This program implements a full Scrabble board game for up to four human players or up to three humans against the computer. The board is rendered on screen with color-coded bonus squares (double/triple letter and word scores) drawn using PRINT AT and PLOT/DRAW commands, with player tile racks and scores displayed on the right side. The computer opponent uses randomized letter selection and anagram generation (lines 175–245) to form words from its rack. Notable BASIC techniques include extensive use of DEF FN for attribute checking, string manipulation, and scoring (functions B, C$, D$, E, F, F$, m), as well as encoding board square attributes and tile values in DATA strings where character codes carry positional information. The tile bag, letter frequencies, and point values are stored as strings in lines 7010–7020 and a lookup string at line 7010, with scoring computed by indexing into the value string by letter code.
Program Analysis
Program Structure
The program is organized into clearly labeled subroutine blocks, as documented in the REM statements at lines 5–7:
- Lines 7000–7080: Variable and data initialization
- Lines 7500–7640: Intro screen with animated PLOT/DRAW title graphics
- Lines 7900–8140: Player name entry (up to 4 humans, or 3 humans + computer)
- Lines 8500–8765: Order-of-play determination (optional letter draw)
- Lines 8800–9200: Board setup, drawing bonus squares, dealing initial tiles
- Lines 1000–1100: Main game loop iterating over players
- Lines 1500–1900: Human player turn logic (pass, discard, word entry)
- Lines 2200–2880: Word placement, validation, and scoring on the board
- Lines 3000–3200: Computer opponent stub/helper (line 3200 is just RETURN)
- Lines 9500–9997: End-of-game scoring, winner announcement, multi-game totals
The main game loop at line 1000 iterates i from 1 to nn (number of players). The variable ic holds the computer player’s index; human turns branch to subroutine 1500, computer turns to subroutine 3200.
Variable Conventions
Two constants are established at initialization for readability and compactness:
y = SGN PI= 1 (used everywhere as the integer 1)z = NOT PI= 0 (used everywhere as the integer 0)
This is a common memory-saving idiom: assigning frequently used literal values to single-letter variables avoids the overhead of storing repeated numeric literals in tokenized BASIC.
DEF FN Usage
The program defines seven functions covering a range of utility operations:
| Function | Purpose |
|---|---|
FN F(t,x,a,b) | Conditional tile score multiplier based on square attribute |
FN F$(x$,t) | Returns letter string once or twice depending on multiplier type |
FN E(a,x,b) | Computes run length for cross-word checking along a direction |
FN B(x$,y$) | Tests if character x$ appears in string y$; returns y (1) or 0 |
FN C$(x) | Returns “row” or “column” string based on orientation flag |
FN D$(x$,a) | Deletes character at position a from string x$ (used to remove drawn tiles) |
FN m(a,b) | Returns minimum of two values: a+(b-a AND a>b) |
Tile Bag and Scoring
The tile bag is built in g$ at line 7020 as a literal string containing all 100 Scrabble tiles in the correct distribution. The letter point values are encoded in l$ at line 7010 as a 26-character string of digit characters indexed by letter code (CODE k$(k)-64 gives the offset into l$). The character "9" in the value string is treated as 10 points (line 275: VAL l$(t)+(l$(t)="9")), covering Q and Z. The blank tile is represented as "*".
Board Drawing and Bonus Squares
The 15×15 board grid is drawn at lines 9060–9085 using PLOT/DRAW for grid lines and PRINT AT for column and row labels. Bonus square positions are stored in four DATA strings at line 5100, with each pair of characters encoding a row and column via CODE c$(f)-61. Four bonus types are drawn with distinct INK/PAPER color combinations: double letter, double word, triple letter, triple word.
Word Placement and Validation
When a human enters a word (line 1700), subroutine 1850 strips letters from the player’s rack string, matching character by character. Placement is handled by subroutine 2200, which walks the board using GO SUB 90 to read ATTR and SCREEN$ at each cell. Existing tiles (attribute < 40 indicating non-paper-5 cells) are treated as pre-placed board tiles and skipped over. The program validates that the first word touches the center square H,H by checking SCREEN$ (11,11) for the character “2” at line 2300. Cross-word scoring is performed in subroutine 2500, which scans perpendicular to the played word for each newly placed letter.
Computer Opponent
The computer’s tile selection during the draw phase uses RANDOMIZE 500*(gg+nn+i) for a seeded random draw. The anagram-generation routine at lines 175–245 builds candidate words by randomly sampling subsets of the computer’s rack letters (iterating word lengths 3 to 6), checking each against a scoring threshold stored in array e(). In the current listing, subroutine 3200 (the actual computer play logic) consists only of RETURN at line 3200, meaning the computer player draws tiles but does not place words — this is either a stub or the play AI was omitted from this version.
Screen I/O Idioms
The GO SUB 500 / GO SUB 600 display subsystem handles all prompts. Line 500 prints a status bar and the current prompt i$, then calls BEEP and branches on b to one of several wait modes: b=0 waits 90 frames (PAUSE 90), b=1 calls the keypress reader (600), b=2 also checks for pass, b=3 reads h/v orientation, and b=4 reads a board coordinate. Subroutine 600 cycles through an 18-iteration loop showing alternating score/value displays, polling INKEY$ continuously for human input or bypassing to line 690 for the computer.
Multi-Game Score Tracking
The variable gg counts games played. Scores are accumulated in array t(4,10) (up to 4 players, 10 games) and totaled in u(4). The end-of-game display at lines 9760–9890 prints a tabular scoreboard with per-game and cumulative totals. Player ordering between games is preserved via name matching between p$() (play order) and e$() (entry order).
Notable Anomalies
- The computer name is hardcoded as
"T/S2068"at line 8130, identifying the intended platform. FN Bat line 70 referencesy$(2)throughy$(7)— sincey$is a string variable, this uses substring notation to check individual characters of the passed string argument, which is valid as long as the string is at least 7 characters long. The search strings passed (“AEIOUY ” and “JQXZ* “) are exactly 7 characters.- Line 80 defines
FN mafter the program has already jumped toGO TO 1000at line 75, so allDEF FNstatements are executed only once during initialization viaGO SUB 8800at line 50, before the jump at line 75. - The 50-point bonus for playing all 7 tiles (a “bingo”) is awarded at line 2460:
s(i)=s(i)+s+50*(LEN u$=7).
Content
Source Code
5 REM 4/16/85 Tape Name scrabble; by John Leary
6 REM subroutines; 7000 vars; 7500 intro; 7900 player names
7 REM 8500 order of play; 8900 start game
10 GO SUB 7000: GO SUB 7500: GO SUB 7900
40 GO SUB 8500
50 GO SUB 8800: DEF FN F(t,x,a,b)=t+(t AND x=a)+(2*t AND x=b): DEF FN F$(x$,t)=(x$ AND t=2)+(x$+x$ AND t=3): DEF FN E(a,x,b)=a*(x=z)+b*(x=y)-4
70 DEF FN B(x$,y$)=(y AND (x$=y$(y) OR x$=y$(2) OR x$=y$(3) OR x$=y$(4) OR x$=y$(5) OR x$=y$(6) OR x$=y$(7)))
75 DEF FN C$(x)=("row" AND x=z)+("column" AND x<>z): DEF FN D$(x$,a)=x$( TO a-y)+x$(a+y TO ): GO TO 1000
80 DEF FN m(a,b)=a+(b-a AND a>b)
90 LET x=ATTR (q,p): LET x=x-128*(x=168): LET y$=SCREEN$ (q,p): LET y$=y$+("\e" AND y$=""): RETURN
100 LET b=y: GO SUB 400: LET j$=j$+"!": LET x=x1: IF i=ic THEN FOR j=y TO 3: LET a$(4+j)="": NEXT j
105 FOR j=y TO x1: LET b$=("s" AND x>y)+("" AND x=y)
110 IF i<>ic THEN LET i$="Choose "+STR$ x+(" more" AND x<x1)+" letter"+b$+(" by typing any key" AND x=x1)+"."
115 IF i=ic THEN LET i$="My turn. I will choose "+STR$ x+(" more" AND x<>x1)+" letter"+b$+"."
120 GO SUB 300: GO SUB 500: PRINT AT 4,z;ll;" ": LET v=LEN v$
125 FOR k=y TO v: IF q$>v$(k) THEN GO TO 135
130 LET v$=v$( TO k-y)+q$+v$(k TO ): GO TO 145+(5 AND i<>ic)
135 NEXT k: LET v$=v$+q$
140 IF i<>ic THEN GO TO 150
145 LET a$(6)=(q$ AND FN B(q$,"AEIOUY ")=y)+a$(6): LET a$(5)=(q$ AND FN B(q$,"JQXZ* ")=z)+a$(5): LET a$(7)=(q$ AND (q$="*" OR q$="S"))+a$(7)
150 LET x=x-y: PRINT PAPER 5;AT y+g*i,21;v$: NEXT j: LET a$(i)=v$: IF i<>ic THEN RETURN
175 DIM e(20): LET j$=a$(5): GO SUB 410
190 FOR j=3 TO FN m(6,LEN j$): LET x=5*j-14: FOR l=y TO 3*(8-j): LET k$="": FOR e=y TO j
195 LET v(e)=y+INT (RND*LEN j$): FOR f=y TO e-y: IF v(f)=v(e) THEN GO TO 195
200 NEXT f: NEXT e
205 FOR e=y TO j: LET k$=k$+j$(v(e)): NEXT e: GO SUB 260
210 FOR e=x TO x+4: IF e(e)=s THEN GO TO 240
215 IF e(e)>s THEN GO TO 230
220 IF e(e)<s THEN IF e(e)=z THEN LET e(e)=s: GO TO 240
225 FOR f=4+x TO e+y STEP -y: LET e(f)=e(f-y): NEXT f: LET e(e)=s: GO TO 235
230 NEXT e: IF e(20)<>z THEN RETURN
235 IF e(x+4)<>z THEN GO TO 245
240 NEXT l
245 NEXT j: RETURN
250 IF xx>z THEN GO TO 260
255 LET b=y: LET i$=k$: GO SUB 500: LET b=z
260 LET s=z: FOR k=y TO LEN k$: LET t=y+(CODE k$(k)-64)*("@"<k$(k) AND k$(k)<"[")
275 LET s=s+VAL l$(t)+(l$(t)="9"): NEXT k: RETURN
300 RANDOMIZE : LET ll=LEN g$: LET u=y+INT (RND*ll): LET q$=g$(u): LET g$=FN D$(g$,u): LET ll=ll-y: RETURN
400 LET j$=p$(i): GO TO 410
405 LET j$=a$(i)
410 FOR k=LEN j$ TO y STEP -y: IF j$(k)=" " THEN LET j$=j$( TO k-y)
420 NEXT k: RETURN
500 PRINT AT 19,z;o$+o$+o$+o$+o$+o$: IF j$="" THEN PRINT AT 19,0;i$
510 IF j$<>"" THEN PRINT AT 19,z;j$'i$
520 BEEP .2,12: GO TO 530+10*b
530 PAUSE 90: RETURN
540 GO SUB 600: RETURN
550 GO SUB 600: IF n$="p" THEN LET r=r+y
555 RETURN
560 GO SUB 600: LET h=(y AND n$="h"): LET v=y-h: RETURN
570 GO SUB 600: LET e(j)=CODE n$-93: RETURN
600 IF xx=y THEN GO TO 660
605 PRINT FLASH y;AT g*i,21;"\::"
610 FOR l=y TO 18: PAUSE 35
620 GO TO 650-(20 AND l=y)-(5 AND l=10)
630 PRINT INK 2;AT y,y;" 2 double letter 2 double word"'; INK y;" 3 triple letter 3 triple word": INK z: GO TO 650
645 PRINT AT y,y;m$+" "+l$+" "
650 IF i=ic THEN GO TO 690
660 LET n$=INKEY$: IF n$<>"" THEN GO TO 690
670 IF xx=y THEN GO TO 660
680 NEXT l: GO TO 610
690 PRINT AT g*i,21;" ": RETURN
900 INPUT "Press enter to continue";j$: RETURN
1000 LET r1=z: FOR i=y TO nn: IF i=ic THEN GO SUB 3200: LET lw=z
1010 IF i<>ic THEN GO SUB 1500
1020 LET a$(i)=v$: PRINT AT 2+g*i,27;s(i); PAPER 5;AT y+g*i,21;a$(i): LET v=LEN v$: LET x1=FN m(ll,7-v)
1055 IF r=nn OR v+ll=z THEN LET xx=y: GO TO 9500
1060 IF v<7 AND ll>z THEN GO SUB 100
1100 NEXT i: GO TO 1000
1500 LET v$=a$(i): LET b=2: GO SUB 400: LET j$=j$+"!": LET i$="Your turn. To pass, type p. To play, type any other key."
1505 LET r1=r: GO SUB 500: IF r=r1 THEN GO TO 1550
1507 IF r=nn OR ll=z THEN RETURN
1510 INPUT "Enter the letters you want to discard. If all, enter ""7""; if none just press enter.";u$: IF u$="" THEN RETURN
1515 IF u$="7" THEN LET g$=g$+a$(i): LET v$="": RETURN
1520 GO SUB 1850: LET g$=g$+j$: RETURN
1550 LET j$="": LET b=3: LET r=z: LET i$="If your word is horizontal, typeh; if vertical, type v."
1560 GO SUB 500: IF h<2 THEN GO TO 1600
1580 LET b=z: LET i$="You must type h or v!": GO SUB 500: GO TO 1550
1600 FOR j=y TO 2: LET b$=("left" AND j=y)+("top" AND j=2): LET c$=FN C$(j-y)
1620 LET b=4: LET i$="Type the letter at the "+b$+" of the "+c$+" in which your first letter goes.": GO SUB 500
1640 IF e(j)>3 AND e(j)<19 THEN GO TO 1680
1660 LET b=z: LET i$=c$+"s A to O only": GO SUB 500: GO TO 1620
1680 NEXT j: LET q=e(y): LET p=e(2): LET b=z: GO SUB 400
1700 INPUT "Enter your letters. Use SYMBL SHIFT B for a blank.";u$: LET b=z
1735 IF xx>z AND LEN u$<2 THEN LET i$="The first word must contain at least two letters! Start over.": GO SUB 500: GO TO 1500
1740 GO SUB 1850: IF n>LEN u$ THEN GO TO 1800
1790 GO SUB 400: LET i$=u$(n)+" is not on your list! Choose another word.": GO SUB 500: GO TO 1500
1800 GO SUB 2200: LET b=y: RETURN
1850 LET j$=a$(i): GO SUB 405: LET v$=j$: LET j$=""
1860 FOR n=y TO LEN u$: IF u$(n)>"Z" THEN LET u$(n)=CHR$ (CODE u$(n)-32)
1870 LET t=LEN v$: FOR l=y TO t: IF u$(n)=v$(l) THEN LET v$=FN D$(v$,l): LET j$=j$+u$(n): GO TO 1890
1880 NEXT l: IF r=r1 AND i<>ic THEN RETURN
1890 IF u$(n)="*" AND r=r1 AND i<>ic THEN INPUT "Enter the letter your * stands for!";u$(n)
1900 NEXT n: RETURN
2200 LET u=LEN u$: LET t=y: LET hm=y: LET p0=p: LET q0=q
2210 LET k$=u$: LET c$="": LET s$="": LET w$="": LET x$=""
2220 FOR j=y TO u: IF p=19 OR q=19 THEN GO TO 2400
2240 GO SUB 90: LET x$=x$+STR$ x: LET s$=s$+y$: IF x<>40 THEN GO TO 2270
2250 LET hm=z: IF j>y THEN LET w$=w$+y$
2260 LET p=p+h: LET q=q+v: GO TO 2240
2270 LET z$=u$(j): PRINT PAPER 5; FLASH y;AT q,p;z$
2280 IF ATTR (q-h,p-v)=40 OR ATTR (q+h,p+v)=40 THEN LET hm=z
2290 LET p=p+h: LET q=q+v: NEXT j
2295 IF ATTR (q0-v,p0-h)=40 OR ATTR (q,p)=40 THEN LET hm=z
2300 IF SCREEN$ (11,11)<>"2" THEN GO TO 2330
2320 LET i$="The first word must include the center square (H,H). Start over.": GO SUB 500: GO TO 2425
2330 IF hm=z OR xx=7 THEN GO TO 2445
2340 LET i$="Your word must join the others! Start over.": GO SUB 500: GO TO 2425
2400 LET i$="Not enough room in "+FN C$(v)+"! Try again.": GO SUB 500
2425 FOR k=y TO LEN s$: LET x=VAL x$(2*k-y TO 2*k): LET x1=INT (x/8): PRINT INK x-8*x1; PAPER x1;AT q0+v*k-v,p0+h*k-h;s$(k)
2440 NEXT k: LET fm=(f+lw AND i=ic): LET em=(e AND i=ic): GO TO 1500+(i=ic)*1750
2445 LET j$="": IF i=ic THEN LET i$="Anyone object to my word? "+f$: GO SUB 500: GO SUB 2500
2450 IF i<>ic THEN LET i$="Position or spelling wrong? Cha-nge your mind? "+f$: GO SUB 500: GO SUB 2500
2455 GO TO 2460-5*(INKEY$="")-35*(INKEY$="y")
2460 LET xx=z: GO SUB 250: LET s(i)=s(i)+s+50*(LEN u$=7): LET x$=""
2475 FOR j=y TO LEN s$: LET q=q0+v*j-v: LET p=p0+h*j-h: IF ATTR (q,p)<59 THEN GO TO 2490
2480 LET x$=SCREEN$ (q,p): PRINT PAPER 5; FLASH z;AT q,p;x$: IF FN B(x$,"AEIOUY ")=y THEN LET r$=r$+CHR$ (q+61)+CHR$ (p+61)
2490 NEXT j: RETURN
2500 LET s1=z: LET p=p0: LET q=q0: FOR j=y TO LEN s$
2510 IF ATTR (q,p)<128 THEN GO TO 2650
2520 LET t1=y: LET t0=y: LET z$=SCREEN$ (q,p): IF j>s1 THEN LET s1=15: LET a=-y: LET s=FN E(p,v,q): GO SUB 2800
2540 LET b$="": LET s=VAL x$(2*j-y TO 2*j): IF s<>56 THEN LET t0=FN F(y,s,23,15): LET t=t*t0: LET t1=FN F(y,s,58,57)
2550 LET p1=p: LET q1=q: LET hm=FN E(p,h,q): FOR l=-y TO y STEP 2: FOR k=y TO hm
2560 LET p=p1+v*l*k: LET q=q1+h*l*k: GO SUB 90: IF x<>40 THEN GO TO 2580
2570 LET b$=(b$+y$ AND l=y)+(y$+b$ AND l=-y): NEXT k
2580 LET hm=14-hm: NEXT l: LET p=p1: LET q=q1: IF lw<>z THEN RETURN
2600 LET n$=FN F$(z$,t1): LET k$=k$+n$: IF b$<>"" THEN LET b$=b$+z$+n$
2610 LET b$=b$+FN F$(b$,t0): LET c$=c$+b$
2650 LET p=p+h: LET q=q+v: NEXT j
2660 LET a=y: LET p=p-h: LET q=q-v: LET s=14-FN E(p,v,q): GO SUB 2800
2670 IF u+LEN w$=y THEN GO TO 2690
2680 LET k$=k$+w$: LET n$=k$: FOR k=y TO t-y: LET k$=k$+n$: NEXT k: GO TO 2700
2690 IF xx=7 THEN LET k$=z$+z$
2700 LET k$=k$+c$: RETURN
2800 LET p1=p: LET q1=q
2820 FOR k=y TO s: LET p=p1+a*h*k: LET q=q1+a*v*k: GO SUB 90: IF x<>40 THEN GO TO 2880
2840 LET w$=w$+y$: NEXT k
2880 LET p=p1: LET q=q1: RETURN
3000 FOR f=y TO lw: IF ATTR (q3-f*v,p3-f*h)=40 THEN GO TO 3015
3010 NEXT f
3015 FOR j=y TO lw: IF ATTR (q3+j*v,p3+j*h)=40 THEN GO TO 3050
3020 NEXT j
3050 LET s1=f: LET s2=j: RETURN
3200 RETURN
5100 DATA "ADALCGCIDADHDOGCGGGIGMHDHLICIGIIIMLALHLOMGMIODOL","BBCCDDEEHHKKLLMMNNBNCMDLEKKELDMCNB","BFBJFBFFFJFNJBJFJJJNNFNJ","AAAHAOHAHOOAOHOO"
5200 DATA 13,6,z,"QUEASYZEALOT"
7000 RESTORE : LET y=SGN PI: LET z=NOT PI: LET lw=z: LET r=z: LET ll=7: LET xx=y: LET x1=7: LET b$=""
7005 LET r$="": LET u$="": LET h$="": LET f$=" If yes, type Y; if no, type any other key.": LET o$=" "
7010 LET m$="*ABCDEFGHIJKLMNOPQRSTUVWXYZ": LET l$="013321424185131139111144849"
7020 LET g$=m$+"*AAAAAAAABCDDDEEEEEEEEEEEFGGHIIIIIIIILLLMNNNNNOOOOOOOPRRRRRSSSTTTTTUUUVWY"
7050 DIM v(6): DIM s(4): DIM e(20): DIM a$(7,7)
7080 FOR j=z TO 6: POKE USR "e"+j,128: NEXT j: POKE USR "e"+7,255: RETURN
7500 GO SUB 7600: PRINT AT 10,12;"SCRABBLE": PAUSE 500: BORDER 5: PAPER 5: INK z: CLS
7520 PRINT AT 6,z;"We play on the TV screen. Type your words on the keyboard. Fol-low the prompts on the screen."''
7525 PRINT "I can play up to 3 human oppon-ents. Or up to 4 people can playeach other while I keep score."''
7530 PRINT "If a prompt uses ""enter"", you must press enter after typing your response."''
7540 PRINT "Before ""entering"", you can cor- rect errors by using CAPS SHIFT 0.": GO SUB 900: RETURN
7600 BORDER 7: PAPER 7: CLS : LET u=y: INK y+RND: FOR i=y TO 2: FOR j=z TO 252 STEP 2: PLOT 128,88: DRAW u*(j-126),-86*u: NEXT j
7640 FOR j=z TO 173 STEP 2: PLOT 128,88: DRAW 126*u,u*(j-86): NEXT j: LET u=-u: NEXT i: RETURN
7900 CLS : DIM p$(4,8): DIM e$(4,8): DIM t(4,10): DIM u(4): LET j$="": LET b=y: LET gg=y: FOR i=y TO 4
7920 BEEP .2,12: INPUT "HUMANS! Enter your names (up to 7 letters). When all are named, press enter to proceed.";e$(i)
8000 IF e$(i,y)=" " THEN GO TO 8120
8040 LET p$(i)=e$(i): PRINT e$(i): IF e$(i,8)=" " THEN GO TO 8080
8060 PRINT "name too long!": GO TO 7920
8080 NEXT i
8120 LET nh=i-y: LET g=8-nh: IF nh>y AND nh<4 THEN LET i$="Do you want me to play? "+f$: GO SUB 500
8130 LET nn=nh+(y AND nh=y OR INKEY$="y"): IF nn<>nh THEN LET e$(nn)="T/S2068": LET p$(nn)=e$(nn)
8140 LET g=8-nn: RETURN
8500 PAUSE 90: CLS : LET i$="Want to draw letters to see who goes first? "+f$
8520 LET ic=nn*(nn<>nh): GO SUB 500: IF INKEY$<>"y" THEN CLS : GO TO 8760
8540 FOR i=y TO nn: GO SUB 400: RANDOMIZE 500*(gg+nn+i)
8560 GO SUB 300: IF i<>ic THEN LET j$=j$+"!": LET i$="Type any key to choose a letter."
8565 IF i=ic THEN LET j$="": LET b=z: LET i$="My turn to choose."
8580 GO SUB 500: LET e(i)=CODE q$: GO SUB 400: PRINT AT 4+i,5;j$+" chose "+q$+"."
8620 FOR j=y TO LEN b$: IF q$=b$(j) THEN LET g$=g$+b$: GO TO 8700
8640 NEXT j: LET b$=b$+q$: NEXT i: LET g$=g$+b$: PRINT AT 19,z;o$+o$+o$+o$: GO TO 8730
8700 LET b=y: BEEP .2,12: PRINT "There is a tie. Draw again!": LET b$="": PAUSE 150: CLS : GO TO 8540
8730 FOR i=y TO nn: LET x=y+(e(i)<e(y))+(e(i)<e(2))+(e(i)<e(3))+(e(i)<e(4))
8750 LET p$(x)=e$(i): LET ic=x*(i=nn AND nn<>nh): NEXT i
8760 FOR i=y TO nn: GO SUB 400: PRINT AT 9+i,5;j$+" is "+("1st" AND i=y)+("2nd" AND i=2)+("3rd" AND i=3)+("4th" AND i=4)+"."
8765 NEXT i: GO SUB 900: RETURN
8800 LET xx=7: CLS : PRINT AT 8,7;"GAME ";gg;" STARTS NOW"''
8820 PRINT "Player's letters and scores are shown on the right. Prompts app-ear at the bottom."''
8840 PRINT "Lists of letter values and bonussquares alternate at the top."''
8850 PRINT "A ""*"" (SYMBL SHIFT B) is a blank-it can be used for any letter.": GO SUB 900: PAPER 7: CLS
9060 PRINT AT PI,4;m$(2 TO 16): FOR m=y TO 15: PRINT AT 3+m,3;m$(m+y): NEXT m: FOR n=z TO 15
9085 PLOT 32,144-8*n: DRAW 120,z: PLOT 32+8*n,144: DRAW z,-120: NEXT n: FOR e=y TO 4: READ c$: FOR f=y TO LEN c$ STEP 2
9120 PRINT INK 7-5*(e=y)-6*(e=3); PAPER 7-5*(e=2)-6*(e=4);AT CODE c$(f)-61,CODE c$(f+y)-61;2+(e>2): NEXT f: NEXT e
9200 INK z: PAPER 7: FOR i=y TO nn: PRINT AT g*i,22;p$(i);AT 2+g*i,21;"Score": LET v$="": GO SUB 100: NEXT i: RETURN
9500 LET t=z: LET w$="": LET b=z: IF v+ll=z THEN GO TO 9540
9520 LET i$="You each passed. Deduct unused letters from your scores.": GO SUB 500: GO TO 9560
9540 GO SUB 400: LET j$=j$+"! You're out of letters.": LET i$="Others deduct unused letters, and add them to your score."
9550 GO SUB 500: LET t=i: LET w$=a$(y)+a$(2)+a$(3)+a$(4): LET s(t)=-s(t)
9560 LET u$="": FOR i=y TO nn: LET s(i)=-s(i): LET k$=a$(i)+(w$ AND i=t): GO SUB 260: LET s(i)=s(i)+s: IF i<>t THEN LET s(i)=-s(i)
9570 PRINT AT 2+g*i,27;s(i);" ": BEEP .2,12: NEXT i
9580 GO SUB 900: LET h=z: LET z$="": FOR i=y TO nn: FOR j=y TO nn: IF s(i)<s(j) THEN GO TO 9700
9680 NEXT j: GO SUB 400: LET t=s(i): LET x$=(" and " AND h=y)+(", " AND h>y): LET h=h+y: LET z$=j$+x$+z$
9700 NEXT i: IF h=nn THEN GO TO 9750
9720 LET j$=("GREAT GAME, " AND t*nn>600)+("Good game, " AND t*nn>400 AND t*nn<=600)+z$+"!": LET i$="You win with a score of "+STR$ t+".": GO SUB 500: GO TO 9760
9750 LET j$="": LET i$="There's a "+STR$ h+"-way tie. Nobody wins!": GO SUB 500
9760 GO SUB 900: LET b=y: CLS : BORDER 6: PRINT AT 2,2;"Score thru Game ";gg;AT 4,z;"Game";AT 8+gg,z;"Total"
9820 FOR j=y TO gg: PRINT AT 6+j,4-LEN STR$ j;j: NEXT j
9840 FOR j=y TO nn: LET r=2+7*j: FOR i=y TO nn: IF p$(i)<>e$(j) THEN GO TO 9890
9860 LET t(j,gg)=s(i): GO SUB 400: PRINT AT 4+(j/2<>INT (j/2)),r+2-LEN j$;j$
9880 FOR k=y TO gg: PRINT AT 6+k,r-LEN STR$ t(j,k);t(j,k): NEXT k
9890 NEXT i: LET u(j)=u(j)+t(j,gg): PRINT " __________________________";AT 8+gg,r-LEN STR$ u(j);u(j): NEXT j
9900 FOR i=y TO nn: LET p$(i)=e$(i): NEXT i: LET gg=gg+y: GO SUB 900: BORDER 5
9920 LET i$="Want to play again?"+f$: GO SUB 500: IF INKEY$<>"y" AND INKEY$<>"Y" THEN GO TO 9990
9930 LET i$="Same players?"+f$: GO SUB 500: IF INKEY$<>"y" AND INKEY$<>"Y" THEN RUN
9940 GO SUB 7000: LET i$="Same order of play?"+f$: GO SUB 500: IF INKEY$="y" OR INKEY$="Y" THEN GO TO 50
9970 GO TO 40
9990 GO SUB 7600: PRINT AT 10,8;"PLAY AGAIN SOON"
9997 STOP
9998 CLEAR : SAVE "SCRABBLE" LINE 10
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


