10 REM Tic Tac Toe - C64 BASIC 20 REM Learning Edition 30 REM by OpenAI 40 REM 50 REM Initialize the game board 60 DIM BOARD(3,3) 70 FOR ROW=1 TO 3 80 FOR COL=1 TO 3 90 BOARD(ROW,COL)=" " 100 NEXT COL 110 NEXT ROW 120 REM 130 REM Display the game board 140 PRINT "TIC TAC TOE": PRINT 150 PRINT " 1 | 2 | 3 " 160 PRINT "---+--+--" 170 PRINT " 4 | 5 | 6 " 180 PRINT "---+--+--" 190 PRINT " 7 | 8 | 9 " 200 REM 210 REM Main game loop 220 FOR TURN=1 TO 9 230 REM Determine who's turn it is 240 IF (TURN MOD 2)=0 THEN 260 242 PRINT "Do you want to play with X or O? (X/O)" 244 INPUT XO 246 IF XO="X" THEN PLAYER="X" ELSE PLAYER="O" 250 PLAYER="X" 260 ELSE 270 PLAYER="O" 280 END IF 290 REM 300 REM Get player's move 310 PRINT "Player "; PLAYER; " turn. Enter move (1-9): "; 320 INPUT MOVE 330 REM 340 REM Validate move 350 IF MOVE < 1 OR MOVE > 9 THEN PRINT "Invalid move. Please enter a number between 1 and 9.": GOTO 310 360 ROW=INT((MOVE-1)/3) 370 COL=MOVE-3*(ROW-1) 380 IF BOARD(ROW,COL)<>" " THEN 310 400 BOARD(ROW,COL)=PLAYER 410 REM 420 REM Display game board 430 PRINT "TIC TAC TOE": PRINT 440 PRINT " "; BOARD(1,1); " | "; BOARD(1,2); " | "; BOARD(1,3); " " 450 PRINT "---+--+--" 460 PRINT " "; BOARD(2,1); " | "; BOARD(2,2); " | "; BOARD(2,3); " " 470 PRINT "---+--+--" 480 PRINT " "; BOARD(3,1); " | "; BOARD(3,2); " | "; BOARD(3,3); " " 490 REM 500 REM Check for win 510 IF (BOARD(1,1)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(3,3)=PLAYER) OR _ 520 (BOARD(1,3)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(3,1)=PLAYER) OR _ 530 (BOARD(1,1)=PLAYER AND BOARD(1,2)=PLAYER AND BOARD(1,3)=PLAYER) OR _ 540 (BOARD(2,1)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(2,3)=PLAYER) OR _ 550 (BOARD(3,1)=PLAYER AND BOARD(3,2)=PLAYER AND BOARD(3,3)=PLAYER) OR _ 580 (BOARD(1,2)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(3,2)=PLAYER) THEN 590 PRINT "Player "; PLAYER; " wins!" 600 GOTO 620 610 END IF 620 REM 630 NEXT TURN 640 REM 650 REM Check for draw 660 IF TURN = 9 THEN 670 PRINT "It's a draw!" 680 END IF 690 REM 700 REM Add learning feature for BOARD 710 REM Store the previous move in a list 720 DIM MOVES(9,3) 730 FOR I=1 TO 9 740 MOVES(I,1)=I 750 NEXT I 760 REM 770 REM Store the outcome of the previous games in a list 780 DIM OUTCOMES(9) 790 REM 800 REM Update the list after each game 810 OUTCOME=-1 820 IF TURN=9 THEN OUTCOME=0 830 IF BOARD(1,1)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(3,3)=PLAYER THEN OUTCOME=1 840 IF BOARD(1,3)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(3,1)=PLAYER THEN OUTCOME=1 850 IF BOARD(1,1)=PLAYER AND BOARD(1,2)=PLAYER AND BOARD(1,3)=PLAYER THEN OUTCOME=1 860 IF BOARD(2,1)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(2,3)=PLAYER THEN OUTCOME=1 870 IF BOARD(3,1)=PLAYER AND BOARD(3,2)=PLAYER AND BOARD(3,3)=PLAYER THEN OUTCOME=1 880 IF BOARD(1,2)=PLAYER AND BOARD(2,2)=PLAYER AND BOARD(3,2)=PLAYER THEN OUTCOME=1 890 REM 900 REM Add the outcome to the list of outcomes 910 FOR I=8 TO 1 STEP -1 920 OUTCOMES(I)=OUTCOMES(I) 930 NEXT I 940 OUTCOMES(1)=OUTCOME 950 REM 960 REM Make the computer player smarter by learning from its mistakes 970 IF PLAYER="O" THEN 980 REM Check the outcomes of the previous moves 990 BESTMOVE=0 1000 BESTOUTCOME=-1 1010 FOR I=1 TO 9 1020 IF BOARD(INT((MOVES(I,1)-1)/3),MOVES(I,1)-3*(INT((MOVES(I,1)-1)/3)1))=" " THEN 1030 IF OUTCOMES(I)>BESTOUTCOME THEN 1040 BESTMOVE=MOVES(I,1) 1050 BESTOUTCOME=OUTCOMES(I) 1060 END IF 1070 END IF 1080 NEXT I 1090 MOVE=BESTMOVE 1100 END IF 1110 REM 1120 REM Repeat the main game loop 1130 GOTO 220 1140 REM 1150 END
Teemu1.huusko