4.8. Nims assignment¶
In this game, two players sit in front of a pile of 100 stones. They
take turns, each removing between 1 and 5 stones (assuming there are
at least 5 stones left in the pile). The person who removes the last
stone(s) wins. Download
nims template. and open it
up. Check out the lines of text in between the sets of triple
quotes (“””), underneath the definition of play nims.
This is called a docstring, and is handy for documentation:
plain English text informing
users of your program
what your program does and
what parameters need to be given values. Also check out the
text following the character
#. These lines,
called comments , are also documentation,
usually strings of English a line or two long clarifying
what the code directly below them does. In
this case they have been used to enter in the outline
of the program constructed from the discussion below.
You’ll probably want to delete these as you write the program.
In this problem, you’ll write a function to play this game; the
function has been outlined it for you. The outline helps
you break the problem down into parts; this
process is useful with most programming tasks. You do not
have to follow the structure of this outline,
but it has proved to be of use to most beginners.
The outline suggests you use nested loops (one
loop inside another). In the outermost loop, we want to keep playing
until we are out of stones. Inside that, there is a loop
that keeps prompting a user for a move until he supplies
a valid move. Instead of using
You have the option of either writing two blocks of code, or
keeping a variable that tracks the current player. The second way
could be slightly trickier, but it’s definitely do-able! The second
way also allows you to do the (optional) addon complication
part of the assignment: Announce which player has won
at the end.
Finally, we might want to have an innermost loop that checks if the user’s input is valid. Is it a number? Is it a valid number (e.g. between 1 and 5)? Are there enough stones in the pile to take off this many? If any of these answers are no, we should tell the user and re-ask them the question. As always, feel free to ask the instructor for help on any part of this problem. If you choose to write two blocks of code, the basic outline of the program should be something like this:
while [pile is not empty]: while [player 1’s answer is not valid]: [ask player 1] [execute player 1’s move] [same as above for player 2]
Be careful with the validity checks. Specifically, we want to keep asking player 1 for their choice as long as their answer is not valid, BUT we want to make sure we ask them at least ONCE. So, for example, we will want to keep a variable that tracks whether their answer is valid, and set it to False initially.
One function you will find useful for this assignment is
raw_input, for interaction with players (there’s some
example code using
raw_input in a
in Section Loops)
>>> X = raw_input('Do you want to continue?\n') Do you want to continue? Yes >>> X 'Yes'
In the simulated interaction above,
executed, it prints out its string argument and then
waits for a response from the user;
the user can then type any answer they choose;
the answer is assumed to be over when they hit
raw_input then returns the string they typed.
Note that on the first line, the variable
is set to that string. So
a program to interact with a user, store their responses,
and then condition future actions on those responses.
Note that what
raw_input returns is a string.
This is true even if a user types a number like 1:
>>> X = raw_input('Guess a number.\n') Guess a number. 1 >>> X '1' >>> type(X) <type 'str'>
If you want compare this to an integer, you
X to an integer first like this:
>>> X = int(X)
When you’re finished, test each other’s programs by playing them! Be sure to test that the game works right both when player 1 and player 2 win.
Optional add on Complication: Instead of having the program simply announce the game is over, have it announce who won (Player 1 or Player 2).
To get started on the nims_assignment, download the