131 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#
 | 
						|
-- $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! ")
 | 
						|
  
 |