risorse | zx spectrum | tictactoe

Tic-tac-toe (1987)

È il classico gioco della tria.

Il programma conserva in un vettore l'ordine preferenziale delle proprie mosse: il calcolatore gioca sempre la prima casella libera tra quelle a priorità più alta. Al termine di una partita vittoriosa le caselle giocate vengono spostate verso l'alto, viceversa, in caso di sconfitta, vengono spostate verso il basso. A lungo andare, giocando contro un avversario intelligente, il programma dovrebbe privilegiare le caselle più strategiche, ovvero quella centrale seguita da quelle d'angolo.

Istantanea

Nastro

Scarica il nastro virtuale tictactoe.tzx (5KB).

Listato

  10 REM ***************
  11 REM * TIC-TAC-TOE *
  12 REM ***************
  20 POKE 23658,8: GO SUB 1180
  40 FOR J=1 TO 9
  50 LET A(J)=32
  60 NEXT J
  70 FOR J=1 TO 5
  80 LET D(J)=0
  90 NEXT J
 100 LET COUNT=0
 110 LET R$=""
 120 GO SUB 1070
 129 REM
 130 REM ********************
 131 REM * CICLO PRINCIPALE *
 132 REM ********************
 133 REM
 140 GO SUB 540
 150 GO SUB 1070
 160 GO SUB 870
 170 IF R$<>"" THEN GO TO 240
 180 GO SUB 980
 190 GO SUB 1070
 200 GO SUB 870
 210 IF R$="" THEN GO TO 140
 229 REM
 230 REM **************
 231 REM * FINE GIOCO *
 232 REM **************
 233 REM
 250 GO SUB 1070
 260 PRINT : PRINT
 270 IF R$="W" THEN PRINT TAB 8;"HO VINTO IO": LET FLAG=-1
 280 IF R$="L" THEN PRINT TAB 8;"HAI VINTO TU": LET FLAG =1
 290 IF R$="D" THEN PRINT TAB 8;"E' PATTA": GO TO 430
 299 REM
 300 REM *********************
 301 REM * AGGIORNA DATABASE *
 302 REM *********************
 303 REM
 310 FOR B=1 TO 5
 320 FOR J=2 TO 9
 330 IF M(J)=D(B) THEN GO SUB 370
 340 NEXT J
 350 NEXT B
 360 GO TO 430
 369 REM
 370 REM ***********************
 371 REM *  RIORDINA ELEMENTI  *
 372 REM * MATRICE DELLE MOSSE *
 373 REM ***********************
 374 REM
 380 LET TEMP=M(J+FLAG)
 390 LET M(J+FLAG)=M(J)
 400 LET M(J)=TEMP
 410 LET J=9
 420 RETURN
 430 PRINT : PRINT
 435 FOR I=1 TO 100: NEXT I
 440 PRINT "PRIORITA' DELLE POSIZIONI": PRINT "DOPO L' ULTIMA PARTITA:"
 450 PRINT : PRINT
 460 FOR J=1 TO 9
 470 PRINT M(J);" ";
 480 NEXT J
 490 PRINT : PRINT
 500 INPUT "VUOI GIOCARE DI NUOVO: "; LINE A$
 515 IF A$="NO" OR A$="N" OR A$="no" OR A$="n" THEN STOP
 520 GO TO 30
 529 REM
 530 REM *********************
 531 REM * MOSSA AL COMPUTER *
 532 REM *********************
 533 REM
 550 LET P=CODE ("O")
 560 LET X=0
 570 LET J=1
 580 IF A(W(J))=A(W(J+1)) AND A(W(J+2))=32 AND A(W(J))=P THEN LET X=W(J+2): GO TO 750
 590 IF A(W(J))=A(W(J+2)) AND A(W(J+1))=32 AND A(W(J))=P THEN LET X=W(J+1): GO TO 750
 600 IF A(W(J+1))=A(W(J+2)) AND A(W(J))=32 AND A(W(J+1))=P THEN LET X=W(J): GO TO 750
 610 IF J<21 THEN LET J=J+3: GO TO 580
 620 IF P=CODE ("O") THEN LET P=CODE ("X"): GO TO 570
 629 REM
 630 REM ***********************
 631 REM * NON CI SONO CASELLE *
 632 REM *  PER LA VITTORIA O  *
 633 REM *     PER IL BLOCCO   *
 634 REM ***********************
 635 REM
 650 LET J=1
 660 IF A(M(J))=32 THEN LET X=M(J): GO TO 750
 670 IF J<10 THEN LET J=J+1: GO TO 660
 680 LET H=0
 690 LET H=H+1
 700 LET X=INT (RND*9)+1: IF A(X)=32 THEN GO TO 750
 710 IF H<100 THEN GO TO 690
 720 LET R$="D"
 730 RETURN
 739 REM
 740 REM *******************
 741 REM * ESEGUE LA MOSSA *
 742 REM *******************
 743 REM
 750 LET A(X)=CODE ("O")
 770 LET COUNT=COUNT+1
 780 LET D(COUNT)=X
 790 LET FLAG=0
 800 FOR J=1 TO 9
 810 IF A(J)=32 THEN LET FLAG=1
 820 NEXT J
 830 IF FLAG=0 AND R$="" THEN LET R$="D"
 839 REM
 840 REM **********************
 841 REM * TUTTE LE POSIZIONI *
 842 REM * OCCUPATE : PATTA.. *
 843 REM **********************
 844 REM
 850 RETURN
 859 REM
 860 REM **********************
 861 REM * CONTROLLA SE VINTO *
 862 REM **********************
 863 REM
 880 LET J=1
 890 IF A(W(J))=32 THEN LET J=J+3
 900 IF J>23 THEN RETURN
 910 IF A(W(J))=A(W(J+1)) AND A(W(J))=A(W(J+2)) THEN GO TO 940
 920 IF J<22 THEN LET J=J+3: GO TO 890
 930 RETURN
 940 IF A(W(J))=CODE ("O") THEN LET R$="W"
 950 IF A(W(J))=CODE ("X") THEN LET R$="L"
 960 RETURN
 969 REM
 970 REM *******************
 971 REM * MOSSA ALL' UOMO *
 972 REM *******************
 973 REM
 980 PRINT
 990 PRINT
