Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';在pygame中不能生成多个敌人_Python_Python 3.x_Pygame - Fatal编程技术网

Python Can';在pygame中不能生成多个敌人

Python Can';在pygame中不能生成多个敌人,python,python-3.x,pygame,Python,Python 3.x,Pygame,我试图在我的游戏中添加多个敌人,但即使我已经输入了这样做的代码,也只显示了一个敌人。我试图调试以查找任何错误,但找不到任何错误 import random import math import pygame # initialise pygame pygame.init() # player 1 playerimage = pygame.image.load("Main Player.png") playerX = 365 playerY = 700 playerX_change = 0

我试图在我的游戏中添加多个敌人,但即使我已经输入了这样做的代码,也只显示了一个敌人。我试图调试以查找任何错误,但找不到任何错误

import random
import math
import pygame

# initialise pygame
pygame.init()

# player 1
playerimage = pygame.image.load("Main Player.png")
playerX = 365
playerY = 700
playerX_change = 0

# laser
# ready - bullet not on screen
# fire - bullet is shown on screen and is moving
laserimage = pygame.image.load("laser.png")
laserX = 0
laserY = 700
laserY_change = 10
laser_currentstate = "ready"

# alien player / random movement = random.randint()
alienimage = []
alienX = []
alienY = []
alienX_change = []
alienY_change = []
amount_aliens = 3
我尝试过制造多个外星人,但代码也不起作用

for i in range(amount_aliens):
    alienimage.append(pygame.image.load('alien.png'))
    alienX.append(random.randint(0, 735))
    alienY.append(random.randint(50, 200))
    alienX_change.append(4)
    alienY_change.append(7)

score = 0


# define player
def main_player(x, y):
    screen.blit(playerimage, (x, y))


# define laster
def fire_laser(x, y):
    global laser_currentstate
    laser_currentstate = "fire"
    screen.blit(laserimage, (x + 16, y + 10))


# define alien
def alien(x, y, i):
    screen.blit(alienimage[i], (x, y))


# collision detection
def hascollision(alienX, alienY, laserX, laserY):
    distance = math.sqrt((math.pow(alienX - laserX, 2)) + (math.pow(alienY - laserY, 2)))
    if distance < 27:
        return True
    else:
        return False


# background
background = pygame.image.load('stars.png')

# display and screen title/icon
(width, height) = (800, 800)
screen = pygame.display.set_mode((width, height))
flip = pygame.display.flip()
pygame.display.set_caption("space fighters")
pygame.event.get()
icon = pygame.image.load('logo.png')
pygame.display.set_icon(icon)

from sys import exit

# loop of functions
executed = True
while executed:
    screen.fill((63, 62, 63))
    # image background
    screen.blit(background, (0, 0))
    for event in pygame.event.get():
        # if key pressed, check which input, right or left?
        if event.type == pygame.KEYDOWN:
            print("key pressed")
            if event.key == pygame.K_a:
                playerX_change = -6
            if event.key == pygame.K_s:
                playerX_change = 6
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a or event.key == pygame.K_s:
                playerX_change = 0
            if event.key == pygame.K_SPACE:
                if laser_currentstate is "ready":
                    laserX = playerX
                fire_laser(laserX, laserY)

    # bounrary algorithm, prevents player moving out/enemy.
    playerX += playerX_change

    if playerX <= 0:
        playerX = 0
    elif playerX >= 736:
        playerX = 736

    # boundry algorithm, make sure alien doesn't go out of bountry
    for i in range(amount_aliens):
        alienX[i] += alienX_change[i]
        if alienX[i] <= 0:
            alienX_change[i] = 4
            alienY[i] += alienY_change[i]
        elif alienX[i] >= 736:
            alienX_change[i] = -4
            alienY[i] += alienY_change[i]

    # collision
    collision = hascollision(alienX[i], alienY[i], laserX, laserY)
    if collision:
        laserY = 650
        laser_currentstate = "ready"
        score += 5
        print(score)
        alienX[i] = random.randint(0, 735)
        alienY[i] = random.randint(50, 200)

    alien(alienX[i], alienY[i], i)

    # movement of laser shot
    if laserY <= 0:
        laserY = 650
        laser_currentstate = "ready"

    if laser_currentstate is "fire":
        fire_laser(laserX, laserY)
        laserY -= laserY_change

    # updates screen to show screen
    main_player(playerX, playerY)
    pygame.display.update()
