python開(kāi)發(fā)的小球完全彈性碰撞游戲代碼
完成這個(gè)小球的完全彈性碰撞游戲靈感來(lái)自于:
下面是我花了一周下班時(shí)間所編寫(xiě)的一個(gè)小球完全彈性碰撞游戲:
游戲初始化狀態(tài):
最下面的游標(biāo)和修改小球的移動(dòng)速度
源碼部分:
#python tkinter
#python version 3.3.2
from tkinter import *
'''
判斷
兩個(gè)小球
{
圓心:A(x1,y1) 半徑:r X軸速度:Vax Y軸速度:Vay
圓心:B(x2,y2) 半徑:R X軸速度:Vbx Y軸速度:Vby
}
碰撞的條件是:
1.兩個(gè)小球的圓心距離不大于兩小球半徑之和(r+R),即:
{
(x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2
}
2.小球碰撞后,兩小球的數(shù)度交換,即:
{
tempVax = Vax
tempVay = Vay
Vax = Vbx
Vay = Vby
Vbx = tempVax
Vby = tempVay
或:
Vax = Vax + Vbx
Vbx = Vax - Vbx
Vax = Vax - Vbx
Vay = Vay + Vby
Vby = Vay - Vby
Vay = Vay - Vby
}
游戲規(guī)則:
五小球在畫(huà)布中移動(dòng),他們之間會(huì)產(chǎn)生碰撞,當(dāng)然小球和上下左右都會(huì)產(chǎn)生碰撞
碰撞后,小球會(huì)改變方向返回
而最下面的游標(biāo)則用于調(diào)節(jié)小球的移動(dòng)速度,游標(biāo)的范圍是[-100, 100]
缺陷或BUG:
1.在修改游標(biāo)數(shù)據(jù)從而改變小球移動(dòng)速度的時(shí)候,小球移動(dòng)的距離得不到及時(shí)的更新
導(dǎo)致小球可能會(huì)逃離畫(huà)布
2.小球在運(yùn)動(dòng)的過(guò)程中,有時(shí)候也有可能逃離畫(huà)布
總結(jié):
完成這個(gè)游戲,花了一個(gè)星期的下班時(shí)間。在這個(gè)過(guò)程中不僅回去學(xué)習(xí)了高中的數(shù)學(xué)知識(shí),
物理知識(shí),很多東西都忘得差不多了,不過(guò)很快又學(xué)返回來(lái)了。
游戲其實(shí)很多就是數(shù)學(xué)問(wèn)題。
游戲中還存在缺陷或BUG,希望志同道合者可以共同完善。
'''
__author__ = {'author' : 'Hongten',
'Email' : 'hongtenzone@foxmail.com',
'Blog' : 'http://www.cnblogs.com/hongten/',
'Created' : '2013-09-28',
'Version' : '1.0'}
class Pong(Frame):
def createWidgets(self):
## 畫(huà)布
self.draw = Canvas(self, width="5i", height="5i", bg='white')
## 游標(biāo)(控制小球移動(dòng)速度,范圍:[-100, 100])
self.speed = Scale(self, orient=HORIZONTAL, label="ball speed",
from_=-100, to=100)
self.speed.pack(side=BOTTOM, fill=X)
#小球碰撞墻壁的范圍
self.scaling_right = 4.8
self.scaling_left = 0.2
#小球直徑
self.ball_d = 0.4
#游標(biāo)度數(shù)
self.scale_value = self.speed.get()
#放縮率
self.scaling = 100.0
#存放小球數(shù)組
self.balls = []
#存放小球x坐標(biāo)數(shù)組
self.ball_x = []
#存放小球y坐標(biāo)數(shù)組
self.ball_y = []
#存放小球x軸方向速度數(shù)組
self.ball_v_x = []
#存放小球y軸方向速度數(shù)組
self.ball_v_y = []
# 五個(gè)小球
self.ball = self.draw.create_oval("0.10i", "0.10i", "0.50i", "0.50i",
fill="red")
self.second_ball = self.draw.create_oval("0.70i", "0.70i", "1.10i", "1.10i",
fill='black')
self.three_ball = self.draw.create_oval("1.30i", "1.30i", "1.70i", "1.70i",
fill='brown')
self.four_ball = self.draw.create_oval("2.0i", "2.0i", "2.40i", "2.40i",
fill='green')
self.five_ball = self.draw.create_oval("3.0i", "3.0i", "3.40i", "3.40i",
fill='gray')
#把五個(gè)小球放入數(shù)組
self.balls.append(self.ball)
self.balls.append(self.second_ball)
self.balls.append(self.three_ball)
self.balls.append(self.four_ball)
self.balls.append(self.five_ball)
#第一個(gè)小球,即self.ball的圓心坐標(biāo)(self.x, self.y),這里進(jìn)行了放縮,目的是為了
#在小球移動(dòng)的過(guò)程中更加流暢
self.x = 0.3
self.y = 0.3
#第一個(gè)小球的速度方向
self.velocity_x = -0.2
self.velocity_y = 0.5
self.second_ball_x = 0.9
self.second_ball_y = 0.9
self.second_ball_v_x = 0.4
self.second_ball_v_y = -0.5
self.three_ball_x = 1.5
self.three_ball_y = 1.5
self.three_ball_v_x = -0.3
self.three_ball_v_y = -0.5
self.four_ball_x = 2.2
self.four_ball_y = 2.2
self.four_ball_v_x = 0.1
self.four_ball_v_y = -0.5
self.five_ball_x = 3.2
self.five_ball_y = 3.2
self.five_ball_v_x = 0.3
self.five_ball_v_y = 0.5
#更新小球的坐標(biāo)
self.update_ball_x_y()
self.draw.pack(side=LEFT)
def update_ball_x_y(self, *args):
'''更新小球的坐標(biāo),即把各個(gè)小球的圓心坐標(biāo)信息以及速度信息存放到數(shù)組中,
便于在后面循環(huán)遍歷的時(shí)候使用。'''
#第一個(gè)小球信息
self.ball_x.append(self.x)
self.ball_y.append(self.y)
self.ball_v_x.append(self.velocity_x)
self.ball_v_y.append(self.velocity_y)
self.ball_x.append(self.second_ball_x)
self.ball_y.append(self.second_ball_y)
self.ball_v_x.append(self.second_ball_v_x)
self.ball_v_y.append(self.second_ball_v_y)
self.ball_x.append(self.three_ball_x)
self.ball_y.append(self.three_ball_y)
self.ball_v_x.append(self.three_ball_v_x)
self.ball_v_y.append(self.three_ball_v_y)
self.ball_x.append(self.four_ball_x)
self.ball_y.append(self.four_ball_y)
self.ball_v_x.append(self.four_ball_v_x)
self.ball_v_y.append(self.four_ball_v_y)
self.ball_x.append(self.five_ball_x)
self.ball_y.append(self.five_ball_y)
self.ball_v_x.append(self.five_ball_v_x)
self.ball_v_y.append(self.five_ball_v_y)
def update_ball_velocity(self, index, *args):
'''更新各個(gè)小球速度信息,即小球碰撞到四周和另外的小球索要更新的速度信息'''
#游標(biāo)值
self.scale_value = self.speed.get()
#碰撞墻壁
if (self.ball_x[index] > self.scaling_right) or (self.ball_x[index] < self.scaling_left):
self.ball_v_x[index] = -1.0 * self.ball_v_x[index]
if (self.ball_y[index] > self.scaling_right) or (self.ball_y[index] < self.scaling_left):
self.ball_v_y[index] = -1.0 * self.ball_v_y[index]
'''
#TEST:
for n in range(len(self.balls)):
#print((self.ball_x[index] - self.ball_x[n])**2)
#print(round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2))
print(round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2) <= round(self.ball_d**2, 2))
'''
for n in range(len(self.balls)):
#小球碰撞條件,即:(x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2
if (round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2) <= round(self.ball_d**2, 2)):
#兩小球速度交換
temp_vx = self.ball_v_x[index]
temp_vy = self.ball_v_y[index]
self.ball_v_x[index] = self.ball_v_x[n]
self.ball_v_y[index] = self.ball_v_y[n]
self.ball_v_x[n] = temp_vx
self.ball_v_y[n] = temp_vy
#print(self.ball_v_x, self.ball_v_y)
'''
#WRONG:
for n in range(len(self.balls)):
if (((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2) <= self.ball_d**2):
#兩小球速度交換
self.ball_v_x[index] = self.ball_v_x[index] + self.ball_v_x[n]
self.ball_v_x[n] = self.ball_v_x[0] - self.ball_v_x[n]
self.ball_v_x[index] = self.ball_v_x[index] - self.ball_v_x[n]
self.ball_v_y[index] = self.ball_v_y[index] + self.ball_v_y[n]
self.ball_v_y[n] = self.ball_v_y[index] - self.ball_v_y[n]
self.ball_v_y[index] = self.ball_v_y[index] - self.ball_v_y[n]
print(self.ball_v_x, self.ball_v_y)
'''
def get_ball_deltax(self, index, *args):
'''獲取小球X軸坐標(biāo)移動(dòng)距離并且更新小球的圓心X坐標(biāo),返回X軸所需移動(dòng)距離'''
deltax = (self.ball_v_x[index] * self.scale_value / self.scaling)
self.ball_x[index] = self.ball_x[index] + deltax
return deltax
def get_ball_deltay(self, index, *args):
'''獲取小球Y軸坐標(biāo)移動(dòng)距離并且更新小球的圓心Y坐標(biāo),返回Y軸所需移動(dòng)距離'''
deltay = (self.ball_v_y[index] * self.scale_value / self.scaling)
self.ball_y[index] = self.ball_y[index] + deltay
return deltay
def moveBall(self, *args):
'''移動(dòng)第一個(gè)小球,編號(hào)為:0,這是根據(jù)數(shù)組:self.balls確定的。'''
self.update_ball_velocity(0)
deltax = self.get_ball_deltax(0)
deltay = self.get_ball_deltay(0)
#小球移動(dòng)
self.draw.move(self.ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.moveBall)
def move_second_ball(self, *args):
self.update_ball_velocity(1)
deltax = self.get_ball_deltax(1)
deltay = self.get_ball_deltay(1)
self.draw.move(self.second_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_second_ball)
def move_three_ball(self, *args):
self.update_ball_velocity(2)
deltax = self.get_ball_deltax(2)
deltay = self.get_ball_deltay(2)
self.draw.move(self.three_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_three_ball)
def move_four_ball(self, *args):
self.update_ball_velocity(3)
deltax = self.get_ball_deltax(3)
deltay = self.get_ball_deltay(3)
self.draw.move(self.four_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_four_ball)
def move_five_ball(self, *args):
self.update_ball_velocity(4)
deltax = self.get_ball_deltax(4)
deltay = self.get_ball_deltay(4)
self.draw.move(self.five_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_five_ball)
def __init__(self, master=None):
'''初始化函數(shù)'''
Frame.__init__(self, master)
Pack.config(self)
self.createWidgets()
self.after(10, self.moveBall)
self.after(10, self.move_three_ball)
self.after(10, self.move_four_ball)
self.after(10, self.move_five_ball)
self.after(10, self.move_second_ball)
game = Pong()
game.mainloop()
===================================================
第二個(gè)版本 version.1.1: Edit by Hongten 2013-09-28 17:40
===================================================
修改記錄:
1.調(diào)整畫(huà)布大小
2.調(diào)整了小球的半徑,以及小球的速度初始值,小球初始圓心坐標(biāo)
3.游標(biāo)的范圍修改為:[-200, 200]
這些修改主要是針對(duì)上面的缺陷而進(jìn)行的。
優(yōu)點(diǎn):
1.小球移動(dòng)的過(guò)程更直觀
2.小球的移動(dòng)速度變小,但是可以根據(jù)游標(biāo)來(lái)修改小球移動(dòng)速度
3.界面比之前更加友好
運(yùn)行效果:
#python tkinter
#python version 3.3.2
from tkinter import *
'''
判斷
兩個(gè)小球
{
圓心:A(x1,y1) 半徑:r X軸速度:Vax Y軸速度:Vay
圓心:B(x2,y2) 半徑:R X軸速度:Vbx Y軸速度:Vby
}
碰撞的條件是:
1.兩個(gè)小球的圓心距離不大于兩小球半徑之和(r+R),即:
{
(x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2
}
2.小球碰撞后,兩小球的數(shù)度交換,即:
{
tempVax = Vax
tempVay = Vay
Vax = Vbx
Vay = Vby
Vbx = tempVax
Vby = tempVay
或:
Vax = Vax + Vbx
Vbx = Vax - Vbx
Vax = Vax - Vbx
Vay = Vay + Vby
Vby = Vay - Vby
Vay = Vay - Vby
}
游戲規(guī)則:
五小球在畫(huà)布中移動(dòng),他們之間會(huì)產(chǎn)生碰撞,當(dāng)然小球和上下左右都會(huì)產(chǎn)生碰撞
碰撞后,小球會(huì)改變方向返回
而最下面的游標(biāo)則用于調(diào)節(jié)小球的移動(dòng)速度,游標(biāo)的范圍是[-100, 100]
缺陷或BUG:
1.在修改游標(biāo)數(shù)據(jù)從而改變小球移動(dòng)速度的時(shí)候,小球移動(dòng)的距離得不到及時(shí)的更新
導(dǎo)致小球可能會(huì)逃離畫(huà)布
2.小球在運(yùn)動(dòng)的過(guò)程中,有時(shí)候也有可能逃離畫(huà)布
總結(jié):
完成這個(gè)游戲,花了一個(gè)星期的下班時(shí)間。在這個(gè)過(guò)程中不僅回去學(xué)習(xí)了高中的數(shù)學(xué)知識(shí),
物理知識(shí),很多東西都忘得差不多了,不過(guò)很快又學(xué)返回來(lái)了。
游戲其實(shí)很多就是數(shù)學(xué)問(wèn)題。
游戲中還存在缺陷或BUG,希望志同道合者可以共同完善。
修改記錄:
1.調(diào)整畫(huà)布大小
2.調(diào)整了小球的半徑,以及小球的速度初始值,小球初始圓心坐標(biāo)
3.游標(biāo)的范圍修改為:[-200, 200]
這些修改主要是針對(duì)上面的缺陷而進(jìn)行的。
優(yōu)點(diǎn):
1.小球移動(dòng)的過(guò)程更直觀
2.小球的移動(dòng)速度變小,但是可以根據(jù)游標(biāo)來(lái)修改小球移動(dòng)速度
3.界面比之前更加友好
'''
__author__ = {'author' : 'Hongten',
'Email' : 'hongtenzone@foxmail.com',
'Blog' : 'http://www.cnblogs.com/hongten/',
'Created' : '2013-09-28',
'Version' : '1.1'}
class Pong(Frame):
def createWidgets(self):
#放縮率
self.scaling = 100.0
#畫(huà)布比例
self.canvas_width = 10
self.canvas_height = 5.6
## 畫(huà)布
self.draw = Canvas(self, width=(self.canvas_width * self.scaling),
height=(self.canvas_height * self.scaling),
bg='white')
## 游標(biāo)(控制小球移動(dòng)速度,范圍:[-100, 100])
self.speed = Scale(self, orient=HORIZONTAL, label="ball speed",
from_=-200, to=200)
self.speed.pack(side=BOTTOM, fill=X)
#小球直徑
self.ball_d = 1.0
#小球碰撞墻壁的范圍
self.scaling_left = round(self.ball_d / 2, 1)
self.scaling_right = self.canvas_width - self.scaling_left
self.scaling_bottom = self.canvas_height - self.scaling_left
self.scaling_top = self.scaling_left
#游標(biāo)度數(shù)
self.scale_value = self.speed.get() * 0.1
#存放小球數(shù)組
self.balls = []
#存放小球x坐標(biāo)數(shù)組
self.ball_x = []
#存放小球y坐標(biāo)數(shù)組
self.ball_y = []
#存放小球x軸方向速度數(shù)組
self.ball_v_x = []
#存放小球y軸方向速度數(shù)組
self.ball_v_y = []
# 五個(gè)小球
self.ball = self.draw.create_oval("0.60i", "0.60i", "1.60i", "1.60i",
fill="red")
self.second_ball = self.draw.create_oval("2.0i", "2.0i", "3.0i", "3.0i",
fill='black')
self.three_ball = self.draw.create_oval("4.0i", "4.0i", "5.0i", "5.0i",
fill='brown')
self.four_ball = self.draw.create_oval("6.0i", "2.0i", "7.0i", "3.0i",
fill='green')
self.five_ball = self.draw.create_oval("8.0i", "3.0i", "9.0i", "4.0i",
fill='gray')
#把五個(gè)小球放入數(shù)組
self.balls.append(self.ball)
self.balls.append(self.second_ball)
self.balls.append(self.three_ball)
self.balls.append(self.four_ball)
self.balls.append(self.five_ball)
#第一個(gè)小球,即self.ball的圓心坐標(biāo)(self.x, self.y),這里進(jìn)行了放縮,目的是為了
#在小球移動(dòng)的過(guò)程中更加流暢
self.x = 1.1
self.y = 1.1
#第一個(gè)小球的速度方向
self.velocity_x = -0.2
self.velocity_y = 0.1
self.second_ball_x = 2.5
self.second_ball_y = 2.5
self.second_ball_v_x = 0.1
self.second_ball_v_y = -0.2
self.three_ball_x = 4.5
self.three_ball_y = 4.5
self.three_ball_v_x = -0.1
self.three_ball_v_y = -0.2
self.four_ball_x = 6.5
self.four_ball_y = 2.5
self.four_ball_v_x = 0.1
self.four_ball_v_y = -0.2
self.five_ball_x = 8.5
self.five_ball_y = 3.5
self.five_ball_v_x = 0.1
self.five_ball_v_y = 0.2
#更新小球的坐標(biāo)
self.update_ball_x_y()
self.draw.pack(side=LEFT)
def update_ball_x_y(self, *args):
'''更新小球的坐標(biāo),即把各個(gè)小球的圓心坐標(biāo)信息以及速度信息存放到數(shù)組中,
便于在后面循環(huán)遍歷的時(shí)候使用。'''
#第一個(gè)小球信息
self.ball_x.append(self.x)
self.ball_y.append(self.y)
self.ball_v_x.append(self.velocity_x)
self.ball_v_y.append(self.velocity_y)
self.ball_x.append(self.second_ball_x)
self.ball_y.append(self.second_ball_y)
self.ball_v_x.append(self.second_ball_v_x)
self.ball_v_y.append(self.second_ball_v_y)
self.ball_x.append(self.three_ball_x)
self.ball_y.append(self.three_ball_y)
self.ball_v_x.append(self.three_ball_v_x)
self.ball_v_y.append(self.three_ball_v_y)
self.ball_x.append(self.four_ball_x)
self.ball_y.append(self.four_ball_y)
self.ball_v_x.append(self.four_ball_v_x)
self.ball_v_y.append(self.four_ball_v_y)
self.ball_x.append(self.five_ball_x)
self.ball_y.append(self.five_ball_y)
self.ball_v_x.append(self.five_ball_v_x)
self.ball_v_y.append(self.five_ball_v_y)
def update_ball_velocity(self, index, *args):
'''更新各個(gè)小球速度信息,即小球碰撞到四周和另外的小球索要更新的速度信息'''
#游標(biāo)值
self.scale_value = self.speed.get() * 0.1
#碰撞墻壁
if (self.ball_x[index] > self.scaling_right) or (self.ball_x[index] < self.scaling_left):
self.ball_v_x[index] = -1.0 * self.ball_v_x[index]
if (self.ball_y[index] > self.scaling_bottom) or (self.ball_y[index] < self.scaling_top):
self.ball_v_y[index] = -1.0 * self.ball_v_y[index]
'''
#TEST:
for n in range(len(self.balls)):
#print((self.ball_x[index] - self.ball_x[n])**2)
#print(round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2))
print(round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2) <= round(self.ball_d**2, 2))
'''
for n in range(len(self.balls)):
#小球碰撞條件,即:(x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2
if (round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2) <= round(self.ball_d**2, 2)):
#兩小球速度交換
temp_vx = self.ball_v_x[index]
temp_vy = self.ball_v_y[index]
self.ball_v_x[index] = self.ball_v_x[n]
self.ball_v_y[index] = self.ball_v_y[n]
self.ball_v_x[n] = temp_vx
self.ball_v_y[n] = temp_vy
#print(self.ball_v_x, self.ball_v_y)
'''
#WRONG:
for n in range(len(self.balls)):
if (((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2) <= self.ball_d**2):
#兩小球速度交換
self.ball_v_x[index] = self.ball_v_x[index] + self.ball_v_x[n]
self.ball_v_x[n] = self.ball_v_x[0] - self.ball_v_x[n]
self.ball_v_x[index] = self.ball_v_x[index] - self.ball_v_x[n]
self.ball_v_y[index] = self.ball_v_y[index] + self.ball_v_y[n]
self.ball_v_y[n] = self.ball_v_y[index] - self.ball_v_y[n]
self.ball_v_y[index] = self.ball_v_y[index] - self.ball_v_y[n]
print(self.ball_v_x, self.ball_v_y)
'''
def get_ball_deltax(self, index, *args):
'''獲取小球X軸坐標(biāo)移動(dòng)距離并且更新小球的圓心X坐標(biāo),返回X軸所需移動(dòng)距離'''
deltax = (self.ball_v_x[index] * self.scale_value / self.scaling)
self.ball_x[index] = self.ball_x[index] + deltax
return deltax
def get_ball_deltay(self, index, *args):
'''獲取小球Y軸坐標(biāo)移動(dòng)距離并且更新小球的圓心Y坐標(biāo),返回Y軸所需移動(dòng)距離'''
deltay = (self.ball_v_y[index] * self.scale_value / self.scaling)
self.ball_y[index] = self.ball_y[index] + deltay
return deltay
def moveBall(self, *args):
'''移動(dòng)第一個(gè)小球,編號(hào)為:0,這是根據(jù)數(shù)組:self.balls確定的。'''
self.update_ball_velocity(0)
deltax = self.get_ball_deltax(0)
deltay = self.get_ball_deltay(0)
#小球移動(dòng)
self.draw.move(self.ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.moveBall)
def move_second_ball(self, *args):
self.update_ball_velocity(1)
deltax = self.get_ball_deltax(1)
deltay = self.get_ball_deltay(1)
self.draw.move(self.second_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_second_ball)
def move_three_ball(self, *args):
self.update_ball_velocity(2)
deltax = self.get_ball_deltax(2)
deltay = self.get_ball_deltay(2)
self.draw.move(self.three_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_three_ball)
def move_four_ball(self, *args):
self.update_ball_velocity(3)
deltax = self.get_ball_deltax(3)
deltay = self.get_ball_deltay(3)
self.draw.move(self.four_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_four_ball)
def move_five_ball(self, *args):
self.update_ball_velocity(4)
deltax = self.get_ball_deltax(4)
deltay = self.get_ball_deltay(4)
self.draw.move(self.five_ball, "%ri" % deltax, "%ri" % deltay)
self.after(10, self.move_five_ball)
def __init__(self, master=None):
'''初始化函數(shù)'''
Frame.__init__(self, master)
Pack.config(self)
self.createWidgets()
self.after(10, self.moveBall)
self.after(10, self.move_three_ball)
self.after(10, self.move_four_ball)
self.after(10, self.move_five_ball)
self.after(10, self.move_second_ball)
game = Pong()
game.mainloop()
源碼下載:python_tkinter_pong(jb51.net).rar
- python貪吃蛇游戲代碼
- 14 個(gè)Python小游戲 源碼分享
- 二十種Python代碼游戲源代碼分享
- 13個(gè)有趣又好玩的Python游戲代碼分享
- python基礎(chǔ)練習(xí)之幾個(gè)簡(jiǎn)單的游戲
- Python實(shí)現(xiàn)我的世界小游戲源代碼
- 用Python設(shè)計(jì)一個(gè)經(jīng)典小游戲
- 20行python代碼的入門(mén)級(jí)小游戲的詳解
- 用python制作游戲外掛
- Python寫(xiě)的貪吃蛇游戲例子
- 基于Python實(shí)現(xiàn)的掃雷游戲?qū)嵗a
- python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a
- Python實(shí)現(xiàn)打磚塊小游戲代碼實(shí)例
- Python開(kāi)發(fā)文字版密室逃脫游戲的實(shí)例(含代碼)
相關(guān)文章
使用Python進(jìn)行穩(wěn)定可靠的文件操作詳解
在本文中,主要分享一些如何在Python代碼中改善I/O可靠性的見(jiàn)解,大家參考使用吧2013-12-12使用OpenCV-python3實(shí)現(xiàn)滑動(dòng)條更新圖像的Canny邊緣檢測(cè)功能
這篇文章主要介紹了使用OpenCV-python3實(shí)現(xiàn)滑動(dòng)條更新圖像的Canny邊緣檢測(cè)功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12詳談Python基礎(chǔ)之內(nèi)置函數(shù)和遞歸
下面小編就為大家?guī)?lái)一篇Python基礎(chǔ)之內(nèi)置函數(shù)和遞歸。小編覺(jué)得挺不錯(cuò)的?,F(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06python 圖像判斷,清晰度(明暗),彩色與黑白實(shí)例
這篇文章主要介紹了python 圖像判斷,清晰度(明暗),彩色與黑白實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06python執(zhí)行子進(jìn)程實(shí)現(xiàn)進(jìn)程間通信的方法
這篇文章主要介紹了python執(zhí)行子進(jìn)程實(shí)現(xiàn)進(jìn)程間通信的方法,涉及Python使用subprocess模塊操作進(jìn)程的相關(guān)技巧,需要的朋友可以參考下2015-06-06python多線程多并發(fā)啟動(dòng)appium服務(wù)的實(shí)現(xiàn)
使用Dos命令或者bat批處理來(lái)手動(dòng)啟動(dòng)appium服務(wù),啟動(dòng)效率低下,本文主要介紹了python多線程多并發(fā)啟動(dòng)appium服務(wù)的實(shí)現(xiàn),具有一定的 參考價(jià)值,感興趣的可以了解一下2024-02-02Python tkinter庫(kù)實(shí)現(xiàn)登錄注冊(cè)基本功能
Python自帶了tkinter模塊,實(shí)質(zhì)上是一種流行的面向?qū)ο蟮腉UI工具包 TK 的Python編程接口,提供了快速便利地創(chuàng)建GUI應(yīng)用程序的方法,下面這篇文章主要給大家介紹了關(guān)于tkinter庫(kù)制作一個(gè)簡(jiǎn)單的登錄注冊(cè)小程序,需要的朋友可以參考下2022-12-12Python 經(jīng)典面試題 21 道【不可錯(cuò)過(guò)】
這篇文章主要介紹了Python 經(jīng)典面試題 21 道,在python面試過(guò)程中這21道是經(jīng)常被問(wèn)到了,感興趣的朋友跟隨小編一起看看吧2018-09-09