您好我正在尝试对街机游戏小行星进行编程,并且当用户按下空格键时创建了一个圆圈,创建了一个圆圈,其中“船”当前位于其中,并且当船的水平位置时,其位置添加到“ball_list”垂直速度在'ball_vlist'中存储为新圆圈的速度,如图所示
def draw(canvas):
global ship_pos, ship_vel, ball_list
if current_key=='32': # if spacebar is pressed
ball_list.append(ship_pos) # create a new circle and store is position
ball_vlist.append(ship_vel) # add a velocity to this new circle
当我运行整个程序时,正如我所料,船只以我最初给它的速度移动。但是,当我按下空格键时,它会加速,我不知道为什么。我发现这一行导致了问题:
ball_list.append(ship_pos)
因为当我将其评论出来时,按下空格键时船只会继续正常运行。是否以某种方式改变了船的位置?我已经检查过,即使船舶加速,船舶的速度(ship_vel)也保持不变。
感谢您的帮助!如果您需要其他上下文,这是整个程序:
import simplegui
ball_list = []
ball_vlist = []
ship_pos = [200, 400]
ship_vel = [.5, -.5]
current_key=' '
frame = simplegui.create_frame("Asteroids", 800, 500)
def tick():
global ball_list, ball_vlist, ship_pos
# update the ship position
ship_pos[0] += ship_vel[0]
ship_pos[1] += ship_vel[1]
# update the ball positions
for i in range(len(ball_list)):
ball_list[i][0]+=ball_vlist[i][0]
ball_list[i][1]+=ball_vlist[i][1]
def draw(canvas):
global ship_pos, ship_vel, ball_list
if current_key=='32':
ball_list.append(ship_pos)
ball_vlist.append(ship_vel)
for ball_pos in ball_list:
canvas.draw_circle(ball_pos, 1, 1, "white", "white") # these are the circles the ship shoots
canvas.draw_circle(ship_pos, 4, 1, "red", "green") # this is my 'ship' (just to test)
def keydown(key):
global current_key
current_key = str(key)
def keyup(key):
global current_key
current_key=' '
timer = simplegui.create_timer(10, tick)
frame.set_keydown_handler(keydown)
frame.set_keyup_handler(keyup)
frame.set_draw_handler(draw)
frame.start()
timer.start()
答案 0 :(得分:3)
试试这个:
ball_list.append(ship_pos[:])
ball_vlist.append(ship_vel[:])
当您追加ship_pos
(和ship_vel
)时,您实际上是附加了相同的列表。 ball_list[0]
现在将引用与ship_pos
相同的列表。这意味着如果您更改一个(例如ball_list[0][0] = 5
),那么另一个也将更改(ship_pos[0] == 5
)。
您可以使用[:]
复制列表来解决此问题,以便您现在附加列表的新副本。
我认为其中任何一个都没有意义,所以这里有一些可能有用的代码:
>>> a = []
>>> b = [1,2]
>>> a.append(b)
>>> a
[[1, 2]]
>>> a[0][0] = 3
>>> a
[[3, 2]]
>>> b
[3, 2]
>>> a=[]
>>> b=[1,2]
>>> a.append(b[:])
>>> a
[[1, 2]]
>>> a[0][0] = 3
>>> a
[[3, 2]]
>>> b
[1, 2]
答案 1 :(得分:0)
问题在于将列表附加到数组,列表仍然作为参考。
示例:
>>> i = [1, 2, 3]
>>> x = []
>>> x.append(i)
>>> x[0][1] = 5
>>> i
[1, 5, 3]
>>>