Created
April 4, 2024 07:43
-
-
Save shiracamus/4b4c168dfc49736e716ff0d971627d63 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### tic-tac-toe game | |
from tkinter import * | |
from tkinter.messagebox import * | |
class Board: | |
def __init__(self, size=3): | |
self.size = size | |
self.clear() | |
def clear(self): | |
self.marks = [[""] * self.size for _ in range(self.size)] | |
def __iter__(self): | |
return iter(self.marks) | |
def is_full(self): | |
return all(mark != "" for marks in self.marks for mark in marks) | |
def is_putable(self, row, column): | |
return self.marks[row][column] == "" | |
def put(self, row, column, mark): | |
self.marks[row][column] = mark | |
def has_line(self, mark): | |
line = [mark] * self.size | |
return (line in self.marks or | |
tuple(line) in zip(*self.marks) or | |
line == [marks[i] for i, marks in enumerate(self.marks)] or | |
line == [marks[i] for i, marks in enumerate(self.marks[::-1])]) | |
class BoardUI: # Input/Output User Interface for Board | |
def __init__(self, board, put): | |
self.board = board | |
self.buttons = [[self._make_button(mark, put, row, column) | |
for column, mark in enumerate(marks)] | |
for row, marks in enumerate(board)] | |
def _make_button(self, mark, put, row, column): | |
button = Button(text=mark, | |
command=lambda: put(row, column), | |
width=5, | |
height=2, | |
font=", 24") | |
button.grid(row=row, column=column) | |
return button | |
def update(self): | |
for buttons, marks in zip(self.buttons, self.board): | |
for button, mark in zip(buttons, marks): | |
button["text"] = mark | |
class Player: | |
def __init__(self, name, mark): | |
self.name = name | |
self.mark = mark | |
class TicTacToe: | |
def __init__(self, exit_): | |
self.exit = exit_ | |
self.board = Board() | |
self.ui = BoardUI(self.board, self.put) | |
self.player1 = Player("first player", "O") | |
self.player2 = Player("seocnd player", "X") | |
self.turn = {self.player1: self.player2, self.player2: self.player1} | |
def play(self): | |
self.player = self.player1 | |
self.board.clear() | |
self.ui.update() | |
def put(self, row, column): | |
if not self.board.is_putable(row, column): | |
showinfo("against the rules", | |
"This square has selected!\n" + | |
"You must select to square that wasn't selected.") | |
return | |
self.board.put(row, column, self.player.mark) | |
self.ui.update() | |
if self.board.has_line(self.player.mark): | |
self.win(self.player) | |
elif self.board.is_full(): | |
self.draw() | |
else: | |
self.player = self.turn[self.player] | |
def win(self, player): | |
showinfo("game end", | |
f"This game's winer is {player.name}({player.mark})!") | |
self.ask_play_again() | |
def draw(self): | |
showinfo("game end", "This game is draw!") | |
self.ask_play_again() | |
def ask_play_again(self): | |
if askyesno("replay or exit", "Are you want to play again?"): | |
self.play() | |
else: | |
self.exit() | |
def main(): | |
root = Tk() | |
root.title("tic tac toe game") | |
game = TicTacToe(root.quit) | |
game.play() | |
root.mainloop() | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment