引言
五子棋,古老而經典,是一種兩人對抗的策略棋類游戲。想要體驗制作游戲的樂趣嗎?本文將詳細指導你如何使用Python/ target=_blank class=infotextkey>Python語言和Pygame庫,一步步打造自己的五子棋游戲!
1. 開始之前:重要準備
首先,確保你已經安裝了pygame庫。接下來,我們會定義一些必要的常量,這些常量為我們的游戲設定了基礎參數,例如棋子的顏色、棋盤的尺寸等:
EMPTY = 0
BLACK = 1
WHITE = 2
BLACK_COLOR = [0, 0, 0]
WHITE_COLOR = [255, 255, 255]
BOARD_SIZE = 15
GRID_SIZE = 40
2. 構建五子棋棋盤
RenjuBoard類是五子棋的心臟。它代表了棋盤,并且提供了一系列的方法來進行游戲操作:
-
__init__方法:初始化一個15x15的空棋盤。 -
move方法:玩家點擊后,會在相應的位置落子。該方法還會檢查該位置是否已被占用。 -
draw方法:使用Pygame的繪圖函數,繪制出整個棋盤及其上的棋子。
特別值得注意的是,在draw方法中,我們不僅僅是畫出基本的棋盤線條,還特別強調了天元和四個星位,為棋盤增添了傳統的觸感。
# 五子棋棋盤類
class RenjuBoard:
def __init__(self):
self._board = [[EMPTY] * BOARD_SIZE for _ in range(BOARD_SIZE)]
# 重置棋盤
def reset(self):
for row in range(BOARD_SIZE):
self._board[row] = [EMPTY] * BOARD_SIZE
# 下棋
def move(self, row, col, is_black):
if self._board[row][col] == EMPTY:
self._board[row][col] = BLACK if is_black else WHITE
return True
return False
# 繪制棋盤與棋子
def draw(self, screen):
# 畫棋盤線
for h in range(1, BOARD_SIZE + 1):
pygame.draw.line(screen, BLACK_COLOR, [GRID_SIZE, h * GRID_SIZE], [BOARD_SIZE * GRID_SIZE, h * GRID_SIZE], 1)
pygame.draw.line(screen, BLACK_COLOR, [h * GRID_SIZE, GRID_SIZE], [h * GRID_SIZE, BOARD_SIZE * GRID_SIZE], 1)
# 畫外框
pygame.draw.rect(screen, BLACK_COLOR, [GRID_SIZE - BORDER_WIDTH, GRID_SIZE - BORDER_WIDTH, (BOARD_SIZE + 1) * GRID_SIZE, (BOARD_SIZE + 1) * GRID_SIZE], BORDER_WIDTH)
# 畫棋盤特殊點位
pygame.draw.circle(screen, BLACK_COLOR, [GRID_SIZE * 8, GRID_SIZE * 8], 5, 0) # 天元點
for x in [GRID_SIZE * 4, GRID_SIZE * 12]:
for y in [GRID_SIZE * 4, GRID_SIZE * 12]:
pygame.draw.circle(screen, BLACK_COLOR, [x, y], 3, 0)
# 畫棋子
for row in range(BOARD_SIZE):
for col in range(BOARD_SIZE):
if self._board[row][col] != EMPTY:
color = BLACK_COLOR if self._board[row][col] == BLACK else WHITE_COLOR
pos = [GRID_SIZE * (col + 1), GRID_SIZE * (row + 1)]
pygame.draw.circle(screen, color, pos, 18, 0)
3. 勝負的決定時刻
在五子棋中,任意五個連續的同色棋子意味著一方的勝利。因此,is_win方法是至關重要的。它通過掃描每一行、每一列和兩個斜線方向,檢查是否存在五個連續的同色棋子。
# 定義函數,傳入當前棋盤上的棋子列表,輸出結果,不管黑棋白棋勝,都是傳回False,未出結果則為True
def is_win(board):
for n in range(15):
# 判斷垂直方向勝利
flag = 0
# flag是一個標簽,表示是否有連續以上五個相同顏色的棋子
for b in board._board:
if b[n] == 1:
flag += 1
if flag == 5:
print('黑棋勝')
return False
else:
# else表示此時沒有連續相同的棋子,標簽flag重置為0
flag = 0
flag = 0
for b in board._board:
if b[n] == 2:
flag += 1
if flag == 5:
print('白棋勝')
return False
else:
flag = 0
# 判斷水平方向勝利
flag = 0
for b in board._board[n]:
if b == 1:
flag += 1
if flag == 5:
print('黑棋勝')
return False
else:
flag = 0
flag = 0
for b in board._board[n]:
if b == 2:
flag += 1
if flag == 5:
print('白棋勝')
return False
else:
flag = 0
# 判斷正斜方向勝利
for x in range(4, 25):
flag = 0
for i,b in enumerate(board._board):
if 14 >= x - i >= 0 and b[x - i] == 1:
flag += 1
if flag == 5:
print('黑棋勝')
return False
else:
flag = 0
for x in range(4, 25):
flag = 0
for i,b in enumerate(board._board):
if 14 >= x - i >= 0 and b[x - i] == 2:
flag += 1
if flag == 5:
print('白棋勝')
return False
else:
flag = 0
#判斷反斜方向勝利
for x in range(11, -11, -1):
flag = 0
for i,b in enumerate(board._board):
if 0 <= x + i <= 14 and b[x + i] == 1:
flag += 1
if flag == 5:
print('黑棋勝')
return False
else:
flag = 0
for x in range(11, -11, -1):
flag = 0
for i,b in enumerate(board._board):
if 0 <= x + i <= 14 and b[x + i] == 2:
flag += 1
if flag == 5:
print('白棋勝')
return False
else:
flag = 0
return True
4. 游戲的主要循環
五子棋的魅力在于玩家的每一次操作。在mAIn函數中,我們創建了一個游戲窗口,并初始化棋盤。主循環監聽玩家的操作,每當玩家點擊,就會更新棋盤并判斷勝負。
5. 后續擴展
現在,你已經有了一個基礎的五子棋游戲,但這僅僅是開始。你可以考慮增加更多的功能:
-
AI對手:通過簡單的搜索算法或深度學習,讓計算機成為一個具有挑戰性的對手。 -
悔棋功能:讓玩家有機會重新思考他們的策略。 -
背景音樂和音效:為游戲增加更多的沉浸感。