挑戰(zhàn)自己,編程你的五子棋:Python+Pygame實(shí)踐經(jīng)驗(yàn)分享
五子棋,古老而經(jīng)典,是一種兩人對抗的策略棋類游戲。想要體驗(yàn)制作游戲的樂趣嗎?本文將詳細(xì)指導(dǎo)你如何使用Python語言和Pygame庫,一步步打造自己的五子棋游戲!
1. 開始之前:重要準(zhǔn)備
首先,確保你已經(jīng)安裝了pygame庫。接下來,我們會(huì)定義一些必要的常量,這些常量為我們的游戲設(shè)定了基礎(chǔ)參數(shù),例如棋子的顏色、棋盤的尺寸等:
EMPTY = 0
BLACK = 1
WHITE = 2
BLACK_COLOR = [0, 0, 0]
WHITE_COLOR = [255, 255, 255]
BOARD_SIZE = 15
GRID_SIZE = 40
2. 構(gòu)建五子棋棋盤
RenjuBoard類是五子棋的心臟。它代表了棋盤,并且提供了一系列的方法來進(jìn)行游戲操作:
- __init__方法:初始化一個(gè)15x15的空棋盤。
- move方法:玩家點(diǎn)擊后,會(huì)在相應(yīng)的位置落子。該方法還會(huì)檢查該位置是否已被占用。
- draw方法:使用Pygame的繪圖函數(shù),繪制出整個(gè)棋盤及其上的棋子。
特別值得注意的是,在draw方法中,我們不僅僅是畫出基本的棋盤線條,還特別強(qiáng)調(diào)了天元和四個(gè)星位,為棋盤增添了傳統(tǒng)的觸感。
# 五子棋棋盤類
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)
# 畫棋盤特殊點(diǎn)位
pygame.draw.circle(screen, BLACK_COLOR, [GRID_SIZE * 8, GRID_SIZE * 8], 5, 0) # 天元點(diǎn)
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. 勝負(fù)的決定時(shí)刻
在五子棋中,任意五個(gè)連續(xù)的同色棋子意味著一方的勝利。因此,is_win方法是至關(guān)重要的。它通過掃描每一行、每一列和兩個(gè)斜線方向,檢查是否存在五個(gè)連續(xù)的同色棋子。
# 定義函數(shù),傳入當(dāng)前棋盤上的棋子列表,輸出結(jié)果,不管黑棋白棋勝,都是傳回False,未出結(jié)果則為True
def is_win(board):
for n in range(15):
# 判斷垂直方向勝利
flag = 0
# flag是一個(gè)標(biāo)簽,表示是否有連續(xù)以上五個(gè)相同顏色的棋子
for b in board._board:
if b[n] == 1:
flag += 1
if flag == 5:
print('黑棋勝')
return False
else:
# else表示此時(shí)沒有連續(xù)相同的棋子,標(biāo)簽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. 游戲的主要循環(huán)
五子棋的魅力在于玩家的每一次操作。在main函數(shù)中,我們創(chuàng)建了一個(gè)游戲窗口,并初始化棋盤。主循環(huán)監(jiān)聽玩家的操作,每當(dāng)玩家點(diǎn)擊,就會(huì)更新棋盤并判斷勝負(fù)。
5. 后續(xù)擴(kuò)展
現(xiàn)在,你已經(jīng)有了一個(gè)基礎(chǔ)的五子棋游戲,但這僅僅是開始。你可以考慮增加更多的功能:
- AI對手:通過簡單的搜索算法或深度學(xué)習(xí),讓計(jì)算機(jī)成為一個(gè)具有挑戰(zhàn)性的對手。
- 悔棋功能:讓玩家有機(jī)會(huì)重新思考他們的策略。
- 背景音樂和音效:為游戲增加更多的沉浸感。
最后
五子棋不僅僅是一個(gè)游戲,它也是編程的一個(gè)極好的練習(xí)場。通過編寫代碼,你不僅可以更深入地了解游戲的規(guī)則和策略,還可以體驗(yàn)到編程帶來的樂趣和挑戰(zhàn)。不管你是初學(xué)者還是有經(jīng)驗(yàn)的程序員,都希望你能從中找到樂趣!