首先,我们需要安装tkinter,random,time。

tkinter实现画布弹窗,random实现随机出现,time负责等待sleep()

1. Ball 类

draw()负责移动Ball
碰撞检测,反弹,Ball检测Paddle

2.Paddle类

draw()负责移动Paddle
碰撞检测,确定能不能继续
监听键盘事件

3.主循环

绘制Ball和Paddle
update()
sleep()

附源码:

# -*- coding: utf-8 -*-
import tkinter as tkinter
import tkinter.messagebox as mb
import 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 = canvasself.paddle = paddleself.score = scoreself.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 = Falsedef 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 = 3if position[3] >= self.canvas_height: # 如果小球的右下角y坐标大于画布宽度,则表示小球碰到了画布底部,游戏结束self.hit_bottom = Trueif self.hit_paddle(position) == True: # 判断 球 是否碰到了 球拍,如果碰到了则使小球回弹self.y = -3if position[0] <= 0: # 如果小球的左上角x坐标 小于等于0,则向右移动3个像素self.x = 3if position[2] >= self.canvas_width: # 如果小球的右下角x坐标 大于等于画布宽度,则向左移动3个像素self.x = -3def 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 Truereturn Falsedef 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_lengthelif 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坐标 小于 0if position[0] <= 0:# 则再次按向左移动时,移动距离为0self.x = 0else:# 每次向左移动3个像素self.x = -3def turn_right(self,event):# 获取球拍的位置坐标position = self.canvas.coords(self.id)# 如果球拍的右下角x坐标 大于等于 画布宽度if position[2] >= self.canvas_width:# 则再次按向右移动时,移动距离为0self.x = 0else:# 每次向右移动3个像素self.x = 3def start_game(self,evt):self.started = Truedef pause_game(self,evt):if self.started:self.started=Falseelse:self.started=Truedef 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:得分文本的颜色'''# 初始化得分为0self.score = 0# 把参数canvas赋值给对象变量canvasself.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='得分:{}'.format(self.score))# 将小球的颜色同步至游戏关卡的颜色if ball_color == 'red':self.canvas.itemconfig(self.note,text='{}-'.format('颜色'),fill='red')elif ball_color=='green':self.canvas.itemconfig(self.note,text='{}+'.format('颜色'),fill='green')else:self.canvas.itemconfig(self.note,text='--',fill='grey')def main():# tkinter.Tk()类创建一个tk对象,它就是一个基本窗口,可以在其上增加其他东西tk = tkinter.Tk()# call back for Quitdef callback():'''该函数用于,当点击窗口 关闭 按钮时,展示一个消息提示框,询问是否要关闭,点击 是,则退出窗口'''if mb.askokcancel("退出", "你想退出吗?"):# Ball.flag = Falsetk.destroy()# 使用protocol将 WM_DELETE_WINDOW 与 callback 绑定,程序在退出时打印 'WM_DELETE_WINDOW'tk.protocol("WM_DELETE_WINDOW", callback)# 画布的宽canvas_width = 500# 画布的高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='游戏结束',state='hidden',fill='red',font=(None, 18, "bold"))# 游戏开始时的提示introduce = '欢迎来到弹球游戏V1.2:\n按任意键开始\n'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 弹球游戏相关推荐

  1. python弹球游戏双球代码键盘操作_python编写弹球游戏的实现代码

    弹球游戏: from tkinter import * import time import random tk=Tk() #创建一个界面 tk.title("弹球游戏") can ...

  2. python弹球游戏双球代码键盘操作_python运用pygame库实现双人弹球小游戏

    使用python pygame库实现一个双人弹球小游戏,两人分别控制一个左右移动的挡板用来拦截小球,小球会在两板间不停弹跳,拦截失败的一方输掉游戏,规则类似于简化版的乒乓球. 因为是第一次用pygam ...

  3. python弹球游戏移动球拍_python编写弹球游戏的实现代码

    弹球游戏: from tkinter import * import time import random tk=Tk() #创建一个界面 tk.title("弹球游戏") can ...

  4. python弹球游戏

    # -*- coding = utf-8 -*- # @Time : 2021/11/17 9:15 # @Author : luxiaoguo # @File : 弹球游戏.py # @Softwa ...

  5. python弹球游戏难度_python弹球游戏

    先看一下我们的最终效果图 我们分9步来讲解如何写这个小游戏 1.创建游戏的主界面 我们用Python的内置模块Tkinter来完成了,它是Python的标准GUI工具包,可以非常方便在制作GUI小工具 ...

  6. python弹球游戏实验报告_Python实战案例:用Python写一个弹球游戏,就是这么强

    我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python ...

  7. python弹球游戏移动球拍_pygame库实现移动底座弹球小游戏

    本文实例为大家分享了pygame实现移动底座弹球的具体代码,供大家参考,具体内容如下 输出结果: 实现代码: # -*- coding: utf-8 -*- #Py之pygame:有趣好玩--利用py ...

  8. python弹球游戏绑定鼠标事件_用python和pygame游戏编程入门-弹球[鼠标控制]

    本节我们再将鼠标的事件引入到这个动画中,要做什么呢?就是在动画中,如果按下鼠标左键,小球会停止移动,如果松开左键,小球会移动到鼠标的位置,然后继续刚才的运动:如果按下鼠标左键不放,移动鼠标,小球就会跟 ...

  9. python弹球游戏实验报告_弹珠小游戏课程设计实验报告

    摘要: 这个小程序是关于弹珠的小游戏, 游戏比较简单, 以小球的速度来区分游戏的难易. 该小程序是用左右键控制游戏的开始和挡板的方向,不让小球落到底端,当然,小球的 速度越快,该游戏的难度也就越大.此 ...

最新文章

  1. Swift项目引入第三方库的方法
  2. 编辑器插件不生效在html中,关于6.04版本HTML编辑器插件使用问题!
  3. python——type()、metaclass元类和精简ORM框架
  4. 随手记:IDAPro蛮强大
  5. Neo4j实战 (数据库技术丛书)pdf
  6. [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
  7. matlab 由图片生成视频
  8. 用sort()方法随机打乱数组
  9. linux搭建java开发环境_linux中搭建java开发环境
  10. mysql 命令行 主从复制_MySQL 的主从复制(高级篇)
  11. Android反射机制实现与原理
  12. 计算机那个是固态硬盘,固态硬盘的好处是什么?电脑使用固态硬盘有什么用
  13. 各国市场分析(荷兰)
  14. Evaluate之迷思
  15. 2016-12-28 迪米特法则+依赖倒转原则+里氏替换原则
  16. 汇编语言,and、or指令
  17. 我是没有口袋的哆啦a梦
  18. QT:获取当前系统时间与时间戳
  19. Redis持久化(少年一贯快马扬帆,道阻且长不转弯)
  20. 酒店IPTV系统搭建有什么省钱方案?

热门文章

  1. 潭州课堂25班:Ph201805201 django框架 第三课 模板路径,变量,过滤器,静态文件的引用 (课堂笔记)...
  2. Word 2010 入门教程【初步认识Word 2010】
  3. 数据库死锁的检查和解决方法
  4. pyqt5+爬虫+有界面的爬取天气预报
  5. ACM 训练大纲(CSUST_ACM)
  6. 电脑如何连接打印机以及共享打印
  7. 16进制颜色值 与 rgb颜色值转换
  8. 一种计算两直线交点的方法
  9. 六、 网络互联与互联网
  10. HTML解析引擎:Jumony