2016-01-16 39 views
0

我想在Python中使用CodeSkulptor構建街機遊戲'Pong'。我需要兩件事建設'傍'與蟒蛇(codeskulptor)

  1. 增加10%,球速幫助當它擊中槳
  2. 查看該顏色的按鈕,這是不工作

這裏修復是鏈接到代碼:http://www.codeskulptor.org/#user41_yJMm4nMju5X5zvk.py

# Implementation of classic arcade game Pong 
# Built by: Dejvi Zelo 
import simplegui 
import random 

# initialize globals - pos and vel encode vertical info for paddles 
WIDTH = 600 
HEIGHT = 400  
BALL_RADIUS = 20 
PAD_WIDTH = 8 
PAD_HEIGHT = 80 
HALF_PAD_WIDTH = PAD_WIDTH/2 
HALF_PAD_HEIGHT = PAD_HEIGHT/2 
LEFT = False 
RIGHT = True 
score1 = 0 
score2 = 0 

#paddle position 
paddle1_pos = HEIGHT/2 
paddle2_pos = HEIGHT/2 

#paddle velocity 
paddle1_vel = 0 
paddle2_vel = 0 

# initialize ball_pos and ball_vel for new bal in middle of table 
ball_pos = [WIDTH/2 , HEIGHT/2] 
ball_vel = [0 , 0] 

#set color theme 
color_palette = ['#FF5252','#00BCD4','#536DFE','#8BC34A','#FFC107','#FF9800','#FF4081','#E040FB'] 

color = random.choice(color_palette) 

def color_red(): 
    color = color_palette[0] 

def color_l_blue(): 
    color = color_palette[1] 

def color_d_blue(): 
    color = color_palette[2] 

def color_green(): 
    color = color_palette[3] 

def color_yellow(): 
    color = color_palette[4] 

def color_orange(): 
    color = color_palette[5] 

def color_pink(): 
    color = color_palette[6] 

def color_purple(): 
    color = color_palette[7] 

def open_game(): 
    global ball_pos, ball_vel 
    ball_pos = [WIDTH/2 , HEIGHT/2] 
    ball_vel[0] = 0 
    ball_vel[1] = 0 

# if direction is RIGHT, the ball's velocity is upper right, else upper left 
def start_game(direction): 
    global ball_pos, ball_vel 
    ball_pos = [WIDTH/2 , HEIGHT/2] 

    if direction == RIGHT: 
     ball_vel[0] = random.randrange(120,240)/60.0 
     ball_vel[1] = -random.randrange(60,180)/60.0 

    if direction == LEFT: 
     ball_vel[0] = -random.randrange(120,240)/60.0 
     ball_vel[1] = -random.randrange(60,180)/60.0 

# define event handlers 
def new_game(): 
    global paddle1_pos, paddle2_pos, paddle1_vel, paddle2_vel 
    global score1, score2 
    paddle1_pos = HEIGHT/2 
    paddle2_pos = HEIGHT/2 
    open_game() 
    score1 = 0 
    score2 = 0 

