首頁 > 軟體

Python開發遊戲之井字遊戲的實戰步驟

2023-02-06 06:01:34

前言

毫無疑問,你一定在學生時代玩過井字遊戲,我們每個人都喜歡玩這款遊戲。您會驚訝地發現井字遊戲自古埃及時代就已存在。

通過 TechVidvan 的這個 Python 專案,我們將構建一個互動式 Tic Tac Toe 遊戲,我們將在此過程中學習新事物。

什麼是井字遊戲?

Tic Tac Toe 是玩得最多的遊戲之一,也是最好的消磨時間的遊戲,您可以在任何地方用筆和紙玩。如果您不知道如何玩這個遊戲,請不要擔心,讓我們先了解一下。

遊戲由兩個人玩。首先,我們畫一個 3×3 方格的棋盤。第一個玩家選擇“X”並將其繪製在任何方形網格上,然後第二個玩家有機會在可用空間上繪製“O”。像這樣,玩家在空白處交替繪製“X”和“O”,直到玩家成功地以水平、垂直或對角線方式繪製 3 個連續標記。然後玩家贏得遊戲,否則當所有位置都填滿時遊戲平局。

Python 井字遊戲——專案詳情

有趣的 Python 專案將使用 pygame 庫構建。我們將解釋該專案中使用的所有 pygame 物件方法。Pygame 是一個很棒的庫,它允許我們建立視窗並在視窗上繪製影象和形狀。這樣我們將捕獲滑鼠座標並確定我們需要標記“X”或“O”的塊。然後我們將檢查使用者是否贏得了比賽。

先決條件

為了實現這個遊戲,我們將使用 Python 和 Pygame 的基本概念,Pygame 是一個用於構建跨平臺遊戲的 Python 庫。它包含計算機圖形和聲音庫所需的模組。要安裝該庫,您可以從命令列使用 pip 安裝程式:

pip install pygame

構建 Python 井字遊戲的步驟

首先,讓我們檢查一下在 Python 中構建 Tic Tac Toe 程式的步驟:

  • 為我們的遊戲建立顯示視窗。
  • 在我們將玩井字遊戲的畫布上繪製網格。
  • 在畫布下方繪製狀態列,以顯示輪到哪個玩家以及誰贏得了遊戲。
  • 當有人贏得比賽或比賽平局時,我們將重置比賽。

我們需要在無限迴圈中執行我們的遊戲。它會不斷尋找事件,當用戶在網格上按下滑鼠按鈕時,我們將首先獲取滑鼠的 X 和 Y 座標。然後我們將檢查使用者點選了哪個方塊。然後我們將在畫布上繪製適當的“X”或“O”影象。所以這基本上就是我們將在這個 Python 專案想法中做的事情。

1.初始化遊戲元件

因此,讓我們從匯入 pygame 庫和時間庫開始,因為我們將使用time.sleep()方法在特定位置暫停遊戲。然後我們初始化我們將在 Tic Tac Toe 遊戲中使用的所有全域性變數。

import pygame as pg,sys 
from pygame.locals import * 
import time 
 
#初始化全域性變數
XO = 'x' 
winner = None 
draw = False 
width = 400 
height = 400 
white = (255, 255, 255) 
line_color = (10,10 ,10) 
 
#TicTacToe 3x3 棋盤
TTT = [[None]*3,[None]*3,[None]*3]

在這裡,TTT 是主要的 3×3 井字棋盤,起初,它將有 9 個無值。我們將玩遊戲的畫布的高度和寬度為 400×400。

2.初始化Pygame視窗

我們使用 pygame 建立一個新視窗,我們將在其中玩 Tic Tac Toe 遊戲。所以我們用pg.init()方法初始化pygame ,設定視窗顯示寬度為400,高度為500。我們預留了100畫素的空間用於顯示遊戲狀態。

pg.display.set_mode ()初始化顯示,我們用 screen 變數參照它。每當我們想在顯示器上畫東西時,都會使用這個螢幕變數。

pg.display.set_caption 方法用於設定將出現在顯示視窗頂部的名稱。

#初始化pygame視窗
pg.init() 
fps = 30 
CLOCK = pg.time.Clock() 
screen = pg.display.set_mode((width, height+100),0,32) 
pg.display.set_caption("Tic Tac Toe")

3.載入和轉換影象

Python 專案使用了許多影象,例如遊戲開始或重置時將顯示的開場影象。當用戶點選網格時我們將繪製的 X 和 O 影象。我們載入所有影象並調整它們的大小,以便它們很容易適合我們的視窗。

#載入影象
opening = pg.image.load('tic tac opening.png')
x_img = pg.image.load('x.png')
o_img = pg.image.load('o.png')
 
#調整影象大小
x_img = pg.transform.scale(x_img, (80,80))
o_img = pg.transform.scale(o_img, (80,80))
opening = pg.transform.scale(opening, (width, height+100))

4.定義函數

