-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathTicTacToe.py
More file actions
52 lines (40 loc) · 2.01 KB
/
TicTacToe.py
File metadata and controls
52 lines (40 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class TicTacToe:
""" Making of a Tic-Tac-Toe game (simple version)"""
def __init__(self):
""" start a new game """
self._board = [[' '] *3 for j in range(3)] # make a 3x3 array
self._player = 'X'
def mark(self, i, j):
""" Put an X or O mark at position (i,j) for next player's turn. """
if not (0 <= i <= 2 and 0 <= j <= 2):
raise ValueError('Invalid position')
if self._board[i][j] != ' ':
raise ValueError('Board position occupied')
if self.winner( ) is not None:
raise ValueError('Game is over!')
self._board[i][j] = self._player
if self._player == 'X':
self._player = 'O'
else:
self._player = 'X'
def _is_win(self, mark):
"""Check whether the board configuration is a win for the given player."""
board = self._board
return(mark == board[0][0] == board[0][1] == board[0][2] or # row 0
mark == board[1][0] == board[1][1] == board[1][2] or # row 1
mark == board[2][0] == board[2][1] == board[2][2] or # row 2
mark == board[0][0] == board[1][0] == board[2][0] or # column 0
mark == board[0][1] == board[1][1] == board[2][1] or # column 1
mark == board[0][2] == board[1][2] == board[2][2] or # column 2
mark == board[0][0] == board[1][1] == board[2][2] or # diagonal
mark == board[0][2] == board[1][1] == board[2][0]) # rev diag
def winner(self):
"""Return mark of winning player, or None to indicate a tie."""
for mark in 'XO':
if self._is_win(mark):
return mark
return None
def __str__(self):
"""Return string representation of current game board."""
rows = [' | '.join(self._board[r]) for r in range(3)]
return '\n-------\n'.join(rows)