def draw(canvas): 
    global score1, score2, paddle1_pos, paddle2_pos, ball_pos, ball_vel 
    global paddle1_vel, paddle2_vel, PAD_HEIGHT, PAD_WIDTH, BALL_RADIUS,HALF_PAD_HEIGHT, HALF_PAD_WIDTH 
    global color_palette, color 

    # draw mid line and gutters 
    canvas.draw_line([WIDTH/2, 0],[WIDTH/2, HEIGHT], 1, "White") 
    canvas.draw_line([PAD_WIDTH, 0],[PAD_WIDTH, HEIGHT], 1, "White") 
    canvas.draw_line([WIDTH - PAD_WIDTH, 0],[WIDTH - PAD_WIDTH, HEIGHT], 1, "White") 

    # update ball 
    ball_pos[0] += ball_vel[0] 
    ball_pos[1] += ball_vel[1] 

    #ball with upper and lower wall collisions 
    if ball_pos[1] <= BALL_RADIUS: 
     ball_vel[0] = ball_vel[0] 
     ball_vel[1] = -ball_vel[1] 
    if ball_pos[1] >= (HEIGHT-1)-BALL_RADIUS: 
     ball_vel[0] = ball_vel[0] 
     ball_vel[1] = -ball_vel[1] 

    #spawn ball left or right  
    if ball_pos[0] <= BALL_RADIUS+PAD_WIDTH: 
     start_game(RIGHT) 
     score2 += 1 
    if ball_pos[0] >= (WIDTH-1)-PAD_WIDTH-BALL_RADIUS: 
     start_game(LEFT) 
     score1 += 1 

    # draw ball 
    canvas.draw_circle(ball_pos, BALL_RADIUS, 2, color, color) 

    #keep paddle on the screen 
    if paddle1_pos-HALF_PAD_HEIGHT <= 0 and paddle1_vel < 0: 
     paddle1_vel = 0 
    if paddle2_pos-HALF_PAD_HEIGHT <= 0 and paddle2_vel < 0: 
     paddle2_vel = 0 
    if paddle1_pos+HALF_PAD_HEIGHT >= HEIGHT and paddle1_vel > 0: 
     paddle1_vel = 0 
    if paddle2_pos+HALF_PAD_HEIGHT >= HEIGHT and paddle2_vel > 0: 
     paddle2_vel = 0 

    # update paddle's vertical position 
    paddle1_pos += paddle1_vel 
    paddle2_pos += paddle2_vel 

    # draw paddles 
    canvas.draw_polygon([(0,paddle1_pos-HALF_PAD_HEIGHT),(PAD_WIDTH,paddle1_pos-HALF_PAD_HEIGHT),(PAD_WIDTH,paddle1_pos+HALF_PAD_HEIGHT),(0,paddle1_pos+HALF_PAD_HEIGHT)], 5, color, color) 
    canvas.draw_polygon([(WIDTH,paddle2_pos-HALF_PAD_HEIGHT),(WIDTH-PAD_WIDTH,paddle2_pos-HALF_PAD_HEIGHT),(WIDTH-PAD_WIDTH,paddle2_pos+HALF_PAD_HEIGHT),(WIDTH,paddle2_pos+HALF_PAD_HEIGHT)], 5, color, color) 

    # determine whether paddle and ball collide  
    if ball_pos[1] > paddle1_pos-HALF_PAD_HEIGHT -2 and ball_pos[1]<paddle1_pos +HALF_PAD_HEIGHT +2 and ball_pos[0] - BALL_RADIUS <= PAD_WIDTH+2: 
     ball_vel[0] = -ball_vel[0] 
     ball_vel[1] = ball_vel[1] 

    if ball_pos[1] > paddle2_pos-HALF_PAD_HEIGHT -2 and ball_pos[1] < paddle2_pos +HALF_PAD_HEIGHT+2 and WIDTH - (WIDTH - (ball_pos[0] + BALL_RADIUS)) >= (WIDTH - PAD_WIDTH) -2: 
     ball_vel[0] = -ball_vel[0] 
     ball_vel[1] = ball_vel[1] 

    # draw scores 
    canvas.draw_text(str(score1), (WIDTH/2 - 100,80), 60, color, 'sans-serif') 
    canvas.draw_text(str(score2), (WIDTH/2 + 60,80), 60, color, 'sans-serif') 

def keydown(key): 
    global paddle1_vel, paddle2_vel 
    if key == simplegui.KEY_MAP['w']: 
     paddle1_vel = -4 
    elif key == simplegui.KEY_MAP['s']: 
     paddle1_vel = 4 
    elif key == simplegui.KEY_MAP['up']: 
     paddle2_vel = -4 
    elif key == simplegui.KEY_MAP['down']: 
     paddle2_vel = 4 
    elif key == simplegui.KEY_MAP['space']: 
     start_game(random.choice([LEFT,RIGHT])) 

