<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
毫無疑問,你一定在學生時代玩過井字遊戲,我們每個人都喜歡玩這款遊戲。您會驚訝地發現井字遊戲自古埃及時代就已存在。
通過 TechVidvan 的這個 Python 專案,我們將構建一個互動式 Tic Tac Toe 遊戲,我們將在此過程中學習新事物。
Tic Tac Toe 是玩得最多的遊戲之一,也是最好的消磨時間的遊戲,您可以在任何地方用筆和紙玩。如果您不知道如何玩這個遊戲,請不要擔心,讓我們先了解一下。
遊戲由兩個人玩。首先,我們畫一個 3×3 方格的棋盤。第一個玩家選擇“X”並將其繪製在任何方形網格上,然後第二個玩家有機會在可用空間上繪製“O”。像這樣,玩家在空白處交替繪製“X”和“O”,直到玩家成功地以水平、垂直或對角線方式繪製 3 個連續標記。然後玩家贏得遊戲,否則當所有位置都填滿時遊戲平局。
有趣的 Python 專案將使用 pygame 庫構建。我們將解釋該專案中使用的所有 pygame 物件方法。Pygame 是一個很棒的庫,它允許我們建立視窗並在視窗上繪製影象和形狀。這樣我們將捕獲滑鼠座標並確定我們需要標記“X”或“O”的塊。然後我們將檢查使用者是否贏得了比賽。
為了實現這個遊戲,我們將使用 Python 和 Pygame 的基本概念,Pygame 是一個用於構建跨平臺遊戲的 Python 庫。它包含計算機圖形和聲音庫所需的模組。要安裝該庫,您可以從命令列使用 pip 安裝程式:
pip install pygame
首先,讓我們檢查一下在 Python 中構建 Tic Tac Toe 程式的步驟:
我們需要在無限迴圈中執行我們的遊戲。它會不斷尋找事件,當用戶在網格上按下滑鼠按鈕時,我們將首先獲取滑鼠的 X 和 Y 座標。然後我們將檢查使用者點選了哪個方塊。然後我們將在畫布上繪製適當的“X”或“O”影象。所以這基本上就是我們將在這個 Python 專案想法中做的事情。
因此,讓我們從匯入 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。
我們使用 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")
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))
現在我們建立一個函數來啟動遊戲。當我們想要重新啟動遊戲時,我們也會使用這個函數。在 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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45