10 REM Word Puzzle Solver V.2.5 20 REM by M.Bobrowski for 8BS 30 : 40 MODE 4:VDU 19,0,4;0;19,1,3;0; 50 PROCinit 60 PROCenterpuzzle 70 PROCscreen 80 REPEAT:VDU 28,1,31,38,26 90 REPEAT:CLS:VDU 23,1,1;0;0;0; 100 INPUT"Enter hidden word : "W$ 110 W$=FNcase(W$):L%=LENW$:UNTIL ok AND L%>0:VDU 23,1,0;0;0;0; 120 PROCsearch:IF found PRINT'"Start point - ";CHR$(H%+64);V%;". The word is placed"'T$(D%);".":REPEAT:PROCshow(H%,V%,0):PROCshow(H%,V%,1):UNTILINKEY-99 130 UNTIL FALSE 140 : 150 DEF PROCinit 160 MOVE 320,1000:DRAW 956,1000:MOVE 320,992:DRAW 956,992:COLOUR0:COLOUR129:PRINTTAB(10,1)" WORD PUZZLE SOLVER ":COLOUR1:COLOUR128:MOVE 320,952:DRAW 956,952 170 REPEAT:PRINTTAB(1,3)SPC38:INPUTTAB(1,3)"Enter number of columns (max.26) : "M%:UNTIL M%>0 AND M%<27 180 REPEAT:PRINTTAB(1,5)SPC38:INPUTTAB(1,5)"Enter number of rows (max.20) : "N%:UNTIL N%>0 AND N%<21 190 DIM L$(M%,N%),D%(7,1),T$(7) 200 FOR J%=0 TO 7:READ D%(J%,0),D%(J%,1),T$(J%):NEXT 210 B%=19-M%/2:W%=12-N%/2:A$=STRING$(K%,"*"):C$="ABCDEFGHIJKLMNOPQRSTUVWXYZ" 220 ENDPROC 230 : 240 DATA 1,0,horizontally,1,1,diagonally (downwards and rightwards),0,1,downwards,-1,1,diagonally (downwards and leftwards),-1,0,backwards,-1,-1,diagonally (upwards and leftwards),0,-1,upwards,1,-1,diagonally (upwards and rightwards) 250 : 260 DEF PROCenterpuzzle 270 PRINT'" Now enter the puzzle, row by row ....":PRINT 280 FOR R%=1 TO N% 290 v%=VPOS:REPEAT:PRINTTAB(2,v%)"row ";RIGHT$(" "+STR$R%,2);" : ";STRING$(M%,".");SPC(39-POS);:INPUTTAB(11,v%)R$:R$=FNcase(R$):IF LENR$<>M% VDU7 300 UNTIL ok=TRUE AND LENR$=M% 310 FOR C%=1 TO M% 320 L$(C%,R%)=MID$(R$,C%,1) 330 NEXT:NEXT 340 ENDPROC 350 : 360 DEF PROCscreen 370 CLS:MOVE 32*B%-16,1040-32*W%:DRAW 32*(B%+M%)+16,1040-32*W%:DRAW 32*(B%+M%)+16,1040-32*(W%+N%+1):DRAW 32*B%-16,1040-32*(W%+N%+1):DRAW 32*B%-16,1040-32*W% 380 FOR R%=1 TO N%:PRINTTAB(B%-3,R%+W%-1);RIGHT$(" "+STR$R%,2);CHR$9; 390 FOR C%=1 TO M%:PRINT L$(C%,R%); 400 NEXT:NEXT:PRINT''TAB(B%)LEFT$(C$,M%)TAB(0,25)STRING$(40,"-") 410 ENDPROC 420 : 430 DEF PROCsearch:found=FALSE 440 PROChorizontal:IF found ENDPROC 450 PROCbackwards:IF found ENDPROC 460 PROCdownwards:IF found ENDPROC 470 PROCupwards:IF found ENDPROC 480 PROCdownright:IF found ENDPROC 490 PROCdownleft:IF found ENDPROC 500 PROCupleft:IF found ENDPROC 510 PROCupright:IF found ENDPROC 520 IF NOT found VDU7:PRINT'"Word not found."''"Press SPACE to continue";:REPEAT UNTIL GET=32 530 ENDPROC 540 : 550 DEF PROChorizontal 560 D%=0:FOR R%=1 TO N% 570 A$="" 580 FOR C%=1 TO M% 590 A$=A$+L$(C%,R%):I%=INSTR(A$,W$) 600 IF I%>0 H%=I%:V%=R%:R%=N%:C%=M%:found=TRUE 610 NEXT:NEXT 620 ENDPROC 630 : 640 DEF PROCbackwards 650 D%=4:FOR R%=1 TO N% 660 A$="" 670 FOR C%=M% TO 1 STEP -1 680 A$=A$+L$(C%,R%):I%=INSTR(A$,W$) 690 IF I%>0 H%=M%-I%+1:V%=R%:R%=N%:C%=1:found=TRUE 700 NEXT:NEXT 710 ENDPROC 720 : 730 DEF PROCdownwards 740 D%=2:FOR C%=1 TO M% 750 A$="" 760 FOR R%=1 TO N% 770 A$=A$+L$(C%,R%):I%=INSTR(A$,W$) 780 IF I%>0 H%=C%:V%=I%:R%=N%:C%=M%:found=TRUE 790 NEXT:NEXT 800 ENDPROC 810 : 820 DEF PROCupwards 830 D%=6:FOR C%=1 TO M% 840 A$="" 850 FOR R%=N% TO 1 STEP -1 860 A$=A$+L$(C%,R%):I%=INSTR(A$,W$) 870 IF I%>0 H%=C%:V%=N%-I%+1:R%=1:C%=M%:found=TRUE 880 NEXT:NEXT 890 ENDPROC 900 : 910 DEF PROCdownright 920 D%=1:FOR R%=1 TO N% 930 FOR C%=1 TO M% 940 A$="":X%=C%:Y%=R% 950 REPEAT:A$=A$+L$(X%,Y%):I%=INSTR(A$,W$):IF I%>0 found=TRUE 960 X%=X%+1:Y%=Y%+1 970 UNTIL X%>M% OR Y%>N% OR found:IF found H%=X%-L%:V%=Y%-L%:C%=M%:R%=N% 980 NEXT:NEXT 990 ENDPROC 1000 : 1010 DEF PROCdownleft 1020 D%=3:FOR R%=1 TO N% 1030 FOR C%=M% TO 1 STEP -1 1040 A$="":X%=C%:Y%=R% 1050 REPEAT:A$=A$+L$(X%,Y%):I%=INSTR(A$,W$):IF I%>0 found=TRUE 1060 X%=X%-1:Y%=Y%+1 1070 UNTIL X%<1 OR Y%>N% OR found:IF found H%=X%+L%:V%=Y%-L%:C%=1:R%=N% 1080 NEXT:NEXT 1090 ENDPROC 1100 : 1110 DEF PROCupleft 1120 D%=5:FOR R%=N% TO 1 STEP -1 1130 FOR C%=M% TO 1 STEP -1 1140 A$="":X%=C%:Y%=R% 1150 REPEAT:A$=A$+L$(X%,Y%):I%=INSTR(A$,W$):IF I%>0 found=TRUE 1160 X%=X%-1:Y%=Y%-1 1170 UNTIL X%<1 OR Y%<1 OR found:IF found H%=X%+L%:V%=Y%+L%:C%=1:R%=1 1180 NEXT:NEXT 1190 ENDPROC 1200 : 1210 DEF PROCupright 1220 D%=7:FOR R%=N% TO 1 STEP -1 1230 FOR C%=1 TO M% 1240 A$="":X%=C%:Y%=R% 1250 REPEAT:A$=A$+L$(X%,Y%):I%=INSTR(A$,W$):IF I%>0 found=TRUE 1260 X%=X%+1:Y%=Y%-1 1270 UNTIL X%>M% OR Y%<1 OR found:IF found H%=X%-L%:V%=Y%+L%:C%=M%:R%=1 1280 NEXT:NEXT 1290 ENDPROC 1300 : 1310 DEF PROCshow(X%,Y%,K%) 1320 VDU26:COLOUR K%:COLOUR129-(K%=1) 1330 FOR J%=1 TO LEN W$ 1340 PRINTTAB(X%+B%-1,Y%+W%-1)MID$(W$,J%,1) 1350 X%=X%+D%(D%,0):Y%=Y%+D%(D%,1) 1360 NEXT:IF K%=1 XX=INKEY(100) ELSE XX=INKEY(10) 1370 IF K%=1 PRINTTAB(1,31)"Press SPACE to continue"; 1380 ENDPROC 1390 : 1400 DEF FNcase(C$) 1410 LOCAL Z%,B$:B$="" 1420 FOR J%=1 TO LENC$ 1430 Z%=ASCMID$(C$,J%,1):IF Z%>64 AND Z%<91 OR Z%>96 AND Z%<123 ok=TRUE ELSE ok=FALSE:J%=LENC$:NEXT:VDU7:="" 1440 IF Z%>64 AND Z%<91 B$=B$+CHR$(Z%+32) ELSE B$=B$+CHR$Z% 1450 NEXT 1460 =B$