python使用tkinter写的弹跳游戏。
1 import random 2 import time 3 from tkinter import * 4 5 6 #下面定义一个球的类,有canvas和color两个对象 7 class Ball: #定义一个Ball类的函数 8 def __init__(self,canvas,paddle,color):#这是Ball类的属性函数,Ball类下的函数都有这些性质 9 self.canvas=canvas 10 self.paddle=paddle 11 self.id=canvas.create_oval(10,10,25,25,fill=color)#返回所绘小球的调用值放入对象self.id 12 self.canvas.move(self.id,245,100) #移动小球到(245,100)坐标处, 13 starts=[-3,-2,-1,1,2,3] 14 random.shuffle(starts) 15 self.x=starts[0] #使得小球左右方向运动随机 16 self.y=-3 #默认开始的小球向上方运动 17 self.canvas_height=self.canvas.winfo_height()#画布高度函数winfo_height()返回值放入canvas_height对象中 18 self.canvas_width=self.canvas.winfo_width() #winfo_width()返回画布宽度放入canvas_width对象中 19 self.hit_bottom=False #设定hit_bottom初始值为false 20 21 22 def hit_paddle(self,pos): #声明函数,以供调用 23 paddle_pos=self.canvas.coords(self.paddle.id) #将球拍的(x1,y1)(x2,y2)的坐标放到paddle_pos中 24 if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]: # 25 if pos[3]>=paddle_pos[1] and pos[3]<=paddle_pos[3]: #比较小球y轴是否在球拍y轴内 26 return True #表示小球碰到了球拍 27 return False #表示小球没有碰到球拍 28 29 30 def draw(self): #声明draw函数, 31 self.canvas.move(self.id,self.x,self.y) #移动小球,移动速度为(self.x,self.y),在init中的属性可以直接用 32 pos=self.canvas.coords(self.id)#把小球的左上角和右下角的坐标以列表形式(可能元组)放入pos对象中 33 if pos[1]<=0: #如果小球碰到画布上方 34 self.y=3 #则改变移动方向向下方 35 if pos[3]>=self.canvas_height: #如果小球碰到画布底端 则返回hit_bottom为True 36 self.hit_bottom=True 37 if self.hit_paddle(pos)==True: #小球碰到了球拍,则改变Y轴方向向上运动 38 self.y=-3 39 if pos[0]<=0: #如果小球碰到了画布左边,则把X轴速度改成每次向右3个像素 40 self.x=3 41 if pos[2]>=self.canvas_width: #如果小球碰到了画布右边,则把速度改成每次向左3个像素 42 self.x=-3 43 44 class Paddle: #定义一个paddle类 45 def __init__(self,canvas,color): #paddle类的属性函数,默认有两个变量画布和颜色 46 self.canvas=canvas #将canvas对象赋给self.canvas 47 self.id=canvas.create_rectangle(0,0,100,10,fill=color) #创建球拍,将球拍的调用编号存入self.id 48 self.canvas.move(self.id,200,300) #将球拍移动到(200,300)处 49 self.x=0 # 50 self.canvas_width=self.canvas.winfo_width() #将画布的宽度放入canvas_width对象 51 self.canvas.bind_all('<KeyPress-Left>',self.turn_left) #用bind_all()函数绑定键盘左键与tun_left函数 52 self.canvas.bind_all('<KeyPress-Right>',self.turn_right) #绑定键盘右键与turn_right函数 53 54 55 def draw(self): #声明一个draw函数 56 self.canvas.move(self.id,self.x,0) #左右移动球拍的速度为self.x,默认不动 57 pos=self.canvas.coords(self.id) #将球拍的左上角和右下角的坐标存入pos对象中 58 if pos[0]<=0: #如果球拍x轴小于0,则不再向右移动 59 self.x=0 60 elif pos[2]>=self.canvas_width: #如果球拍要超过画布右侧了,则球拍的移动速度变为0 61 self.x=0 62 63 def turn_left(self,evt):#这里的evt是调用方传过来的参数,改变球拍的移动速度向左, 64 self.x=-5 65 66 def turn_right(self,evt): #改变球拍的移动速度向右每次5个像素 67 self.x=5 68 69 70 71 #创建框架并且命名和固定,然后创建该框架的画布 72 tk=Tk() #创建框架对象tk 73 tk.title('Game') #框架对象tk显示的名字为'game' 74 tk.resizable(0,0) #固定框架 75 tk.wm_attributes('-topmost',1) #显示在最外层 76 canvas=Canvas(tk,width=500,height=400,bd=0,highlightthickness=0) #创建画布canvas,属于tk框架对象, 77 canvas.pack() #显示画布的变化 78 tk.update() #显示框架的变化 79 80 81 #把类赋值给对象ball,如果调用了ball就可以实现该类的作用 82 paddle=Paddle(canvas,"blue") #调用拍的类给对象paddle用 83 ball=Ball(canvas,paddle,'green') #调用球的类给对象ball用 84 85 while True: #要注意while语句以防止死循环,先设置为真 86 if ball.hit_bottom==False: #没有碰到底部的话执行下面的语句 87 ball.draw() #调用ball对象的函数draw() 88 paddle.draw()#调用paddle对象的函数draw() 89 tk.update_idletasks() 90 tk.update() #更新框架 91 time.sleep(0.01) #睡眠0.01秒 92 elif ball.hit_bottom==True: #要是小球接触了底部 93 canvas.create_text(200,100,text='Aha,you lose it,\nHow about try again?',font=('Times',22)) #在(200,100)坐标处创建文本‘...’,字号22号 94 tk.update() #更新内容
用IDLE自带的tkinter写的小球游戏,
参考教材《教孩子学编程》作者Jason R.Briggs
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?