电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python 實現彈球游戲的示例代碼

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

運行效果

python 實現彈球游戲的示例代碼

實現代碼

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

以上就是python 實現彈球小游戲的詳細內容,更多關于python 彈球游戲的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 便携式谷丙转氨酶检测仪|华图生物科技百科 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 苏商学院官网 - 江苏地区唯一一家企业家自办的前瞻型、实操型商学院 | QQ房产导航-免费收录优秀房地产网站_房地产信息网 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 复合肥,化肥厂,复合肥批发,化肥代理,复合肥品牌-红四方 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 珠光砂保温板-一体化保温板-有釉面发泡陶瓷保温板-杭州一体化建筑材料 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 苗木价格-苗木批发-沭阳苗木基地-沭阳花木-长之鸿园林苗木场 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | LNG鹤管_内浮盘价格,上装鹤管,装车撬厂家-连云港赛威特机械 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 工作服定制,工作服定做,工作服厂家-卡珀职业服装(苏州)有限公司 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 蒸汽吸附分析仪-进口水分活度仪|康宝百科| 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 365文案网_全网创意文案句子素材站 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 干培两用箱-细菌恒温培养箱-菲斯福仪器| 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 中细软知识产权_专业知识产权解决方案提供商| 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 |