(* $Source$ * $State$ * $Revision$ *) MODULE HiLo; FROM InOut IMPORT WriteInt, WriteLn, WriteString, ReadString, ReadInt; FROM random IMPORT Uniform; FROM Streams IMPORT FlushStream, OutputStream, StreamResult; VAR buffer : ARRAY [0..32] OF CHAR; PROCEDURE flush; VAR strus : StreamResult; BEGIN FlushStream(OutputStream, strus); END flush; PROCEDURE reads; BEGIN WriteString("> "); flush; ReadString(buffer); END reads; PROCEDURE game; VAR Number : INTEGER; Attempts : INTEGER; guess : INTEGER; finished : BOOLEAN; BEGIN WriteString("See if you can guess my number."); WriteLn; Number := Uniform(0, 99); Attempts := 1; finished := FALSE; WHILE NOT finished DO WriteString("> "); flush; ReadInt(guess); IF guess = Number THEN WriteLn; WriteString("You got it right in only "); WriteInt(Attempts, 0); WriteString(" "); IF Attempts = 1 THEN WriteString("go"); ELSE WriteString("goes"); END; WriteString("!"); WriteLn; finished := TRUE; ELSIF guess < Number THEN WriteLn; WriteString("Try a bit higher."); WriteLn; ELSIF guess > Number THEN WriteLn; WriteString("Try a bit lower."); WriteLn; END; Attempts := Attempts + 1; END; END game; VAR finished : BOOLEAN; BEGIN WriteLn; WriteString("Hi there! I'm written in Modula-2. Before we start, what is your name?"); WriteLn; reads; WriteLn; WriteString("Hello, "); WriteString(buffer); WriteString("! "); finished := FALSE; WHILE NOT finished DO game; WriteLn; WriteString("Would you like another go?"); WriteLn; reads; IF (buffer[0] = 'n') OR (buffer[0] = 'N') THEN finished := TRUE; WriteLn; WriteString("Thanks for playing --- goodbye!"); WriteLn; ELSE WriteLn; WriteString("Excellent! "); END; END; END HiLo.