forked from OpenBMB/ChatDev
-
Notifications
You must be signed in to change notification settings - Fork 0
/
board.py
51 lines (51 loc) · 2.18 KB
/
board.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
'''
This file handles the game logic for the Gomoku game.
'''
import pygame
class Board:
def __init__(self, rows, cols, player_1_icon, player_2_icon, width, height):
self.rows = rows
self.cols = cols
self.width = width
self.height = height
self.board = [[None for _ in range(cols)] for _ in range(rows)]
self.current_player = 1
self.player_1_icon =player_1_icon
self.player_2_icon =player_2_icon
self.game_state = 'ongoing'
self.winner = None
def place_stone(self, x, y):
if self.game_state == 'ended':
return
row, col = self.get_board_position(x, y)
if row >= 0 and row < self.rows and col >= 0 and col < self.cols:
if self.board[row][col] is None:
self.board[row][col] = self.current_player
if self.check_win(row, col):
self.game_state = 'ended'
self.winner = self.current_player
self.current_player = 1 if self.current_player == 2 else 2
def get_board_position(self, x, y):
row = y // (self.height // self.rows)
col = x // (self.width // self.cols)
return row, col
def check_win(self, row, col):
# Check horizontal, vertical and diagonal lines for a win
directions = [(0, 1), (1, 0), (1, 1), (1, -1)]
for dx, dy in directions:
if self.count_stones(row, col, dx, dy) + self.count_stones(row, col, -dx, -dy) - 1 >= 5:
return True
return False
def count_stones(self, row, col, dx, dy):
count = 0
while 0 <= row < self.rows and 0 <= col < self.cols and self.board[row][col] == self.current_player:
count += 1
row += dx
col += dy
return count
def draw(self, window):
for row in range(self.rows):
for col in range(self.cols):
if self.board[row][col] is not None:
icon = self.player_1_icon if self.board[row][col] == 1 else self.player_2_icon
window.blit(icon, (col * (self.width // self.cols), row * (self.height // self.rows)))