本篇內(nèi)容主要講解“Python中turtle怎么實(shí)現(xiàn)球類(lèi)小游戲”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Python中turtle怎么實(shí)現(xiàn)球類(lèi)小游戲”吧!
創(chuàng)新互聯(lián)為企業(yè)級(jí)客戶(hù)提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站建設(shè)、成都做網(wǎng)站、成都App制作、成都微信小程序、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶(hù)快速提升營(yíng)銷(xiāo)能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門(mén)都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來(lái)大量新的創(chuàng)意。
turtle (小海龜) 是 Python 內(nèi)置的一個(gè)繪圖模塊,其實(shí)它不僅可以用來(lái)繪圖,還可以制作簡(jiǎn)單的小游戲,甚至可以當(dāng)成簡(jiǎn)易的 GUI 模塊,編寫(xiě)簡(jiǎn)單的 GUI程序。
編寫(xiě)游戲,如果要做專(zhuān)業(yè)的、趣味性高的,還是請(qǐng)找 pygame,本文用 turtle 編寫(xiě)游戲的目的是為了深度理解 turtle 的功能。
程序運(yùn)行時(shí),畫(huà)布上會(huì)出現(xiàn)一個(gè)紅色的小球和很多綠色、藍(lán)色的小球。
剛開(kāi)始紅色的小球會(huì)朝某一個(gè)方向移動(dòng),使用者可以通過(guò)按下上、下、左、右方向鍵控制紅色小球的運(yùn)動(dòng)方向。
綠色、藍(lán)色小球以初始的默認(rèn)方向在畫(huà)布上移動(dòng)。
當(dāng)紅色的小球碰到綠色小球時(shí),紅色小球球體會(huì)變大,當(dāng)紅色小球碰到藍(lán)色小球時(shí),紅色球體會(huì)變小。
當(dāng)紅色小球球體縮小到某一個(gè)閾值時(shí),游戲結(jié)束。
本程序需要使用到 turtle、random、math 模塊,使用之前,先導(dǎo)入。
import turtle import random import math ''' 初始化游戲界面大小 ''' # 游戲區(qū)域的寬度 game_wid = 600 # 游戲區(qū)域的高度 game_hei = 400 # 磚塊的大小,以及每一個(gè)小球初始大小 cell = 20 # 紅球初始大小 red_size = cell # 紅色小球 red_ball = None # 存儲(chǔ)綠色小球的列表 green_balls = [] # 存儲(chǔ)藍(lán)色小球的列表 blue_balls = [] # 紅色小球的方向 當(dāng)前方向 0 向右,90 向上 180 向左 -90 向下 dir = 0
上述代碼說(shuō)明:
紅色小球只有一個(gè),由變量 red_ball
保存,紅色小球在運(yùn)動(dòng)過(guò)程中可以改大小,red_size
保存其大小。
綠色和藍(lán)色小球會(huì)有很多,這里使用 green_balls
和 blue_balls
2 個(gè)列表存儲(chǔ)。
隨機(jī)位置計(jì)算函數(shù):為小球們隨機(jī)生成剛開(kāi)始出現(xiàn)的位置。
''' 隨機(jī)位置計(jì)算函數(shù) ''' def rand_pos(): # 水平有 30 個(gè)單元格,垂直有 20 個(gè)單元格 x = random.randint(-14, 14) y = random.randint(-9, 9) return x * cell, y * cell
繪制指定填充顏色的小正方形:在游戲里有一個(gè)虛擬區(qū)域,四周使用很多小正方形圍起來(lái)。
''' 繪制一個(gè)指定填充顏色的正方形 填充顏色可以不指定 ''' def draw_square(color): if color is not None: # 的顏色就填充 turtle.fillcolor(color) turtle.begin_fill() for i in range(4): turtle.fd(cell) turtle.left(90) if color is not None: turtle.end_fill()
自定義畫(huà)筆形狀:
使用 turtle 制作游戲的底層思想:
當(dāng)我們導(dǎo)入 turtle
模塊時(shí),意味著我們有了一支可以在畫(huà)布上畫(huà)畫(huà)的畫(huà)筆,畫(huà)筆的默認(rèn)形狀是一個(gè)小海龜。
本文稱(chēng)這支默認(rèn)畫(huà)筆叫主畫(huà)筆,可以使用 turtle
模塊中的 turtle.Turtle()
類(lèi)創(chuàng)建更多畫(huà)筆 ,并且可以使用 ``turtle模塊提供的
turtle.register_shape(name, shape)` 方法為每一支畫(huà)筆定制畫(huà)筆形狀。
如上所述,是使用 turtle
設(shè)計(jì)游戲的關(guān)鍵。
強(qiáng)調(diào)一下:
通過(guò)主畫(huà)筆創(chuàng)建更多的畫(huà)筆,以及為每一支畫(huà)筆設(shè)置不同的形狀。是編寫(xiě)游戲的關(guān)鍵,游戲中的每一個(gè)角色,其本質(zhì)是一支支畫(huà)筆,我們只是在控制畫(huà)筆在畫(huà)布上按我們?cè)O(shè)計(jì)好的軌跡移動(dòng)。
本游戲中紅、綠、藍(lán) 3 種顏色的小球就是形狀為圓形的畫(huà)筆。
畫(huà)筆清單:
紅色小球畫(huà)筆一支。
綠色小球畫(huà)筆 n 支。
藍(lán)色小球畫(huà)筆 n 支。
''' 自定義畫(huà)筆形狀 name:畫(huà)筆名稱(chēng) color:可選項(xiàng) ''' def custom_shape(name, size): turtle.begin_poly() turtle.penup() turtle.circle(size) turtle.end_poly() cs = turtle.get_poly() turtle.register_shape(name, cs)
turtle.register_shape(name, shape)
方法參數(shù)說(shuō)明:
name:自定義形狀的名稱(chēng)。
shape:由開(kāi)發(fā)者繪制的形狀。
開(kāi)發(fā)者繪制的哪一部分圖形用來(lái)充當(dāng)畫(huà)筆形狀?
由 turtle.begin_poly() 記錄的第一點(diǎn)到由 turtle.end_poly() 記錄的最后一點(diǎn)之間的圖形作為畫(huà)筆形狀。
cs = turtle.get_poly()
可以理解為獲取到剛繪制的圖形,然后使用 turtle.register_shape(name, cs)
注冊(cè)畫(huà)筆形狀,以后就可以隨時(shí)使用此形狀。
如上代碼記錄了一個(gè)圓的繪制過(guò)程,也就是創(chuàng)建了一個(gè)圓形的畫(huà)筆形狀。
移動(dòng)到某個(gè)位置函數(shù):
此函數(shù)用來(lái)讓某一支畫(huà)筆移到指定位置,不留下移動(dòng)過(guò)程中的軌跡。
''' 移到某點(diǎn) ''' def move_pos(pen, pos): pen.penup() pen.goto(pos) pen.pendown()
參數(shù)說(shuō)明:
pen
: 畫(huà)筆對(duì)象。
pos
:要移到的目標(biāo)地。
注冊(cè)鍵盤(pán)事件函數(shù):
使用者可以通過(guò)鍵盤(pán)上的方向鍵更改紅色小球的方向。
turtle
模塊提供有很多事件,可以以交互式的方式使用turtle
。turtle
模塊中主要有 2 類(lèi)事件:鍵盤(pán)事件、點(diǎn)擊事件。因 turtle
的工作重點(diǎn)還是繪制靜態(tài)圖案上,其動(dòng)畫(huà)繪制比較弱,所以它的事件少而簡(jiǎn)單。
''' 改變紅色小球 4 方向的函數(shù), 這些函數(shù)只有當(dāng)使用者觸發(fā)按鍵后方可調(diào)用,故這些函數(shù)也稱(chēng)為回調(diào)函數(shù)。 ''' def dir_right(): global dir dir = 0 def dir_left(): global dir dir = 180 def dir_up(): global dir dir = 90 def dir_down(): global dir dir = -90 ''' 注冊(cè)鍵盤(pán)響應(yīng)事件,用來(lái)改變紅球的方向 ''' def register_event(): for key, f in {"Up": dir_up, "Down": dir_down, "Left": dir_left, "Right": dir_right}.items(): turtle.onkey(f, key) turtle.listen() ''' 當(dāng)紅色小球遇到墻體后,也要修改方向 ''' def is_meet_qt(): global dir if red_ball.xcor() < -220: dir = 0 if red_ball.xcor() > 240: dir = 180 if red_ball.ycor() > 140: dir = -90 if red_ball.ycor() < -120: dir = 90
紅色的小球在 2 個(gè)時(shí)間點(diǎn)需要改變方向,一是使用者按下了方向鍵,一是碰到了墻體。
繪制墻體函數(shù):
墻體是游戲中的虛擬區(qū)域,用來(lái)限制小球的活動(dòng)范圍。
Tips:墻體由主畫(huà)筆繪制。
''' 繪制四面的墻體 ''' def draw_blocks(): # 隱藏畫(huà)筆 turtle.hideturtle() # 上下各30個(gè)單元格,左右各 20 個(gè)單元格 for j in [30, 20, 30, 20]: for i in range(j): # 調(diào)用前面繪制正方形的函數(shù) draw_square('gray') turtle.fd(cell) turtle.right(90) turtle.fd(-cell) # 回到原點(diǎn) move_pos(turtle, (0, 0))
創(chuàng)建小球畫(huà)筆:此函數(shù)用來(lái)創(chuàng)建新畫(huà)筆。本程序中的紅色、藍(lán)色、綠色小球都是由此函數(shù)創(chuàng)建的畫(huà)筆,且外觀形狀是圓。
def init_ball(pos, color, shape): # 由主畫(huà)筆創(chuàng)建新畫(huà)筆 ball = turtle.Turtle() ball.color(color) # 指定新畫(huà)筆的形狀,如果不指定,則為默認(rèn)形狀 ball.shape(shape) # 移到隨機(jī)位置 move_pos(ball, pos) # 移動(dòng)過(guò)程要不顯示任何軌跡 ball.penup() return ball
參數(shù)說(shuō)明:
pos
: 創(chuàng)建畫(huà)筆后畫(huà)筆移動(dòng)的位置。
color
:指定畫(huà)筆和填充顏色。
shape
: 已經(jīng)定義好的畫(huà)筆形狀名稱(chēng)。
創(chuàng)建綠色、藍(lán)色小球:
def ran_gb_ball(balls, color): # 隨機(jī)創(chuàng)建藍(lán)色、綠色小球的頻率, # 也就是說(shuō),不是調(diào)用此函數(shù)就一定會(huì)創(chuàng)建小球,概率大概是調(diào)用 5 次其中會(huì)有一次創(chuàng)建 ran = random.randint(1, 5) # 隨機(jī)一個(gè)角度 a = random.randint(0, 360) # 1/5 的概率 if ran == 5: turtle.tracer(False) # 每一個(gè)小球就是一只畫(huà)筆 ball = init_ball(rand_pos(), color, 'ball') ball.seth(a) # 添加到列表中 balls.append(ball) turtle.tracer(True)
為什么要設(shè)置一個(gè)概率值?
適當(dāng)控制藍(lán)色、綠色小球的數(shù)量。
turtle.tracer(False)
方法的作用:是否顯示畫(huà)筆繪制過(guò)程中的動(dòng)畫(huà)。False
關(guān)閉動(dòng)畫(huà)效果,True
打開(kāi)動(dòng)畫(huà)效果。
這里設(shè)置為 False
的原因是不希望用戶(hù)看到新畫(huà)筆創(chuàng)建過(guò)程。
藍(lán)色、綠色小球的移動(dòng)函數(shù):
藍(lán)色、綠色小球被創(chuàng)建后會(huì)移到一個(gè)隨機(jī)位置,然后按默認(rèn)方向移動(dòng)。
def gb_ball_m(balls): s = 20 a = random.randint(0, 360) r = random.randint(0, 10) for b in balls: b.fd(s) if b.xcor() < -220 or b.xcor() > 240 or b.ycor() > 140 or b.ycor() < -120: b.goto(rand_pos())
當(dāng)小球碰到墻體后讓其再隨機(jī)移到墻體內(nèi)部(簡(jiǎn)單粗粗暴?。。?。
紅色球是否碰到了藍(lán)色或綠色小球:
此函數(shù)邏輯不復(fù)雜,計(jì)算小球相互之間的坐標(biāo),判斷坐標(biāo)是否重疊。
''' 紅球是否碰到綠、藍(lán)球 ''' def r_g_b_meet(): global red_size # 紅色小球的坐標(biāo) s_x, s_y = red_ball.pos() # 迭代綠色小球,藍(lán)色小球列表 for bs in [green_balls, blue_balls]: for b in bs: # 計(jì)算藍(lán)色或綠色小球坐標(biāo) f_x, f_y = b.pos() # 計(jì)算和紅色球之間的距離 x_ = math.fabs(s_x - f_x) y_ = math.fabs(s_y - f_y) # 碰撞距離:兩個(gè)球的半徑之和 h = cell + red_size if 0 <= x_ <= h and y_ >= 0 and y_ <= h: if b in green_balls: # 遇到綠色球紅球變大 red_size += 2 if b in blue_balls: # 遇到藍(lán)色球紅球變大 red_size -= 2 # 關(guān)鍵代碼 custom_shape('red', red_size) return True return False
上述代碼整體邏輯不復(fù)雜。而 custom_shape('red', red_size)
是關(guān)鍵代碼,因紅色小球的半徑發(fā)生了變化,所以需要重新定制紅色小球的外觀形狀,這樣才能在畫(huà)布上看到半徑變化的紅色小球。
怎樣讓小球動(dòng)起來(lái)?
每隔一定時(shí)間,讓小球重新移動(dòng)。 turtle.ontimer(ball_move, 100)
是讓小球動(dòng)起來(lái)的核心邏輯,每隔一定時(shí)間,重新移動(dòng)紅、藍(lán)、綠外觀如圓形狀的小球。
def ball_move(): red_ball.seth(dir) red_ball.fd(40) # 檢查紅球是否碰到墻體 is_meet_qt() # 隨機(jī)創(chuàng)建綠色小球 ran_gb_ball(green_balls, 'green') # 隨機(jī)創(chuàng)建藍(lán)色小球 ran_gb_ball(blue_balls, 'blue') # 讓綠色小球移動(dòng) gb_ball_m(green_balls) # 讓藍(lán)色小球移動(dòng) gb_ball_m(blue_balls) # 檢查紅球是否碰到藍(lán)色、綠色小球 r_g_b_meet() # 定時(shí)器 turtle.ontimer(ball_move, 100)
主方法:
if __name__ == "__main__": # 關(guān)閉動(dòng)畫(huà)效果 turtle.tracer(False) # 注冊(cè)事件 register_event() # 定制 2 種畫(huà)筆形狀 for name in ['red', 'ball']: custom_shape(name, cell) # 主畫(huà)筆移動(dòng)墻體的左上角 move_pos(turtle, (-300, 200)) # 繪制墻體 draw_blocks() red_ball = init_ball(rand_pos(), 'red', 'red') turtle.tracer(True) # 讓紅球移動(dòng)起來(lái) ball_move() # turtle.done()
以上為此游戲程序中的每一個(gè)函數(shù)講解。
運(yùn)行后,可以控制紅色小球,當(dāng)遇到綠色球和藍(lán)色球時(shí),紅色球體會(huì)變大或變小。
到此,相信大家對(duì)“Python中turtle怎么實(shí)現(xiàn)球類(lèi)小游戲”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章題目:Python中turtle怎么實(shí)現(xiàn)球類(lèi)小游戲
網(wǎng)頁(yè)地址:http://jinyejixie.com/article39/jjhssh.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、企業(yè)建站、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)、品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)