Python實現井字棋遊戲

一、背景

井字棋遊戲是一種經典的二人博弈遊戲,以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 True

return 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-hk/n/156790.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-18 02:00
下一篇 2024-11-18 02:00

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論