日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python 實(shí)現(xiàn)彈球游戲的示例代碼

瀏覽:29日期:2022-07-05 09:43:51

運(yùn)行效果

python 實(shí)現(xiàn)彈球游戲的示例代碼

實(shí)現(xiàn)代碼

# -*- coding: utf-8 -*-import tkinter as tkinterimport tkinter.messagebox as mbimport random,timeclass Ball(): ’’’ 創(chuàng)建Ball類(lèi),初始化對(duì)象,即創(chuàng)建對(duì)象設(shè)置屬性, init函數(shù)是在對(duì)象被創(chuàng)建的同時(shí)就設(shè)置屬性的一種方法,Python會(huì)在創(chuàng)建新對(duì)象時(shí)自動(dòng)調(diào)用這個(gè)函數(shù)。 ’’’ def __init__(self,canvas,paddle,score,color,init_x=100,init_y=100): ’’’ Ball類(lèi)初始化屬性 :param canvas:畫(huà)布 :param paddle:球拍 :param score:得分 :param color:小球的顏色 :param init_x:小球球的初始橫坐標(biāo),有默認(rèn)值,可不傳 :param init_y:小球球的初始縱坐標(biāo),有默認(rèn)值,可不傳 ’’’ self.canvas = canvas self.paddle = paddle self.score = score self.color = color # 保存tkinter畫(huà)小球返回的id,為后期移動(dòng)屏幕上的小球做準(zhǔn)備, # 參數(shù)分別表示為:(10,10)表示左上角x,y坐標(biāo),(30,30)表示右下角x,y坐標(biāo),即創(chuàng)建一個(gè)直徑為20的圓 # fill為小球的填充色 self.id = canvas.create_oval(10,10,30,30,fill=self.color) # 將小球移動(dòng)到初始位置,初始位置可通過(guò)傳參進(jìn)行更改,有默認(rèn)值 self.canvas.move(self.id,init_x,init_y) # 給一串x分量的起始值(x和y代表橫坐標(biāo)和縱坐標(biāo)的分量) starts = [-3,-2,-1,1,2,3] # shuffle() 方法將序列的所有元素隨機(jī)排序 random.shuffle(starts) # 隨機(jī)混排序,賦值給對(duì)象變量x,讓它起始的時(shí)候獲得隨機(jī)分量值,引起球每次起始角度都不同 self.x = starts[0] # 對(duì)象變量y就是垂直分量移動(dòng)的初始值,等價(jià)于上下移動(dòng),值代表移動(dòng)多少像素點(diǎn) self.y = -3 # winfo_height()函數(shù)來(lái)獲取畫(huà)布當(dāng)前的高度,賦值給對(duì)象變量 self.canvas_height = self.canvas.winfo_height() # winfo_width()函數(shù)來(lái)獲取畫(huà)布當(dāng)前的寬度,賦值給對(duì)象變量 self.canvas_width = self.canvas.winfo_width() # 小球是否碰觸到畫(huà)布底部,初始值為False,即沒(méi)有碰到 self.hit_bottom = False def draw(self): ’’’ 該函數(shù)用于讓小球水平和垂直運(yùn)動(dòng),在運(yùn)動(dòng)的過(guò)程中,判斷是否得分、游戲是否結(jié)束 ’’’ # 讓小球可以水平和垂直運(yùn)動(dòng) self.canvas.move(self.id,self.x,self.y) # coords函數(shù)通過(guò)id返回畫(huà)布球的坐標(biāo)列表(兩個(gè)坐標(biāo),左上角的坐標(biāo)和右下角的兩個(gè)坐標(biāo)) position = self.canvas.coords(self.id) # 判斷小球是否撞到畫(huà)布頂部或者底部,保證小球反彈回去,不消失 if position[1] <= 0: # 如果小球的左上角y坐標(biāo)小于0,則向下移動(dòng)3個(gè)像素 self.y = 3 if position[3] >= self.canvas_height: # 如果小球的右下角y坐標(biāo)大于畫(huà)布寬度,則表示小球碰到了畫(huà)布底部,游戲結(jié)束 self.hit_bottom = True if self.hit_paddle(position) == True: # 判斷 球 是否碰到了 球拍,如果碰到了則使小球回彈 self.y = -3 if position[0] <= 0: # 如果小球的左上角x坐標(biāo) 小于等于0,則向右移動(dòng)3個(gè)像素 self.x = 3 if position[2] >= self.canvas_width: # 如果小球的右下角x坐標(biāo) 大于等于畫(huà)布寬度,則向左移動(dòng)3個(gè)像素 self.x = -3 def hit_paddle(self,position): ’’’ 該函數(shù)用于判斷 球 是否碰到了 球拍,如果碰到了則使小球回彈,否則游戲結(jié)束 :param position:小球的坐標(biāo) ’’’ # 獲取球拍在畫(huà)布的坐標(biāo),返回一個(gè)數(shù)組(兩個(gè)坐標(biāo),左上角的坐標(biāo)和右下角的兩個(gè)坐標(biāo)) paddle_position = self.canvas.coords(self.paddle.id) print (’paddle_position:’,paddle_position[0],paddle_position[1],paddle_position[2],paddle_position[3]) # 如果小球的右下角x坐標(biāo) 大于等于 球拍左上角x坐標(biāo),且小球左上角x坐標(biāo) 小于等于 球拍右下角x坐標(biāo) if position[2] >= paddle_position[0] and position[0] <= paddle_position[2]: # 如果小球右下角y坐標(biāo) 大于等于 球拍左上角y坐標(biāo),且小球右下角y坐標(biāo) 小于等于 球拍右下角坐標(biāo) if position[3] >= paddle_position[1] and position[3] <= paddle_position[3]:# 橫坐標(biāo) 等于self.x += self.paddle.xcolors = [’red’,’green’]# shuffle() 方法將序列的所有元素隨機(jī)排序,以便隨機(jī)獲得小球顏色random.shuffle(colors)self.color= colors[0]#self.canvas.itemconfig(self.id,fill=colors[0])# 計(jì)算得分并展示,且同時(shí)將小球的顏色、關(guān)卡顏色同步self.score.hit(ball_color = self.color)self.canvas.itemconfig(self.paddle.id,fill=self.color)# 增加或減少球拍的寬度self.adjust_paddle(paddle_position)return True return False def adjust_paddle(self,paddle_position): ’’’ 該函數(shù)用于增加或減少球拍的寬度 :paddle_position:球拍的位置坐標(biāo) ’’’ # 球拍每次的增量大小 paddle_grow_length = 30 # 球拍的寬度 = 球拍的右下角x坐標(biāo) - 球拍的左上角x坐標(biāo) paddle_width = paddle_position[2] - paddle_position[0] if self.color == ’red’: # 如果當(dāng)前球的顏色為紅色 if paddle_width > 30: # 如果球拍的寬度大于60if paddle_position[2] >= self.canvas_width: # 如果球拍右下角的x坐標(biāo) 大于等于 畫(huà)布寬度 # 球拍右下角x坐標(biāo) = 球拍右下角x坐標(biāo) - 增量值 paddle_position[2] = paddle_position[2] - paddle_grow_lengthelse: # 球拍的左上角x坐標(biāo) = 球拍的左上角x坐標(biāo) + 增量值 paddle_position[0] = paddle_position[0] + paddle_grow_length elif self.color == ’green’: # 如果當(dāng)前球的顏色為綠色 if paddle_width < 300: # 如果球拍的寬度小于300if paddle_position[2] >= self.canvas_width: # 如果球拍的右下角x坐標(biāo) 大于等于 畫(huà)布寬度 # 球拍左上角x坐標(biāo) - 增量值 paddle_position[0] = paddle_position[0] - paddle_grow_lengthelse: # 球拍右下角x坐標(biāo) + 增量值 paddle_position[2]=paddle_position[2]+paddle_grow_lengthclass Paddle: ’’’ 球拍類(lèi) ’’’ def __init__(self,canvas,color): ’’’ :param canvas:畫(huà)布 :param color:球拍的顏色 ’’’ self.canvas = canvas # winfo_width()函數(shù)來(lái)獲取畫(huà)布當(dāng)前的寬度,賦值給對(duì)象變量 self.canvas_width = self.canvas.winfo_width() # winfo_height()函數(shù)來(lái)獲取畫(huà)布當(dāng)前的高度,賦值給對(duì)象變量 self.canvas_height = self.canvas.winfo_height() # 保存tkinter畫(huà)球拍時(shí)返回的id,為后期移動(dòng)屏幕上的球拍做準(zhǔn)備, # create_rectangle 畫(huà)矩形,fill為球拍的顏色 self.id = canvas.create_rectangle(0,0,180,15,fill=color) # 將球拍移動(dòng)至初始位置 self.canvas.move(self.id,200,self.canvas_height*0.75) # 設(shè)置對(duì)象變量x,初始值為0.也就是球拍先不移動(dòng) self.x = 0 # 游戲是否開(kāi)始,默認(rèn)為Flase,即 不開(kāi)始 self.started = False # 是否繼續(xù)游戲,默認(rèn)值為 否 self.continue_game = False # 初始化時(shí)將事件‘按下左鍵’和函數(shù)向左移動(dòng)綁定 self.canvas.bind_all(’<KeyPress-Left>’,self.turn_left) # 初始化時(shí)將事件‘按下右鍵’和函數(shù)向右移動(dòng)綁定 self.canvas.bind_all(’<KeyPress-Right>’,self.turn_right) # 初始化時(shí)將事件‘按下Enter鍵’和函數(shù)繼續(xù)游戲綁定 self.canvas.bind_all(’<KeyPress-Enter>’,self.continue_game) # 按任意鍵開(kāi)始游戲 self.canvas.bind_all(’<Button-1>’,self.start_game) # 初始化時(shí)將事件‘按下space鍵’和函數(shù)暫停游戲綁定 self.canvas.bind_all(’<space>’,self.pause_game) def turn_left(self,event): ’’’ 該函數(shù)用于向左移動(dòng)時(shí), ’’’ # 獲取球拍的位置坐標(biāo) position = self.canvas.coords(self.id) # 如果球拍的左上角x坐標(biāo) 小于 0 if position[0] <= 0: # 則再次按向左移動(dòng)時(shí),移動(dòng)距離為0 self.x = 0 else: # 每次向左移動(dòng)3個(gè)像素 self.x = -3 def turn_right(self,event): # 獲取球拍的位置坐標(biāo) position = self.canvas.coords(self.id) # 如果球拍的右下角x坐標(biāo) 大于等于 畫(huà)布寬度 if position[2] >= self.canvas_width: # 則再次按向右移動(dòng)時(shí),移動(dòng)距離為0 self.x = 0 else: # 每次向右移動(dòng)3個(gè)像素 self.x = 3 def start_game(self,evt): self.started = True def pause_game(self,evt): if self.started: self.started=False else: self.started=True def draw(self): ’’’ 該函數(shù)用于移動(dòng)球拍 ’’’ # 球拍類(lèi)可以水平移動(dòng) self.canvas.move(self.id,self.x,0) # 獲取球拍的位置坐標(biāo) position = self.canvas.coords(self.id) # 如果球拍左上角x坐標(biāo)小于等于0,則停止移動(dòng) if position[0] <= 0: self.x = 0 # 如果球拍右下角x坐標(biāo)大于等于0,則停止移動(dòng) elif position[2] >= self.canvas_width: self.x = 0class Score(): ’’’ 得分類(lèi) ’’’ def __init__(self,canvas,color): ’’’ 初始化得分類(lèi) :param canvas:畫(huà)布 :param color:得分文本的顏色 ’’’ # 初始化得分為0 self.score = 0 # 把參數(shù)canvas賦值給對(duì)象變量canvas self.canvas = canvas # winfo_width()函數(shù)來(lái)獲取畫(huà)布當(dāng)前的寬度,賦值給對(duì)象變量 self.canvas_width = self.canvas.winfo_width() # winfo_height()函數(shù)來(lái)獲取畫(huà)布當(dāng)前的高度,賦值給對(duì)象變量 self.canvas_height = self.canvas.winfo_height() # 創(chuàng)建文本控件,用戶(hù)保存用戶(hù)保存得分 self.id = canvas.create_text(self.canvas_width-150,10,text=’score:0’,fill=color,font=(None, 18, 'bold')) # 用戶(hù)保存游戲的關(guān)卡顏色 self.note = canvas.create_text(self.canvas_width-70,10,text=’--’,fill=’red’,font=(None, 18, 'bold')) def hit(self,ball_color=’grey’): ’’’ 該函數(shù)用于將計(jì)算得分并展示,且同時(shí)將小球的顏色、關(guān)卡顏色同步 :param ball_color:小球的顏色,默認(rèn)為’grey’ ’’’ # 得分遞增 self.score += 1 # 將得分展示在文本控件中 self.canvas.itemconfig(self.id,text=’score:{}’.format(self.score)) # 將小球的顏色同步至游戲關(guān)卡的顏色 if ball_color == ’red’: self.canvas.itemconfig(self.note,text=’{}-’.format(’W’),fill=’red’) elif ball_color==’green’: self.canvas.itemconfig(self.note,text=’{}+’.format(’W’),fill=’green’) else: self.canvas.itemconfig(self.note,text=’--’,fill=’grey’)def main(): # tkinter.Tk()類(lèi)創(chuàng)建一個(gè)tk對(duì)象,它就是一個(gè)基本窗口,可以在其上增加其他東西 tk = tkinter.Tk() # call back for Quit def callback(): ’’’ 該函數(shù)用于,當(dāng)點(diǎn)擊窗口 關(guān)閉 按鈕時(shí),展示一個(gè)消息提示框,詢(xún)問(wèn)是否要關(guān)閉, 點(diǎn)擊 是,則退出窗口 ’’’ if mb.askokcancel('Quit', 'Do you really wish to quit?'): # Ball.flag = False tk.destroy() # 使用protocol將 WM_DELETE_WINDOW 與 callback 綁定,程序在退出時(shí)打印 ’WM_DELETE_WINDOW’ tk.protocol('WM_DELETE_WINDOW', callback) # 畫(huà)布的寬 canvas_width = 600 # 畫(huà)布的高 canvas_hight = 500 # 窗口標(biāo)題 tk.title('Ball Game V1.2') # 窗口不可被拉伸,(0,0)的意思是“窗口的大小在水平方向上和垂直方向上都不能改變” tk.resizable(0,0) # 調(diào)用wm_attributes,將窗口始終放到所有其他窗口之前(-topmost),將1改為0畫(huà)布窗口不在其他窗口之前 tk.wm_attributes('-topmost',1) # 創(chuàng)建畫(huà)布,bd=0,highlightthickness=0 作用是畫(huà)布之外沒(méi)有邊框,可以使游戲屏幕看上去更加美觀(guān)。最后一個(gè)bd是畫(huà)布的背景色。 canvas = tkinter.Canvas(tk,width=canvas_width,height=canvas_hight,bd=0,highlightthickness=0,bg=’#00ffff’) # 按照上面一行指定的寬度高度參數(shù)調(diào)整其自身大小 canvas.pack() # update強(qiáng)制更新屏幕,實(shí)時(shí)更新畫(huà)布 tk.update() # 創(chuàng)建得分類(lèi),得分控件的顏色為紅色 score = Score(canvas,’red’) # 創(chuàng)建 球拍類(lèi), paddle = Paddle(canvas,'red') # 創(chuàng)建 小球類(lèi),小球的默認(rèn)顏色為灰色 ball = Ball(canvas,paddle,score,'grey') # 游戲結(jié)束時(shí)的提示 game_over_text = canvas.create_text(canvas_width/2,canvas_hight/2,text=’Game over’,state=’hidden’,fill=’red’,font=(None, 18, 'bold')) # 游戲開(kāi)始時(shí)的提示 introduce = ’Welcome to Ball GameV1.2:nClick Any Key--StartnStop--EnternContinue-Entern’ game_start_text = canvas.create_text(canvas_width/2,canvas_hight/2,text=introduce,state=’normal’,fill=’magenta’,font=(None, 18, 'bold')) # 主循環(huán),讓tkinter不停地重畫(huà)屏幕 while True: # 如果小球沒(méi)有碰到了底部,且 游戲尚未開(kāi)始 if (ball.hit_bottom == False) and ball.paddle.started: canvas.itemconfig(game_start_text,state=’hidden’) ball.draw() paddle.draw() # 如果小球碰到了底部,則游戲結(jié)束 if ball.hit_bottom == True: time.sleep(0.1) canvas.itemconfig(game_over_text,state=’normal’) # 不停的刷新畫(huà)布 tk.update_idletasks() # 強(qiáng)制更新屏幕 tk.update() time.sleep(0.01)if __name__==’__main__’: main()

