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