当前位置: 首页 > 知识库问答 >
问题:

值错误:< __main__。0x07BFE2F8 >处的敌人对象不在列表中

欧博简
2023-03-14

我试图用pygame制作宇宙飞船游戏。只是一个简单的游戏,什么战舰发射子弹和冲撞敌人。但当我玩我的游戏时,在6或7次碰撞后,我会出现以下错误。

import pygame
import random
import time

WIDTH, HEIGHT = (750, 600)

WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Space İnvader Game")
BG_IMAGE = pygame.transform.scale(pygame.image.load("yeni_resim.jpg"), (WIDTH, HEIGHT))
CAPTION_IMAGE = pygame.image.load("spaceship.png")
ENEMY_IMAGE = pygame.image.load("enemy.png")
BULLET_IMAGE = pygame.image.load("bullet.png")
PLAYER_IMAGE = pygame.image.load("warship.png")

创建项目符号类

class Bullet:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.img = BULLET_IMAGE
        self.mask = pygame.mask.from_surface(self.img)
        self.vel = 8
        self.hitbox = (self.x, self.y, 32,32)

    def draw(self, window):
        window.blit(self.img, (self.x, self.y))
        self.hitbox = (self.x, self.y, 32, 32)
        pygame.draw.rect(window,(0,0,255),self.hitbox,2)

    def get_width(self):
        return self.img.get_width()

    def get_height(self):
        return self.img.get_height()

    def collide(self, obj1, obj2):
        self.offset_x = obj2.x - obj1.x
        self.offset_y = obj2.y - obj1.y
        return obj1.mask.overlap(obj2.mask , (self.offset_x, self.offset_y)) != None

class Ship:
    def __init__(self, x, y,width,height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.ship_img = None


    def draw(self, window):
        window.blit(self.ship_img, (self.x, self.y))


    def get_width(self):
        return self.ship_img.get_width()

    def get_height(self):
        return self.ship_img.get_height()


class Player(Ship):

    def __init__(self, x, y,width,height):
        super().__init__(x, y,width,height)
        self.ship_img = PLAYER_IMAGE
        self.mask = pygame.mask.from_surface(self.ship_img)
        self.hitbox = (self.x, self.y, 64, 64)

    def draw(self, window):
        super().draw(window)
        self.hitbox = (self.x , self.y , 64, 64)
        pygame.draw.rect(window, (0, 0, 255), self.hitbox, 2)

创建敌人类并定义碰撞定义

class Enemy():

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.ship_img = ENEMY_IMAGE
        self.mask = pygame.mask.from_surface(self.ship_img)
        self.enemy_vel = 4
        self.hitbox = (self.x, self.y, 64, 64)

    def draw(self, window):
        self.hitbox = (self.x, self.y, 64, 64)
        window.blit(self.ship_img,(self.x, self.y))
        pygame.draw.rect(window, (255,0,0),self.hitbox,2)

    def move(self,x,y):
        self.x = x
        self.y = y
        self.x += self.enemy_vel
        if self.x >= 686 or self.x <= 0:
            self.enemy_vel *= -1
            self.y += 5

    def get_width(self):
        return self.ship_img.get_width()
    def get_height(self):
        return self.ship_img.get_height()

    def hit(self):
        print("Hit")

    def collide(self,obj1, obj2):
        self.offset_x = obj2.x - obj1.x
        self.offset_y = obj2.y - obj1.y
        return obj1.mask.overlap(obj2.mask , (self.offset_x, self.offset_y)) != None




def main():
    run = True
    FPS = 60
    clock = pygame.time.Clock()
    bullets = []
    enemies = []
    player = Player(350, 500,64,64)
    player_vel = 8
    enemy_vel = 3




    def redraw_window():
        WIN.blit(BG_IMAGE,(0,0))
        player.draw(WIN)
        for bullet in bullets:
            bullet.draw(WIN)
        for enemy in enemies:
            enemy.draw(WIN)
        pygame.display.update()

在for敌人循环中调用冲突定义

    while run:
        clock.tick(FPS)
        redraw_window()


        if len(enemies) < 8:
            enemies.append(Enemy(random.randint(0, 600), random.randint(0,200)))

        for enemy in enemies:
            enemy.move(enemy.x, enemy.y)
            for bullet in bullets:
                if bullet.collide(enemy,bullet):
                    enemies.pop(enemies.index(enemy))
                    bullets.pop(bullets.index(bullet))




        for bullet in bullets:
            if bullet.y < 600 and bullet.y > 0:
                bullet.y -= bullet.vel
            else:
                bullets.pop(bullets.index(bullet))


        keys = pygame.key.get_pressed()
        if keys[pygame.K_RIGHT] and player.x + player_vel + player.get_width() < WIDTH:
            player.x += player_vel
        if keys[pygame.K_LEFT] and player.x - player_vel > 0:
            player.x -= player_vel
        if keys[pygame.K_SPACE]:
            if len(bullets) < 10:
                bullets.append(Bullet(round(player.x + 17),round(player.y)))



        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False


main()

然后在6或7次碰撞后取这个误差

C:\Users\191119\AppData\Local\Programs\Python\Python38-32\python.exe "C:/Users/191119/PycharmProjects/Pygame Projects2/AIGAMES.py"
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "C:/Users/191119/PycharmProjects/Pygame Projects2/AIGAMES.py", line 180, in <module>
    main()
  File "C:/Users/191119/PycharmProjects/Pygame Projects2/AIGAMES.py", line 151, in main
    enemies.pop(enemies.index(enemy))
ValueError: <__main__.Enemy object at 0x07527868> is not in list

共有1个答案

邴宏大
2023-03-14

这是你的问题:

        for enemy in enemies:
            enemy.move(enemy.x, enemy.y)
            for bullet in bullets:
                if bullet.collide(enemy,bullet):
                    enemies.pop(enemies.index(enemy))
                    bullets.pop(bullets.index(bullet))

您正在遍历列表并从列表中删除元素,而您仍在遍历它们。这不是您被允许做的事情。

尝试遍历列表的副本并从原始列表中删除。如下所示:

        for enemy in enemies.copy():
            enemy.move(enemy.x, enemy.y)
            for bullet in bullets.copy():
                if bullet.collide(enemy,bullet):
                    enemies.pop(enemies.index(enemy))
                    bullets.pop(bullets.index(bullet))

另一方面,我不清楚您为什么要进行这种操作:

    bullets.pop(bullets.index(bullet))

而不是像这样使用VD()

    bullets.remove(bullet)
 类似资料:
  • 我有以下列表,里面是另一个列表,然后是字符串列表 <代码>列表 示例 除了执行嵌套循环并最终替换列表之外,还有更好的方法吗?也许有溪流?

  • 没多久,绝影干脆在学校外面租了房子自己搬了出去。 超薄早在上上学期就在外面租了房子,本来超薄话不多,看起来又热爱学习,大家都以为他是个老实人,根本没想到他居然是寝室第一个谈恋爱的,更没想到他居然会租房子同居。上学期王江也出去租了房子,他有足够的理由:要搞音乐,搞乐队,还要搞平面设计,比如搞音乐的搞设计的标志是什么?当然是有一家属于自己的工作室。――所以租间房子作工作室是很让人信服的。 绝影也想出去

  • 我在Python27的这个小代码内容中遇到了这个错误。有人能帮我吗?提前谢谢。 运行时错误回溯(上次调用):文件“5EB4481881D651D6ECE1C375C80F5E509.py”,第57行,在print len(arr)TypeError中:“list”对象不可调用

  • 我有两个对象列表,它们在两个列表中都有重复名称。我需要从清单2中删除清单1中的所有重复值。 下面是一个场景,类有名称变量,用这个变量需要检查清单1中的重复值并需要删除。 //这是具有3个对象的第一个列表 清单1大小为1 请建议我在Java8与流。

  • 最近我遇到了一个问题,ArrayList中充满了对象 而每个 Item 对象都有自己的属性,如或整数。在我的图形界面中,我希望JComboBox仅填充 ArrayList中每个对象的名称值。 中的对象是在我的程序运行时添加的,它一开始没有值。将新项目添加到我的数组列表后,我调用 但这只给我一些类似的东西。有没有可能只显示ComboBox中ArrayList中每个项目的值?

  • 问题内容: 我有一个可能具有或不具有相同属性值的对象的列表/集合。获得具有相同属性的对象的不同列表的最简单方法是什么?一种收集类型最适合此目的吗?例如,在C#中,我可以使用LINQ执行以下操作。 我最初的想法是使用lambdaj(链接文本),但似乎不支持此功能。 问题答案: 使用接口的实现(类T可能需要自定义方法,您可能必须自己实现)。通常,a 是开箱即用的:它使用和方法比较对象。对于简单的对象,