以上就是python 實(shí)現(xiàn)彈球小游戲的詳細(xì)內(nèi)容,更多關(guān)于python 彈球游戲的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日本不卡| 国产精品99一区二区三| a国产在线视频| 国产videos久久| 久久精品资源| 久久伊人久久| 中文字幕在线高清| 亚洲二区精品| 玖玖精品视频| 日韩超碰人人爽人人做人人添| 国产精品中文| 香蕉成人av| 少妇精品久久久一区二区| 精品女同一区二区三区在线观看| 9国产精品视频| 欧美专区18| 久久在线视频免费观看| 蜜芽一区二区三区| 精品99在线| 亚洲一级特黄| 综合欧美精品| 精品99久久| 免费不卡在线视频| 国产一区二区三区天码| 免费观看在线综合| 老司机精品在线| 欧美日韩精品一区二区视频| 久久国产三级| 爽好久久久欧美精品| 精品久久在线| 综合一区av| 欧美日韩第一| 日本а中文在线天堂| 麻豆精品久久久| 亚洲深深色噜噜狠狠爱网站 | 久久精品卡一| 国产精品a级| 亚洲另类av| 韩日一区二区三区| 亚洲天堂资源| 麻豆国产欧美一区二区三区| 国产手机视频一区二区| 99久久精品国产亚洲精品| 精品国产亚洲日本| 中文字幕乱码亚洲无线精品一区| 日韩一区亚洲二区| 国产成人免费精品| 麻豆一区二区三区| 蜜桃久久久久| 欧美成人久久| 国产一区三区在线播放| 欧美不卡高清一区二区三区| 亚洲精品.com| 久久国产电影| 99久久亚洲精品| 深夜福利视频一区二区| 国产乱码精品一区二区三区四区| 日韩黄色av| 日韩精品成人| 中文一区在线| 视频一区二区欧美| 亚洲免费成人av在线| 99综合视频| 综合国产在线| 日本免费一区二区视频| 亚洲va在线| 久久要要av| 好看不卡的中文字幕| 日韩欧美美女在线观看| 日韩美女国产精品| 国产精品极品国产中出| www在线观看黄色| 午夜国产一区二区| 视频一区二区国产| 一区二区电影| 国产伦理一区| 日韩在线短视频| 天堂精品久久久久| 成人午夜亚洲| 中国女人久久久| 国产欧美日韩影院| 在线精品视频在线观看高清| 欧美一级久久| 欧美日韩水蜜桃| 麻豆91精品视频| 日韩久久99| 国产视频一区欧美| 亚洲女同av| 欧美黑人巨大videos精品| 国产综合精品| 国产精品2区| 亚洲开心激情| 亚洲欧美日韩专区| 五月婷婷亚洲| 久久精品动漫| 精品国产乱码久久久久久1区2匹| 亚洲tv在线| 亚洲伊人精品酒店| 亚洲一区二区网站| 亚洲精品一二三区区别| 色在线中文字幕| 久久精品欧洲| 日韩国产欧美一区二区| 亚洲精品伊人| аⅴ资源天堂资源库在线| 美女久久网站| 神马午夜久久| 国产精品亚洲人成在99www| 在线视频免费在线观看一区二区| 蜜桃久久久久| 亚洲乱码一区| 欧美精品激情| 偷拍亚洲精品| se01亚洲视频 | 亚洲一区激情| 欧美中文一区二区| 精品中文在线| 国产精品九九| 国产精品一区二区三区美女| 丝袜亚洲另类欧美| 午夜国产一区二区| 婷婷久久一区| 色偷偷色偷偷色偷偷在线视频| 麻豆视频久久| 日本一区二区三区视频在线看 | 欧美91在线| 国产精品s色| 天堂久久av| 日本亚洲不卡| 视频一区中文字幕精品 | 天堂成人国产精品一区| 好吊一区二区三区| 美女亚洲一区| 视频一区欧美精品| 蜜臀国产一区二区三区在线播放 | 免费在线看一区| 日韩综合一区二区三区| 日韩不卡一区二区三区| 国产精品日韩精品在线播放| 久久精品免视看国产成人| 精品中文在线| 日韩欧美自拍| 欧美日韩国产探花| 99在线精品视频在线观看| 国产在线观看www| 国产精品玖玖玖在线资源| 欧美日韩在线精品一区二区三区激情综合 | 亚洲无线观看| 日韩一区二区免费看| 欧美在线观看视频一区| 精品国产中文字幕第一页| 卡一卡二国产精品| 91精品一区| 欧美国产日本| 欧美日韩视频网站| 成人福利av| 不卡中文字幕| 欧美日韩xxxx| 久久精品国产亚洲aⅴ| 成人久久一区| 欧美日韩国产一区二区三区不卡| 91精品国产成人观看| 久久久9色精品国产一区二区三区| 国产成人精品福利| 国产视频一区欧美| 国产精品久久久久久妇女| av亚洲在线观看| 精品视频在线一区二区在线| 中文亚洲欧美| 91av亚洲| 麻豆精品久久久| 亚洲综合色婷婷在线观看| 国产精品夜夜夜| 日本激情一区| 日韩高清在线观看一区二区| 亚洲永久av| 国产色99精品9i| 亚洲神马久久| 精品欧美视频| 少妇高潮一区二区三区99| 久久蜜桃精品| 你懂的国产精品| 一区二区91| 麻豆国产精品一区二区三区| 久久久五月天| 久久国产尿小便嘘嘘| 亚洲香蕉网站| 欧美成人aaa| 日韩精品影视| 日韩成人精品一区| 丝袜美腿亚洲一区| 成人国产精品久久| 亚洲日产国产精品| 精品中国亚洲| 亚洲综合小说| 日韩视频一区二区三区在线播放免费观看| 成人在线丰满少妇av| 精品成av人一区二区三区| 国内精品麻豆美女在线播放视频| 另类激情亚洲|