1000 INPUT "FAI LA TUA MOSSA: ";MOV
1020 IF MOV<1 OR MOV>9 THEN GO TO 1000
1030 IF A(MOV)<>32 THEN GO TO 1000
1040 LET A(MOV)=CODE ("X")
1050 RETURN
1059 REM
1060 REM *********************
1061 REM * STAMPA SCACCHIERA *
1062 REM *********************
1063 REM
1080 CLS
1085 PRINT "TIC-TAC-TOE"
1090 PRINT : PRINT : PRINT
1100 PRINT "   1:2:3      ";CHR$ (A(1));":";CHR$ (A(2));":";CHR$ (A(3))
1110 PRINT "   -----      -----"
1120 PRINT "   4:5:6      ";CHR$ (A(4));":";CHR$ (A(5));":";CHR$ (A(6))
1130 PRINT "   -----      -----"
1140 PRINT "   7:8:9      ";CHR$ (A(7));":";CHR$ (A(8));":";CHR$ (A(9))
1150 PRINT
1160 RETURN
1169 REM
1170 REM ********************
1171 REM * INIZIALIZZAZIONE *
1172 REM ********************
1173 REM
1190 CLS
1200 DIM A(9): DIM M(10): DIM W(24): DIM D(5)
1250 FOR J=1 TO 24
1260 READ W(J)
1270 NEXT J
1280 DATA 1,2,3,4,5,6,7,8,9
1290 DATA 1,4,7,2,5,8,3,6,9
1300 DATA 1,5,9,3,5,7
1309 REM
1310 REM *********************
1311 REM * DATABASE INIZIALE *
1312 REM *********************
1313 REM
1314 INPUT "VUOI INSERIRE PERSONALMENTE"'"IL TUO DATABASE INIZIALE ? "; LINE A$
1315 IF A$<>"SI" THEN GO TO 1320
1318 GO SUB 1060: FOR J=1 TO 9: PRINT "POSIZIONE N. ";(J);: INPUT "CASELLA NUMERO..";M(J): PRINT "  CASELLA N. ";M(J): NEXT J: RETURN
1320 FOR J=1 TO 10
1330 READ M(J)
1340 NEXT J
1350 DATA 5,3,7,1,9,2,4,6,8,5
1360 RETURN

Pagina modificata l'8/11/2011