一、背景
井字棋遊戲是一種經典的二人博弈遊戲,以3*3的九宮格為遊戲棋盤,由兩名玩家輪流在空白格子中放入自己的棋子,先將自己的三個棋子連成一條直線的玩家獲得勝利。這個簡單的規則使得井字棋成為了一款易於上手,但又不失趣味和競爭性的遊戲。
本文將演示如何使用Python實現一個簡單的井字棋遊戲。具體而言,我們將通過使用Python的pygame庫來創建遊戲窗口和繪製棋盤,使用圖形界面來替代控制台,讓遊戲更加直觀和友好。
二、創建遊戲窗口
遊戲開始前,我們首先需要創建一個窗口來展示遊戲界面。我們將使用pygame庫來創建一個800×600大小的遊戲窗口,代碼如下:
import pygame # 初始化pygame庫 pygame.init() # 創建遊戲窗口 screen = pygame.display.set_mode((800, 600)) # 標題 pygame.display.set_caption("井字棋遊戲") # 遊戲主循環 run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # 渲染遊戲界面 screen.fill((255, 255, 255)) pygame.display.update() # 退出pygame庫 pygame.quit()
首先,我們需要初始化pygame庫,這個庫提供了許多基於圖形界面的遊戲開發函數和對象。然後,我們通過調用pygame.display.set_mode()函數創建一個800×600大小的遊戲窗口,並將其賦給變量screen。接着,我們使用pygame.display.set_caption()函數來設置遊戲窗口的標題。最後,我們通過遊戲主循環來不斷渲染遊戲界面,直到玩家退出遊戲,我們才會調用pygame.quit()函數退出pygame庫。
三、繪製遊戲棋盤
遊戲窗口創建好以後,我們需要在窗口上繪製一個3×3的棋盤。我們可以使用pygame庫的基本圖形繪製函數來生成棋盤,代碼如下:
import pygame # 初始化pygame庫 pygame.init() # 創建遊戲窗口 screen = pygame.display.set_mode((800, 600)) # 標題 pygame.display.set_caption("井字棋遊戲") # 繪製遊戲棋盤 def draw_board(): # 繪製橫向的兩條直線 pygame.draw.line(screen, (0, 0, 0), (100, 200), (700, 200), 5) pygame.draw.line(screen, (0, 0, 0), (100, 400), (700, 400), 5) # 繪製縱向的兩條直線 pygame.draw.line(screen, (0, 0, 0), (300, 0), (300, 600), 5) pygame.draw.line(screen, (0, 0, 0), (500, 0), (500, 600), 5) # 遊戲主循環 run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # 渲染遊戲界面 screen.fill((255, 255, 255)) draw_board() # 繪製棋盤 pygame.display.update() # 退出pygame庫 pygame.quit()
在這段代碼中,我們定義了一個draw_board()函數,用來繪製井字棋的棋盤。我們使用pygame庫的pygame.draw.line()函數來繪製直線,將其畫在遊戲窗口的surface對象上。首先,我們在棋盤的中間繪製一條橫向的直線,然後在上下兩個位置繪製一條橫向的直線,最後在中間位置繪製兩條縱向的直線。通過這樣的方式,我們就成功地繪製了井字棋遊戲的棋盤。
四、實現鼠標交互效果
接下來,我們需要讓玩家可以通過鼠標的點擊來在遊戲棋盤上落下棋子。為了實現這個效果,我們需要監聽鼠標事件,並且判斷玩家的鼠標點擊位置是否在棋盤的格子上。如果是,我們則在格子上繪製棋子,並且將當前格子的狀態改為已落子。代碼如下:
import pygame # 初始化pygame庫 pygame.init() # 創建遊戲窗口 screen = pygame.display.set_mode((800, 600)) # 標題 pygame.display.set_caption("井字棋遊戲") # 繪製遊戲棋盤 def draw_board(board): # 繪製橫向的兩條直線 pygame.draw.line(screen, (0, 0, 0), (100, 200), (700, 200), 5) pygame.draw.line(screen, (0, 0, 0), (100, 400), (700, 400), 5) # 繪製縱向的兩條直線 pygame.draw.line(screen, (0, 0, 0), (300, 0), (300, 600), 5) pygame.draw.line(screen, (0, 0, 0), (500, 0), (500, 600), 5) # 繪製棋子 for i in range(3): for j in range(3): if board[i][j] == "O": pygame.draw.circle(screen, (255, 0, 0), (200 + i * 200, 100 + j * 200), 80, 5) elif board[i][j] == "X": pygame.draw.line(screen, (0, 0, 255), (150 + i * 200, 50 + j * 200), (250 + i * 200, 150 + j * 200), 5) pygame.draw.line(screen, (0, 0, 255), (250 + i * 200, 50 + j * 200), (150 + i * 200, 150 + j * 200), 5) # 遊戲主循環 run = True board = [["", "", ""], ["", "", ""], ["", "", ""]] player = "X" # 默認玩家為X while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False elif event.type == pygame.MOUSEBUTTONUP: # 監聽鼠標點擊事件 pos = pygame.mouse.get_pos() col = (pos[0] - 100) // 200 # 計算所在列數 row = (pos[1] - 100) // 200 # 計算所在行數 if 0 <= col < 3 and 0 <= row < 3 and board[row][col] =="": board[row][col] = player # 改變棋盤狀態 player = "O" if player == "X" else "X" # 輪換玩家 # 渲染遊戲界面 screen.fill((255, 255, 255)) draw_board(board) # 繪製棋盤 pygame.display.update() # 退出pygame庫 pygame.quit()
在這段代碼中,我們定義了一個二維數組board來表示遊戲棋盤的狀態,每個位置的狀態可以是“X”代表玩家X已經落子,“O”代表玩家O已經落子,或者是空串“”代表該位置還沒有被落子。我們通過監聽pygame.MOUSEBUTTONUP事件來獲取玩家的鼠標點擊,並計算出玩家點擊的格子所在的行列數,判斷當前格子的狀態是否為空,如果是,則在棋盤上繪製相應的棋子,並將棋盤狀態改為已落子。截止到目前為止,我們已經完成了井字棋遊戲的基本交互效果。
五、判斷遊戲勝負
最後,我們需要在玩家落子後判斷遊戲是否產生了勝負。由於井字棋遊戲只有3×3個位置,我們可以通過枚舉所有勝利的情況來判斷是否存在勝利的玩家。代碼如下:
import pygame# 初始化pygame庫
pygame.init()# 創建遊戲窗口
screen = pygame.display.set_mode((800, 600))# 標題
pygame.display.set_caption("井字棋遊戲")# 繪製遊戲棋盤
def draw_board(board):
# 繪製橫向的兩條直線
pygame.draw.line(screen, (0, 0, 0), (100, 200), (700, 200), 5)
pygame.draw.line(screen, (0, 0, 0), (100, 400), (700, 400), 5)# 繪製縱向的兩條直線
pygame.draw.line(screen, (0, 0, 0), (300, 0), (300, 600), 5)
pygame.draw.line(screen, (0, 0, 0), (500, 0), (500, 600), 5)# 繪製棋子
for i in range(3):
for j in range(3):
if board[i][j] == "O":
pygame.draw.circle(screen, (255, 0, 0), (200 + i * 200, 100 + j * 200), 80, 5)
elif board[i][j] == "X":
pygame.draw.line(screen, (0, 0, 255), (150 + i * 200, 50 + j * 200), (250 + i * 200, 150 + j * 200), 5)
pygame.draw.line(screen, (0, 0, 255), (250 + i * 200, 50 + j * 200), (150 + i * 200, 150 + j * 200), 5)# 檢查是否有勝利的情況
def check_win(board, player):
# 檢查橫向
for i in range(3):
if board[i][0] == board[i][1] == board[i][2] == player:
return True# 檢查縱向
for i in range(3):
if board[0][i] == board[1][i] == board[2][i] == player:
return True# 檢查對角線
if board[1][1] == player and ((board[0][0] == board[2][2] == player) or (board[0][2] == board[2][0] == player)):
return Truereturn False
# 遊戲主循環
run = True
board = [["", "", ""], ["", "", ""], ["", "", ""]]
player = "X" # 玩家X先手
winner = None # 當前勝利者
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
col = (pos[0] - 100) // 200 # 計算所在列數
row = (pos[1] - 100) // 200 # 計算所在行數
if 0 <= col < 3 and 0 <= row < 3 and board[row][col] =="":
board[row][col] = player # 改變棋盤狀態
if check_win(board, player): # 判斷是否產生勝利
winner = player
player = "O" if player == "X" else "X" # 輪換玩家# 渲染遊戲界面
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/156790.html