Guest User

Untitled

a guest
Dec 14th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. class State(object):
  2. X = 'X'
  3. O = 'O'
  4. NULL = '-'
  5. def __init__(self, row1=None, row2=None, row3=None):
  6. self.rows = [row or [self.NULL]*3 for row in [row1, row2, row3]]
  7. self.turn = self.O
  8.  
  9. @property
  10. def horizontal_rows(self):
  11. return self.rows
  12.  
  13. @property
  14. def vertical_rows(self):
  15. return [[c1, c2, c3] for c1, c2, c3 in zip(*self.rows)]
  16.  
  17. @property
  18. def diagonal_forward(self):
  19. return [r[i] for i, r in enumerate([list(reversed(r)) for r in self.rows])]
  20.  
  21. @property
  22. def diagonal_backward(self):
  23. return [row[index] for index, row in enumerate(self.rows)]
  24.  
  25. def is_won(self):
  26. for win_case in [*self.horizontal_rows, *self.vertical_rows, self.diagonal_forward, self.diagonal_backward]:
  27. if self.NULL not in win_case and len(set(win_case)) == 1:
  28. return set(win_case)
  29.  
  30. def is_full(self):
  31. for row in self.horizontal_rows + self.vertical_rows:
  32. if any([item == self.NULL for item in row]):
  33. return False
  34. return True
  35.  
  36. def space_occupied(self, row, column):
  37. return self.rows[row][column] in [self.X, self.O]
  38.  
  39. def add_move(self, row, column):
  40. self.rows[row][column] = self.turn
  41. self.turn = self.X if self.turn == self.O else self.O
  42.  
  43. def __repr__(self):
  44. formatted = [str(index or '>') + ' ' +' ' .join(row) for index, row in enumerate([[str(f) for f in range(1,4)]] + self.rows)]
  45. return '\t'+'\n\t'.join(formatted)
  46.  
  47.  
  48. class Game(object):
  49. def __init__(self):
  50. print('Welcome to Tic Tac Toe! When playing your turn, input a column and row (starting top left) e.g. - 1 2 (values between 1-3)')
  51. self.state = State()
  52.  
  53. def run(self):
  54. while not self.state.is_won() and not self.state.is_full():
  55. print('\nThe Board is:\n\n%s\n' % repr(self.state))
  56. self.state.add_move(*self.get_input())
  57. if self.state.is_full() and not self.state.is_won():
  58. print('Tie game:\n%s' % repr(self.state))
  59. else:
  60. print('Congrats %r, you won!:\n%s' % (self.state.is_won(), repr(self.state)))
  61.  
  62. def get_input(self):
  63. row_input = None
  64. while not self.validate_input(row_input):
  65. message = '%rs turn: ' % self.state.turn
  66. row_input = [item - 1 for item in reversed([int(x) for x in input(message).split()])]
  67. return row_input
  68.  
  69. def validate_input(self, player_input):
  70. if isinstance(player_input, list) and len(player_input) == 2 and all([0 <= n <= 2 for n in player_input]):
  71. if not self.state.space_occupied(*player_input):
  72. return True
  73. return False
  74.  
  75. if __name__ == '__main__':
  76. Game().run()
Add Comment
Please, Sign In to add comment