我有一个用于类似 Pong 的游戏的 Pygame,它现在看起来非常棒,但有一些我无法弄清楚。
第一个问题是双方的问题。我已经设置蝙蝠使用左右箭头键移动并在到达侧面时停止(使用定位),但是如果你按下左侧的左键或右侧的右键,它会稍微走出游戏区。
第二个问题,和第一个一样,也是关于双方的。我已经将球设置为在墙壁周围移动和弹跳(使用定位),但是如果球棒在左侧或右侧,并且我持有相应的键,球将直接穿过墙壁/天花板!
最后一个问题是我已经将球设置为随着时间的推移加速(使用速度)。如果你擅长比赛,它会加速,直到球快到有能力直接突破球棒。
这是我的代码:
import pygame, time, sys, random
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600, 500))
pygame.display.set_caption ("Pong Squash")
def gameplay1():
global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, font2, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball, points, points_count, new_points, your_score1, space1, esc1, munrosmall, new_positionx, beep_list
game_over_display = "game_over1.png"
lives = "lives.png"
points = "points.png"
lives_remaining = "lives_remaining.png"
your_score = "score_intro.png"
space = "space.png"
esc = "esc.png"
munrosmall = "munrosmall.ttf"
beep1 = "beep1.wav"
beep2 = "beep2.wav"
beep3 = "beep3.wav"
beep4 = "beep4.wav"
game_over1 = pygame.image.load(game_over_display).convert()
lives1 = pygame.image.load(lives).convert()
points1 = pygame.image.load(points).convert()
lives_remaining1 = pygame.image.load(lives_remaining).convert()
your_score1 = pygame.image.load(your_score).convert()
space1 = pygame.image.load(space).convert()
esc1 = pygame.image.load(esc).convert()
font1 = pygame.font.Font((munrosmall), 40)
font2 = pygame.font.Font(None, 40)
white = 255,255,255
black = 0, 0, 0
green = 0, 250, 0
yellow = 255, 255, 0
points = 0
points_count = font1.render(str(points), True, white)
lives_count = font1.render(('3'), True, white)
position_x = 175
position_y = 375
velocity_x1 = 0
velocity_y1 = 0
position1 = 275
position2 = 150
velocity1 = 2
velocity2 = 2
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == pygame.K_SPACE:
if waiting:
waiting = False
reset_ball()
if event.key == pygame.K_LEFT:
velocity_x1 = (velocity_x1 - 3)
elif event.key == pygame. K_RIGHT:
velocity_x1 = (velocity_x1 + 3)
elif event.type == KEYUP:
if event.key == K_LEFT or event.key == K_RIGHT:
velocity_x1 = 0
screen.fill((0, 0, 0))
color = 255
width = 0
position = position_x, position_y, 250, 25
position_x += velocity_x1
position_y += velocity_y1
position1 += velocity1
position2 += velocity2
player = pygame.draw.rect(screen, (color, color, color), position, width)
ball = pygame.draw.rect(screen, (color, color, color), (position1, position2, 15, 15), width)
if player.colliderect(ball):
velocity2 = - velocity2
beep_list = [beep1, beep2, beep3, beep4]
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
if position_x > 350 or position_x < 0:
velocity_x1 = 0
elif position1 > 575 or position1 < 0:
velocity1 = - velocity1
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
elif position2 < 0:
velocity2 = - velocity2
velocity2 += 0.1
points += 100
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
pygame.display.update()
elif position2 > 365:
new_points = points
newposition_x = position_x
change_level1()
screen.blit(lives1, (450, 455))
screen.blit(points1,(0, 459))
screen.blit(lives_count,(560,453))
points_count = font1.render(str(points), True, white)
screen.blit(points_count, (150, 456))
pygame.display.update()
def gameplay2():
global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball, points, points_count, new_points, your_score1, munrosmall, newposition_x, beep_list
game_over_display = "game_over1.png"
lives = "lives.png"
points = "points.png"
lives_remaining = "lives_remaining.png"
beep1 = "beep1.wav"
beep2 = "beep2.wav"
beep3 = "beep3.wav"
beep4 = "beep4.wav"
game_over1 = pygame.image.load(game_over_display).convert()
lives1 = pygame.image.load(lives).convert()
points1 = pygame.image.load(points).convert()
lives_remaining1 = pygame.image.load(lives_remaining).convert()
white = 255,255,255
black = 0, 0, 0
green = 0, 250, 0
yellow = 255, 255, 0
points_count = font1.render(str(new_points), True, white)
lives_count = font1.render(('2'), True, white)
velocity_x1 = 0
velocity_y1 = 0
position1 = 275
position2 = 150
velocity1 = 2
velocity2 = 2
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == pygame.K_SPACE:
if waiting:
waiting = False
reset_ball()
if event.key == pygame.K_LEFT:
velocity_x1 = (velocity_x1 - 3)
elif event.key == pygame. K_RIGHT:
velocity_x1 = (velocity_x1 + 3)
elif event.type == KEYUP:
if event.key == K_LEFT or event.key == K_RIGHT:
velocity_x1 = 0
screen.fill((0, 0, 0))
color = 255
width = 0
position = position_x, position_y, 250, 25
position_x += velocity_x1
position1 += velocity1
position2 += velocity2
player = pygame.draw.rect(screen, (color, color, color), position, width)
ball = pygame.draw.rect(screen, (color, color, color), (position1, position2, 15, 15), width)
if player.colliderect(ball):
velocity1 = - velocity1
velocity2 = - velocity2
beep_list = [beep1, beep2, beep3, beep4]
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
if position_x > 350 or position_x < 0:
velocity_x1 = 0
elif position1 > 575 or position1 < 0:
velocity1 = - velocity1
beep_list = [beep1, beep2, beep3, beep4]
beep = random.shuffle((beep_list))
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
elif position2 < 0:
velocity2 = - velocity2
velocity2 += 0.1
new_points += 100
beep_list = [beep1, beep2, beep3, beep4]
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
pygame.display.update()
elif position2 > 365:
change_level2()
screen.blit(lives1, (450, 455))
screen.blit(points1,(0, 459))
screen.blit(lives_count,(560,453))
points_count = font1.render(str(new_points), True, white)
screen.blit(points_count, (150, 456))
pygame.display.update()
def gameplay3():
global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball, new_points, new_points2, your_score1, munrosmall, newposition_x, beep_list
game_over_display = "game_over1.png"
lives = "lives.png"
points = "points.png"
lives_remaining = "lives_remaining.png"
beep1 = "beep1.wav"
beep2 = "beep2.wav"
beep3 = "beep3.wav"
beep4 = "beep4.wav"
game_over1 = pygame.image.load(game_over_display).convert()
lives1 = pygame.image.load(lives).convert()
points1 = pygame.image.load(points).convert()
lives_remaining1 = pygame.image.load(lives_remaining).convert()
white = 255,255,255
black = 0, 0, 0
green = 0, 250, 0
yellow = 255, 255, 0
points_count = font1.render(str(new_points), True, white)
lives_count = font1.render(('1'), True, white)
velocity_x1 = 0
velocity_y1 = 0
position1 = 275
position2 = 150
velocity1 = 2
velocity2 = 2
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == pygame.K_SPACE:
if waiting:
waiting = False
reset_ball()
if event.key == pygame.K_LEFT:
velocity_x1 = (velocity_x1 - 3)
elif event.key == pygame. K_RIGHT:
velocity_x1 = (velocity_x1 + 3)
elif event.type == KEYUP:
if event.key == K_LEFT or event.key == K_RIGHT:
velocity_x1 = 0
screen.fill((0, 0, 0))
color = 255
width = 0
position = position_x, position_y, 250, 25
position_x += velocity_x1
position1 += velocity1
position2 += velocity2
player = pygame.draw.rect(screen, (color, color, color), position, width)
ball = pygame.draw.rect(screen, (color, color, color), (position1, position2, 15, 15), width)
if player.colliderect(ball):
velocity1 = - velocity1
velocity2 = - velocity2
beep_list = [beep1, beep2, beep3, beep4]
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
if position_x > 350 or position_x < 0:
velocity_x1 = 0
elif position1 > 575 or position1 < 0:
velocity1 = - velocity1
beep = random.shuffle(beep_list)
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
elif position2 < 0:
velocity2 = - velocity2
velocity2 += 0.1
new_points += 100
pygame.mixer.music.load((beep_list[1]))
pygame.mixer.music.play()
pygame.display.update()
elif position2 > 365:
game_over()
screen.blit(lives1, (450, 455))
screen.blit(points1,(0, 459))
screen.blit(lives_count,(560,453))
points_count = font1.render(str(new_points), True, white)
screen.blit(points_count, (150, 456))
pygame.display.update()
def change_level1():
global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball
gameplay2()
pygame.display.update()
def change_level2():
global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball
gameplay3()
pygame.display.update()
def reset_ball():
global game_over_display, lives, points, lives_remaining, game_over1, lives1, points1, lives_remaining1, font1, white, black, green, yellow, lives_number, lives_count, position_x, position_y, velocity_x1, velocity_y1, position1, position2, velocity1, velocity2, color, width, position, player, ball
velocity1 = 2
velocity2 = 2
pygame.display.update()
def game_over():
global game_over1, your_score1
pygame.display.flip()
screen.fill(black)
screen.blit(game_over1, (200,100))
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
elif event.key == K_RETURN:
gameplay1()
pygame.display.flip()
time.sleep(1)
screen.blit(your_score1, (100, 175))
pygame.display.flip()
time.sleep(1)
points_count = font1.render(str(new_points), True, white)
screen.blit(points_count, (400, 170))
pygame.display.flip()
time.sleep(1)
screen.blit(space1, (115, 250))
screen.blit(esc1, (175, 300))
pygame.display.flip()
gameplay1()
在这些事情上我真的需要帮助。提前致谢!
更新:我通过降低每次撞击后墙时增加的速度来解决最后一个问题,但我仍然需要前两个方面的帮助。我不明白velocityx1无论如何都与velocity1有关。是墙壁位置的问题,还是碰撞?请帮忙!