Skip to content
This repository has been archived by the owner on Apr 23, 2022. It is now read-only.

Commit

Permalink
Add game class
Browse files Browse the repository at this point in the history
  • Loading branch information
kekalainen committed Apr 27, 2021
1 parent 7fab4ad commit 6abff34
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 21 deletions.
6 changes: 5 additions & 1 deletion src/game/board.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@


class Board:
def __init__(self):
def __init__(self, game):
self.game = game
self.width = 8
self.moves = []
self.pieces = [[None] * self.width for i in range(self.width)]
Expand Down Expand Up @@ -65,6 +66,9 @@ def is_legal_move(self, from_xy, to_xy):
):
return False

if not self.game.is_legal_move(from_xy, to_xy, piece, occupant):
return False

return True

def get_legal_moves(self, x, y):
Expand Down
29 changes: 29 additions & 0 deletions src/game/game.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from game.board import Board


class Game:
def __init__(self, on_update):
self.white_to_move = True
self.board = Board(self)
self.dispatch_update = on_update

def is_legal_move(self, from_xy, to_xy, piece, occupant):
if piece.is_white() != self.white_to_move:
return False
return True

def switch_color_to_move(self):
self.white_to_move = not self.white_to_move
self.dispatch_update()

def move_piece(self, from_xy, to_xy):
if self.board.move_piece(from_xy, to_xy):
self.switch_color_to_move()
return True
return False

def undo_move(self):
if self.board.undo_move():
self.switch_color_to_move()
return True
return False
11 changes: 5 additions & 6 deletions src/ui/board.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@


class BoardFrame(tk.Frame):
def __init__(self, master=None, board=None, tile_width=100):
def __init__(self, master=None, game=None, tile_width=100):
super().__init__(master)
self.master = master
self.board = board
self.game = game
self.board = game.board

self.pack(expand=tk.TRUE, fill=tk.BOTH)
self.board_canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0)
Expand Down Expand Up @@ -47,7 +48,7 @@ def load_piece_images(self):
] = ImageTk.PhotoImage(img)

def undo_move(self, event):
self.board.undo_move()
self.game.undo_move()
self.deselect_tile()
self.draw_pieces()

Expand Down Expand Up @@ -113,9 +114,7 @@ def select_tile(self, event):
self.legal_tiles = self.board.get_legal_moves(x, y)
self.draw_board()
else:
self.board.move_piece(
(self.selected_tile[0], self.selected_tile[1]), (x, y)
)
self.game.move_piece((self.selected_tile[0], self.selected_tile[1]), (x, y))
self.deselect_tile()
self.draw_pieces()

Expand Down
56 changes: 42 additions & 14 deletions src/ui/main.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import tkinter as tk
import tkinter.messagebox
from tkinter.ttk import Notebook

from .board import BoardFrame
from game.board import Board
from game.game import Game


class MainFrame(tk.Frame):
Expand All @@ -20,11 +21,24 @@ def __init__(self, master=None):
padx = 10
pady = 5

start_btn = tk.Button(self, text="Play", command=self.start_game)
start_btn.grid(row=0, column=1, padx=padx, pady=pady)
tabs = Notebook(self)
tabs.grid(row=0, column=0)

tabs_game = tk.Frame(tabs)
tabs.add(tabs_game, text="Game")

self.start_btn = tk.Button(tabs_game, text="Play", command=self.start_game)
self.start_btn.grid(row=0, column=0, padx=padx, pady=pady)

self.move_label = tk.Label(tabs_game, text="")
self.move_label.grid(row=1, column=0, padx=padx, pady=pady)
self.move_label.grid_remove()

tabs_settings = tk.Frame(tabs)
tabs.add(tabs_settings, text="Settings")

credits_btn = tk.Button(
self,
tabs_settings,
text="Credits",
command=lambda: tk.messagebox.showinfo(
title="Credits",
Expand All @@ -36,34 +50,48 @@ def __init__(self, master=None):
),
),
)
credits_btn.grid(row=1, column=1, padx=padx, pady=pady)
credits_btn.grid(row=0, column=0, padx=padx, pady=pady)

quit_btn = tk.Button(self, text="Quit", command=self.master.destroy)
quit_btn.grid(row=2, column=1, padx=padx, pady=pady)
quit_btn.grid(row=1, column=0, padx=padx, pady=pady)

self.grid()

def on_game_update(self):
text = "White to move"
if not self.game.white_to_move:
text = "Black to move"
self.move_label["text"] = text

def start_game(self):
if not hasattr(self, "board"):
self.board = Board()
dimension = self.board.width * self.board_tile_width
if not hasattr(self, "game"):
self.game = Game(self.on_game_update)
self.board_dimension = self.game.board.width * self.board_tile_width
self.board_window = tk.Toplevel(master=self)
x = self.master.winfo_x() - dimension - 4
x = self.master.winfo_x() - self.board_dimension - 4
y = self.master.winfo_y()
self.board_window.geometry("%dx%d+%d+%d" % (dimension, dimension, x, y))
self.board_window.geometry(
"%dx%d+%d+%d" % (self.board_dimension, self.board_dimension, x, y)
)
self.board_window.resizable(False, False)
self.board_frame = BoardFrame(
self.board_window, board=self.board, tile_width=self.board_tile_width
self.board_window, game=self.game, tile_width=self.board_tile_width
)
self.master.bind("<Configure>", self.board_window_follow)
self.board_window.protocol("WM_DELETE_WINDOW", self.on_board_window_close)

self.start_btn.grid_remove()
self.move_label.grid()
self.on_game_update()

def board_window_follow(self, event=None):
x = self.master.winfo_x() - self.board_window.winfo_width() - 4
x = self.master.winfo_x() - self.board_dimension - 4
y = self.master.winfo_y()
self.board_window.geometry("+%d+%d" % (x, y))

def on_board_window_close(self):
delattr(self, "board")
delattr(self, "game")
self.master.unbind("<Configure>")
self.board_window.destroy()
self.start_btn.grid()
self.move_label.grid_remove()

0 comments on commit 6abff34

Please sign in to comment.