2013-02-06 95 views
0

嗨我想編程的街機遊戲小行星,並已這樣做,當用戶按空格鍵,創建一個圓形'船'當前位置,並且其位置添加到'ball_list',而船舶的水平和垂直速度是存儲在「ball_vlist」新圈子的速度,如圖Python .append改變輸入列表?

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() 

回答

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] 
+0

啊這是有道理的!謝謝一堆! – kylecblyth

0

的問題是與附加列表到一​​個數組,該列表保持作爲參考。

例子:

>>> i = [1, 2, 3] 
>>> x = [] 
>>> x.append(i) 
>>> x[0][1] = 5 
>>> i 
[1, 5, 3] 
>>>