首页 > 代码库 > python开发_tkinter_小球完全弹性碰撞游戏
python开发_tkinter_小球完全弹性碰撞游戏
完成这个小球的完全弹性碰撞游戏灵感来自于:
下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏:
游戏初始化状态:
最下面的游标和修改小球的移动速度
===================================================
源码部分:
===================================================
1 #python tkinter 2 #python version 3.3.2 3 4 from tkinter import * 5 6 ‘‘‘ 7 判断 8 两个小球 9 { 10 圆心:A(x1,y1) 半径:r X轴速度:Vax Y轴速度:Vay 11 圆心:B(x2,y2) 半径:R X轴速度:Vbx Y轴速度:Vby 12 } 13 碰撞的条件是: 14 1.两个小球的圆心距离不大于两小球半径之和(r+R),即: 15 { 16 (x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2 17 } 18 2.小球碰撞后,两小球的数度交换,即: 19 { 20 tempVax = Vax 21 tempVay = Vay 22 Vax = Vbx 23 Vay = Vby 24 Vbx = tempVax 25 Vby = tempVay 26 或: 27 Vax = Vax + Vbx 28 Vbx = Vax - Vbx 29 Vax = Vax - Vbx 30 Vay = Vay + Vby 31 Vby = Vay - Vby 32 Vay = Vay - Vby 33 } 34 35 游戏规则: 36 五小球在画布中移动,他们之间会产生碰撞,当然小球和上下左右都会产生碰撞 37 碰撞后,小球会改变方向返回 38 而最下面的游标则用于调节小球的移动速度,游标的范围是[-100, 100] 39 40 缺陷或BUG: 41 1.在修改游标数据从而改变小球移动速度的时候,小球移动的距离得不到及时的更新 42 导致小球可能会逃离画布 43 2.小球在运动的过程中,有时候也有可能逃离画布 44 45 总结: 46 完成这个游戏,花了一个星期的下班时间。在这个过程中不仅回去学习了高中的数学知识, 47 物理知识,很多东西都忘得差不多了,不过很快又学返回来了。 48 游戏其实很多就是数学问题。 49 50 游戏中还存在缺陷或BUG,希望志同道合者可以共同完善。 51 ‘‘‘ 52 53 __author__ = {‘author‘ : ‘Hongten‘, 54 ‘Email‘ : ‘hongtenzone@foxmail.com‘, 55 ‘Blog‘ : ‘http://www.cnblogs.com/hongten/‘, 56 ‘Created‘ : ‘2013-09-28‘, 57 ‘Version‘ : ‘1.0‘} 58 59 class Pong(Frame): 60 def createWidgets(self): 61 ## 画布 62 self.draw = Canvas(self, width="5i", height="5i", bg=‘white‘) 63 64 ## 游标(控制小球移动速度,范围:[-100, 100]) 65 self.speed = Scale(self, orient=HORIZONTAL, label="ball speed", 66 from_=-100, to=100) 67 68 self.speed.pack(side=BOTTOM, fill=X) 69 70 #小球碰撞墙壁的范围 71 self.scaling_right = 4.8 72 self.scaling_left = 0.2 73 #小球直径 74 self.ball_d = 0.4 75 #游标度数 76 self.scale_value = http://www.mamicode.com/self.speed.get()"0.10i", "0.10i", "0.50i", "0.50i", 93 fill="red") 94 self.second_ball = self.draw.create_oval("0.70i", "0.70i", "1.10i", "1.10i", 95 fill=‘black‘) 96 self.three_ball = self.draw.create_oval("1.30i", "1.30i", "1.70i", "1.70i", 97 fill=‘brown‘) 98 self.four_ball = self.draw.create_oval("2.0i", "2.0i", "2.40i", "2.40i", 99 fill=‘green‘)100 self.five_ball = self.draw.create_oval("3.0i", "3.0i", "3.40i", "3.40i",101 fill=‘gray‘)102 103 #把五个小球放入数组104 self.balls.append(self.ball)105 self.balls.append(self.second_ball)106 self.balls.append(self.three_ball)107 self.balls.append(self.four_ball)108 self.balls.append(self.five_ball)109 110 #第一个小球,即self.ball的圆心坐标(self.x, self.y),这里进行了放缩,目的是为了111 #在小球移动的过程中更加流畅112 self.x = 0.3 113 self.y = 0.3114 #第一个小球的速度方向115 self.velocity_x = -0.2116 self.velocity_y = 0.5117 118 self.second_ball_x = 0.9119 self.second_ball_y = 0.9120 self.second_ball_v_x = 0.4121 self.second_ball_v_y = -0.5122 123 self.three_ball_x = 1.5124 self.three_ball_y = 1.5125 self.three_ball_v_x = -0.3126 self.three_ball_v_y = -0.5127 128 self.four_ball_x = 2.2129 self.four_ball_y = 2.2130 self.four_ball_v_x = 0.1131 self.four_ball_v_y = -0.5132 133 self.five_ball_x = 3.2134 self.five_ball_y = 3.2135 self.five_ball_v_x = 0.3136 self.five_ball_v_y = 0.5137 138 139 #更新小球的坐标140 self.update_ball_x_y()141 self.draw.pack(side=LEFT)142 143 def update_ball_x_y(self, *args):144 ‘‘‘更新小球的坐标,即把各个小球的圆心坐标信息以及速度信息存放到数组中,145 便于在后面循环遍历的时候使用。‘‘‘146 #第一个小球信息147 self.ball_x.append(self.x)148 self.ball_y.append(self.y)149 self.ball_v_x.append(self.velocity_x)150 self.ball_v_y.append(self.velocity_y)151 152 self.ball_x.append(self.second_ball_x)153 self.ball_y.append(self.second_ball_y)154 self.ball_v_x.append(self.second_ball_v_x)155 self.ball_v_y.append(self.second_ball_v_y)156 157 self.ball_x.append(self.three_ball_x)158 self.ball_y.append(self.three_ball_y)159 self.ball_v_x.append(self.three_ball_v_x)160 self.ball_v_y.append(self.three_ball_v_y)161 162 self.ball_x.append(self.four_ball_x)163 self.ball_y.append(self.four_ball_y)164 self.ball_v_x.append(self.four_ball_v_x)165 self.ball_v_y.append(self.four_ball_v_y)166 167 self.ball_x.append(self.five_ball_x)168 self.ball_y.append(self.five_ball_y)169 self.ball_v_x.append(self.five_ball_v_x)170 self.ball_v_y.append(self.five_ball_v_y)171 172 def update_ball_velocity(self, index, *args):173 ‘‘‘更新各个小球速度信息,即小球碰撞到四周和另外的小球索要更新的速度信息‘‘‘174 #游标值175 self.scale_value = http://www.mamicode.com/self.speed.get()"%ri" % deltax, "%ri" % deltay)234 self.after(10, self.moveBall)235 236 def move_second_ball(self, *args):237 self.update_ball_velocity(1) 238 deltax = self.get_ball_deltax(1)239 deltay = self.get_ball_deltay(1) 240 self.draw.move(self.second_ball, "%ri" % deltax, "%ri" % deltay)241 self.after(10, self.move_second_ball)242 243 244 def move_three_ball(self, *args):245 self.update_ball_velocity(2) 246 deltax = self.get_ball_deltax(2)247 deltay = self.get_ball_deltay(2)248 self.draw.move(self.three_ball, "%ri" % deltax, "%ri" % deltay)249 self.after(10, self.move_three_ball)250 251 def move_four_ball(self, *args):252 self.update_ball_velocity(3) 253 deltax = self.get_ball_deltax(3)254 deltay = self.get_ball_deltay(3)255 self.draw.move(self.four_ball, "%ri" % deltax, "%ri" % deltay)256 self.after(10, self.move_four_ball)257 258 def move_five_ball(self, *args):259 self.update_ball_velocity(4) 260 deltax = self.get_ball_deltax(4)261 deltay = self.get_ball_deltay(4)262 self.draw.move(self.five_ball, "%ri" % deltax, "%ri" % deltay)263 self.after(10, self.move_five_ball)264 265 266 def __init__(self, master=None):267 ‘‘‘初始化函数‘‘‘268 Frame.__init__(self, master)269 Pack.config(self)270 self.createWidgets()271 self.after(10, self.moveBall)272 self.after(10, self.move_three_ball)273 self.after(10, self.move_four_ball)274 self.after(10, self.move_five_ball)275 self.after(10, self.move_second_ball)276 277 278 game = Pong()279 280 game.mainloop()
源码下载:http://files.cnblogs.com/liuzhi/python_tkinter_pong.1.0.zip
===================================================
第二个版本 version.1.1: Edit by Hongten 2013-09-28 17:40
===================================================
修改记录:
1.调整画布大小
2.调整了小球的半径,以及小球的速度初始值,小球初始圆心坐标
3.游标的范围修改为:[-200, 200]
这些修改主要是针对上面的缺陷而进行的。
优点:
1.小球移动的过程更直观
2.小球的移动速度变小,但是可以根据游标来修改小球移动速度
3.界面比之前更加友好
运行效果:
===================================================
1 #python tkinter 2 #python version 3.3.2 3 4 from tkinter import * 5 6 ‘‘‘ 7 判断 8 两个小球 9 { 10 圆心:A(x1,y1) 半径:r X轴速度:Vax Y轴速度:Vay 11 圆心:B(x2,y2) 半径:R X轴速度:Vbx Y轴速度:Vby 12 } 13 碰撞的条件是: 14 1.两个小球的圆心距离不大于两小球半径之和(r+R),即: 15 { 16 (x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2 17 } 18 2.小球碰撞后,两小球的数度交换,即: 19 { 20 tempVax = Vax 21 tempVay = Vay 22 Vax = Vbx 23 Vay = Vby 24 Vbx = tempVax 25 Vby = tempVay 26 或: 27 Vax = Vax + Vbx 28 Vbx = Vax - Vbx 29 Vax = Vax - Vbx 30 Vay = Vay + Vby 31 Vby = Vay - Vby 32 Vay = Vay - Vby 33 } 34 35 游戏规则: 36 五小球在画布中移动,他们之间会产生碰撞,当然小球和上下左右都会产生碰撞 37 碰撞后,小球会改变方向返回 38 而最下面的游标则用于调节小球的移动速度,游标的范围是[-100, 100] 39 40 缺陷或BUG: 41 1.在修改游标数据从而改变小球移动速度的时候,小球移动的距离得不到及时的更新 42 导致小球可能会逃离画布 43 2.小球在运动的过程中,有时候也有可能逃离画布 44 45 总结: 46 完成这个游戏,花了一个星期的下班时间。在这个过程中不仅回去学习了高中的数学知识, 47 物理知识,很多东西都忘得差不多了,不过很快又学返回来了。 48 游戏其实很多就是数学问题。 49 50 游戏中还存在缺陷或BUG,希望志同道合者可以共同完善。 51 52 修改记录: 53 1.调整画布大小 54 2.调整了小球的半径,以及小球的速度初始值,小球初始圆心坐标 55 3.游标的范围修改为:[-200, 200] 56 这些修改主要是针对上面的缺陷而进行的。 57 58 优点: 59 1.小球移动的过程更直观 60 2.小球的移动速度变小,但是可以根据游标来修改小球移动速度 61 3.界面比之前更加友好 62 ‘‘‘ 63 64 __author__ = {‘author‘ : ‘Hongten‘, 65 ‘Email‘ : ‘hongtenzone@foxmail.com‘, 66 ‘Blog‘ : ‘http://www.cnblogs.com/hongten/‘, 67 ‘Created‘ : ‘2013-09-28‘, 68 ‘Version‘ : ‘1.1‘} 69 70 class Pong(Frame): 71 def createWidgets(self): 72 #放缩率 73 self.scaling = 100.0 74 #画布比例 75 self.canvas_width = 10 76 self.canvas_height = 5.6 77 ## 画布 78 self.draw = Canvas(self, width=(self.canvas_width * self.scaling), 79 height=(self.canvas_height * self.scaling), 80 bg=‘white‘) 81 82 ## 游标(控制小球移动速度,范围:[-100, 100]) 83 self.speed = Scale(self, orient=HORIZONTAL, label="ball speed", 84 from_=-200, to=200) 85 86 self.speed.pack(side=BOTTOM, fill=X) 87 88 #小球直径 89 self.ball_d = 1.0 90 #小球碰撞墙壁的范围 91 self.scaling_left = round(self.ball_d / 2, 1) 92 self.scaling_right = self.canvas_width - self.scaling_left 93 self.scaling_bottom = self.canvas_height - self.scaling_left 94 self.scaling_top = self.scaling_left 95 96 #游标度数 97 self.scale_value = http://www.mamicode.com/self.speed.get() * 0.1"0.60i", "0.60i", "1.60i", "1.60i",112 fill="red")113 self.second_ball = self.draw.create_oval("2.0i", "2.0i", "3.0i", "3.0i",114 fill=‘black‘)115 self.three_ball = self.draw.create_oval("4.0i", "4.0i", "5.0i", "5.0i",116 fill=‘brown‘)117 self.four_ball = self.draw.create_oval("6.0i", "2.0i", "7.0i", "3.0i",118 fill=‘green‘)119 self.five_ball = self.draw.create_oval("8.0i", "3.0i", "9.0i", "4.0i",120 fill=‘gray‘)121 122 #把五个小球放入数组123 self.balls.append(self.ball)124 self.balls.append(self.second_ball)125 self.balls.append(self.three_ball)126 self.balls.append(self.four_ball)127 self.balls.append(self.five_ball)128 129 #第一个小球,即self.ball的圆心坐标(self.x, self.y),这里进行了放缩,目的是为了130 #在小球移动的过程中更加流畅131 self.x = 1.1 132 self.y = 1.1133 #第一个小球的速度方向134 self.velocity_x = -0.2135 self.velocity_y = 0.1136 137 self.second_ball_x = 2.5138 self.second_ball_y = 2.5139 self.second_ball_v_x = 0.1140 self.second_ball_v_y = -0.2141 142 self.three_ball_x = 4.5143 self.three_ball_y = 4.5144 self.three_ball_v_x = -0.1145 self.three_ball_v_y = -0.2146 147 self.four_ball_x = 6.5148 self.four_ball_y = 2.5149 self.four_ball_v_x = 0.1150 self.four_ball_v_y = -0.2151 152 self.five_ball_x = 8.5153 self.five_ball_y = 3.5154 self.five_ball_v_x = 0.1155 self.five_ball_v_y = 0.2156 157 158 #更新小球的坐标159 self.update_ball_x_y()160 self.draw.pack(side=LEFT)161 162 def update_ball_x_y(self, *args):163 ‘‘‘更新小球的坐标,即把各个小球的圆心坐标信息以及速度信息存放到数组中,164 便于在后面循环遍历的时候使用。‘‘‘165 #第一个小球信息166 self.ball_x.append(self.x)167 self.ball_y.append(self.y)168 self.ball_v_x.append(self.velocity_x)169 self.ball_v_y.append(self.velocity_y)170 171 self.ball_x.append(self.second_ball_x)172 self.ball_y.append(self.second_ball_y)173 self.ball_v_x.append(self.second_ball_v_x)174 self.ball_v_y.append(self.second_ball_v_y)175 176 self.ball_x.append(self.three_ball_x)177 self.ball_y.append(self.three_ball_y)178 self.ball_v_x.append(self.three_ball_v_x)179 self.ball_v_y.append(self.three_ball_v_y)180 181 self.ball_x.append(self.four_ball_x)182 self.ball_y.append(self.four_ball_y)183 self.ball_v_x.append(self.four_ball_v_x)184 self.ball_v_y.append(self.four_ball_v_y)185 186 self.ball_x.append(self.five_ball_x)187 self.ball_y.append(self.five_ball_y)188 self.ball_v_x.append(self.five_ball_v_x)189 self.ball_v_y.append(self.five_ball_v_y)190 191 def update_ball_velocity(self, index, *args):192 ‘‘‘更新各个小球速度信息,即小球碰撞到四周和另外的小球索要更新的速度信息‘‘‘193 #游标值194 self.scale_value = http://www.mamicode.com/self.speed.get() * 0.1"%ri" % deltax, "%ri" % deltay)253 self.after(10, self.moveBall)254 255 def move_second_ball(self, *args):256 self.update_ball_velocity(1) 257 deltax = self.get_ball_deltax(1)258 deltay = self.get_ball_deltay(1) 259 self.draw.move(self.second_ball, "%ri" % deltax, "%ri" % deltay)260 self.after(10, self.move_second_ball)261 262 263 def move_three_ball(self, *args):264 self.update_ball_velocity(2) 265 deltax = self.get_ball_deltax(2)266 deltay = self.get_ball_deltay(2)267 self.draw.move(self.three_ball, "%ri" % deltax, "%ri" % deltay)268 self.after(10, self.move_three_ball)269 270 def move_four_ball(self, *args):271 self.update_ball_velocity(3) 272 deltax = self.get_ball_deltax(3)273 deltay = self.get_ball_deltay(3)274 self.draw.move(self.four_ball, "%ri" % deltax, "%ri" % deltay)275 self.after(10, self.move_four_ball)276 277 def move_five_ball(self, *args):278 self.update_ball_velocity(4) 279 deltax = self.get_ball_deltax(4)280 deltay = self.get_ball_deltay(4)281 self.draw.move(self.five_ball, "%ri" % deltax, "%ri" % deltay)282 self.after(10, self.move_five_ball)283 284 285 def __init__(self, master=None):286 ‘‘‘初始化函数‘‘‘287 Frame.__init__(self, master)288 Pack.config(self)289 self.createWidgets()290 self.after(10, self.moveBall)291 self.after(10, self.move_three_ball)292 self.after(10, self.move_four_ball)293 self.after(10, self.move_five_ball)294 self.after(10, self.move_second_ball)295 296 297 game = Pong()298 299 game.mainloop()
源码下载:http://files.cnblogs.com/liuzhi/python_tkinter_pong.1.1.zip
python开发_tkinter_小球完全弹性碰撞游戏
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。