Nim game: Difference between revisions
(Add Python example code) |
(Added Go) |
||
Line 36: | Line 36: | ||
T |
T |
||
</lang> |
</lang> |
||
=={{header|Go}}== |
|||
<lang go>package main |
|||
import ( |
|||
"bufio" |
|||
"fmt" |
|||
"os" |
|||
"strconv" |
|||
) |
|||
func showTokens(tokens int) { |
|||
fmt.Println("Tokens remaining", tokens, "\n") |
|||
} |
|||
func main() { |
|||
tokens := 12 |
|||
scanner := bufio.NewScanner(os.Stdin) |
|||
for { |
|||
showTokens(tokens) |
|||
fmt.Print(" How many tokens 1, 2 or 3? ") |
|||
scanner.Scan() |
|||
if scerr := scanner.Err(); scerr != nil { |
|||
fmt.Println("Error reading standard input:", scerr) |
|||
return |
|||
} |
|||
t, err := strconv.Atoi(scanner.Text()) |
|||
if err != nil || t < 1 || t > 3 { |
|||
fmt.Println("\nMust be a number between 1 and 3, try again.\n") |
|||
} else { |
|||
ct := 4 - t |
|||
s := "s" |
|||
if ct == 1 { |
|||
s = "" |
|||
} |
|||
fmt.Print(" Computer takes ", ct, " token", s, "\n\n") |
|||
tokens -= 4 |
|||
} |
|||
if tokens == 0 { |
|||
showTokens(0) |
|||
fmt.Println(" Computer wins!") |
|||
return |
|||
} |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
Sample game: |
|||
<pre> |
|||
Tokens remaining 12 |
|||
How many tokens 1, 2 or 3? 2 |
|||
Computer takes 2 tokens |
|||
Tokens remaining 8 |
|||
How many tokens 1, 2 or 3? 4 |
|||
Must be a number between 1 and 3, try again. |
|||
Tokens remaining 8 |
|||
How many tokens 1, 2 or 3? 1 |
|||
Computer takes 3 tokens |
|||
Tokens remaining 4 |
|||
How many tokens 1, 2 or 3? 3 |
|||
Computer takes 1 token |
|||
Tokens remaining 0 |
|||
Computer wins! |
|||
</pre> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
Revision as of 17:06, 10 April 2019
Nim is a simple game where the second player - if they know the trick - will always win. The game has only 3 rules.
- start with 12 tokens
- each player takes 1, 2, or 3 tokens in turn
- the player who takes the last token wins.
To win every time, the second player simply takes 4 minus the number the first player took. So if the first player takes 1, the second takes 3 - if the first player takes 2, the second should take 2 - and if the first player takes 3, the second player will take 1.
- Task
Design a simple Nim game where the player goes first, and the computer always wins. The game should enforce the rules.
AsciiDots
<lang AsciiDots> %$MXTRL .-$"Nim Dots v0.5 by Prof_Apex"-$""-
/$_"Number must be "\ T /----~------\ | *M /---+-*-[o] | | R [-]\ .>#3-+[>][<]-1#<.| | .-#12>--^ \"stod "$-#_$-" ekat uoY"_$---/ \--*----*-/ |
.>$_"How many dots would you like to take"---#?---/ |
\X X---------<".3 dna 1 neewteb"$/ /-----*L | [-]--\ R | | *-$_"Computer takes "-$_#-$" dots"/ M-*#4[%] \---/ /----------------$"computer wins!"-& /---~-- *#0[=]
L-------------*---*>$_#-$" dots remaining."-$""
T
</lang>
Go
<lang go>package main
import (
"bufio" "fmt" "os" "strconv"
)
func showTokens(tokens int) {
fmt.Println("Tokens remaining", tokens, "\n")
}
func main() {
tokens := 12 scanner := bufio.NewScanner(os.Stdin) for { showTokens(tokens) fmt.Print(" How many tokens 1, 2 or 3? ") scanner.Scan() if scerr := scanner.Err(); scerr != nil { fmt.Println("Error reading standard input:", scerr) return } t, err := strconv.Atoi(scanner.Text()) if err != nil || t < 1 || t > 3 { fmt.Println("\nMust be a number between 1 and 3, try again.\n") } else { ct := 4 - t s := "s" if ct == 1 { s = "" } fmt.Print(" Computer takes ", ct, " token", s, "\n\n") tokens -= 4 } if tokens == 0 { showTokens(0) fmt.Println(" Computer wins!") return } }
}</lang>
- Output:
Sample game:
Tokens remaining 12 How many tokens 1, 2 or 3? 2 Computer takes 2 tokens Tokens remaining 8 How many tokens 1, 2 or 3? 4 Must be a number between 1 and 3, try again. Tokens remaining 8 How many tokens 1, 2 or 3? 1 Computer takes 3 tokens Tokens remaining 4 How many tokens 1, 2 or 3? 3 Computer takes 1 token Tokens remaining 0 Computer wins!
Python
<lang Python> print("Py Nim 0.5 by Prof_Apex\n")
def getTokens(curTokens): global tokens
print("How many tokens would you like to take? ", end=) take = int(input())
if (take < 1 or take > 3): print("Number must be between 1 and 3.\n") getTokens(curTokens) return
tokens = curTokens - take print(f'You take {take} tokens.') print(f'{tokens} tokens remaining.\n')
def compTurn(curTokens): global tokens
take = curTokens % 4 tokens = curTokens - take print (f'Computer takes {take} tokens.') print (f'{tokens} tokens remaining.\n')
tokens = 12
while (tokens > 0):
getTokens(tokens)
compTurn(tokens)
print("Computer wins!") </lang>