我正在研究一个项目,该项目是从youtube上的一个教程开始的,用于重塑类似于《太空侵略者》游戏的内容。我让游戏正常运行,但是我想在游戏结束后为用户实施重新启动选项。我尝试将所有代码放入main()函数中,以便游戏结束后,我可以为用户提供一个再次玩的选项,如果他们选择再次玩,我可以调用main()函数来重新启动代码。将我的代码放入main()函数后,除发射子弹外,其他所有工作均完全相同。它应该起作用,以便每当用户按下空格键时,子弹就会被发射到整个屏幕高度,然后重设回太空飞船,或者一旦碰到外星飞船就重设。我遇到的问题是,当我按下空格键时,子弹不会从飞船上移开,它只是短暂地出现在屏幕上的起始位置,然后再不动。下面的所有代码都在我的main函数内部,并且main函数被调用并且可以正常工作。唯一的问题是,子弹不会像预期的那样移动。
pygame.init()
backgroundImg = pygame.image.load("Spacepic.jpg")
windowScreen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Space Invaders Remake")
topIcon = pygame.image.load("space-ship (2).png")
pygame.display.set_icon(topIcon)
score_num = 0
font = pygame.font.Font("freesansbold.ttf", 32)
textX = 10
textY = 10
playerImg = pygame.image.load("space-invaders.png")
playerX = 370
playerY = 480
playerX_change = 0
# Enemy
enemyImg = []
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies = 30
initial_num_of_enemies = 6
# Bullet
bulletImg = pygame.image.load("bullet.png")
bulletX = 0
bulletY = 480
bulletY_change = 20
bullet_state = "ready"
lives = 3
end_lives = 0
for i in range(num_of_enemies):
enemyImg.append(pygame.image.load("ufo.png"))
enemyX.append(random.randint(0, 736))
enemyY.append(random.randint(0, 0))
enemyX_change.append(12)
enemyY_change.append(40)
num_of_enemies = initial_num_of_enemies
# Collision between bullet and spaceship
def isCollision():
distance = math.sqrt((math.pow(enemyX[i] - bulletX, 2)) + (math.pow(enemyY[i] - bulletY, 2)))
if distance < 25:
return True
else:
return False
# Fire bullet function
def bullet(x, y):
global bullet_state
bullet_state = "fire"
windowScreen.blit(bulletImg, (x + 15, y))
def show_score():
score = font.render("Score: " + str(score_num), True, (255, 255, 255))
windowScreen.blit(score, (textX, textY))
def show_score_to_win():
win_score = font.render("Score to win: 100", True, (255, 255, 255))
windowScreen.blit(win_score, (520, 10))
def you_win_msg():
win_text = font.render("You win, CONGRATULATIONS!", True, (255, 255, 255))
windowScreen.blit(win_text, (200, 250))
def game_over():
lose_text = font.render("You lose, GAME OVER!", True, (255, 255, 255))
windowScreen.blit(lose_text, (225, 250))
def player():
windowScreen.blit(playerImg, (playerX, playerY))
def enemy(x, y, i):
windowScreen.blit(enemyImg[i], (x, y))
def show_lives():
lives_display = font.render("Lives: " + str(lives), True, (255, 255, 255))
windowScreen.blit(lives_display, (10, 100))
rungame = True
while rungame:
windowScreen.fill((0, 0, 0))
windowScreen.blit(backgroundImg, (0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
rungame = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
playerX_change = -5
if event.key == pygame.K_RIGHT:
playerX_change = 5
# If bullet isn't already visible fire once spacebar pressed
if event.key == pygame.K_SPACE:
if bullet_state is "ready":
bulletX = playerX
bullet(bulletX, bulletY)
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
playerX_change = 0
playerX += playerX_change
if playerX <= 0:
playerX = 0
elif playerX >= 736:
playerX = 736
for i in range(num_of_enemies):
enemy(enemyX[i], enemyY[i], i)
enemyX[i] += enemyX_change[i]
if 0 <= score_num < 20:
if enemyX[i] <= 0:
enemyX_change[i] = 5
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] = -5
enemyY[i] += enemyY_change[i]
elif 20 <= score_num < 40:
if enemyX[i] <= 0:
enemyX_change[i] = 6
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] = -6
enemyY[i] += enemyY_change[i]
elif 40 <= score_num < 60:
if enemyX[i] <= 0:
enemyX_change[i] = 7
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] = -7
enemyY[i] += enemyY_change[i]
elif 60 <= score_num < 100:
if enemyX[i] <= 0:
enemyX_change[i] = 8.5
enemyY[i] += enemyY_change[i]
elif enemyX[i] >= 736:
enemyX_change[i] = -8.5
enemyY[i] += enemyY_change[i]
# If collision occurs bullet resets to starting position
collision = isCollision()
if collision:
bulletY = 480
bullet_state = "ready"
score_num += 1
enemyX[i] = random.randint(0, 736)
enemyY[i] = random.randint(0, 0)
if 20 <= score_num < 40:
num_of_enemies = 10
elif 40 <= score_num < 60:
num_of_enemies = 15
elif 60 <= score_num < 100:
num_of_enemies = 20
elif score_num == 100:
for j in range(num_of_enemies):
enemyY[j] = 1000
you_win_msg()
break
if lives >= end_lives:
if 435 < enemyY[i] < 900:
enemyY[i] = 1000
lives -= 1
if score_num > 0:
score_num -= 1
if lives == end_lives:
for j in range(num_of_enemies):
enemyY[j] = 1000
game_over()
# Bullet movement
if bulletY <= 0:
bulletY = 480
bullet_state = "ready"
if bullet_state is "fire":
bullet(bulletX, bulletY)
bulletY -= 100
player()
show_score()
show_score_to_win()
show_lives()
pygame.display.update()