def keyup(key): 
    global paddle1_vel, paddle2_vel 
    if key == simplegui.KEY_MAP['w']: 
     paddle1_vel = 0 
    elif key == simplegui.KEY_MAP['s']: 
     paddle1_vel = 0 
    elif key == simplegui.KEY_MAP['up']: 
     paddle2_vel = 0 
    elif key == simplegui.KEY_MAP['down']: 
     paddle2_vel = 0 

# create frame 
frame = simplegui.create_frame("Pong", WIDTH, HEIGHT) 
frame.set_canvas_background('#192c36') 
frame.set_draw_handler(draw) 
frame.set_keydown_handler(keydown) 
frame.set_keyup_handler(keyup) 
frame.add_label('Start the game by pressing SPACE'),frame.add_label(' ') 
frame.add_button('Restart', new_game, 100),frame.add_label(' ') 
frame.add_label('Choose color theme: '),frame.add_label(' ') 
frame.add_button('Red', color_red, 100) 
frame.add_button('Light Blue', color_l_blue, 100) 
frame.add_button('Dark Blue', color_d_blue, 100) 
frame.add_button('Green', color_green, 100) 
frame.add_button('Yellow', color_yellow, 100) 
frame.add_button('Orange', color_orange, 100) 
frame.add_button('Pink', color_pink, 100) 
frame.add_button('Purple', color_purple, 100) 


# start frame 
open_game() 
frame.start() 

因爲我不知道速度,我已經嘗試了不同的方法,他們沒有工作,但我敢肯定,這只是一些無聊的簡單的數學

對於顏色,顏色變量設置爲從列表color_palette中選取一個隨機顏色,但除此之外,這些按鈕並沒有按照他們所期望的那樣做。

我是新來的Python和一般的編程和英語不是我的第一語言,所以請裸露在我身邊。

感謝任何進一步的幫助

+0

'ball_vel [0] = -1.1 * ball_vel [0]'...等等 –

+0

我到底在哪裏添加這段代碼,是因爲我試了幾次,它只給了我更多的錯誤? – Dave

+0

有些身體給了你很好的記錄代碼...並編輯它的任務...如果你真的想學習,那麼我建議你閱讀整個代碼...你認爲你會把它放在哪裏?如果這不起作用,你會得到什麼錯誤? –

回答

0
# determine whether paddle and ball collide  
if ball_pos[1] > paddle1_pos-HALF_PAD_HEIGHT -2 and ball_pos[1]<paddle1_pos +HALF_PAD_HEIGHT +2 and ball_pos[0] - BALL_RADIUS <= PAD_WIDTH+2: 
    ball_vel[0] = -1.1*ball_vel[0] 
    ball_vel[1] = ball_vel[1] # this line does absolutely nothing ... 

if ball_pos[1] > paddle2_pos-HALF_PAD_HEIGHT -2 and ball_pos[1] < paddle2_pos +HALF_PAD_HEIGHT+2 and WIDTH - (WIDTH - (ball_pos[0] + BALL_RADIUS)) >= (WIDTH - PAD_WIDTH) -2: 
    ball_vel[0] = -1.1*ball_vel[0] 
    ball_vel[1] = ball_vel[1] # this line does absolutely nothing ... 

也是你的碰撞都有點壞...它時常撞擊擋板和錯誤重新啓動球得一分...

你需要將global color添加到每個顏色函數的頂部,以便您將顏色分配爲全局顏色而不是本地顏色......還有許多其他方法可以解決此問題......但這需要最少量的更改和工作

def color_red(): 
    global color 
    color = color_palette[0] 
+0

我也試過。它仍然不起作用。相同的結果如上面註釋 – Dave

+0

中所述那不是你的碰撞(你需要修復它們...即使你沒有改變你的代碼,它仍然會出現毛刺和(不正確)重新啓動球定期...通過增加速度你大大增加了這個錯誤發生的機率)...這是你的問題的答案... –

+0

好吧我現在明白了。非常感謝,你有任何可能幫助碰撞的機會嗎?這是一個小故障,我一直無法解決,我認爲它只是電腦 – Dave