Tic-tac-toe: Difference between revisions
Content added Content deleted
(→{{header|QuickBASIC}}: Added a solution.) |
(→{{header|RapidQ}}: Added a solution.) |
||
Line 2,347: | Line 2,347: | ||
FUNCTION Win% (Piece AS STRING) |
FUNCTION Win% (Piece AS STRING) |
||
FOR I = 0 TO 7 |
|||
IF Board(WinPos(I, 0)) = Piece AND Board(WinPos(I, 1)) = Piece AND Board(WinPos(I, 2)) = Piece THEN Win = -1: EXIT FUNCTION |
|||
NEXT I |
|||
Win = 0 |
|||
END FUNCTION |
|||
</syntaxhighlight> |
|||
==={{header|RapidQ}}=== |
|||
{{trans|QuickBASIC}} |
|||
<syntaxhighlight lang="basic"> |
|||
' Tic-tac-toe |
|||
' Console application |
|||
DECLARE FUNCTION Win (Piece AS STRING) AS INTEGER |
|||
DECLARE FUNCTION SpacesFilled () AS INTEGER |
|||
DECLARE SUB ClearBoard () |
|||
DECLARE SUB DisplayNumberedBoard () |
|||
DECLARE SUB DisplayPiecedBoard () |
|||
DECLARE FUNCTION Evaluate (Me AS STRING, Him AS STRING) AS INTEGER |
|||
DIM Board(9) AS STRING * 1, BestMove AS INTEGER |
|||
DIM WinPos(8, 2) AS INTEGER |
|||
DIM MyPiece AS STRING, HisPiece AS STRING |
|||
FOR I = 0 TO 7 |
|||
FOR J = 0 TO 2 |
|||
READ WinPos(I, J) |
|||
NEXT J |
|||
NEXT I |
|||
' Winning positions |
|||
DATA 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 3, 6, 1, 4, 7, 2, 5, 8, 0, 4, 8, 2, 4, 6 |
|||
MyWinsCnt = 0: HisWinsCnt = 0: DrawsCnt = 0 |
|||
CompFirst = -1 ' It be reversed, so human goes first |
|||
CLS |
|||
PRINT |
|||
PRINT " TIC-TAC-TOE" |
|||
PRINT |
|||
PRINT "In this version, X always goes first." |
|||
PRINT "The board is numbered:" |
|||
DO |
|||
CompFirst = NOT CompFirst ' reverse who goes first |
|||
MovesCnt = 0 |
|||
PRINT |
|||
DisplayNumberedBoard |
|||
PRINT |
|||
PRINT IIF(CompFirst, "I go first.", "You go first.") |
|||
ClearBoard |
|||
IF CompFirst THEN MyPiece = "X": HisPiece = "O" ELSE MyPiece = "O": HisPiece = "X" |
|||
' -1: human; 1: computer; 0: nobody |
|||
Mover = IIF(CompFirst, 1, -1) |
|||
WHILE Mover <> 0 |
|||
SELECT CASE Mover |
|||
CASE 1 |
|||
IF MovesCnt = 0 THEN |
|||
BestMove = INT(RND * 9) |
|||
ELSEIF MovesCnt = 1 THEN |
|||
BestMove = IIF(Board(4) <> " ", INT(RND * 2) * 6 + INT(RND * 2) * 2, 4) |
|||
ELSE |
|||
T = Evaluate(MyPiece, HisPiece) |
|||
END IF |
|||
Board(BestMove) = MyPiece |
|||
INC(MovesCnt) |
|||
PRINT |
|||
CALL DisplayPiecedBoard |
|||
PRINT |
|||
IF Win(MyPiece) THEN |
|||
INC(MyWinsCnt) |
|||
PRINT "I win!" |
|||
Mover = 0 |
|||
ELSEIF SpacesFilled THEN |
|||
INC(DrawsCnt) |
|||
PRINT "It's a draw. Thank you." |
|||
Mover = 0 |
|||
ELSE |
|||
Mover = -1 |
|||
END IF |
|||
CASE -1 |
|||
DO |
|||
INPUT "Where do you move? ",I |
|||
IF I < 1 OR I > 9 THEN |
|||
PRINT "Illegal! "; |
|||
ELSEIF Board(I - 1) <> " " THEN |
|||
PRINT "Place already occupied. "; |
|||
ELSE |
|||
EXIT DO |
|||
END IF |
|||
LOOP |
|||
Board(I - 1) = HisPiece |
|||
INC(MovesCnt) |
|||
PRINT |
|||
CALL DisplayPiecedBoard |
|||
PRINT |
|||
IF Win(HisPiece) THEN |
|||
INC(HisWinsCnt) |
|||
PRINT "You beat me! Good game." |
|||
Mover = 0 |
|||
ELSEIF SpacesFilled THEN |
|||
INC(DrawsCnt) |
|||
PRINT "It's a draw. Thank you." |
|||
Mover = 0 |
|||
ELSE |
|||
Mover = 1 |
|||
END IF |
|||
END SELECT |
|||
WEND |
|||
PRINT |
|||
INPUT "Another game (y/n)? ", Answ$ |
|||
LOOP UNTIL UCASE$(Answ$) <> "Y" |
|||
PRINT |
|||
PRINT "Final score:" |
|||
PRINT "You won "; HisWinsCnt; " game"; IIF(HisWinsCnt <> 1, "s.", ".") |
|||
PRINT "I won "; MyWinsCnt; " game"; IIF(MyWinsCnt <> 1, "s.", ".") |
|||
PRINT "We tied "; DrawsCnt; " game"; IIF(DrawsCnt <> 1, "s.", ".") |
|||
PRINT "See you later!" |
|||
END |
|||
SUB ClearBoard |
|||
FOR I = 0 TO 8: Board(I) = " ": NEXT I |
|||
END SUB |
|||
SUB DisplayNumberedBoard |
|||
FOR I = 0 TO 8 STEP 3 |
|||
PRINT " "; I + 1; " | "; I + 2; " | "; I + 3 |
|||
IF I <> 6 THEN PRINT "---+---+---" |
|||
NEXT I |
|||
END SUB |
|||
SUB DisplayPiecedBoard |
|||
FOR I = 0 TO 8 STEP 3 |
|||
PRINT " "; Board(I); " | "; Board(I + 1); " | "; Board(I + 2) |
|||
IF I <> 6 THEN PRINT "---+---+---" |
|||
NEXT I |
|||
END SUB |
|||
FUNCTION Evaluate (Me AS STRING, Him AS STRING) |
|||
' Recursive algorithm |
|||
DIM I AS INTEGER, SafeMove AS INTEGER, V AS INTEGER, LoseFlag AS INTEGER |
|||
IF Win(Me) THEN Evaluate = 1: EXIT FUNCTION |
|||
IF Win(Him) THEN Evaluate = -1: EXIT FUNCTION |
|||
IF SpacesFilled THEN Evaluate = 0: EXIT FUNCTION |
|||
LoseFlag = 1 |
|||
I = 0 |
|||
WHILE I <= 8 |
|||
IF Board(I) = " " THEN |
|||
Board(I) = Me ' Try the move. |
|||
V = Evaluate(Him, Me) |
|||
Board(I) = " " ' Restore the empty space. |
|||
IF V = -1 THEN BestMove = I: Evaluate = 1: EXIT FUNCTION |
|||
IF V = 0 THEN LoseFlag = 0: SafeMove = I |
|||
END IF |
|||
INC(I) |
|||
WEND |
|||
BestMove = SafeMove |
|||
Evaluate = -LoseFlag |
|||
END FUNCTION |
|||
FUNCTION SpacesFilled |
|||
FOR I = 0 TO 8 |
|||
IF Board(I) = " " THEN SpacesFilled = 0: EXIT FUNCTION |
|||
NEXT I |
|||
SpacesFilled = -1 |
|||
END FUNCTION |
|||
FUNCTION Win (Piece AS STRING) |
|||
FOR I = 0 TO 7 |
FOR I = 0 TO 7 |
||
IF Board(WinPos(I, 0)) = Piece AND Board(WinPos(I, 1)) = Piece AND Board(WinPos(I, 2)) = Piece THEN Win = -1: EXIT FUNCTION |
IF Board(WinPos(I, 0)) = Piece AND Board(WinPos(I, 1)) = Piece AND Board(WinPos(I, 2)) = Piece THEN Win = -1: EXIT FUNCTION |