Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.97 KB | None | 0 0
  1. class TicTacToeUI(QtWidgets.QWidget):
  2. icons = ['icons/x-mark.png', 'icons/hollow-circle.png']
  3.  
  4. def __init__(self, parent=None):
  5. super().__init__(parent)
  6. self.setWindowTitle("TicTacToe")
  7. self.setStyleSheet('background-color: #D7CCC8;')
  8. # Players
  9. self._players_selector = QtWidgets.QGridLayout()
  10. self._players = list()
  11. for p in range(2):
  12. label = QtWidgets.QLabel('Player {:}'.format(p))
  13. selectbox = QtWidgets.QComboBox()
  14. selectbox.setFixedHeight(24)
  15. selectbox.addItems(list(PLAYERS.keys()))
  16. self._players_selector.addWidget(label, 0, p)
  17. self._players_selector.addWidget(selectbox, 1, p)
  18. self._players.append(selectbox)
  19. self._grid = QtWidgets.QGridLayout()
  20. self._gameboard_buttons = dict()
  21. for i in range(self.m):
  22. for j in range(self.n):
  23. btn = self.create_gameboard_button(row=i, col=j)
  24. self._grid.addWidget(btn, i, j)
  25. self._gameboard_buttons.update({(i, j): btn})
  26. self._message_box = QtWidgets.QLabel('', parent=self)
  27. self._restart_button = QtWidgets.QPushButton('Start', parent=self)
  28. self._restart_button.setFixedHeight(32)
  29. self._restart_button.clicked.connect(self.restart)
  30. # Layout
  31. self._layout = QtWidgets.QVBoxLayout()
  32. self._layout.addLayout(self._players_selector)
  33. self._layout.addLayout(self._grid)
  34. self._layout.addWidget(self._message_box)
  35. self._layout.addWidget(self._restart_button)
  36. self.setLayout(self._layout)
  37. # The game
  38. self._game = TicTacToe()
  39. self._started = False
  40.  
  41. def create_gameboard_button(self, row, col):
  42. btn = TicTacToeUIButton('', parent=self, style_sheet='background-color: #D7CCC8;')
  43. btn.setFixedSize(64, 64)
  44. btn.clicked.connect(functools.partial(self.click, row, col))
  45. return btn
  46.  
  47. def click(self, row, col):
  48. if not self._started:
  49. pass
  50. elif self._game.is_ended:
  51. pass
  52. else:
  53. btn = self._gameboard_buttons.get((row, col))
  54. if btn is not None:
  55. if btn.is_occupied:
  56. msg = 'It is occupied. Please select another one.'
  57. self._message_box.setText(msg)
  58. else:
  59. player = self._game.turn_player
  60. # Icon appearance
  61. for _, b in self._gameboard_buttons.items():
  62. b.remove_border()
  63. btn.setIcon(QtGui.QIcon(self.icons[player]))
  64. btn.setIconSize(QtCore.QSize(48, 48))
  65. btn.add_border('border: 1px solid #FF0000;')
  66. btn.occupied_player = player
  67. # Check result
  68. self._game.move(row=row, col=col, player=player)
  69. if self._game.winner is not None:
  70. if self._game.winner == -1:
  71. msg = 'Draw. What a game!'
  72. else:
  73. msg = 'Player {:} won. Congratulations!'
  74. msg = msg.format(self._game.winner)
  75. else:
  76. msg = ''
  77. self._message_box.setText(msg)
  78. # Next turn
  79. if self._game.is_ended:
  80. pass
  81. else:
  82. self._game.players[self._game.turn_player].decide_ui(self)
  83.  
  84. def reset(self):
  85. self._started = True
  86. self._game.reset()
  87. self._game.player0 = PLAYERS.get(self._players[0].currentText())
  88. self._game.player1 = PLAYERS.get(self._players[1].currentText())
  89. self._restart_button.setText('Restart')
  90. self._message_box.setText('')
  91. for _, btn in self._gameboard_buttons.items():
  92. btn.reset()
  93. if self._game.player0.is_ai:
  94. self._game._player0.decide_ui(self)
  95.  
  96. def restart(self):
  97. self.reset()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement