132 lines
2.4 KiB
Plaintext
132 lines
2.4 KiB
Plaintext
#
|
|
-- $Source$
|
|
-- $State$
|
|
-- $Revision$
|
|
|
|
#include "dec.ocm"
|
|
|
|
-- General utilities: read and write strings.
|
|
|
|
proc puts(value s[]) =
|
|
seq i = [1 for s[byte 0]]
|
|
output ! s[byte i]
|
|
:
|
|
|
|
proc gets(var s[]) =
|
|
var length, finished, c:
|
|
seq
|
|
finished := false
|
|
length := 0
|
|
|
|
while not finished
|
|
seq
|
|
input ? c
|
|
if
|
|
c = 10
|
|
finished := true
|
|
true
|
|
seq
|
|
length := length + 1
|
|
s[byte length] := c
|
|
|
|
s[byte 0] := length
|
|
:
|
|
|
|
-- Our random number generator.
|
|
|
|
var seed:
|
|
proc randomise(value s) =
|
|
seq
|
|
seed := s
|
|
:
|
|
|
|
proc random(value range, var result) =
|
|
seq
|
|
seed := (20077 * seed) + 12345
|
|
if
|
|
seed < 0
|
|
seed := -seed
|
|
true
|
|
skip
|
|
result := seed \ range
|
|
:
|
|
|
|
-- Does the reading-in-the-name thing.
|
|
|
|
proc getname =
|
|
var seed, buffer[128]:
|
|
seq
|
|
puts("*nHi there! I'm written in Occam. Before we start, what is your name?*n")
|
|
puts("> ")
|
|
gets(buffer)
|
|
|
|
seed := 0
|
|
seq i = [1 for buffer[byte 0]]
|
|
seed := seed + buffer[byte i]
|
|
randomise(seed)
|
|
|
|
puts("*nHello, ")
|
|
puts(buffer)
|
|
puts("! ")
|
|
:
|
|
|
|
-- Plays a single game.
|
|
|
|
proc game =
|
|
var Number, Attempts, finished, guess:
|
|
seq
|
|
puts("See if you can guess my number.*n")
|
|
random(100, Number)
|
|
Attempts := 1
|
|
finished := false
|
|
while not finished
|
|
seq
|
|
puts("*n> ")
|
|
var c:
|
|
seq
|
|
c := '*s'
|
|
decin(input, guess, c)
|
|
|
|
if
|
|
guess = Number
|
|
seq
|
|
puts("*nYou got it right in only ")
|
|
decout(output, Attempts, 0)
|
|
puts(" ")
|
|
if
|
|
Attempts = 1
|
|
puts("go")
|
|
true
|
|
puts("goes")
|
|
puts("!*n")
|
|
finished := true
|
|
|
|
guess < Number
|
|
puts("*nTry a bit higher.*n")
|
|
guess > Number
|
|
puts("*nTry a bit lower.*n")
|
|
Attempts := Attempts + 1
|
|
:
|
|
|
|
var finished, buffer[128]:
|
|
seq
|
|
output ! TEXT
|
|
getname
|
|
|
|
finished := false
|
|
while not finished
|
|
seq
|
|
game
|
|
|
|
puts("*nWould you like another go?*n")
|
|
puts("> ")
|
|
gets(buffer)
|
|
if
|
|
(buffer[byte 1] = 'n') or (buffer[byte 1] = 'N')
|
|
seq
|
|
finished := true
|
|
puts("*nThanks for playing --- goodbye!*n")
|
|
true
|
|
puts("*nExcellent! ")
|
|
|