Plays Generala, the Latin American dice game related to Yahtzee, for one to three players, with the computer able to take a seat. The options are one player against the computer, two players, two players and the computer, or three players, and each player types a name. A turn allows up to three throws of five dice, drawn from 2×2 blocks of UDGs. Between throws each die can be saved (X) or rolled (R), or you can roll all (ENTER) or reset (0). To score, you choose Digits (the 1–6 boxes) or Figures, and the program picks the box. The figures are Straight (20), Full (30), Poker (40), Generala (50) and Double Generala (100), with more for a figure made on the first throw (25, 40, 60 and 80). A Double Generala on the first throw ends the game at once. If a throw fits nothing, a box is crossed out. After eleven rounds the program announces the winner or a draw and shows how many games each player has won.
The title screen shows “Rel#: 30” and “© 1984” but names no author. Some REMs are in Spanish, such as REM rutina de escalera buscada (“sought-straight routine”). A Generala program was reviewed in the Reviewer Corner: Generala column.
Program Analysis
Structure
- Lines 7999–8968: sets RAMTOP to 65000, clears the statistics area and POKEs 136 bytes of UDG data (17 characters) to 65368.
- Lines 9005–9446: option menu, player names, the scorecard screen and the variables.
- Lines 1000–1060: the round loop.
t$holds the turn order for each option ("1400","1200","1240","1230"), where 4 means the computer. - Lines 1200–1537: dice throw, dice display, save markers and the running total.
- Lines 3000–3710: a human turn and the scoring of digits, figures and crossed-out boxes.
- Lines 3800–3955: digit sum and an insertion sort of the dice into
q$. - Lines 4000–7812: the computer player.
- Lines 6500–6710: winner or draw, the games-won statistics and the replay options.
Scorecard
Each player’s card is a 33-character row of U$(3,33), three characters per box in the order 1–6, ST, FL, PK, GL and DG. "XXX" marks a crossed-out box, and line 1515 totals the row with VAL. The card’s labels come from slicing S$=" 1 2 3 4 5 6STFLPKGLDG".
Computer Player
The computer sorts its dice, looks for generala, poker, three of a kind, two pairs or a straight, and then marks dice to keep in f$ according to which boxes are still open. For straights it compares its dice with three patterns in m$: 1-2-3-4-5, 2-3-4-5-6 and 1-3-4-5-6. It has separate strategies for the last two rounds (lines 7200 and 7700).
Persistent Statistics
Lines 8000–8001 POKE the RAMTOP system variable (23730/23731) to 65000 directly. Games won, the player names and their lengths, and the chosen option are then stored at 65001–65037, so they survive the CLEAR used when a new game starts with the same players.
Notable Techniques
- Line numbers are kept in named variables (
player=3000,Throw=1200,score=3200,cpu=5000,Rubout=3600,Finale=6500…) and called withGO SUB ThroworGO TO score. Most targets are one less than the first real line of the routine. GO TO 3415+VAL (q$(i))*15jumps straight to the scoring code for the repeated digit.- TS2068
SOUNDstatements drive the AY chip for the dice-roll noise and a fanfare, alongsideBEEPtunes. - Each die face is a 2×2 block built from the 17 UDGs.
POKE 23658,0turns caps lock off so the lower-case key codes in theINKEY$tests match.
Potential Issues
- Line 4005 tests
h$="13456"twice. The second test was probably meant to be"23456". - The human straight check (line 3366) accepts only 1-2-3-4-5 and 2-3-4-5-6, but the computer also treats 1-3-4-5-6 as a straight (lines 5910 and 7402). When the computer sends that hand to be scored, the straight is refused and, if it was chasing a straight, its straight box appears to be crossed out.
- Line 7602 compares the three-character slice
U$(q,25 TO 27)with two spaces, and line 7610 compares the single characterU$(3,24)with two spaces. Neither can ever be equal, so those last-round shortcuts never fire. - Line 7642 reads
CONTINUE 7648. That is not a valid jump in Sinclair BASIC and appears to be a corruptedGO TO 7648. - Line 7776 is garbled (
VAL q$3)=VAL q$(0)) but cannot be reached. - When the same players start a new game, line 6653 POKEs 1, 2 and 3 into 65003, 65013 and 65023. Those addresses hold player 3’s win count and the tenth character of names 1 and 2, so that win count is overwritten.
- Turns are entered with
GO SUB playerorGO SUB cpubut leave withGO TO 1050, so each turn leaves an entry on the GO SUB stack. - The
LETafterGO TO 3670in line 3662 can never run.
This copy comes from Bob Swoger’s Larken games disk. For tape, the RANDOMIZE USR 100 calls and the LOGICALL load were removed from the save and load lines at 9997–9998, and the program now autostarts at line 1. It was tested in ZEsarUX.
Source Code
1 RESTORE : POKE 23658,0: GO TO 7999
900 LET h$="00000"
902 FOR i=1 TO 5
904 LET h$(i)=q$(i)
906 NEXT i
908 RETURN
1010 FOR x=1 TO 4
1015 LET count=0
1020 IF VAL t$(n,x)=0 THEN GO TO 1052
1030 IF VAL t$(n,x)=4 THEN GO SUB cpu
1035 LET q=VAL t$(n,x)
1040 GO SUB player
1050 GO SUB Total
1052 NEXT x
1054 LET End=End+1
1056 IF End=11 THEN GO TO Finale
1060 GO TO 1000
1190 FOR i=18 TO 20
1192 INK 1: PRINT AT i,1;"::::::::::::::::::::::::::::"
1194 NEXT i
1196 RETURN
1201 SOUND 6,31;7,7;8,3;9,3;10,16;11,30;12,3;13,8
1202 IF count>1 THEN GO SUB 1400
1205 FOR i=1 TO 5
1207 IF f$(i)="x" THEN GO TO 1215
1210 LET d(i)=INT (RND*6)+1
1213 GO SUB 1220+i*10
1215 NEXT i
1220 RETURN
1231 PAPER 7
1232 GO SUB 2000+(d(i)*100)
1234 PRINT AT 5,2;a$(1)
1236 PRINT AT 6,2;a$(2)
1237 BEEP .05,22: PAPER 6
1238 RETURN
1241 PAPER 7
1242 GO SUB 2000+(d(i)*100)
1244 PRINT AT 8,5;a$(1)
1246 PRINT AT 9,5;a$(2)
1247 BEEP .05,22: PAPER 6
1248 RETURN
1251 PAPER 7
1252 GO SUB 2000+(d(i)*100)
1254 PRINT AT 12,7;a$(1)
1256 PRINT AT 13,7;a$(2)
1257 BEEP .05,22: PAPER 6
1258 RETURN
1261 PAPER 7
1262 GO SUB 2000+(d(i)*100)
1264 PRINT AT 8,9;a$(1)
1266 PRINT AT 9,9;a$(2)
1267 BEEP .05,22: PAPER 6
1268 RETURN
1271 PAPER 7
1272 GO SUB 2000+(d(i)*100)
1274 PRINT AT 5,12;a$(1)
1276 PRINT AT 6,12;a$(2)
1277 BEEP .05,22: PAPER 6
1278 RETURN
1305 LET e=4*i-3
1310 FLASH 1: INK 0: PRINT AT VAL o$(e TO e+1),VAL o$(e+2 TO e+3);i
1315 RETURN
1355 FLASH 0: INK 4: PRINT AT VAL o$(e TO e+1),VAL o$(e+2 TO e+3);"::"
1360 RETURN
1402 FOR i=1 TO 5
1404 IF f$(i)="x" THEN GO TO 1418
1406 FOR j=1 TO 5
1408 LET p=i*4-3
1410 PRINT AT VAL k$(p TO p+1),VAL k$(p+2 TO p+3);"::::"
1412 PRINT AT VAL k$(p TO p+1)+1,VAL k$(p+2 TO p+3);"::::"
1414 INK 4
1416 NEXT j
1418 NEXT i
1419 INK 0
1420 RETURN
1502 LET Z(q)=0
1505 FOR i=1 TO 31 STEP 3
1510 IF U$(q,i TO i+2)="XXX" OR U$(q,i TO i+2)=" " THEN GO TO 1520
1515 LET Z(q)=Z(q)+VAL U$(q,i TO i+2)
1520 NEXT i
1522 IF Z(q)>=100 THEN GO TO 1536
1526 IF Z(q)>=10 THEN GO TO 1534
1532 PRINT AT 20,q+(3*(q+6));Z(q)
1533 RETURN
1534 PRINT AT 20,q+(3*(q+6))-1;Z(q)
1535 RETURN
1536 PRINT AT 20,q+(3*(q+6))-2;Z(q)
1537 RETURN
2110 LET a$(1)="bc"
2120 LET a$(2)="de"
2130 RETURN
2210 LET a$(1)="af"
2220 LET a$(2)="ga"
2230 RETURN
2310 LET a$(1)="bh"
2320 LET a$(2)="ie"
2330 RETURN
2410 LET a$(1)="jf"
2420 LET a$(2)="gk"
2430 RETURN
2510 LET a$(1)="lh"
2520 LET a$(2)="im"
2530 RETURN
2610 LET a$(1)="np"
2620 LET a$(2)="oq"
2630 RETURN
3001 PRINT #1;AT 1,0;"TURN: ";N$(q)
3002 LET count=count+1
3003 IF count>1 THEN GO TO 3006
3004 FOR i=3 TO 16: INK 4: PRINT AT i,1;" ": NEXT i
3005 INK 0
3006 GO SUB Throw
3007 SOUND 8,0;9,0;10,0
3010 IF count=3 THEN GO TO 3200
3012 PRINT AT 18,1;"____SELECT____"
3013 PRINT AT 19,1;"S to Score "
3014 PRINT AT 20,1;"ENTER to Roll"
3015 IF INKEY$=CHR$ 115 THEN GO TO 3200
3016 IF INKEY$=CHR$ 13 THEN GO TO 3018
3017 GO TO 3015
3018 GO SUB 1190
3025 FOR i=1 TO 5
3026 INK 0: PRINT AT 18,1;"X=Save R=Roll"
3027 PRINT AT 19,1;"ENTER=Roll All"
3028 PRINT AT 20,1;"0=Reset all"
3029 IF f$(i)="x" THEN GO TO 3038
3030 GO SUB Fix
3031 IF INKEY$="" THEN GO TO 3031
3032 IF INKEY$=CHR$ 48 THEN GO TO 3040
3033 IF INKEY$=CHR$ 114 OR INKEY$=CHR$ 120 THEN GO TO 3036
3034 IF INKEY$=CHR$ 13 THEN GO TO 3042
3035 GO TO 3031
3036 LET f$(i)=INKEY$
3037 GO SUB Blank
3038 NEXT i
3039 GO TO 3043
3040 LET f$="00000": GO SUB Blank
3041 FLASH 0: GO TO 3025
3042 LET f$="00000": GO SUB Blank: FLASH 0
3043 GO SUB 1190
3044 GO TO 3000
3201 LET f$="00000"
3202 FLASH 0
3205 GO SUB Seq
3210 IF fl=1 THEN GO TO 3228
3212 GO SUB 1190
3214 IF End=10 THEN GO TO 3230
3216 PRINT AT 18,1;"____SELECT____"
3218 PRINT AT 19,1;"1 - Digits "
3220 PRINT AT 20,1;"F - Figures "
3222 IF INKEY$=CHR$ 49 THEN GO TO 3400
3224 IF INKEY$=CHR$ 102 THEN GO TO 3230
3226 GO TO 3222
3228 LET fl=0
3231 GO SUB 1190
3234 IF q$(1)<>q$(5) THEN GO TO 3280
3236 IF U$(q,29)="X" THEN GO TO 3280
3238 IF U$(q,29)<>" " THEN GO TO 3250
3240 IF count=1 THEN GO TO 3246
3242 LET U$(q,28 TO 30)=" 50"
3243 PRINT AT 17,16+q*4;" 50": GO SUB Music
3244 GO TO 1050
3246 LET U$(q,28 TO 30)=" 80"
3247 PRINT AT 17,16+q*4;" 80": GO SUB Music
3248 GO TO 1050
3250 IF U$(q,31)<>" " THEN GO TO 3280
3254 LET U$(q,31 TO 33)="100"
3256 PRINT AT 18,16+q*4;"100"
3257 GO SUB Total: IF count=1 THEN GO TO Finale
3258 GO SUB Music
3260 PRINT #1;AT 1,0;"DO YOU CONCEDE DEFEAT?(Y/N)"
3262 IF INKEY$="" THEN GO TO 3262
3263 IF INKEY$=CHR$ 121 THEN GO TO 6700
3264 PRINT #1;AT 1,0;" "
3270 GO TO 1052
3282 IF q$(1)<>q$(4) AND q$(2)<>q$(5) THEN GO TO 3320
3284 IF U$(q,26)<>" " THEN GO TO 3320
3285 IF VAL q$(3)=6 AND U$(q,16 TO 18)=" " THEN GO TO 3505
3286 IF count=1 THEN GO TO 3300
3290 LET U$(q,25 TO 27)=" 40"
3292 PRINT AT 16,16+q*4;" 40"
3294 GO TO 1050
3300 LET U$(q,25 TO 27)=" 60"
3302 PRINT AT 16,16+q*4;" 60"
3303 GO SUB Mus2
3304 GO TO 1050
3322 IF q$(1)=q$(3) AND q$(4)=q$(5) OR q$(1)=q$(2) AND q$(3)=q$(5) THEN GO TO 3326
3324 GO TO 3360
3326 IF U$(q,23)<>" " THEN GO TO 3360
3328 IF count=1 THEN GO TO 3340
3330 LET U$(q,22 TO 24)=" 30"
3332 PRINT AT 15,16+q*4;" 30"
3334 GO TO 1050
3340 LET U$(q,22 TO 24)=" 40"
3342 PRINT AT 15,16+q*4;" 40"
3343 GO SUB Mus2
3344 GO TO 1050
3361 IF U$(q,20)<>" " THEN GO TO 3400
3362 LET h$="00000"
3363 FOR i=1 TO 5
3364 LET h$(i)=q$(i)
3365 NEXT i
3366 IF h$="12345" OR h$="23456" THEN GO TO 3370
3367 IF fstr=1 THEN GO TO 3664
3368 GO TO 3400
3370 IF count=1 THEN GO TO 3380
3372 LET U$(q,19 TO 21)=" 20"
3374 PRINT AT 14,16+q*4;" 20"
3376 GO TO 1050
3380 LET U$(q,19 TO 21)=" 25"
3382 PRINT AT 14,16+q*4;" 25"
3383 GO SUB Mus2
3384 GO TO 1050
3401 GO SUB 1190
3405 FOR i=1 TO 3
3410 IF q$(i)=q$(i+2) THEN GO TO 3415+VAL (q$(i))*15
3415 NEXT i
3420 FOR i=1 TO 4
3422 IF q$(i)=q$(i+1) THEN GO TO 3415+VAL (q$(i))*15
3424 NEXT i
3425 GO TO Rubout
3432 IF U$(q,3)<>" " THEN GO TO Rubout
3433 LET v=1
3434 GO SUB Sum
3436 LET U$(q,3)=STR$ Add
3438 PRINT AT 8,18+q*4;STR$ Add
3440 GO TO 1050
3447 IF U$(q,5 TO 6)<>" " THEN GO TO Rubout
3448 LET v=2
3449 GO SUB Sum
3451 IF Add=10 THEN GO TO 3456
3452 LET U$(q,6)=STR$ Add
3453 PRINT AT 9,18+q*4;STR$ Add
3454 GO TO 1050
3456 LET U$(q,5 TO 6)=STR$ Add
3457 PRINT AT 9,17+q*4;STR$ Add
3458 GO TO 1050
3462 IF U$(q,8 TO 9)<>" " THEN GO TO Rubout
3463 LET v=3
3464 GO SUB Sum
3466 IF Add>=12 THEN GO TO 3471
3468 LET U$(q,9)=STR$ Add
3469 PRINT AT 10,18+q*4;STR$ Add
3470 GO TO 1050
3471 LET U$(q,8 TO 9)=STR$ Add
3472 PRINT AT 10,17+q*4;STR$ Add
3474 GO TO 1050
3476 IF U$(q,11 TO 12)<>" " THEN GO TO Rubout
3478 LET v=4
3479 GO SUB Sum
3480 IF Add>=12 THEN GO TO 3485
3482 LET U$(q,12)=STR$ Add
3483 PRINT AT 11,18+q*4;STR$ Add
3484 GO TO 1050
3485 LET U$(q,11 TO 12)=STR$ Add
3486 PRINT AT 11,17+q*4;STR$ Add
3487 GO TO 1050
3491 IF U$(q,14 TO 15)<>" " THEN GO TO Rubout
3492 LET v=5
3494 GO SUB Sum
3496 IF Add>=10 THEN GO TO 3501
3497 LET U$(q,15)="5"
3498 PRINT AT 12,18+q*4;"5"
3499 GO TO 1050
3501 LET U$(q,14 TO 15)=STR$ Add
3502 PRINT AT 12,17+q*4;STR$ Add
3503 GO TO 1050
3506 IF U$(q,17 TO 18)<>" " THEN GO TO Rubout
3507 LET v=6
3509 GO SUB Sum
3511 IF Add>=12 THEN GO TO 3516
3512 LET U$(q,18)="6"
3513 PRINT AT 13,18+q*4;"6"
3514 GO TO 1050
3516 LET U$(q,17 TO 18)=STR$ Add
3517 PRINT AT 13,17+q*4;STR$ Add
3518 GO TO 1050
3605 IF U$(q,31)<>" " THEN GO TO 3610
3606 LET U$(q,31 TO )="XXX"
3607 PRINT AT 18,16+q*4;"XXX"
3608 GO TO 1050
3611 LET b=0
3612 FOR i=1 TO 4
3615 FOR j=1 TO 5
3620 IF q$(j)=STR$ i THEN LET b=b+1
3625 IF j=5 AND b<>0 THEN GO TO 3650
3630 NEXT j
3635 NEXT i
3636 FOR i=1 TO 4
3637 IF U$(q,3*i-2 TO 3*i)=" " THEN GO TO 3640
3638 NEXT i
3639 GO TO 3660
3640 LET U$(q,3*i-2 TO 3*i)="XXX"
3642 PRINT AT i+7,16+q*4;"XXX"
3644 GO TO 1050
3650 IF U$(q,3*i-1 TO 3*i)<>" " THEN GO TO 3656
3652 LET U$(q,i+2*i)=STR$ (b*i)
3653 PRINT AT i+7,18+q*4;STR$ (b*i)
3654 GO TO 1050
3656 LET b=0
3658 GO TO 3635
3662 IF U$(q,19 TO 21)<>" " THEN GO TO 3670: LET U$(q,19 TO 21)="XXX"
3664 LET U$(q,19 TO 21)="XXX"
3666 PRINT AT 14,16+q*4;"XXX"
3668 GO TO 1050
3672 FOR i=5 TO 6
3674 FOR j=1 TO 5
3676 IF q$(j)=STR$ i THEN LET b=b+1
3678 IF j=5 AND b<>0 THEN GO TO 3690
3680 NEXT j
3681 NEXT i
3682 FOR i=5 TO 6
3683 IF U$(q,3*i-2 TO 3*i)=" " THEN GO TO 3640
3684 NEXT i
3685 GO TO 3700
3690 IF U$(q,3*i-1 TO 3*i)=" " THEN GO TO 3696
3692 LET b=0: GO TO 3681
3696 LET U$(q,3*i-1 TO 3*i)=STR$ (b*i)
3698 PRINT AT i+7,19-LEN STR$ (b*i)+q*4;STR$ (b*i)
3699 GO TO 1050
3702 FOR g=23 TO 29 STEP 3
3704 IF U$(q,g)=" " THEN GO TO 3708
3706 NEXT g
3708 LET U$(q,g-1 TO g+1)="XXX"
3709 PRINT AT ((g-20)/3)+14,16+q*4;"XXX"
3710 GO TO 1050
3805 LET b=0
3810 FOR i=1 TO 5
3815 IF q$(i)=STR$ v THEN LET b=b+1
3820 NEXT i
3825 LET Add=b*v
3830 LET b=0
3835 RETURN
3905 FOR i=1 TO 5
3910 LET q$(i)=STR$ d(i)
3915 NEXT i
3920 FOR j=2 TO 5
3925 LET w$=q$(j)
3930 FOR i=j-1 TO 1 STEP -1
3935 IF q$(i)<w$ THEN GO TO 3945
3940 LET q$(i+1)=q$(i)
3942 NEXT i
3945 LET q$(i+1)=w$
3950 NEXT j
3955 RETURN
4000 REM rutina de escalera buscada
4001 IF U$(q,19 TO 21)<>" " THEN GO TO 5000
4002 LET flagstr=0
4003 IF count=1 THEN GO TO 4010
4004 GO SUB 900
4005 IF h$="12345" OR h$="13456" OR h$="13456" THEN GO TO score
4010 LET zero=0
4012 FOR i=2 TO 5
4014 IF q$(i)=q$(i-1) THEN GO SUB 4025
4016 NEXT i
4018 IF zero>1 THEN GO TO 5000
4020 GO TO 4030
4025 LET q$(i-1)="0"
4026 LET zero=zero+1
4027 RETURN
4030 FOR j=2 TO 5
4032 LET b$=q$(j)
4034 FOR i=j-1 TO 1 STEP -1
4036 IF q$(i)<b$ THEN GO TO 4042
4038 LET q$(i+1)=q$(i)
4040 NEXT i
4042 LET q$(i+1)=b$
4044 NEXT j
4046 FOR i=1 TO 5
4048 LET h$(i)=q$(i)
4050 NEXT i
4052 IF h$(2 TO )="3456" OR h$(2 TO )="1345" OR h$(2 TO )="2345" THEN GO TO 4056
4054 GO TO 5000
4056 FOR j=1 TO 5
4058 FOR i=1 TO 5
4060 IF d(j)=VAL q$(i) THEN GO SUB 4080
4062 NEXT i
4064 NEXT j
4066 LET flagstr=1
4070 GO TO 5000
4080 LET f$(j)="x"
4082 LET q$(i)="0"
4084 RETURN
5001 LET fl=1
5002 LET count=count+1
5003 PRINT #1;AT 1,0;"TURN: CPU "
5004 LET q=3
5005 IF count>1 THEN GO TO 5010
5007 FOR i=3 TO 16: INK 4: PRINT AT i,1;" ": NEXT i
5008 INK 0
5010 GO SUB Throw
5011 SOUND 8,0;9,0;10,0
5012 LET f$="00000"
5015 IF count=3 THEN GO TO score
5020 GO SUB Seq
5021 IF End=9 THEN GO TO 7700
5022 IF End=10 THEN GO TO 7200
5024 IF flagstr=1 THEN GO TO 4000
5025 IF q$(1)=q$(5) THEN GO TO 5100
5030 IF q$(1)=q$(4) OR q$(2)=q$(5) THEN GO TO 5300
5035 FOR i=1 TO 3
5036 IF q$(i)=q$(i+2) THEN GO TO 5500
5037 NEXT i
5040 IF q$(1)=q$(2) AND q$(3)=q$(4) THEN GO TO 5700
5045 IF q$(2)=q$(3) AND q$(4)=q$(5) THEN GO TO 5700
5050 IF q$(1)=q$(2) AND q$(4)=q$(5) THEN GO TO 5700
5055 GO TO 5900
5105 IF U$(q,28 TO 30)=" " THEN GO TO score
5110 IF U$(q,29)="X" THEN GO TO 5300
5115 IF U$(q,31 TO 33)=" " THEN GO TO score
5120 GO TO score
5302 IF count<>1 THEN GO TO 5308
5304 LET rand=INT (RND*2)+1
5306 IF U$(q,25 TO 27)=" " AND rand=2 THEN GO TO score
5308 IF U$(q,29)<>"X" THEN GO TO 5330
5310 IF U$(q,25 TO 27)=" " THEN GO TO score
5315 LET dig=VAL q$(3)
5320 IF U$(q,(3*dig)-2 TO 3*dig)=" " THEN GO TO 5330
5322 IF U$(q,30)<>"X" AND U$(q,31 TO 33)=" " THEN GO TO 5330
5328 GO TO 5000
5330 FOR j=1 TO 5 STEP 4
5332 IF q$(j)<>q$(3) THEN GO TO 5335
5333 NEXT j
5335 FOR i=1 TO 5
5336 IF d(i)<>VAL q$(j) THEN LET f$(i)="x"
5337 NEXT i
5340 GO TO 5000
5505 FOR j=2 TO 4
5510 IF q$(j)=q$(j-1) AND q$(j)=q$(j+1) THEN GO TO 5525
5515 NEXT j
5525 IF j<>3 THEN GO TO 5570
5530 LET dig=VAL q$(j)
5532 IF count=1 AND U$(q,29)<>" " THEN GO TO 5540
5535 IF U$(q,(3*dig)-2 TO 3*dig)<>" " AND U$(q,26)<>" " THEN GO TO 5000
5540 FOR i=1 TO 5
5542 IF d(i)=VAL q$(3) THEN LET f$(i)="x"
5544 NEXT i
5546 GO TO 5000
5570 IF j=2 AND q$(4)=q$(5) THEN GO TO 5573
5571 IF j=4 AND q$(1)=q$(2) THEN GO TO 5573
5572 GO TO 5574
5573 IF U$(q,22 TO 24)=" " THEN GO TO score
5574 LET dig=VAL q$(3)
5575 IF U$(q,(3*dig)-2 TO 3*dig)=" " OR U$(q,23)=" " OR U$(q,26)=" " OR U$(q,29)=" " THEN GO TO 5600
5576 IF U$(q,29)<>"X" AND U$(q,31)=" " THEN GO TO 5600
5578 GO TO 5000
5600 FOR i=1 TO 5
5605 IF d(i)=VAL q$(3) THEN LET f$(i)="x"
5610 NEXT i
5620 GO TO 5000
5702 FOR j=1 TO 5 STEP 2
5704 IF q$(j)<>q$(2) AND q$(j)<>q$(4) THEN GO TO 5710
5706 NEXT j
5710 IF U$(q,23)=" " THEN GO TO 5750
5711 IF j=3 THEN GO TO 5725
5712 IF j=5 THEN GO TO 5735
5714 LET dig=VAL q$(2)
5715 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5720
5716 FOR i=1 TO 5
5717 IF d(i)=VAL q$(2) THEN LET f$(i)="x"
5718 NEXT i
5719 GO TO 5000
5720 LET dig=VAL q$(4)
5721 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5000
5722 FOR i=1 TO 5: IF d(i)=VAL q$(4) THEN LET f$(i)="x"
5723 NEXT i
5724 GO TO 5000
5725 LET dig=VAL q$(1)
5726 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5730
5727 FOR i=1 TO 5
5728 IF d(i)=VAL q$(1) THEN LET f$(i)="x"
5729 NEXT i: GO TO 5000
5730 LET dig=VAL q$(4)
5732 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5000
5733 FOR i=1 TO 5: IF d(i)=VAL q$(4) THEN LET f$(i)="x"
5734 NEXT i: GO TO 5000
5735 LET dig=VAL q$(1)
5736 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5740
5737 GO TO 5727
5740 LET dig=VAL q$(3)
5742 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5000
5744 GO TO 5733
5750 FOR i=1 TO 5
5752 IF d(i)<>VAL q$(j) THEN LET f$(i)="x"
5758 NEXT i
5760 GO TO 5000
5902 LET h$="00000"
5904 FOR i=1 TO 5
5906 LET h$(i)=q$(i)
5908 NEXT i
5910 IF h$="12345" OR h$="23456" OR h$="13456" THEN GO TO 5955
5915 FOR i=1 TO 4
5920 IF q$(i)=q$(i+1) THEN GO TO 5930
5922 NEXT i
5924 GO TO 4000
5930 LET dig=VAL q$(i)
5935 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 4000
5940 FOR j=1 TO 5
5943 IF d(j)=VAL q$(i) THEN LET f$(j)="x"
5946 NEXT j
5950 GO TO 5000
5955 IF U$(q,20 TO 21)<>" " THEN GO TO 5000
5960 GO TO score
6505 BORDER 0: PAPER 5: INK 0: CLS
6510 FOR i=2 TO 3
6515 IF Z(i)>=Z(1) THEN GO TO 6530
6520 NEXT i
6525 LET q=1: GO TO 6700
6530 FOR i=1 TO 3 STEP 2
6535 IF Z(i)>=Z(2) THEN GO TO 6550
6540 NEXT i
6545 LET q=2: GO TO 6700
6550 FOR i=1 TO 2
6555 IF Z(i)>=Z(3) THEN GO TO 6570
6560 NEXT i
6565 LET q=3: GO TO 6700
6570 FOR i=0 TO 7
6575 BORDER i: FLASH 1: PRINT AT 10,10;"DRAW GAME!!!": BEEP .01,5: BEEP .01,10: BEEP .01,15: BEEP .01,20: BEEP .01,25: BEEP .01,30
6580 NEXT i
6585 FLASH 0
6590 GO TO 6605
6600 LET v(q)=PEEK (65000+q)+1
6602 POKE 65000+q,v(q)
6605 BORDER 4: PAPER 4: INK 0: CLS
6610 PRINT AT 5,5;" CURRENT STATISTICS "
6615 FOR i=1 TO 3
6620 PRINT AT 8+(2*i),5;"* ";N$(i);" won ";PEEK (65000+i);" games"
6625 NEXT i
6630 PRINT AT 18,5;"Another Game?"; FLASH 1;" y/n "
6635 IF INKEY$="" THEN GO TO 6635
6636 IF INKEY$=CHR$ 121 THEN GO TO 6639
6637 IF INKEY$="n" THEN STOP
6638 GO TO 6635
6639 PRINT AT 18,5;" ": PAUSE 60
6640 PRINT AT 18,5;"Same Players?"; FLASH 1;"::y/n "
6641 IF INKEY$=CHR$ 121 THEN GO TO 6650
6642 IF INKEY$<>CHR$ 110 THEN GO TO 6640
6643 FOR i=1 TO 3
6644 POKE 65000+i,0
6645 NEXT i
6646 CLEAR
6648 GO TO 9005
6650 CLEAR
6651 DIM N$(3,10)
6652 LET i=1
6653 FOR j=65003 TO 65023 STEP 10: POKE j,i
6654 FOR x=1 TO PEEK (65033+i)
6655 LET N$(i,x TO x)=CHR$ (PEEK (j+x))
6656 NEXT x
6657 LET i=i+1
6658 NEXT j
6660 GO TO 9100
6702 FOR i=0 TO 6
6704 BORDER i: PAPER 4: INK 0: PRINT AT 10,5;" WINNER : "; FLASH 1;N$(q)
6706 FOR x=5 TO 35 STEP 5: BEEP .01,x: NEXT x
6708 NEXT i
6710 GO TO 6600
7002 SOUND 7,56;0,68;1,3;8,15
7003 SOUND 2,151;3,2;9,12
7004 SOUND 4,46;5,2;10,12
7005 BEEP .1,-5: BEEP .1,0: BEEP .1,4: BEEP .1,7: PAUSE 15: BEEP .1,7: BEEP .1,7: BEEP .1,7
7006 BEEP .1,4: PAUSE 15: BEEP .1,4: BEEP .1,4: BEEP .1,4: BEEP .3,0: BEEP .3,4: BEEP .3,0: BEEP 1,-5
7012 SOUND 8,0;9,0;10,0
7099 RETURN
7100 REM Mus2
7102 BEEP .2,14: PAUSE 10: BEEP .1,9: BEEP .1,8: BEEP .1,9: BEEP .3,10: PAUSE 5: BEEP .3,9: PAUSE 15: BEEP .2,13: PAUSE 10: BEEP .3,14
7105 RETURN
7202 IF count>=2 THEN GO TO Pointer
7204 FOR i=1 TO 31 STEP 3
7206 IF U$(q,i TO i+2)=" " THEN GO TO 7210
7208 NEXT i
7210 IF i<=16 THEN GO TO 7230
7212 IF i=19 THEN LET Pointer=7400
7214 IF i=22 THEN LET Pointer=7500
7216 IF i>=25 THEN LET Pointer=7600
7218 GO TO Pointer
7230 LET ONE=i+2
7232 LET Pointer=7300
7300 FOR j=1 TO 5
7301 IF VAL q$(j)=ONE/3 THEN LET tone=tone+1
7302 NEXT j
7303 IF TWO/3>6 THEN GO TO 7312
7304 FOR j=1 TO 5
7305 IF VAL q$(j)=TWO/3 THEN LET ttwo=ttwo+1
7306 NEXT j
7307 IF ttwo<tone THEN GO TO 7312
7308 LET die=TWO/3
7309 LET Pointer=7320
7310 GO TO Pointer
7312 LET die=ONE/3
7313 LET Pointer=7320
7320 FOR i=1 TO 5
7322 IF d(i)=die THEN LET f$(i)="x"
7324 NEXT i
7326 LET tone=0
7328 LET ttwo=0
7330 GO TO 5000
7401 FLASH 1: PRINT AT 18,1;"CPU thinks... ": GO SUB 900
7402 IF h$="12345" OR h$="23456" OR h$="13456" THEN GO TO score
7404 IF count>=2 THEN GO TO 7490
7405 DIM E(3)
7406 FOR i=2 TO 5
7407 IF VAL q$(i)=VAL q$(i-1) THEN LET q$(i-1)="0"
7408 NEXT i
7409 LET fstr=1
7410 FOR j=1 TO 3
7412 FOR x=1 TO 5
7414 FOR i=1 TO 5
7416 IF VAL m$(j,x)=VAL q$(i) THEN LET E(j)=E(j)+1
7418 NEXT i
7420 NEXT x
7422 NEXT j
7430 IF E(1)>=E(2) THEN GO TO 7436
7432 IF E(2)>=E(3) THEN GO TO 7446
7434 GO TO 7438
7436 IF E(1)>=E(3) THEN GO TO 7442
7438 LET ix=3
7440 GO TO 7450
7442 LET ix=1
7444 GO TO 7450
7446 LET ix=2
7450 GO SUB 900
7458 LET find=0
7460 FOR i=1 TO 5
7462 FOR x=1 TO 5
7464 IF q$(i)=m$(ix,x) THEN LET find=1
7466 NEXT x
7468 IF find=0 THEN LET q$(i)="0"
7470 LET find=0
7472 NEXT i
7474 FOR i=1 TO 5
7476 FOR x=1 TO 5
7478 IF d(i)=VAL q$(x) THEN GO TO 7486
7480 NEXT x
7482 NEXT i
7483 FLASH 0: GO SUB 1190
7484 GO TO 5000
7486 LET f$(i)="x"
7487 LET q$(x)="0"
7488 GO TO 7480
7490 FOR i=2 TO 5
7492 IF VAL q$(i)=VAL q$(i-1) THEN LET q$(i-1)="0"
7494 NEXT i
7496 GO TO 7450
7502 IF VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(5) OR VAL q$(1)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN GO TO score
7504 IF VAL q$(1)=VAL q$(3) OR VAL q$(2)=VAL q$(4) OR VAL q$(3)=VAL q$(5) THEN GO TO 7530
7506 IF VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(4) OR VAL q$(1)=VAL q$(2) AND VAL q$(4)=VAL q$(5) OR VAL q$(2)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN GO TO 7540
7510 FOR i=2 TO 5
7512 IF VAL q$(i)=VAL q$(i-1) THEN GO TO 7518
7514 NEXT i
7516 GO TO 5000
7518 FOR j=1 TO 5
7520 IF d(j)=VAL q$(i) THEN LET f$(j)="x"
7522 NEXT j
7524 GO TO 5000
7532 FOR i=1 TO 5
7534 IF d(i)=VAL q$(3) THEN LET f$(i)="x"
7536 NEXT i
7538 GO TO 5000
7542 FOR i=1 TO 5
7544 IF d(i)=VAL q$(2) OR d(i)=VAL q$(4) THEN LET f$(i)="x"
7546 NEXT i
7548 GO TO 5000
7602 IF VAL q$(1)=VAL q$(4) AND U$(q,25 TO 27)=" " THEN GO TO score
7604 IF VAL q$(1)=VAL q$(5) THEN GO TO score
7606 IF VAL q$(1)=VAL q$(3) OR VAL q$(2)=VAL q$(4) OR VAL q$(3)=VAL q$(5) THEN GO TO 7630
7608 IF VAL q$(1)=VAL q$(3) AND VAL q$(4)=VAL q$(5) OR VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(5) THEN LET full=1
7610 IF full=1 AND U$(3,24)=" " THEN GO TO score
7612 FOR i=2 TO 5
7613 IF VAL q$(i)=VAL q$(i-1) THEN GO TO 7618
7614 NEXT i
7616 GO TO 5000
7618 FOR j=1 TO 5
7620 IF d(j)=VAL q$(i) THEN LET f$(j)="x"
7622 NEXT j
7624 GO TO 5000
7632 FOR i=1 TO 5
7634 IF d(i)=VAL q$(3) THEN LET f$(i)="x"
7636 NEXT i
7638 GO TO 5000
7640 FOR i=1 TO 5 STEP 2
7642 IF VAL q$(i)<>VAL q$(2) AND VAL q$(i)<>VAL q$(4) THEN CONTINUE 7648
7644 NEXT i
7648 FOR j=1 TO 5
7650 IF d(j)<>VAL q$(i) THEN LET f$(j)="x"
7652 NEXT j
7654 GO TO 5000
7660 REM Full
7666 IF VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(4) OR VAL q$(1)=VAL q$(2) AND VAL q$(4)=VAL q$(5) OR VAL q$(2)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN GO TO 7640
7668 LET PTR=7600
7670 GO TO PTR
7702 IF count>=2 THEN GO TO PTR
7710 FOR i=3 TO 33 STEP 3
7712 IF U$(3,i)=" " THEN GO TO 7716
7714 NEXT i
7716 LET ONE=i
7718 FOR i=i+3 TO 33 STEP 3
7720 IF U$(3,i)=" " THEN GO TO 7724
7722 NEXT i
7724 LET TWO=i
7730 IF ONE<=18 AND TWO<=18 THEN GO TO 7810
7732 IF ONE<=18 AND TWO>=21 THEN GO TO 7750
7734 IF ONE=21 AND TWO=24 THEN GO TO 7770
7736 IF ONE=21 AND TWO>=27 THEN GO TO 7790
7738 IF ONE=24 THEN GO TO 7660
7740 LET PTR=7600
7742 GO TO PTR
7750 LET ADDER=0
7751 FOR i=1 TO 5
7752 IF VAL q$(i)=ONE/3 THEN LET ADDER=ADDER+1
7753 NEXT i
7754 IF ADDER>=2 THEN GO TO 7810
7756 IF TWO=21 THEN GO TO 7782
7760 FOR i=2 TO 4
7762 IF VAL q$(i)=VAL q$(i-1) AND VAL q$(i)=VAL q$(i+1) THEN GO TO 7768
7764 NEXT i
7766 GO TO 7810
7768 IF TWO=21 THEN LET PTR=7400
7770 IF TWO=24 THEN LET PTR=7500
7772 IF TWO>=27 THEN LET PTR=7600
7774 GO TO PTR
7776 IF VAL q$(1)=VAL q$(2) AND VAL q$3)=VAL q$(0) OR VAL q$(1)=VAL q$(2) AND VAL q$(4)=VAL q$(5) OR VAL q$(2)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN LET PTR=7500
7778 IF PTR<>7500 THEN LET PTR=7400
7780 GO TO PTR
7782 LET PTR=7400
7784 GO TO PTR
7790 FOR i=2 TO 4
7792 IF VAL q$(i)=VAL q$(i-1) AND VAL q$(i)=VAL q$(i+1) THEN GO TO 7800
7794 NEXT i
7796 LET PTR=7400
7798 GO TO PTR
7800 LET PTR=7600
7802 GO TO PTR
7810 LET PTR=7300
7812 GO TO PTR
7999 POKE 23658,0
8000 POKE 23730,232
8001 POKE 23731,253
8002 FOR i=65001 TO 65003
8003 POKE i,0
8004 NEXT i
8005 FOR i=65004 TO 65033
8006 POKE i,32
8007 NEXT i
8900 BORDER 4: PAPER 6: INK 0: CLS
8902 PRINT AT 10,8; FLASH 1;" INITIALIZATION "
8904 PRINT AT 18,3;"(Please wait a few seconds)"
8908 PRINT AT 5,2;"Rel#: 30";AT 5,25;"*1984"
8950 FOR i=65368 TO 65503
8952 READ u
8954 POKE i,u
8956 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,128
8958 DATA 1,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0
8960 DATA 0,0,0,0,48,48,0,0,0,0,12,12,0,0,0,128,1,0,0,0,48,48,0,0
8962 DATA 0,0,48,48,0,0,0,0,0,0,0,0,12,12,0,0,0,0,48,48,0,0,0,1
8964 DATA 128,0,0,0,12,12,0,0,0,0,48,48,0,0,0,48,48,0,0,0,48,48,0,0
8966 DATA 0,0,12,12,0,0,0,12,12,0,0,0,12,12,0,0
8968 NEXT i
9005 BORDER 4: PAPER 4: INK 0
9020 CLS : INVERSE 1: PRINT AT 2,0;"Select desired option2": INVERSE 0
9025 PRINT AT 5,4;"*One Player vs Computer": INVERSE 1: PRINT AT 5,30;"1"
9030 INVERSE 0: PRINT AT 7,4;"*Two Players only": INVERSE 1: PRINT AT 7,30;"2"
9035 INVERSE 0: PRINT AT 9,4;"*Two Players and"
9040 PRINT AT 10,5;"the Computer": INVERSE 1: PRINT AT 10,30;"3"
9045 INVERSE 0: PRINT AT 12,4;"*Three Players only": INVERSE 1: PRINT AT 12,30;"4"
9050 PRINT AT 15,0;"Hit Number Indicated ": INVERSE 0
9052 IF INKEY$="" THEN GO TO 9052
9053 IF INKEY$<CHR$ 49 OR INKEY$>CHR$ 52 THEN GO TO 9052
9055 LET n=VAL INKEY$
9056 POKE 65037,n
9060 PAPER 5: CLS : DIM N$(3,10): PRINT AT 2,0;"Player 1...your name?": INPUT N$(1): PRINT N$(1)
9061 FOR i=1 TO LEN N$(1)
9062 POKE 65003+i,CODE N$(1,i)
9063 NEXT i
9064 POKE 65034,LEN N$(1)
9065 IF n=1 THEN GO TO 9090
9070 PRINT AT 5,0;"Player 2...your name?": INPUT N$(2): PRINT N$(2)
9071 FOR i=1 TO LEN N$(2)
9072 POKE 65013+i,CODE N$(2,i)
9073 NEXT i
9074 POKE 65035,LEN N$(2)
9075 IF n=2 THEN GO TO 9100
9076 IF n=3 THEN GO TO 9090
9080 PRINT AT 8,0;"Player 3...your name?": INPUT N$(3): PRINT N$(3)
9081 FOR i=1 TO LEN N$(3)
9082 POKE 65023+i,CODE N$(3,i)
9083 NEXT i
9084 POKE 65036,LEN N$(3)
9085 PAUSE 120: CLS : GO TO 9100
9090 LET N$(3)="CPU"
9091 POKE 65024,67
9092 POKE 65025,80
9093 POKE 65026,85
9094 POKE 65036,3
9101 DIM t$(4,4): RESTORE 9103
9102 FOR x=1 TO 4
9103 READ w$
9104 LET t$(x)=w$
9105 DATA "1400","1200","1240","1230"
9106 NEXT x
9107 DIM v(3)
9108 LET n=PEEK 65037
9109 FOR i=0 TO 21: INK 1: PRINT AT i,0;"::::::::::::::::::::::::::::::::": NEXT i
9110 FOR i=0 TO 21: INK 0: PRINT AT i,16;"::::::::::::::::::::::::::::::::": NEXT i
9115 PAPER 6: PRINT AT 1,17;"PL1:";N$(1)
9116 IF n=1 THEN GO TO 9120
9117 PRINT AT 2,17;"PL2:";N$(2)
9118 IF n=4 THEN PRINT AT 3,17;"PL3:";N$(3)
9120 PRINT AT 6,20;"PL1";AT 20,20;" ": IF n<>1 THEN PRINT AT 6,24;"PL2";AT 20,24;" "
9125 IF n=1 OR n=3 THEN PRINT AT 6,28;"CPU";AT 20,28;" "
9130 IF n=4 THEN PRINT AT 6,28;"PL3";AT 20,28;" "
9135 LET S$=" 1 2 3 4 5 6STFLPKGLDG"
9140 FOR i=8 TO 18: PRINT AT i,17;S$(i*2-15 TO i*2-14): NEXT i: PRINT AT 20,17;"TL"
9145 FOR i=8 TO 18
9146 PRINT AT i,20;" "
9147 IF n=1 THEN PRINT AT i,28;" "
9148 IF n=2 THEN PRINT AT i,24;" "
9149 IF n>=3 THEN PRINT AT i,24;" ";AT i,28;" "
9150 NEXT i
9155 FOR i=3 TO 16: INK 4: PRINT AT i,1;"::::::::::::::::::::::::::::": NEXT i
9285 DIM U$(3,33)
9290 DIM a$(2,2)
9295 DIM d(5)
9300 LET f$="00000"
9305 INK 0
9310 LET player=3000
9315 LET Throw=1200
9320 LET count=0
9325 LET score=3200
9330 LET k$=" 5 2 8 512 7 8 9 512"
9335 DIM q$(5,1)
9340 LET Rubout=3600
9345 LET Sum=3800
9350 RANDOMIZE 0
9355 LET cpu=5000
9360 LET Seq=3900
9365 LET fl=0
9370 LET End=0
9375 LET Finale=6500
9380 LET Fix=1300
9385 LET Blank=1350
9390 LET o$="07021005140710090712"
9395 DIM Z(3)
9397 DIM Z$(3,3)
9399 LET Total=1500
9405 FLASH 0: GO SUB 1190
9410 DIM m$(3,5)
9415 LET m$(1)="12345"
9420 LET m$(2)="23456"
9425 LET m$(3)="13456"
9430 LET Acc=0
9435 LET Music=7000
9436 LET Mus2=7100
9438 LET full=0
9440 LET fstr=0
9442 LET tone=0
9444 LET ttwo=0
9446 LET flagstr=0
9995 GO TO 1000
9996 STOP
9997 CLEAR : RANDOMIZE USR 100: SAVE "Genrla.B1" LINE 1
9998 CLEAR : RANDOMIZE USR 100: LOAD "L.B1"Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


