%EXTERNALROUTINE DICE %RECORDFORMAT Q(%INTEGER CARD,TIMES) %RECORDARRAY YOURHAND,MYHAND(0:5)(Q) %CONSTSTRING(5)%ARRAY HOLD(0:5)="Ace","King","Queen", "Jack","10","9" %CONSTSTRING(2)%ARRAY HOL (0:5)="A","K","Q","J","10","9" %OWNINTEGER FSA=3 %CONSTSTRING(3) ME="I", YOU="you" %INTEGER YOURLOT,MYLOT,YOURCARD,MYCARD,PLAY %STRING(120) SEQ YOURLOT=1 %ROUTINE CHEAT %INTEGER I %CYCLE I=1,1,5 PRINTSTRING(SP(20)."*** CHEAT ***".SNL) %REPEAT %END %ROUTINE WAIT PROMPT("Ok? :") READSEQUENCE(SEQ,SNL) %END %ROUTINE INSTRUCT %ROUTINE P(%STRING(120) S) PRINTSTRING(S) NEWLINE %END P(" The instructions:") P("1. In answer to the question Who's first, it will assume that") P("you wish to go first unless you type in ""you"" ie the computer") P("somewhere in the first line.") P("2. In answer to the question Another game?, it will assume") P("that you do want another game unless what you type in is either") P("""NO"" or ""No"".") P("3. In answer to Ok?, you need only press .") P("4. Now the more complex matter of what you can throw away:") P(" The faces may be refered to either as Ace, King, Queen,") P(" Jack, 10 and 9 or A, K, Q, J, 10 and 9.") P(" `King' will throw away one King.") P("as will `1 King' or `1 Kings' or `1 KS'.") P("`Kings' throws away all the Kings you have even if you have 0.") P("`3 Kings' will throw away 3 Kings, assuming you have that many") P("and will object if you don't.") P(" So `S' and `s' mark plural and it assumes all unless a") P("number comes before to qualify it, as you would expect.") P("Notes:") P(" (i) Spaces count for nothing.") P(" (ii) The names may come in any order, but only once.") P("(iii) If more than that only the first one counts.") P(" (iv) You can have anything else on the line you like,") P(" but only one line.") P(" (v) Don't throw away what you haven't got.") P("") P(" That's it, now try it!") WAIT %END %ROUTINE SWAPRECORDS(%RECORDNAME A,B) %RECORDSPEC A(Q) %RECORDSPEC B(Q) %RECORD C(Q) C=A; A=B; B=C %END %ROUTINE SORTCARD (%RECORDARRAYNAME HAND) %RECORDSPEC HAND(Q) %INTEGER K,A,B %CYCLE B=4,-1,0 K=0 %CYCLE A=0,1,B K=K+1 %AND SWAPRECORDS(HAND(A),HAND(A+1)) %IFC HAND(A)_CARD>HAND(A+1)_CARD %REPEAT %RETURNIF K=0 %REPEAT %END %ROUTINE SORTTIMES(%RECORDARRAYNAME HAND) %RECORDSPEC HAND(Q) %INTEGER K,A,B %CYCLE B=4,-1,0 K=0 %CYCLE A=0,1,B K=K+1 %AND SWAPRECORDS(HAND(A),HAND(A+1)) %IFC HAND(A)_TIMESJ.(" ").K %CYCLE I=0,1,5 %IF L->J.(HOLD(I)).K %OR L->J.(HOL(I)).K %START S==YOURHAND(I)_TIMES %IF K->("s").K %OR K->("S").K %START LG=LENGTH(J) %IF LG#0 %THEN N=FROMSTRING(J,LG,LG) %ELSE N="" %IF "0"<=N<="5" %START TOTAL=TOTAL+STOI(N) %IF TOTAL>5 %START CHEAT %RESULT=EMPTY %FINISH S=S-STOI(N) %FINISHELSE TOTAL=TOTAL+S %AND S=0 %FINISHELSESTART TOTAL=TOTAL+1 S=S-1 %FINISH %IF S<0 %START CHEAT %RESULT=EMPTY %FINISH L=J.K %FINISH %REPEAT %RESULT=TOTAL %END %INTEGERFN CARDS(%RECORDARRAYNAME HAND) %RECORDSPEC HAND(Q) %INTEGER I,Y SORTTIMES(HAND) Y=0 %CYCLE I=0,1,5 Y=Y*10+5-HAND(I)_CARD %REPEAT %RESULT=Y %END %INTEGERFN LOT (%RECORDARRAYNAME HAND) %RECORDSPEC HAND(Q) %INTEGER X,Y SORTTIMES(HAND) Y=HAND(0)_TIMES*10+HAND(1)_TIMES X=CARDS(HAND) Y=60 %IF Y=11 %AND X=543210 Y=55 %IF Y=11 %AND X=432105 %RESULT=Y %END %INTEGERFN NOUSE MYLOT=LOT(MYHAND) %RESULT=0 %IF MYLOT>50 %OR MYLOT=32 MYHAND(1)_TIMES=0 %ANDRESULT=1 %IF MYLOT=41 MYHAND(2)_TIMES=0 %ANDRESULT=1 %IF MYLOT=22 %IF MYLOT=21 %START MYHAND(0)_TIMES=1 %RESULT=1 %IF MYHAND(3)_CARD#5 %RESULT=1 %IF MYHAND(4)_CARD=0 MYHAND(3)_TIMES=0 %RESULT=2 %FINISH %IF MYLOT=11 %THEN MYHAND(4)_TIMES=0 %ANDRESULT=1 %IF MYLOT=31 %START MYHAND(2)_TIMES=0 %RESULT=1 %IF RANDOMINTEGER//(MYHAND(1)_CARD+1)>200 MYHAND(1)_TIMES=0 %RESULT=2 %FINISH %END %INTEGERFN WHATEVER %INTEGER R,I %INTEGERNAME H YOURCARD=CARDS(YOURHAND) YOURLOT=LOT(YOURHAND) MYCARD=CARDS(MYHAND) MYLOT=LOT(MYHAND) %RESULT=0 %IF MYLOT>YOURLOT %OR (MYLOT=YOURLOT %AND MYCARD>YOURCARD) R=0 %IF 50<=YOURLOT %OR(MYLOT<30 %AND YOURLOT=32)%START SORTCARD(MYHAND) %CYCLE I=0,1,5 H==MYHAND(I)_TIMES R=R+1 %AND H=1 %IF H#0 %REPEAT R=R+1 %AND H=0 %IF H#0 %AND MYHAND(0)_TIMES#0 %RESULT=5-R %FINISH %IF YOURLOT=MYLOT=32 %AND MYCARDYOURLOT %THENRESULT="I win." %IF YOURLOT>MYLOT %THENRESULT="you win." %IF MYCARD>YOURCARD %THENRESULT="I win." %IF YOURCARD>MYCARD %THENRESULT="you win." %RESULT="it's a draw." %END %ROUTINE WHO WINS LINES HAVE(ME,MYHAND) HAVE(YOU,YOURHAND) PRINTSTRING("so ".WINNER) LINES %END %ROUTINE MEFIRST %INTEGER I,D,SA SA=1 %CYCLE I=0,1,5 MYHAND(I)_TIMES=0 MYHAND(I)_CARD=I %REPEAT THROW(PLAY,5,MYHAND) %CYCLE I=1,1,2 HAVE(ME,MYHAND) D=NO USE %EXITIF D=0 KEEP THROW(PLAY,D,MYHAND) SA=SA+1 %REPEAT NEWLINES(2) KEEP LINES FSA=SA %END %ROUTINE YOUR GO %INTEGER I,D,SA SA=1 %CYCLE I=0,1,5 YOURHAND(I)_TIMES=0 YOURHAND(I)_CARD=I %REPEAT PRINTSTRING("You have ".ITOS(FSA,0)." throw") %IF FSA=1 %THEN PRINTSTRING(".".SNL)%ELSE PRINTSTRING("s.".SNL) THROW(10,5,YOURHAND) %IF FSA#1 %START %CYCLE I=2,1,FSA HAVE(YOU,YOURHAND) D=DISCARD YOURLOT=EMPTY %ANDRETURNIF D=EMPTY %EXITIF D=0 THROW(10,D,YOURHAND) SA=SA+1 %REPEAT %FINISH HAVE(YOU,YOURHAND) NEWLINES(2) FSA=SA %END %ROUTINE MESECOND %INTEGER I,D LINES %CYCLE I=0,1,5 MYHAND(I)_TIMES=0 MYHAND(I)_CARD=I %REPEAT THROW(PLAY,5,MYHAND) %IF FSA#1 %START %CYCLE I=2,1,FSA HAVE(ME,MYHAND) D=WHATEVER %EXITIF D=0 KEEP THROW(PLAY,D,MYHAND) %REPEAT %FINISH NEWLINES(2) KEEP %END %ROUTINE GAME %STRING(40) D,E,F PROMPT("Who's first?:") READSEQUENCE(D,SNL) ME FIRST %IF D->E.(YOU).F YOURGO %RETURNIF YOURLOT=EMPTY ME SECOND %UNLESS D->E.(YOU).F WHO WINS %END ! ! !NOW THE MAIN PART ! ! PRINTSTRING("Do you want instructions?".SNL) PROMPT("YES or NO :") READSEQUENCE(SEQ,SNL) %IF SEQ->("YES").SEQ %THEN INSTRUCT %AND PLAY=15 %ELSESTART %IF SEQ="i" %THEN PLAY=10 %ELSE PLAY=15 %FINISH JUGGLERANDOMS %UNTIL SEQ="No" %OR SEQ="NO"%CYCLE PRINTSTRING(" Don't cheat this time!".SNL) %IF YOURLOT=EMPTY YOURLOT=0 GAME PROMPT("Another game? :") READSEQUENCE(SEQ,SNL) FSA=3 %REPEAT NEWLINE %END %ENDOFFILE