????大家好,我是Sonhhxg_柒,希望你看完之后,能對你有所幫助,不足請指正!共同學(xué)習(xí)交流??
??個人主頁-Sonhhxg_柒的博客_CSDN博客???
??歡迎各位→點贊?? + 收藏?? + 留言???
??系列專欄 - 機(jī)器學(xué)習(xí)【ML】?自然語言處理【NLP】? 深度學(xué)習(xí)【DL】
??
???foreword
?說明?本人講解主要包括Python、機(jī)器學(xué)習(xí)(ML)、深度學(xué)習(xí)(DL)、自然語言處理(NLP)等內(nèi)容。
如果你對這個系列感興趣的話,可以關(guān)注訂閱喲??
文章目錄
什么是井字游戲?
Python 井字游戲——項目詳情
先決條件
構(gòu)建 Python 井字游戲的步驟
1.初始化游戲組件
2.初始化Pygame窗口
3.加載和轉(zhuǎn)換圖像
4.定義函數(shù)
毫無疑問,你一定在學(xué)生時代玩過井字游戲,我們每個人都喜歡玩這款游戲。您會驚訝地發(fā)現(xiàn)井字游戲自古埃及時代就已存在。
通過 TechVidvan 的這個 Python 項目,我們將構(gòu)建一個交互式 Tic Tac Toe 游戲,我們將在此過程中學(xué)習(xí)新事物。
什么是井字游戲?
Tic Tac Toe 是玩得最多的游戲之一,也是最好的消磨時間的游戲,您可以在任何地方用筆和紙玩。如果您不知道如何玩這個游戲,請不要擔(dān)心,讓我們先了解一下。
游戲由兩個人玩。首先,我們畫一個 3×3 方格的棋盤。第一個玩家選擇“X”并將其繪制在任何方形網(wǎng)格上,然后第二個玩家有機(jī)會在可用空間上繪制“O”。像這樣,玩家在空白處交替繪制“X”和“O”,直到玩家成功地以水平、垂直或?qū)蔷€方式繪制 3 個連續(xù)標(biāo)記。然后玩家贏得游戲,否則當(dāng)所有位置都填滿時游戲平局。
Python 井字游戲——項目詳情
有趣的 Python 項目將使用 pygame 庫構(gòu)建。我們將解釋該項目中使用的所有 pygame 對象方法。Pygame 是一個很棒的庫,它允許我們創(chuàng)建窗口并在窗口上繪制圖像和形狀。這樣我們將捕獲鼠標(biāo)坐標(biāo)并確定我們需要標(biāo)記“X”或“O”的塊。然后我們將檢查用戶是否贏得了比賽。
先決條件
為了實現(xiàn)這個游戲,我們將使用 Python 和 Pygame 的基本概念,Pygame 是一個用于構(gòu)建跨平臺游戲的 Python 庫。它包含計算機(jī)圖形和聲音庫所需的模塊。要安裝該庫,您可以從命令行使用 pip 安裝程序:
pip install pygame
構(gòu)建 Python 井字游戲的步驟
首先,讓我們檢查一下在 Python 中構(gòu)建 Tic Tac Toe 程序的步驟:
- 為我們的游戲創(chuàng)建顯示窗口。
- 在我們將玩井字游戲的畫布上繪制網(wǎng)格。
- 在畫布下方繪制狀態(tài)欄,以顯示輪到哪個玩家以及誰贏得了游戲。
- 當(dāng)有人贏得比賽或比賽平局時,我們將重置比賽。
我們需要在無限循環(huán)中運(yùn)行我們的游戲。它會不斷尋找事件,當(dāng)用戶在網(wǎng)格上按下鼠標(biāo)按鈕時,我們將首先獲取鼠標(biāo)的 X 和 Y 坐標(biāo)。然后我們將檢查用戶點擊了哪個方塊。然后我們將在畫布上繪制適當(dāng)?shù)摹癤”或“O”圖像。所以這基本上就是我們將在這個 Python 項目想法中做的事情。
1.初始化游戲組件
因此,讓我們從導(dǎo)入 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?,設(shè)置窗口顯示寬度為400,高度為500。我們預(yù)留了100像素的空間用于顯示游戲狀態(tài)。
pg.display.set_mode?()初始化顯示,我們用 screen 變量引用它。每當(dāng)我們想在顯示器上畫東西時,都會使用這個屏幕變量。
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 項目使用了許多圖像,例如游戲開始或重置時將顯示的開場圖像。當(dāng)用戶點擊網(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ù)來啟動游戲。當(dāng)我們想要重新啟動游戲時,我們也會使用這個函數(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)的消息復(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)記。它計算玩家是否贏得了比賽。當(dāng)玩家在一行、一列或?qū)蔷€上連續(xù)標(biāo)記 3 個標(biāo)記時,他們可以獲勝。每當(dāng)我們在板上畫一個標(biāo)記“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ù)獲取鼠標(biāo)單擊的行和列,然后繪制“X”或“O”標(biāo)記。我們從繪制標(biāo)記的 png 圖像的位置計算起點的 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)
最后一個函數(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文件名保存源代碼并運(yùn)行該文件。
文章來源:http://www.zghlxwxcb.cn/news/detail-425902.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-425902.html
到了這里,關(guān)于用 Python 開發(fā)游戲——Python井字游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!