patternpythonMinor
Tic Tac Toe victory check
Viewed 0 times
toeticvictorytaccheck
Problem
I am writing Python code for a Tic Tac Toe game. I need to write a function that takes in three inputs: board, x, and y. Board being the current display of the board and then x and y being values of 0, 1, or 2. The game is set up to ask the user for coordinates.
The function is called in the game loop like so:
and it's similar for the computer turn.
I feel like there is a better way to write this function. I feel like I should be using x and y more or there is a better way to check rather than writing all the possibilities. What's
def CheckVictory(board, x, y):
#check if previous move was on vertical line and caused a win
if board[0][y] == ('X') and board[1][y] == ('X') and board [2][y] == ('X'):
return True
if board[0][y] == ('O') and board[1][y] == ('O') and board [2][y] == ('O'):
return True
#check if previous move was on horizontal line and caused a win
if board[x][0] == ('X') and board[x][1] == ('X') and board [x][2] == ('X'):
return True
if board[x][0] == ('O') and board[x][1] == ('O') and board [x][2] == ('O'):
return True
#check if previous move was on the main diagonal and caused a win
if board[0][0] == ('X') and board[1][1] == ('X') and board [2][2] == ('X'):
return True
if board[0][0] == ('O') and board[1][1] == ('O') and board [2][2] == ('O'):
return True
#check if previous move was on the secondary diagonal and caused a win
if board[0][2] == ('X') and board[1][1] == ('X') and board [2][0] == ('X'):
return True
if board[0][2] == ('O') and board[1][1] == ('O') and board [2][0] == ('O'):
return True
return False
#end of CheckVictory functionThe function is called in the game loop like so:
p_x, p_y = playerTurn(board) #let player take turn
displayBoard(board) #show board after move has been made
if CheckVictory(board, p_x, p_y): #see if user has won
print("CONGRATULATIONS, you win!")
newGame(board) #game over start new one
continueand it's similar for the computer turn.
I feel like there is a better way to write this function. I feel like I should be using x and y more or there is a better way to check rather than writing all the possibilities. What's
Solution
You know that a mark has been placed at
Your comments state "check if previous move was on the main/secondary diagonal", but you don't actually check. You can use the expressions
Simplified code:
board[x][y]. Then you only need this to check for a win on vertical line y:if board[0][y] == board[1][y] == board [2][y]Your comments state "check if previous move was on the main/secondary diagonal", but you don't actually check. You can use the expressions
x == y and x + y == 2 to check that.Simplified code:
def CheckVictory(board, x, y):
#check if previous move caused a win on vertical line
if board[0][y] == board[1][y] == board [2][y]:
return True
#check if previous move caused a win on horizontal line
if board[x][0] == board[x][1] == board [x][2]:
return True
#check if previous move was on the main diagonal and caused a win
if x == y and board[0][0] == board[1][1] == board [2][2]:
return True
#check if previous move was on the secondary diagonal and caused a win
if x + y == 2 and board[0][2] == board[1][1] == board [2][0]:
return True
return FalseCode Snippets
if board[0][y] == board[1][y] == board [2][y]def CheckVictory(board, x, y):
#check if previous move caused a win on vertical line
if board[0][y] == board[1][y] == board [2][y]:
return True
#check if previous move caused a win on horizontal line
if board[x][0] == board[x][1] == board [x][2]:
return True
#check if previous move was on the main diagonal and caused a win
if x == y and board[0][0] == board[1][1] == board [2][2]:
return True
#check if previous move was on the secondary diagonal and caused a win
if x + y == 2 and board[0][2] == board[1][1] == board [2][0]:
return True
return FalseContext
StackExchange Code Review Q#24764, answer score: 5
Revisions (0)
No revisions yet.