81 lines
1.6 KiB
Plaintext
81 lines
1.6 KiB
Plaintext
$constant maxtokens = 12
|
|
$constant machine = 0
|
|
$constant human = 1
|
|
$constant false = 0
|
|
$constant true = 0FFFFH
|
|
|
|
procedure welcome
|
|
print "Welcome to the Game of Nim."
|
|
print "We begin with";maxtokens;" tokens. On each turn, a player"
|
|
print "may take between 1 and 3 tokens. The player who takes the"
|
|
print "last token wins."
|
|
print
|
|
end
|
|
|
|
procedure show(n = integer)
|
|
var i = integer
|
|
print "Available tokens:";n;" ";
|
|
rem - provide a visual display
|
|
for i = 1 to n
|
|
print "o ";
|
|
next i
|
|
print
|
|
end
|
|
|
|
function getnum(lowlim, toplim = integer) = integer
|
|
var ok, n = integer
|
|
repeat
|
|
begin
|
|
input "You take:";n
|
|
if n < lowlim or n > toplim then
|
|
begin
|
|
print "Must take between";lowlim;" and";toplim
|
|
print "Try again."
|
|
ok = false
|
|
end
|
|
else
|
|
ok = true
|
|
end
|
|
until ok
|
|
end = n
|
|
|
|
function play(player, tokens, taken = integer) = integer
|
|
if player = human then
|
|
taken = getnum(1,3)
|
|
else
|
|
begin
|
|
if tokens <= 3 then
|
|
taken = tokens
|
|
else
|
|
taken = 4 - taken
|
|
end
|
|
end = taken
|
|
|
|
procedure report(player = integer)
|
|
if player = human then
|
|
print "You took the last one. You win. Congratulations!"
|
|
else
|
|
print "I took the last one, so I win. Sorry about that."
|
|
end
|
|
|
|
var player, tokens, taken = integer
|
|
|
|
welcome
|
|
tokens = maxtokens
|
|
taken = 0
|
|
player = human
|
|
print "You go first."
|
|
repeat
|
|
begin
|
|
show tokens
|
|
taken = play(player, tokens, taken)
|
|
if player = machine then print "I took:";taken
|
|
tokens = tokens - taken
|
|
if tokens > 0 then player = 1 - player
|
|
end
|
|
until tokens <= 0
|
|
report player
|
|
print "Thanks for playing!"
|
|
|
|
end
|