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! ")
 | |
|   
 |