0
0
LldHow-ToIntermediate ยท 4 min read

How to Design a Chess Game: Architecture and Design Patterns

To design a chess game, create a Board class to represent the 8x8 grid and a Piece class hierarchy for different chess pieces. Use a GameController to manage turns, validate moves, and track game state like check or checkmate.
๐Ÿ“

Syntax

The core components include:

  • Board: Represents the chessboard grid and holds pieces.
  • Piece: Base class for all chess pieces with move rules.
  • GameController: Manages game flow, player turns, and move validation.
  • Move: Represents a move from one position to another.
python
class Board:
    def __init__(self):
        self.grid = [[None for _ in range(8)] for _ in range(8)]

class Piece:
    def __init__(self, color):
        self.color = color
    def valid_moves(self, position, board):
        pass

class GameController:
    def __init__(self):
        self.board = Board()
        self.current_turn = 'white'
    def make_move(self, move):
        pass
๐Ÿ’ป

Example

This example shows a simple chess game setup with a board, pieces, and move validation for a pawn.

python
class Board:
    def __init__(self):
        self.grid = [[None for _ in range(8)] for _ in range(8)]
        self.setup_pieces()

    def setup_pieces(self):
        for i in range(8):
            self.grid[1][i] = Pawn('black')
            self.grid[6][i] = Pawn('white')

    def move_piece(self, start, end):
        piece = self.grid[start[0]][start[1]]
        if piece and piece.is_valid_move(start, end, self):
            self.grid[end[0]][end[1]] = piece
            self.grid[start[0]][start[1]] = None
            return True
        return False

class Piece:
    def __init__(self, color):
        self.color = color

class Pawn(Piece):
    def is_valid_move(self, start, end, board):
        direction = -1 if self.color == 'white' else 1
        start_row, start_col = start
        end_row, end_col = end
        if start_col == end_col and end_row == start_row + direction and board.grid[end_row][end_col] is None:
            return True
        return False

class GameController:
    def __init__(self):
        self.board = Board()
        self.current_turn = 'white'

    def make_move(self, start, end):
        piece = self.board.grid[start[0]][start[1]]
        if piece and piece.color == self.current_turn:
            if self.board.move_piece(start, end):
                self.current_turn = 'black' if self.current_turn == 'white' else 'white'
                return 'Move successful'
            else:
                return 'Invalid move'
        return 'Not your turn or no piece at start'

# Example usage
controller = GameController()
print(controller.make_move((6, 0), (5, 0)))  # White pawn moves forward
print(controller.make_move((1, 0), (2, 0)))  # Black pawn moves forward
print(controller.make_move((6, 0), (4, 0)))  # Invalid move (two steps not implemented)
Output
Move successful Move successful Invalid move
โš ๏ธ

Common Pitfalls

Common mistakes include:

  • Not separating game logic from UI, making code hard to maintain.
  • Ignoring special moves like castling, en passant, or pawn promotion.
  • Not validating moves properly, allowing illegal moves.
  • Failing to track game state like check, checkmate, or stalemate.

Always keep game rules encapsulated in piece classes and use a controller to manage turns and state.

python
class Pawn(Piece):
    def is_valid_move(self, start, end, board):
        # Wrong: allows moving backward
        start_row, start_col = start
        end_row, end_col = end
        if start_col == end_col and abs(end_row - start_row) == 1:
            return True
        return False

# Correct approach:
class Pawn(Piece):
    def is_valid_move(self, start, end, board):
        direction = -1 if self.color == 'white' else 1
        start_row, start_col = start
        end_row, end_col = end
        if start_col == end_col and end_row == start_row + direction and board.grid[end_row][end_col] is None:
            return True
        return False
๐Ÿ“Š

Quick Reference

  • Board: 8x8 grid holding pieces.
  • Piece: Base class with move rules.
  • GameController: Manages turns and game state.
  • Move Validation: Each piece defines its own valid moves.
  • Game State: Track check, checkmate, stalemate.
โœ…

Key Takeaways

Design separate classes for Board, Piece, and GameController to keep code organized.
Implement move validation inside each Piece subclass to handle unique rules.
Use GameController to manage turns and overall game state like check and checkmate.
Avoid mixing UI and game logic to keep the design clean and maintainable.
Remember to handle special chess rules like castling and pawn promotion.