DEFINE MINCOLORS="2" DEFINE MAXCOLORS="20" DEFINE MINLENGTH="4" DEFINE MAXLENGTH="10" DEFINE MINGUESS="7" DEFINE MAXGUESS="20" TYPE Score=[BYTE spot,corr,err] TYPE Settings=[BYTE colors,length,guesses,repeat] PROC GetSettings(Settings POINTER s) CHAR ARRAY tmp(10) DO PrintF("Enter number of colors (%B-%B):",MINCOLORS,MAXCOLORS) s.colors=InputB() UNTIL s.colors>=MINCOLORS AND s.colors<=MAXCOLORS OD DO PrintF("Enter length of code (%B-%B):",MINLENGTH,MAXLENGTH) s.length=InputB() UNTIL s.length>=MINLENGTH AND s.length<=MAXLENGTH OD DO PrintF("Enter max number of guesses (%B-%B):",MINGUESS,MAXGUESS) s.guesses=InputB() UNTIL s.guesses>=MINGUESS AND s.guesses<=MAXGUESS OD IF s.colors='a AND c<='z THEN s(i)=c-'a+'A FI OD RETURN PROC PrintScore(Score POINTER res Settings POINTER s) INT i FOR i=1 TO res.spot DO Put('X) OD FOR i=1 TO res.corr DO Put('O) OD FOR i=1 TO s.length-res.spot-res.corr DO Put('-) OD RETURN PROC Main() CHAR ARRAY code(MAXLENGTH+1),guess(255) Score res Settings s BYTE tries PrintE("Mastermind") PutE() GetSettings(s) PutE() Generate(code,s) tries=s.guesses PrintF("Enter your guess (%B tries):%E",tries) DO InputS(guess) ToUpper(guess) CheckScore(code,guess,s,res) Put(28) ;cursor up PrintF("%S -> ",guess) IF res.err THEN Print("Wrong input") ELSE PrintScore(res,s) IF res.spot=s.length THEN PutE() PutE() PrintE("You won!") EXIT FI tries==-1 IF tries=0 THEN PutE() PutE() PrintE("You lost!") EXIT FI FI PrintF(", try again (%B tries):%E",tries) OD RETURN