【问题标题】:Pygame Space Invaders BugPygame 太空入侵者错误
【发布时间】:2020-07-22 23:53:19
【问题描述】:

'''这个太空侵略者代码有一个小错误,一开始一切都很好,直到突然间,主要是在游戏结束时,一些敌方飞船突然移动得非常快并且比其他敌人快得多,但走的路和其他人一样。下面:'''

import pygame
import random
import math
from pygame import mixer
# Initialize and create a Game Window
pygame.init()
screen = pygame.display.set_mode(size=(800,600))

#Caption and Icon
pygame.display.set_caption('Space Invaders')
icon = pygame.image.load('ufo.png')
pygame.display.set_icon(icon)

#Background
background = pygame.image.load('background.png')
#BackgroundSound
mixer.music.load('background.wav')
mixer.music.play(-1)

#Player
playerImg = pygame.image.load('player.png')
playerX=360
playerY=470
playerX_change = 0

#Enemy
enemyImg=[]
enemyX = []
enemyY = []
enemyX_change = []
enemyY_change = []
num_of_enemies=6
for i in range(num_of_enemies):
    enemyImg.append(pygame.image.load('enemy.png'))
    enemyX.append(random.randint(0,736))
    enemyY.append(random.randint(40,120))
    enemyX_change.append(4)
    enemyY_change.append(20)

#Bullet
bulletImg = pygame.image.load('bullet.png')
bulletX=0
bulletY=480
bulletX_change = 0
bulletY_change = -10
bulletstate = 'ready'  # Bullet is 'ready' if its ready to shoot and 'fire' means a bullet is fired
#Number of Bullets
no_of_bullets=0

#Score
score_value=0
Score_font = pygame.font.Font("freesansbold.ttf" , 32)
textX=10
textY=10
#Number of bullets
def Show_score(x,y):
    score=Score_font.render("Score: " + str(score_value) , True , (255,255,255))
    screen.blit(score , (x,y))   

def player(x,y):
    screen.blit(playerImg , (playerX , playerY))
    
def enemy(x, y, i):
    screen.blit(enemyImg[i] , (enemyX[i] , enemyY[i]))

def bullet_fire(x,y):
    global bulletstate
    bulletstate='fire'
    screen.blit(bulletImg ,(x+16 , y+10))
    
def Collision(bulletX , bulletY , enemyX , enemyY):
    distance=math.sqrt((math.pow(enemyX-bulletX,2)) + (math.pow(bulletY-enemyY,2)))
    if distance<29:
        return True
    else:
        return False 
def game_over():
    font1 = pygame.font.Font("BUBBLEGUMS.ttf" , 68)
    gameover=font1.render("GAME OVER "  , True , (255,255,255))
    screen.blit(gameover , (100,200))
def numberofbullets():
    font2=pygame.font.Font("blow.ttf",35)
    number_of_bullets=font2.render("Number of Bullets Shot: " + str(no_of_bullets) , True , (0,255,255))
    screen.blit(number_of_bullets , (170,375))
      

#Game Loop
running=True
while running:
    # BackgroundImage
    screen.blit(background ,(0,0))
    
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            
                       
    #Keystroke
        if event.type == pygame.KEYDOWN:
             
            if event.key ==pygame.K_LEFT:
                playerX_change -=6
                
            if event.key == pygame.K_RIGHT:
                playerX_change +=6
                
                
            if bulletstate=='ready':
                if event.key == pygame.K_SPACE:
                    no_of_bullets+=1
                    bulletX=playerX
                    bullet_fire(bulletX,bulletY)
                    bullet_sound = mixer.Sound('laser.wav')
                    bullet_sound.play()
        if event.type ==pygame.KEYUP:
            if event.key ==pygame.K_LEFT or event.key == pygame.K_RIGHT:
                playerX_change=0
                        
                            
  
    #Checking for Boundaries of Spaceship
    playerX +=playerX_change
    if playerX>=736:
        playerX=736
    elif playerX<=0:
        playerX=0 
    
    # Enemy Movement
    for i in range(num_of_enemies):
        if enemyY[i]>440:
            for j in range(num_of_enemies):
                enemyY[j]=2000
            game_over()
            numberofbullets()
            break
                
        
        enemyX[i] +=enemyX_change[i]
        if enemyX[i]>735:
            enemyX_change[i]+=-4  
            enemyY[i] +=enemyY_change[i]      
        elif enemyX[i]<0:
            enemyX_change[i]+=4
            enemyY[i] +=enemyY_change[i]
                
        #Collision
        collision = Collision(bulletX, bulletY, enemyX[i], enemyY[i])
        if collision:
            collision_sound = mixer.Sound('explosion.wav')
            collision_sound.play()
            bulletY=480
            bulletstate='ready'
            enemyX[i]=random.randint(0,800)
            enemyY[i]=random.randint(40,120)
            score_value+=100
            
        enemy(enemyX[i],enemyY[i] ,i)

    #Bullet Movement
    if bulletY<=0:
        bulletY=480
        bulletstate='ready'
                
        
    if bulletstate=='fire':
        bullet_fire(bulletX, bulletY)
        bulletY+=bulletY_change
            
       
    player(playerX,playerY)   
    Show_score(textX, textY)
    pygame.display.update()

【问题讨论】:

  • StackOverflow 不是为了让专家为您调试整个代码。随时欢迎您询问代码的特定部分,而不是整个程序。请看How to Ask
  • 我是这个网站的新手,所以我不知道这里的情况如何。谢谢

标签: pygame


【解决方案1】:

你的代码的问题是当你写这个时:

enemyX[i] +=enemyX_change[i]
    if enemyX[i]>735:
        enemyX_change[i]+=-4  
        enemyY[i] +=enemyY_change[i]      
    elif enemyX[i]<0:
        enemyX_change[i]+=4
        enemyY[i] +=enemyY_change[i]

每次敌人到达边缘时,enemyX_change[i] 应该设置为与之前相反的值,而不是通过加减 4,而是直接将其设置为 4 或 -4。另外你应该设置enemyX[i]在敌人到达左侧时为735,当敌人到达右侧时为0。

如果你用这个改变那段代码,一切都应该正常:

if enemyX[i]>735:
        enemyX[i] = 735
        enemyX_change[i] = -4  
        enemyY[i] +=enemyY_change[i]      
    elif enemyX[i]<0:
        enemyX[i] = 0
        enemyX_change[i] = 4
        enemyY[i] +=enemyY_change[i]

【讨论】:

  • 但是为什么只有部分敌舰有这个问题?其他的都很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多