pygame.quit()
适用于范围内的i(金额):
alienimage.append(pygame.image.load('alien.png'))
alienX.append(random.randint(0735))
alienY.append(random.randint(50200))
alienX_变更追加(4)
alienY_change.append(7)
分数=0
#定义玩家
def主_播放器(x,y):
屏幕光点(播放图像,(x,y))
#定义laster
def fire_激光器(x,y):
全局激光电流状态
激光器\u currentstate=“点火”
屏幕光点(激光图像,(x+16,y+10))
#定义外国人
def外星人(x,y,i):
屏幕blit(alienimage[i],(x,y))
#碰撞检测
def hascollision(alienX、alienY、laserX、laserY):
距离=math.sqrt((math.pow(alienX-laserX,2))+(math.pow(alienY-laserY,2)))
如果距离小于27:
返回真值
其他:
返回错误
#背景
background=pygame.image.load('stars.png')
#显示和屏幕标题/图标
(宽度、高度)=(800800)
screen=pygame.display.set_模式((宽度、高度))
flip=pygame.display.flip()
pygame.display.set_标题(“太空战斗机”)
pygame.event.get()
icon=pygame.image.load('logo.png')
pygame.display.set_图标(图标)
从系统导入退出
#函数循环
已执行=真
执行时:
屏幕填充((63、62、63))
#图像背景
屏幕光点(背景,(0,0))
对于pygame.event.get()中的事件:
#如果按下该键,请检查哪个输入,右侧还是左侧?
如果event.type==pygame.KEYDOWN:
打印(“按键”)
如果event.key==pygame.K_a:
playerX_change=-6
如果event.key==pygame.K_:
playerX_change=6
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_a或event.key==pygame.K_s:
playerX_change=0
如果event.key==pygame.K_空间:
如果激光器当前状态为“就绪”:
laserX=playerX
fire_激光器(laserX、laserY)
#Bounrry算法,防止玩家移出/敌人。
playerX+=playerX\u更改
如果playerX=736:
playerX=736
#boundry算法,确保外星人不会离开bountry
对于范围内的i(金额):
alienX[i]+=alienX_变化[i]
如果alienX[i]=736:
alienX_变化[i]=-4
alienY[i]+=alienY_变化[i]
#碰撞
collision=hascollision(alienX[i],alienY[i],laserX,laserY)
如果发生碰撞:
激光功率=650
激光器\u currentstate=“就绪”
分数+=5
打印(分数)
alienX[i]=random.randint(0735)
alienY[i]=random.randint(50200)
外星人(alienX[i],alienY[i],i)
#激光丸的运动

如果激光的问题是,你只需要打电话

 alien(alienX[i], alienY[i], i)
一次,你应该为你的每一个外星人调用一次(因此在你的
for
循环中)

这是一个问题

碰撞检测和
外星人(alienX[i],alienY[i],i)
必须在for循环中完成,该循环迭代所有外星人:

executed=True
执行时:
# [...]
#boundry算法,确保外星人不会离开bountry
对于范围内的i(金额):
alienX[i]+=alienX_变化[i]
如果alienX[i]=736:
alienX_变化[i]=-4
alienY[i]+=alienY_变化[i]
#缩进!!!
#碰撞
collision=hascollision(alienX[i],alienY[i],laserX,laserY)
如果发生碰撞:
激光功率=650
激光器\u currentstate=“就绪”
分数+=5
打印(分数)
alienX[i]=random.randint(0735)
alienY[i]=random.randint(50200)
外星人(alienX[i],alienY[i],i)

。整个激光外星碰撞和这条线应该缩进到
for
循环中。非常感谢!我有一种感觉,我会错过一些小东西。有一种东西叫做OOP。查看
关键字。您可以使用它改进代码。当然,这与你的问题无关。不要使用并行列表,这是一种设计反模式。使用dict列表(每个dict保存一个给定外星生物的图像、x、y等值)。当您开始学习OO时,它还将使您更容易从简单的dict移动到真正的“外来”对象。