5 REM Adaptation to Yabasic of the program published in Tim Hartnell's book "Artificial Intelligence: Concepts and Programs", with some minor modifications. 6/2018. 10 REM TICTAC 15 INPUT "English (0), Spanish (other key): " IDIOMA : IF NOT IDIOMA THEN RESTORE 2020 ELSE RESTORE 2010 END IF 20 GOSUB 1180: REM INICIALIZACION 30 REM *** REQUISITOS PREVIOS AL JUEGO *** 40 FOR J = 1 TO 9 50 A(J) = 32 60 NEXT J 70 FOR J = 1 TO 5 80 D(J) = 0 90 NEXT J 100 CCONTADOR = 0 110 R$ = "" 120 GOSUB 1070: REM IMPRESION DEL TABLERO 130 REM ** CICLO PRINCIPAL ** 140 GOSUB 540: REM MOVIMIENTO DEL ORDENADOR 150 GOSUB 1070: REM IMPRESION DEL TABLERO 160 GOSUB 870: REM COMPRUEBA LA VICTORIA 170 IF R$ <> "" GOTO 240 180 GOSUB 980: REM SE ACEPTA EL MOVIMIENTO DE LA PERSONA 190 GOSUB 1070: REM IMPRESION DEL TABLERO 200 GOSUB 870: REM COMPRUEBA LA VICTORIA 210 IF R$ = "" GOTO 140 220 REM ** FIN DEL CICLO PRINCIPAL ** 230 REM ***************************** 240 REM FIN DEL JUEGO 250 GOSUB 1070: REM IMPRESION DEL TABLERO 260 PRINT: PRINT 270 IF R$ = "G" PRINT MENSAJE$(1): BANDERA = -1 280 IF R$ = "P" PRINT MENSAJE$(2): BANDERA = 1 290 IF R$ = "D" PRINT MENSAJE$(3): GOTO 430 300 REM ACTUALIZACION DE LA BASE DE DATOS 310 FOR B = 1 TO 5 320 FOR J = 2 TO 9 330 IF M(J) = D(B) GOSUB 370 340 NEXT J 350 NEXT B 360 GOTO 430 370 REM ** REORDENACION DE LOS ELEMENTOS DE LA MATRIZ M ** 380 TEMP = M(J + BANDERA) 390 M(J + BANDERA) = M(J) 400 M(J) = TEMP 410 J = 9 420 RETURN 430 PRINT: PRINT 440 PRINT MENSAJE$(4) 450 PRINT: PRINT 460 FOR J = 1 TO 9 470 PRINT M(J), " "; 480 NEXT J 490 PRINT: PRINT 500 PRINT MENSAJE$(5) 510 INPUT A$ 520 GOTO 30 530 REM ************************ 540 REM MOVIMIENTO DEL ORDENADOR 550 P = ASC("O") 560 X = 0 570 J = 1 580 IF A(W(J)) = A(W(J + 1)) AND A(W(J + 2)) = 32 AND A(W(J)) = P X = W(J + 2): GOTO 750 590 IF A(W(J)) = A(W(J + 2)) AND A(W(J + 1)) = 32 AND A(W(J)) = P X = W(J + 1): GOTO 750 600 IF A(W(J + 1)) = A(W(J + 2)) AND A(W(J)) = 32 AND A(W(J + 1)) = P X = W(J): GOTO 750 610 IF J < 21 J = J + 3: GOTO 580 620 IF P = ASC("O") P = ASC("X"): GOTO 570 630 REM ** SI NO SE GANA SE BUSCA UN MOVIMIENTO DE BLOQUEO ** 640 REM * ENTONCES SE USA LA SIGUIENTE SECCION * 650 J = 1 660 IF A(M(J)) = 32 X = M(J): GOTO 750 670 IF J < 10 J = J + 1: GOTO 660 680 H = 0 690 H = H + 1 700 X = INT(RAN(1) * 9): IF A(X) = 32 GOTO 750 710 IF H < 100 GOTO 690 720 R$ = "D": REM ES SIMPLEMENTE UN DIBUJO 730 RETURN 740 REM ********************* 750 REM REALIZA EL MOVIMIENTO 760 A(X) = ASC("O") 770 CCONTADOR = CCONTADOR + 1 780 D(CCONTADOR) = X 790 BANDERA = 0 800 FOR J = 1 TO 9 810 IF A(J) = 32 BANDERA = 1 820 NEXT J 830 IF BANDERA = 0 AND R$ = "" R$ = "D" 840 REM SI TODAS LAS CASILLAS ESTAN LLENAS Y R$ ESTA VACIO, ENTONCES ES SIMPLEMENTE UN DIBUJO 850 RETURN 860 REM ********************* 870 REM COMPRUEBA LA VICTORIA 880 J = 1 890 IF A(W(J)) = 32 J = J + 3 900 IF J > 23 RETURN 910 IF A(W(J)) = A(W(J + 1)) AND A(W(J)) = A(W(J + 2)) GOTO 940 920 IF J < 22 J = J + 3: GOTO 890 930 RETURN 940 IF A(W(J)) = ASC("O") R$ = "G": REM EL ORDENADOR GANA 950 IF A(W(J)) = ASC("X") R$ = "P": REM EL ORDENADOR PIERDE 960 RETURN 970 REM ************************ 980 REM MOVIMIENTO DE LA PERSONA 990 PRINT: PRINT 1000 PRINT MENSAJE$(6) 1010 PRINT MENSAJE$(7); : INPUT MOVIMIENTO 1020 IF MOVIMIENTO < 1 OR MOVIMIENTO > 9 GOTO 1010 1030 IF A(MOVIMIENTO) <> 32 GOTO 1010 1040 A(MOVIMIENTO) = ASC("X") 1050 RETURN 1060 REM ********************* 1070 REM IMPRESION DEL TABLERO 1080 CLEAR SCREEN 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 1170 REM ************** 1180 REM INICIALIZACION 1190 CLEAR SCREEN 1200 DIM A(9) : REM TABLERO 1210 DIM M(10) : REM ACCESO A LA BASE DE DATOS 1220 DIM W(24) : REM DATOS DE VICTORIA O BLOQUEO 1230 DIM D(5) : REM ACCESO AL MOVIMIENTO EN EL JUEGO ACTUAL 1235 DIM MENSAJE$(1) : READ M$ : N = TOKEN(M$,MENSAJE$(),",") : RESTORE 1240 REM DATOS DE VICTORIA O BLOQUEO 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 1310 REM BASE INICIAL DE DATOS 1320 FOR J = 1 TO 10 1330 READ M(J) 1340 NEXT J 1350 DATA 2, 6, 8, 4, 7, 3, 1, 9, 5, 2 1360 RETURN 2000 REM MENSAJES EN ESPAÑOL 2010 DATA "YO GANO,TU GANAS,ES SIMPLEMENTE UN DIBUJO,ESTA ES MI PRIORIDAD ACTUALIZADA,PULSE LA TECLA PARA CONTINUAR,REALICE SU MOVIMIENTO,MOVIMIENTO: " 2020 DATA "I WIN,YOU WIN,IT'S JUST A DRAWING,THIS IS MY PRIORITY UPDATE,PRESS TO CONTINUE,TO MAKE YOUR MOVE,MOVEMENT: "