現在我們建立一個函數來啟動遊戲。當我們想要重新啟動遊戲時,我們也會使用這個函數。在 pygame 中,blit()函數用於在表面上繪製一個影象到另一個影象之上。

所以我們繪製開場影象,繪製之後,我們總是需要用pg.display.update()更新顯示。繪製開始影象時,我們使用time.sleep(1)等待 1 秒,然後用白色填充螢幕。

接下來,我們在白色背景上繪製 2 條垂直線和水平線來製作 3×3 網格。最後,我們呼叫draw_status()函數

def game_opening(): 
    screen.blit(opening,(0,0)) 
    pg.display.update() time.sleep 
    (1) 
    screen.fill(white) 
 
    # 繪製垂直線
    pg.draw.line(screen,line_color,(width/3,0),(width/3, height),7)
    pg.draw.line(screen,line_color,(width/3*2,0),(width/3*2, height),7)
    # 繪製水平線
    pg.draw.line(screen,line_color,(0,height/3),(width, height/3),7)
    pg.draw.line(screen,line_color,(0,height/3*2),(width, height/3*2),7)
    draw_status()

draw_status ()函數繪製一個黑色矩形,我們在其中更新遊戲狀態,顯示輪到哪個玩家以及遊戲是結束還是平局。

def draw_status():
    global draw
 
    if winner is None:
        message = XO.upper() + "'s Turn"
    else: 
        message = winner.upper() + "won!" 
    if draw: 
        message = 'Game Draw!' 
    font = pg.font.Font(None, 30) 
    text = font.render(message, 1, (255, 255, 255)) 
    # 將呈現的訊息複製到板上
    screen.fill ((0, 0, 0), (0、400、500、100)) 
    text_rect = text.get_rect(center=(width/2, 500-50)) 
    screen.blit(text, text_rect) 
    pg.display.update()

check_win()函數檢查井字棋盤以檢視“X”和“O”的所有標記。它計算玩家是否贏得了比賽。當玩家在一行、一列或對角線上連續標記 3 個標記時,他們可以獲勝。每當我們在板上畫一個標記“X”或“O”時,都會呼叫此函數。

def check_win():
    global TTT, winner,draw
 
    # 檢查獲勝行
    for row in range (0,3):
        if ((TTT [row][0] == TTT[row][1] == TTT[row][2]) and(TTT [row][0] is not None)):
            # this row won
            winner = TTT[row][0]
            pg.draw.line(screen, (250,0,0), (0, (row + 1)*height/3 -height/6),
                              (width, (row + 1)*height/3 - height/6 ), 4)
            break
 
    # 檢查獲勝列
    for col in range (0, 3):
        if (TTT[0][col] == TTT[1][col] == TTT[2][col]) and (TTT[0][col] is not None):
            # 繪製獲勝線
            winner = TTT[0][col]
            #draw winning line
            pg.draw.line (screen, (250,0,0),((col + 1)* width/3 - width/6, 0),
                          ((col + 1)* width/3 - width/6, height), 4)
            break
 
    # 檢查對角線贏家
    if (TTT[0][0] == TTT[1][1] == TTT[2][2]) and (TTT[0][0] is not None):
        # game won 對角線從左到右
        winner = TTT[0][0]
        pg.draw.line (screen, (250,70,70), (50, 50), (350, 350), 4)
 
    if (TTT[0][2] == TTT[1][1] == TTT[2][0]) and (TTT[0][2] is not None):
        # game won diagonally right to left
        winner = TTT[0][2]
        pg.draw.line (screen, (250,70,70), (350, 50), (50, 350), 4)
 
    if(all([all(row) for row in TTT]) and winner is None ):
        draw = True
    draw_status()

drawXO(row, col) 函數獲取滑鼠單擊的行和列,然後繪製“X”或“O”標記。我們從繪製標記的 png 影象的位置計算起點的 x 和 y 座標。

def drawXO(row,col):
    global TTT,XO
    if row==1:
        posx = 30
    if row==2:
        posx = width/3 + 30
    if row==3:
        posx = width/3*2 + 30
 
    if col==1:
        posy = 30
    if col==2:
        posy = height/3 + 30
    if col==3:
        posy = height/3*2 + 30
    TTT[row-1][col-1] = XO
    if(XO == 'x'):
        screen.blit(x_img,(posy,posx))
        XO= 'o'
    else:
        screen.blit(o_img,(posy,posx))
        XO= 'x'
    pg.display.update()
    #print(posx,posy)
    #print(TTT)

最後一個函數是 reset_game()。這將重新啟動遊戲,我們還將所有變數重置為遊戲的開始。

def reset_game():
    global TTT, winner,XO, draw
    time.sleep(3)
    XO = 'x'
    draw = False
    game_opening()
    winner=None
    TTT = [[None]*3,[None]*3,[None]*3]

萬歲!遊戲已經完成,可以玩了。使用tictactoe.py檔名儲存原始碼並執行該檔案。

總結

到此這篇關於Python開發遊戲之井字遊戲的文章就介紹到這了,更多相關Python開發井字遊戲內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com