Python開發(fā)游戲之井字游戲的實(shí)戰(zhàn)步驟
前言
毫無疑問,你一定在學(xué)生時(shí)代玩過井字游戲,我們每個(gè)人都喜歡玩這款游戲。您會驚訝地發(fā)現(xiàn)井字游戲自古埃及時(shí)代就已存在。
通過 TechVidvan 的這個(gè) Python 項(xiàng)目,我們將構(gòu)建一個(gè)交互式 Tic Tac Toe 游戲,我們將在此過程中學(xué)習(xí)新事物。
什么是井字游戲?
Tic Tac Toe 是玩得最多的游戲之一,也是最好的消磨時(shí)間的游戲,您可以在任何地方用筆和紙玩。如果您不知道如何玩這個(gè)游戲,請不要擔(dān)心,讓我們先了解一下。
游戲由兩個(gè)人玩。首先,我們畫一個(gè) 3×3 方格的棋盤。第一個(gè)玩家選擇“X”并將其繪制在任何方形網(wǎng)格上,然后第二個(gè)玩家有機(jī)會在可用空間上繪制“O”。像這樣,玩家在空白處交替繪制“X”和“O”,直到玩家成功地以水平、垂直或?qū)蔷€方式繪制 3 個(gè)連續(xù)標(biāo)記。然后玩家贏得游戲,否則當(dāng)所有位置都填滿時(shí)游戲平局。
Python 井字游戲——項(xiàng)目詳情
有趣的 Python 項(xiàng)目將使用 pygame 庫構(gòu)建。我們將解釋該項(xiàng)目中使用的所有 pygame 對象方法。Pygame 是一個(gè)很棒的庫,它允許我們創(chuàng)建窗口并在窗口上繪制圖像和形狀。這樣我們將捕獲鼠標(biāo)坐標(biāo)并確定我們需要標(biāo)記“X”或“O”的塊。然后我們將檢查用戶是否贏得了比賽。
先決條件
為了實(shí)現(xiàn)這個(gè)游戲,我們將使用 Python 和 Pygame 的基本概念,Pygame 是一個(gè)用于構(gòu)建跨平臺游戲的 Python 庫。它包含計(jì)算機(jī)圖形和聲音庫所需的模塊。要安裝該庫,您可以從命令行使用 pip 安裝程序:
pip install pygame
構(gòu)建 Python 井字游戲的步驟
首先,讓我們檢查一下在 Python 中構(gòu)建 Tic Tac Toe 程序的步驟:
- 為我們的游戲創(chuàng)建顯示窗口。
- 在我們將玩井字游戲的畫布上繪制網(wǎng)格。
- 在畫布下方繪制狀態(tài)欄,以顯示輪到哪個(gè)玩家以及誰贏得了游戲。
- 當(dāng)有人贏得比賽或比賽平局時(shí),我們將重置比賽。
我們需要在無限循環(huán)中運(yùn)行我們的游戲。它會不斷尋找事件,當(dāng)用戶在網(wǎng)格上按下鼠標(biāo)按鈕時(shí),我們將首先獲取鼠標(biāo)的 X 和 Y 坐標(biāo)。然后我們將檢查用戶點(diǎn)擊了哪個(gè)方塊。然后我們將在畫布上繪制適當(dāng)?shù)?ldquo;X”或“O”圖像。所以這基本上就是我們將在這個(gè) Python 項(xiàng)目想法中做的事情。
1.初始化游戲組件
因此,讓我們從導(dǎo)入 pygame 庫和時(shí)間庫開始,因?yàn)槲覀儗⑹褂?strong>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 個(gè)無值。我們將玩游戲的畫布的高度和寬度為 400×400。
2.初始化Pygame窗口
我們使用 pygame 創(chuàng)建一個(gè)新窗口,我們將在其中玩 Tic Tac Toe 游戲。所以我們用pg.init()方法初始化pygame ,設(shè)置窗口顯示寬度為400,高度為500。我們預(yù)留了100像素的空間用于顯示游戲狀態(tài)。
pg.display.set_mode ()初始化顯示,我們用 screen 變量引用它。每當(dāng)我們想在顯示器上畫東西時(shí),都會使用這個(gè)屏幕變量。
pg.display.set_caption 方法用于設(shè)置將出現(xiàn)在顯示窗口頂部的名稱。
#初始化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.加載和轉(zhuǎn)換圖像
Python 項(xiàng)目使用了許多圖像,例如游戲開始或重置時(shí)將顯示的開場圖像。當(dāng)用戶點(diǎn)擊網(wǎng)格時(shí)我們將繪制的 X 和 O 圖像。我們加載所有圖像并調(diào)整它們的大小,以便它們很容易適合我們的窗口。
#加載圖像 opening = pg.image.load('tic tac opening.png') x_img = pg.image.load('x.png') o_img = pg.image.load('o.png') #調(diào)整圖像大小 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.定義函數(shù)
現(xiàn)在我們創(chuàng)建一個(gè)函數(shù)來啟動(dòng)游戲。當(dāng)我們想要重新啟動(dòng)游戲時(shí),我們也會使用這個(gè)函數(shù)。在 pygame 中,blit()函數(shù)用于在表面上繪制一個(gè)圖像到另一個(gè)圖像之上。
所以我們繪制開場圖像,繪制之后,我們總是需要用pg.display.update()更新顯示。繪制開始圖像時(shí),我們使用time.sleep(1)等待 1 秒,然后用白色填充屏幕。
接下來,我們在白色背景上繪制 2 條垂直線和水平線來制作 3×3 網(wǎng)格。最后,我們調(diào)用draw_status()函數(shù)
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 ()函數(shù)繪制一個(gè)黑色矩形,我們在其中更新游戲狀態(tài),顯示輪到哪個(gè)玩家以及游戲是結(jié)束還是平局。
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)) # 將呈現(xiàn)的消息復(fù)制到板上 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()函數(shù)檢查井字棋盤以查看“X”和“O”的所有標(biāo)記。它計(jì)算玩家是否贏得了比賽。當(dāng)玩家在一行、一列或?qū)蔷€上連續(xù)標(biāo)記 3 個(gè)標(biāo)記時(shí),他們可以獲勝。每當(dāng)我們在板上畫一個(gè)標(biāo)記“X”或“O”時(shí),都會調(diào)用此函數(shù)。
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) 函數(shù)獲取鼠標(biāo)單擊的行和列,然后繪制“X”或“O”標(biāo)記。我們從繪制標(biāo)記的 png 圖像的位置計(jì)算起點(diǎn)的 x 和 y 坐標(biāo)。
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)
最后一個(gè)函數(shù)是 reset_game()。這將重新啟動(dòng)游戲,我們還將所有變量重置為游戲的開始。
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]
萬歲!游戲已經(jīng)完成,可以玩了。使用tictactoe.py文件名保存源代碼并運(yùn)行該文件。
總結(jié)
到此這篇關(guān)于Python開發(fā)游戲之井字游戲的文章就介紹到這了,更多相關(guān)Python開發(fā)井字游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 爬取淘寶商品信息欄目的實(shí)現(xiàn)
這篇文章主要介紹了Python 爬取淘寶商品信息欄目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02python 獲取sqlite3數(shù)據(jù)庫的表名和表字段名的實(shí)例
今天小編就為大家分享一篇python 獲取sqlite3數(shù)據(jù)庫的表名和表字段名的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python網(wǎng)絡(luò)應(yīng)用開發(fā)知識點(diǎn)淺析
在本篇內(nèi)容中小編給學(xué)習(xí)python的朋友們整理了關(guān)于網(wǎng)絡(luò)應(yīng)用開發(fā)的相關(guān)知識點(diǎn)以及實(shí)例內(nèi)容,需要的朋友們參考下。2019-05-05python使用ctypes調(diào)用第三方庫時(shí)出現(xiàn)undefined?symbol錯(cuò)誤詳解
python中時(shí)間的庫有time和datetime,pandas也有提供相應(yīng)的時(shí)間處理函數(shù),下面這篇文章主要給大家介紹了關(guān)于python使用ctypes調(diào)用第三方庫時(shí)出現(xiàn)undefined?symbol錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2023-02-02解讀FastAPI異步化為transformers模型打造高性能接口
這篇文章主要介紹了解讀FastAPI異步化為transformers模型打造高性能接口問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python 彈窗設(shè)計(jì)小人發(fā)射愛心
今天小編就為大家分享一篇使用Python畫出小人發(fā)射愛心的代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-09-09在windows系統(tǒng)中實(shí)現(xiàn)python3安裝lxml
本文主要給大家簡單介紹了下在windows以及l(fā)inux系統(tǒng)中使用Python安裝LXML模塊的教程,非常簡單實(shí)用,有需要的小伙伴可以參考下2016-03-03