Skip to content

Instantly share code, notes, and snippets.

@accessnash
Created April 5, 2021 15:58
Show Gist options
  • Save accessnash/6c336d1c14bc52164935f4918402e010 to your computer and use it in GitHub Desktop.
Save accessnash/6c336d1c14bc52164935f4918402e010 to your computer and use it in GitHub Desktop.
A simple implementation of the Tic Tac Toe game using OOP
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 5 08:46:46 2021
@author: Localuser
"""
import random
class Player:
def __init__(self, marker="X", is_human=True):
self._marker = marker
self._is_human = is_human
@property
def marker(self):
return self._marker
@property
def is_human(self):
return self._is_human
def get_player_move(self):
if self._is_human:
return self.get_human_move()
else:
return self.get_computer_move()
def get_human_move(self):
move = input("Player move (X) : ")
return move
def get_computer_move(self):
row = random.choice([1, 2, 3])
column = random.choice(["A", "B", "C"])
print("Computer move (O) : ", str(row) + column)
return str(row) + column
class Board:
EMPTY = 0
COLUMNS = {"A" : 0, "B" : 1, "C" : 2}
ROWS = (1, 2, 3)
def __init__(self, game_board=None):
if game_board:
self.game_board = game_board
else:
self.game_board = [[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
def print_board(self):
print(" A B C")
for i, row in enumerate(self.game_board, 1):
print(i, end=" | ")
for column in row:
if column != Board.EMPTY:
print(column, end=" | ")
else:
print(" | ", end="")
print("\n---------------")
def submit_move(self, move, player):
if not self.is_move_valid(move):
print("Invalid Input: Please enter row and column of your move")
return
else:
row_index = int(move[0]) - 1
col_index = Board.COLUMNS[move[1]]
value = self.game_board[row_index][col_index]
if value == Board.EMPTY:
self.game_board[row_index][col_index] = player.marker
else:
print("This space is already filled")
def is_move_valid(self, move):
return ((len(move) == 2)
and (int(move[0]) in Board.ROWS)
and (move[1] in Board.COLUMNS))
def is_winner(self, player, row, column):
if self.check_row(row, player):
return True
elif self.check_column(column, player):
return True
elif self.check_diagonal(player):
return True
elif self.check_antidiagonal(player):
return True
else:
return False
def check_tie(self):
total_empty = 0
for row in self.game_board:
total_empty += row.count(Board.EMPTY)
if total_empty == 0:
return True
else:
return False
def check_row(self, row, player):
row_index = int(row) - 1
board_row = self.game_board[row_index]
if board_row.count(player.marker) == 3:
return True
else:
return False
def check_column(self, column, player):
col_index = Board.COLUMNS[column]
total_markers = 0
for i in range(3):
if self.game_board[i][col_index] == player.marker:
total_markers += 1
if total_markers == 3:
return True
else:
return False
def check_diagonal(self, player):
total_markers = 0
for i in range(3):
if self.game_board[i][i] == player.marker:
total_markers += 1
if total_markers == 3:
return True
else:
return False
def check_antidiagonal(self, player):
total_markers = 0
for i in range(3):
if self.game_board[i][2-i] == player.marker:
total_markers += 1
if total_markers == 3:
return True
else:
return False
print("***************")
print(" Tic-Tac-Toe ")
print("***************")
board = Board()
player = Player()
computer = Player("O", False)
board.print_board()
while True:
# Ask human player move
move = player.get_player_move()
# Submit move
board.submit_move(move, player)
# Print board
board.print_board()
if board.is_move_valid(move) and board.is_winner(player, move[0], move[1]):
print("You won!")
break
# Ask computer player move
comp_move = computer.get_player_move()
# Submit move
board.submit_move(comp_move, computer)
# Print board
board.print_board()
if board.is_winner(computer, comp_move[0], comp_move[1]):
print("You lost :(")
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment