KARTIK is a computerised referee and scorekeeper for a two-to-eight-player crossword board game. The program manages a 6×6 board stored in a two-dimensional array, a 60-card letter deck with fractional encoding to carry both letter identity and point value in a single floating-point number, and per-player hand tracking. Word scoring validates up to four directions (across, diagonal-up, diagonal-down, and straight down) by mapping each entered word back onto the board coordinates relative to the card just played. A special “Star” wildcard card is tracked separately, requiring the player to nominate a letter each turn, with its board representation updated accordingly.
Program Structure
The code is organised as a main loop with numbered subroutine blocks:
- Lines 10–99: Constants, array declarations
- Lines 100–465: Main game loop — setup, play, end-of-game detection, rematch
- Lines 1000–1099: Title/splash screen
- Lines 1100–1199: Rules display (paged)
- Lines 1300–1499: Options, name entry, card dealing
- Lines 1500–1599: Card placement input handler
- Lines 1600–1699: Full board redraw
- Lines 1700–1865: Star-card letter assignment and validation
- Lines 1900–1949: Single-cell display routine
- Lines 2000–2099: Board frame draw
- Lines 2100–2299: Per-turn display and card reveal
- Lines 2300–2499: Word entry and challenge loop
- Lines 2500–2738: Word scoring and board-match validation
- Lines 2800–2899: Winner determination
- Lines 2900–2958: Display helpers
- Lines 3000–3099: End-of-game score table
- Lines 5000–5010: SAVE and restart
Symbolic Constant Initialisation
Because the ZX81/TS1000 has no named constants, lines 30–56 build all frequently used integer values arithmetically from O=0 and V=NOT O (i.e. 1). This avoids embedding raw literals that would each cost extra memory and makes the intent self-documenting to an extent:
| Variable | Value | Derivation |
|---|---|---|
O | 0 | explicit |
V | 1 | NOT 0 |
T | 2 | V+V |
U | 3 | T+V |
F | 4 | T+T |
G | 6 | U+U |
N | 9 | G+U |
E | 15 | G+N |
A | 14 | E-V |
R | 16 | E+V |
Z | 20 | R+F |
M | 60 | U*Z |
Q | 64 | M+F |
H | 128 | Q+Q |
M=60 is the deck size; Q=64 and H=128 are ASCII/character-code thresholds used to distinguish card colours (red vs. black) via the fractional encoding scheme.
Card Encoding Scheme
Each of the 60 cards is stored as a single floating-point number in the D() array. The integer part encodes the letter (as its character code, optionally offset by 128 for red cards), and the fractional part encodes the point score. Specifically, line 1434 sets D(J)=S+VAL P$(K)/R where S is the character code and R=16, so scores 1–4 map to fractions 0.0625, 0.125, 0.1875, 0.25. The score is later recovered at line 2170: LET S=R*(D(K)-INT D(K)). Red cards have character codes above Q (64); the star card is detected specially.
The same encoding is used in the board array B(), allowing a single cell to carry colour, letter, and score simultaneously.
Board Display
Subroutine 1900 displays a single cell using PRINT AT with the formula AT U*X-T, U*Y+N+T (where U=3), giving each cell a 3-column-wide slot. Red cards print an inverse-video prefix character (character code T*F*C = 2*4*C = 8*C, selecting the inverse space when C=1). The board frame is drawn once at line 2000 using embedded block-graphics characters and row/column labels.
Word Scoring and Validation (lines 2500–2738)
The scoring subroutine checks whether a player-typed word matches the board in one of four directions (encoded in W: 1=across, 2=diag-up, 3=diag-down, 4=down). It first scans the word string for the character matching the current card (B(X,Y)), establishing the card’s position K within the word. It then walks backward from K and forward to L verifying each character against B() at the appropriate board coordinates. The direction offset logic uses the idiom (W=T)-(W=U) (i.e. +1 for diagonal-up, -1 for diagonal-down) to compute the row delta per column step.
Hand and Deck Management
The two-dimensional array S(player, column) tracks per-player state:
S(I,1): cards remaining in handS(I,2): score for current gameS(I,3): (unused directly in display; reserved)S(I,4): card currently placed (substitution candidate)
Cards in each player’s hand occupy a contiguous segment of D(): player I‘s top card is at index PX*I - S(I,1) + 1 (line 2155). When a substitution is made, the displaced card is appended to the bottom of the hand or discarded depending on colour (lines 325–340).
Star Card Handling
The star card (C$="*") requires the player to nominate a letter each time it is played or lands in a new word. Subroutine 1700 handles both the initial placement case and subsequent turns where the star is already on the board (lines 1785–1799). A second flag SF tracks whether the star is currently on the board. The star’s board value is stored as CODE X$ + V/R, a non-integer that distinguishes it from ordinary cards while its display character (uppercase letter + 128 for red) is shown in inverse video.
Dealing Algorithm
Lines 1415–1435 implement a rejection-sampling shuffle: for each of the 60 positions in the deck string D$, a random index J is chosen uniformly and retried until an empty slot is found. This is a classic occupancy shuffle, O(n log n) average, appropriate for small n=60.
Notable Idioms and Techniques
SLOW/FASTused deliberately: slow mode for text I/O, fast mode for computation-heavy sections like dealing and board drawing.FOR I=V TO LEN X$loops scanning strings, withLET I=LEN X$as a break idiom.PRINT AT Z+V,O;" ... "followed byPRINT AT Z+V,O;is used to clear a status line before redisplaying, rather thanCLS.- The block-graphic characters in the title screen (line 1010–1030) spell out “KARTIK” in large pixel-font style using Spectrum block graphics.
- Line 1330 computes
PX(cards per player) with special-case corrections for 5 and 7 players:PX=(Q-R+T*(P=F+V)+(P=G+V))/P= (48 + 2*(P=5) + 1*(P=7))/P, giving 10/9/8/7/10/7/7 for 2–8 players respectively, matching the rules text.
Content
Source Code
10 REM ***** KARTIK (TM) *****
12 REM *** A WORD GAME FOR ***
14 REM *** 2 TO 8 PLAYERS ****
16 REM ** PROGRAM COPYRIGHT **
18 REM ***** (C) 1984 BY *****
20 REM * WILLCOCKS RESEARCH **
22 REM ***** CONSULTANTS *****
25 REM *VERSION 1.02 12/05/84*
30 LET O=0
32 LET V=NOT O
34 LET T=V+V
36 LET U=T+V
38 LET F=T+T
40 LET G=U+U
42 LET N=G+U
44 LET E=G+N
46 LET A=E-V
48 LET R=E+V
50 LET Z=R+F
52 LET M=U*Z
54 LET Q=M+F
56 LET H=Q+Q
60 DIM Y$(V)
65 DIM B(G,G)
70 DIM D(M)
75 DIM S(G+T,F)
85 DIM W$(F,F+G)
90 DIM W(F)
95 DIM N$(G+T,N+V)
100 RAND
110 LET CP=V
120 LET EF=O
130 LET D$="AAA%ABB%BCC%CDDEEE%EFFGGHHII%IJKKLL%LMMNN%NOO%OPPQRR%RSS%STTU%UVWWXYYZ%*"
140 LET P$="122213231433231252121434351"
150 GOSUB 1000
160 IF Y$<>"Y" THEN GOTO 180
170 GOSUB 1100
180 GOSUB 1300
190 GOSUB 2000
195 GOSUB 1600
200 GOSUB 2100
210 GOSUB 1500
220 IF C$="*" OR SF THEN GOSUB 1700
230 GOSUB 2300
240 IF EF THEN GOTO 210
250 LET S(CP,T)=S(CP,T)+S
300 IF NOT S(CP,F) THEN LET B=B+V
305 IF NOT S(CP,V) THEN LET D=D-V
310 IF S(CP,F) THEN LET DC=DC+V-C
315 IF S(CP,V) THEN LET S(CP,V)=S(CP,V)-V+C*(S(CP,F)>O)
320 IF NOT C OR NOT S(CP,F) THEN GOTO 400
322 IF S(CP,V)=V THEN GOTO 340
325 FOR I=PX*CP+T-S(CP,V) TO PX*CP
330 LET D(I-V)=D(I)
335 NEXT I
340 LET D(PX*CP)=S(CP,F)
400 LET CP=CP+V
405 IF CP>P THEN LET CP=V
410 LET S=S(CP,V)
415 IF B+DC<M AND B<Z+R AND (S OR D) THEN GOTO 200
420 LET K=T
425 GOSUB 2800
430 GOSUB 3000
435 PRINT AT R,O;"ANOTHER GAME - Y/N? ";
440 INPUT Y$
445 PRINT AT R,Z;Y$
450 IF Y$="N" THEN GOTO 500
455 IF Y$<>"Y" THEN GOTO 440
460 GOSUB 1380
465 GOTO 190
500 LET K=U
510 GOSUB 2800
520 PRINT AT O,O;"FINAL SCORES: "
530 PRINT AT A,O;"MATCH WAS ";
540 GOSUB 3035
999 STOP
1000 PRINT AT V,O;"********************************"
1010 PRINT AT U,U;"N : .' .'''. :'''. '':'' : : .' TM P"
1020 PRINT TAB T;"U :.: :...: :'': : : :.: E"
1030 PRINT TAB V;"F : '. : : : : : : : '. P"
1035 PRINT AT G+V,G;"OR CROSSWORD TANGO"
1040 PRINT AT N,O;"A WORD GAME FOR 2 TO 8 PLAYERS"
1050 PRINT AT N+T,O;"U. K. PATENT NO. 449,879 (1936) COPYRIGHT (C) 1935 BY","E. W. WILLCOCKS.","PROGRAM COPYRIGHT (C) 1984 BY WILLCOCKS RESEARCH CONSULTANTS."
1055 PRINT AT A+U,O;"KARTIK IS A TRADE MARK OF","WILLCOCKS RESEARCH CONSULTANTS."
1060 PRINT AT Z,O;"********************************"
1070 PRINT "DO YOU WANT INSTRUCTIONS-Y/N?";
1075 SLOW
1080 INPUT Y$
1085 IF Y$<>"Y" AND Y$<>"N" THEN GOTO 1080
1090 PRINT Y$
1099 RETURN
1100 CLS
1101 FAST
1102 PRINT TAB N-V;"RULES OF KARTIK"
1105 PRINT AT T,T;"KARTIK IS A CROSSWORD GAME FOR2 TO 8 PLAYERS. IT IS PLAYED ONA 6X6 SQUARE BOARD WITH A DECK OF 60 LETTER CARDS."
1110 PRINT AT G+V,T;"48 CARDS (49 FOR 7 PLAYERS OR 50 FOR 5) ARE DEALT FACE DOWN TOTHE PLAYERS. THE REMAINING CARDSARE THE DECK, LEFT FACE DOWN."
1115 PRINT AT N+U,T;"ON HIS TURN, EACH PLAYER TAKESTHE TOP CARD FROM HIS HAND,","LOOKS AT IT AND PLACES IT ON THEBOARD, TRYING TO MAKE WORDS OF 2 TO 6 LETTERS. WORDS MAY READ ACROSS, DIAGONALLY UP OR DIAGON-ALLY DOWN, FROM LEFT TO RIGHT, OR STRAIGHT DOWN."
1120 GOSUB 1185
1130 CLS
1135 PRINT AT V,T;"EACH LETTER HAS A POINT SCORE.THESE ARE TOTALLED FOR EACH NEW WORD FORMED, NO MORE THAN ONE INEACH ALLOWED DIRECTION, AND ALL MUST INCLUDE THE CARD PLAYED."
1140 PRINT AT G+V,T;"AFTER SIX CARDS ARE PLAYED, ASLONG AS AT LEAST 6 EMPTY SQUARESARE LEFT, THE PLAYER MAY SUBSTI-TUTE HIS CARD FOR ANY BLACK","LETTER ON THE BOARD. IF HIS CARDIS RED, HE ADDS THE OLD CARD TO THE BOTTOM OF HIS HAND; IF IT ISBLACK, IT IS DISCARDED. HE MAY NOT SUBSTITUTE FOR A RED CARD."
1145 PRINT AT Z-U,T;"THE RED STAR CARD MAY BE","CHANGED TO REPRESENT ANY LETTER AT EACH TURN, WHEN A NEW WORD WHICH USES IT IS COMPLETED."
1150 GOSUB 1185
1160 CLS
1165 PRINT AT V,O;"THE STAR ALWAYS SCORES 1 POINT. NEW WORDS FORMED BY CHANGING","THE LETTER IT REPRESENTS ARE NOTCOUNTED UNLESS THEY CONTAIN THE CARD JUST PLAYED."
1170 PRINT AT G+V,T;"WHEN A PLAYER HAS NO CARDS","LEFT, HE USES THE TOP CARD FROM THE DECK. HE MAY NOT SUBSTITUTE."
1175 PRINT AT A-U,T;"THE GAME ENDS WHEN THE BOARD IS FILLED, ALL CARDS HAVE BEEN USED, OR A PLAYER HAS NO CARDS AND THE DECK IS USED UP. THE PLAYER WITH THE HIGHEST TOTAL ISTHE WINNER."
1180 PRINT AT Z-T,T;"THE WINNER DEALS FOR THE NEXT GAME, THE PLAYER TO HIS LEFT IS THE FIRST TO PLAY."
1185 PRINT AT V+Z,G;"PRESS ""ENTER"" TO CONTINUE"
1190 INPUT Y$
1199 RETURN
1300 CLS
1305 FAST
1310 PRINT TAB G;"KARTIK OPTIONS",,,"HOW MANY PLAYERS? ";
1315 INPUT P
1320 IF P<T OR P>G+T THEN GOTO 1315
1325 PRINT P
1330 LET PX=(Q-R+T*(P=F+V)+(P=G+V))/P
1335 LET D=M-P*PX
1340 PRINT AT F,O;"EACH PLAYER WILL BE DEALT ";PX,"LETTER CARDS, FACE DOWN. THE REMAINING ";D;" CARDS WILL BE THE DECK. PLAYERS DRAW FROM THE","DECK WHEN THEY HAVE NO MORE","CARDS IN THEIR HANDS."
1350 PRINT AT A-U,O;"ENTER NAMES OF THE PLAYERS:"
1360 FOR I=V TO P
1365 INPUT N$(I)
1370 PRINT I;TAB U;N$(I)
1375 NEXT I
1380 PRINT AT Z,O;"DEALING THE CARDS ... ";
1390 SLOW
1400 FOR I=V TO M
1405 LET D(I)=O
1410 NEXT I
1412 FAST
1415 FOR I=V TO M
1420 LET J=V+INT (M*RND)
1425 IF D(J) THEN GOTO 1420
1430 LET S=CODE D$(I)
1432 LET K=S-H*(S>Q)+(Z+E+G)*(S=H+Z+U)-Z-E-T
1434 LET D(J)=S+VAL P$(K)/R
1435 NEXT I
1440 SLOW
1445 PRINT "DONE."
1450 FOR I=V TO G
1455 FOR J=V TO G
1460 LET B(I,J)=O
1465 NEXT J
1470 NEXT I
1475 LET B=O
1480 FOR I=V TO P
1485 LET S(I,V)=PX
1488 LET S(I,T)=O
1490 NEXT I
1492 LET D=M-P*PX
1495 LET DC=O
1497 LET SF=O
1499 RETURN
1500 INPUT X$
1501 LET EF=O
1505 LET Y=O
1510 LET X=CODE X$-Z-E-T
1515 FOR I=V TO LEN X$
1520 IF X$(I)>"0" AND X$(I)<"7" THEN LET Y=VAL X$(I)
1525 NEXT I
1530 PRINT X$(1);",";Y
1532 SLOW
1535 IF X<V OR X>G THEN GOTO 2212
1540 IF Y<V OR Y>G THEN GOTO 2218
1545 IF NOT B(X,Y) THEN GOTO 1560
1550 IF B<G OR B>=A+R THEN GOTO 2230
1555 IF NOT S(CP,V) OR B(X,Y)>Q OR INT B(X,Y)=CODE C$ THEN GOTO 2238
1560 LET S(CP,F)=B(X,Y)
1565 LET B(X,Y)=D(K)
1570 GOSUB 1900
1599 RETURN
1600 FOR X=V TO G
1610 FOR Y=V TO G
1620 GOSUB 1900
1630 NEXT Y
1640 NEXT X
1699 RETURN
1700 IF SF THEN GOTO 1785
1705 LET X1=X
1710 LET Y1=Y
1720 PRINT AT E,O;"YOU MUST ";TAB O;"CHOOSE A ";TAB O;"LETTER FOR ";TAB O;"THE STAR. "
1728 GOTO 1740
1730 PRINT AT E,O;"PUSH ""ENTER""";TAB O;"IF NO CHANGE";TAB O;"OR ELSE TYPE";TAB O;"NEW LETTER. "
1740 PRINT "WHAT LETTER ";TAB O;"WILL THE STAR CARD";TAB O;"NOW REPRESENT? "
1745 INPUT Y$
1750 IF (Y$="" OR Y$=CHR$ (H-N-V) OR Y$=" ") AND SF THEN RETURN
1752 IF Y$<"A" OR Y$>"Z" THEN GOTO 1745
1754 IF SF OR INT S(CP,F)<>CODE Y$ THEN GOTO 1758
1755 PRINT AT E+T,O;"DIFFERENT ";TAB O;"LETTER. "
1757 GOTO 1740
1758 LET SF=V
1760 PRINT AT Z+V,E;Y$
1765 LET X$=CHR$ (CODE Y$+H)
1770 PRINT AT U*X1-V,U*Y1+A-U;X$
1775 LET B(X1,Y1)=CODE X$+V/R
1780 RETURN
1785 IF X<>X1 AND Y<>Y1 AND X+Y<>X1+Y1 AND X-Y<>X1-Y1 THEN RETURN
1786 LET EF=V
1787 GOSUB 1800+50*(Y=Y1)
1790 IF NOT EF THEN RETURN
1795 LET EF=O
1798 LET Y$=""
1799 GOTO 1730
1800 FOR I=Y TO Y1 STEP SGN (Y1-Y)
1805 LET J=X+(I-Y)*SGN (Y1-Y)*SGN (X1-X)
1810 IF B(J,I)=O THEN LET EF=O
1815 NEXT I
1820 RETURN
1850 FOR I=X TO X1 STEP SGN (X1-X)
1855 IF B(I,Y)=O THEN LET EF=O
1860 NEXT I
1865 RETURN
1900 LET Y$=CHR$ (T*F*(B(X,Y)>Q))
1905 LET X$=CHR$ (INT B(X,Y)-H*(Y$>" "))
1910 IF NOT SF THEN GOTO 1930
1920 IF X=X1 AND Y=Y1 THEN LET X$=CHR$ (CODE X$+H)
1930 PRINT AT U*X-T,U*Y+N+T;Y$;CHR$ (T*A*(B(X,Y)>O)+R*(B(X,Y)-INT B(X,Y)));TAB U*Y+N+T;X$;Y$
1940 PRINT AT Z-V,O;
1949 RETURN
2000 CLS
2005 FAST
2010 PRINT TAB N+U;"% % % % % % % % % % % % % % % % % % % % "
2015 FOR I=O TO G-V
2020 PRINT TAB N+U;"% : : : : : : % "
2025 PRINT TAB N+U;"%A%B%C%D%E%F"(I+1);": : : : : : % "
2030 PRINT TAB N+U;"% :.....:.....:.....:.....:.....:.....% "
2035 NEXT I
2040 PRINT TAB N+U;"% % %1% % %2% % %3% % %4% % %5% % %6% % "
2050 PRINT TAB Z-V;"%K%A%R%T%I%K"
2055 PRINT AT O,O;"P LEFT SCORE"
2060 PRINT AT N,O;"PLAYER YOUR";TAB O;"TO GO: CARD";TAB O;" ....... ";TAB O;"DECK: : ####: ";TAB O;"DISCARD : ####: ";TAB O;"PILE: :.....: "
2099 RETURN
2100 FAST
2105 PRINT AT V,O;
2110 FOR I=V TO P
2115 PRINT N$(I,V TO U);TAB F-(S(I,V)>N);" ";S(I,V);TAB N+T-LEN STR$ S(I,T);S(I,T)
2120 NEXT I
2125 PRINT AT N+T,O;N$(CP,V TO G+T)
2130 PRINT AT N+U,G-V;
2135 IF D<=N THEN PRINT " ";
2140 PRINT D
2145 PRINT AT A,G+V-LEN STR$ DC;DC
2150 IF NOT S(CP,V) THEN GOTO 2200
2155 LET K=PX*CP-S(CP,V)+V
2160 LET C=(D(K)>Q)
2165 LET C$=CHR$ (D(K)-H*C)
2170 LET S=R*(D(K)-INT D(K))
2175 PRINT AT A-T,N;CHR$ (T*F*C);S;TAB N;C$;CHR$ (T*F*C)
2180 IF NOT S(CP,V) THEN GOTO 2190
2185 GOSUB 2910
2190 PRINT AT Z-V,O;"WHERE DO YOU";TAB O;"WANT TO PUT YOUR ";TAB O;"CARD - ROW, COLUMN? "
2195 PRINT AT Z+V,Z;
2199 RETURN
2200 PRINT AT E,O;"YOUR HAND IS";TAB O;"EMPTY. YOU ";TAB O;"DREW A CARD ";TAB O;"FROM DECK. "
2205 LET K=M+V-D
2210 GOTO 2160
2212 PRINT AT E,O;"ROW MUST BE ";TAB O;"A TO F. "
2216 GOTO 2222
2218 PRINT AT E,O;"COLUMN MUST ";TAB O;"BE 1 TO 6. "
2222 PRINT " "
2224 PRINT "TRY AGAIN "
2226 GOSUB 2195
2228 GOTO 1500
2230 PRINT AT E,O;"YOU MUST PUT";TAB O;"IT ON AN ";TAB O;"EMPTY SQUARE"
2236 GOTO 2224
2238 PRINT AT E,O;"YOU CANNOT ";TAB O;"SUBSTITUTE "
2242 IF S(CP,V) THEN GOTO 2248
2244 PRINT "FROM DECK. "
2246 GOTO 2224
2248 IF B(X,Y)<Q THEN GOTO 2254
2250 PRINT "A RED CARD. "
2252 GOTO 2224
2254 IF INT B(X,Y)<>CODE C$ THEN GOTO 1560
2256 PRINT "SAME LETTER."
2258 GOTO 2224
2260 PRINT AT E,O;"YOU HAVE TO ";TAB O;"SCORE IF YOU";TAB O;"SUBSTITUTE. ";TAB O;"TRY AGAIN. "
2268 LET EF=V
2270 GOTO 2310
2272 PRINT AT E,O;"YOUR MOVE IS";TAB O;"TAKEN BACK. ";TAB O;"YOU HAVE TO ";TAB O;"DO IT AGAIN."
2274 IF NOT SF THEN GOTO 2280
2276 IF X=X1 AND Y=Y1 THEN LET SF=O
2280 LET B(X,Y)=S(CP,F)
2282 GOSUB 1900
2283 GOSUB 2190
2284 RETURN
2300 LET S=O
2305 GOSUB 2910
2310 PRINT "DO YOU HAVE ";TAB O;"ANY WORDS TO SCORE "
2313 GOSUB 2920
2314 PRINT "- Y/N? ";
2316 INPUT Y$
2317 PRINT AT Z+V,G+V;Y$
2318 IF Y$="Y" THEN GOTO 2330
2320 IF Y$<>"N" THEN GOTO 2316
2322 IF NOT S(CP,F) THEN RETURN
2324 IF EF THEN GOTO 2272
2326 GOTO 2260
2330 GOSUB 2950
2331 GOSUB 2900
2332 PRINT "ENTER WORDS ";TAB O;"IN ORDER ABOVE OR ";TAB O;"PRESS ""ENTER"" TO SKIP DIRECTION."
2340 FOR I=V TO F
2341 INPUT X$
2342 LET W$(I)=X$
2343 LET W(I)=LEN X$
2344 PRINT AT A+I,T;W$(I)
2346 NEXT I
2348 PRINT "IS ANY WORD ";TAB O;"MIS-SPELLED - Y/N? "
2350 GOSUB 2920
2352 INPUT Y$
2354 PRINT AT Z,R+T;Y$
2356 IF Y$="N" THEN GOTO 2377
2357 IF Y$<>"Y" THEN GOTO 2352
2358 PRINT "TYPE NUMBER AND RE-TYPE WORD."
2359 LET EF=V
2360 INPUT X$
2361 LET W=O
2362 FOR I=V TO LEN X$
2363 IF NOT W AND (X$(I)<"1" OR X$(I)>"4") THEN GOTO 2370
2364 IF NOT W THEN LET W=VAL X$(I)
2365 IF X$(I)<"A" OR X$(I)>"Z" THEN GOTO 2370
2366 LET W$(W)=X$(I TO )
2367 LET W(W)=LEN X$-I+V
2368 LET I=LEN X$
2369 LET EF=O
2370 NEXT I
2371 IF NOT W THEN GOTO 2360
2372 IF EF THEN LET W$(W)=""
2373 IF EF THEN LET W(W)=0
2374 PRINT AT A+W,T;W$(W)
2375 PRINT AT Z-V,O;
2376 GOTO 2348
2377 PRINT AT Z,O;"CHALLENGED - Y/N? "
2378 GOSUB 2920
2379 INPUT Y$
2380 PRINT AT Z,Z-T;Y$
2381 IF Y$="N" THEN GOTO 2390
2382 IF Y$<>"Y" THEN GOTO 2377
2383 PRINT "IS IT IN THE DICTIONARY - Y/N? ";
2384 INPUT Y$
2385 PRINT AT Z+V,E+R;Y$
2386 IF Y$="Y" THEN GOTO 2390
2387 IF Y$<>"N" THEN GOTO 2384
2388 PRINT AT Z+V,O;"YOU LOST YOUR SCORE FOR THE TURN"
2389 RETURN
2390 GOSUB 2918
2392 FOR W=V TO F
2395 LET X$=""
2397 PRINT AT Z-V,O;"WORD NO. "
2398 PRINT AT Z-V,N;W
2399 IF NOT W(W) THEN GOTO 2460
2400 FAST
2401 FOR I=V TO W(W)
2402 IF W$(W,I)<"A" THEN GOTO 2406
2404 LET X$=X$+W$(W,I)
2406 NEXT I
2410 IF LEN X$>V THEN GOTO 2420
2412 PRINT "IS TOO SHORT; MUST ";TAB O;"BE AT LEAST 2 LETTERS. RE-TYPE."
2413 SLOW
2414 INPUT X$
2415 LET W$(W)=X$
2416 PRINT AT W+A,T;W$(W)
2417 LET W(W)=LEN X$
2418 GOSUB 2918
2419 GOTO 2395
2420 IF LEN X$<=G THEN GOTO 2430
2422 PRINT "IS TOO LONG; CANNOT";TAB O;"BE MORE THAN 6 LETTERS. RE-TYPE."
2426 GOTO 2413
2430 GOSUB 2500
2450 SLOW
2460 LET EF=O
2470 NEXT W
2475 IF S>O THEN GOTO 2490
2480 IF S(CP,F) THEN GOTO 2260
2490 PRINT AT Z-V,O;"TOTAL: "
2492 PRINT AT Z-V,N+(S<=N);S
2496 PRINT "SCORE FOR YOUR TURN"
2498 GOSUB 2920
2499 RETURN
2500 LET EF=V
2505 LET TS=O
2510 LET L=LEN X$
2515 LET K=O
2520 FOR I=K+V TO L
2525 IF CODE X$(I)=INT B(X,Y)-H*(B(X,Y)>Q) THEN LET EF=O
2530 IF NOT EF THEN LET K=I
2535 IF NOT EF THEN LET I=L
2540 NEXT I
2545 IF NOT K THEN GOTO 2700
2550 IF EF THEN GOTO 2710
2555 IF K=V THEN GOTO 2615
2560 FOR I=K-V TO V STEP -V
2565 IF W=F THEN GOTO 2590
2567 IF I+Y-K<V THEN GOTO 2595
2570 LET J=X+(K-I)*((W=T)-(W=U))
2575 IF J<V OR J>G THEN GOTO 2595
2580 IF INT B(J,I+Y-K)-H*(B(J,I+Y-K)>Q)<>CODE X$(I) THEN GOTO 2595
2585 GOTO 2605
2590 IF I+X-K<V THEN GOTO 2595
2592 IF INT B(I+X-K,Y)-H*(B(I+X-K,Y)>Q)=CODE X$(I) THEN GOTO 2605
2595 LET EF=V
2600 LET I=V
2605 NEXT I
2610 IF EF THEN GOTO 2520
2615 FOR I=V TO L
2620 IF W=F THEN GOTO 2650
2622 IF I+Y-K>G THEN GOTO 2665
2625 LET J=X+(K-I)*((W=T)-(W=U))
2627 IF I<=K THEN GOTO 2640
2630 IF J<V OR J>G THEN GOTO 2665
2635 IF INT B(J,I+Y-K)-H*(B(J,I+Y-K)>Q)<>CODE X$(I) THEN GOTO 2665
2640 LET TS=TS+R*(B(J,I+Y-K)-INT B(J,I+Y-K))
2645 GOTO 2680
2650 IF I+X-K>G THEN GOTO 2665
2652 IF INT B(I+X-K,Y)-H*(B(I+X-K,Y)>Q)<>CODE X$(I) THEN GOTO 2665
2655 LET TS=TS+R*(B(I+X-K,Y)-INT B(I+X-K,Y))
2660 GOTO 2680
2665 LET EF=V
2670 LET TS=O
2675 LET I=L
2680 NEXT I
2685 IF EF THEN GOTO 2520
2690 PRINT AT W+A,N;
2692 IF TS<=N THEN PRINT " ";
2694 PRINT TS
2696 LET S=S+TS
2699 RETURN
2700 PRINT AT Z,O;"MUST INCLUDE YOUR ";TAB O;"LETTER TO COUNT. RE-TYPE IT. "
2704 GOTO 2720
2710 PRINT AT Z,O;"DOES NOT MATCH WORD";TAB O;"ON THE BOARD. RE-TYPE IT. "
2720 INPUT X$
2722 LET W$(W)=X$
2724 LET W(W)=LEN X$
2726 PRINT AT A+W,T;W$(W)
2728 LET EF=O
2729 GOSUB 2918
2730 IF NOT W(W) THEN RETURN
2732 IF W(W)>V THEN GOTO 2500
2734 PRINT AT Z,O;"IS TOO SHORT; MUST ";TAB O;"BE AT LEAST 2 LETTERS. RE-TYPE."
2738 GOTO 2720
2800 LET B=O
2805 LET J=V
2810 FOR I=V TO P
2815 IF K=U THEN GOTO 2825
2820 LET S(I,U)=S(I,U)+S(I,T)
2825 IF S(I,K)>S(J,K) THEN LET J=I
2830 NEXT I
2835 FOR I=V TO P
2840 IF I=J THEN GOTO 2850
2845 IF S(I,K)=S(J,K) THEN LET B=V
2850 NEXT I
2899 RETURN
2900 PRINT AT E,O;"1 ";W$(V);TAB O;"2 ";W$(T);TAB O;"3 ";W$(U);TAB O;"4 ";W$(F)
2905 RETURN
2910 PRINT AT E,O;" ";TAB O;" ";TAB O;" ";TAB O;" "
2915 RETURN
2918 PRINT AT Z,O;"SCORING YOUR WORDS "
2920 PRINT AT Z+V,O;" "
2922 PRINT AT Z+V,O;
2924 RETURN
2930 SLOW
2932 IF INKEY$="" THEN GOTO 2932
2935 LET Y$=INKEY$
2937 FAST
2940 RETURN
2950 LET W$(V)="ACROSS"
2952 LET W$(T)="DIAG. UP"
2954 LET W$(U)="DIAG. DOWN"
2956 LET W$(F)="DOWN"
2958 RETURN
3000 CLS
3005 FAST
3010 PRINT "GAME OVER",,,,"PLAYER SCORE TOTAL"
3015 FOR I=V TO P
3020 PRINT I;" ";N$(I);TAB R-LEN STR$ S(I,T);S(I,T);TAB G+Z-LEN STR$ S(I,U);S(I,U)
3025 NEXT I
3030 PRINT AT A,O;"GAME WAS ";
3035 IF B THEN PRINT "DRAWN. "
3040 IF NOT B THEN PRINT "WON BY ";N$(J)
3045 LET CP=J+V
3050 SLOW
3099 RETURN
5000 SAVE "KARTI%K"
5010 GOTO 10
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
