Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 为什么下降的矩形随着时间的推移变得越来越多?_Python_Pygame - Fatal编程技术网

Python 为什么下降的矩形随着时间的推移变得越来越多?

Python 为什么下降的矩形随着时间的推移变得越来越多?,python,pygame,Python,Pygame,我不熟悉这个游戏。 我写了一个简单的游戏,避免矩形掉落。但我发现,随着时间的推移,下降的矩形越来越多,一些矩形不能让pygame.sprite.spritecollideny在遇到玩家时产生。我的代码中有任何错误吗 这是我的密码 import pygame import random from pygame.locals import * FPS = 25 fpsclock = pygame.time.Clock() #define the player class Player(pygam

我不熟悉这个游戏。 我写了一个简单的游戏,避免矩形掉落。但我发现,随着时间的推移,下降的矩形越来越多,一些矩形不能让
pygame.sprite.spritecollideny
在遇到玩家时产生。我的代码中有任何错误吗

这是我的密码

import pygame
import random
from pygame.locals import *

FPS = 25
fpsclock = pygame.time.Clock()

#define the player
class Player(pygame.sprite.Sprite):
    def __init__(self):
          super(Player, self).__init__()
          self.surf = pygame.Surface((30, 30))
          self.surf.fill((123, 123, 123))
          self.rect = self.surf.get_rect()
          self.rect.y = 550
          self.rect.x = 175

    def update(self, pressed_keys):
        """
        if pressed_keys[K_UP]:
            self.rect.move_ip(0, -5)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0, 5)
        """
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-5, 0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(5, 0)

        #keep player on the screen
        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > 400:
            self.rect.right = 400

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.surf = pygame.Surface((20, 20))
        self.surf.fill((255, 255, 255))
        self.rect = self.surf.get_rect(center = (random.randint(0, 400), 0))
        self.speed = random.randint(5, 10)

    def update(self):
        self.rect.move_ip(0, self.speed)
        if self.rect.bottom < 0:
            self.kill()

class Game():
    def __init__(self):
        #initialization
        pygame.init()

        #create the screen object
        self.screen = pygame.display.set_mode((400, 600))

        #instantiate the player
        self.player = Player()
        self.score = 0

        #create enemies
        self.ADDENEMY = pygame.USEREVENT + 2
        pygame.time.set_timer(self.ADDENEMY, 250)

        self.enemies = pygame.sprite.Group()
        self.all_sprites = pygame.sprite.Group()
        self.all_sprites.add(self.player)

    def run(self):
        running = True

        #main loop
        while running:
            for event in pygame.event.get():
                if event.type == KEYDOWN:
                    if event.key == K_ESCAPE:
                        running = False
                elif event.type == QUIT:
                    running = False
                elif (event.type == self.ADDENEMY):
                    new_enemy = Enemy()
                    self.enemies.add(new_enemy)
                    self.score = self.score + 1
                    self.all_sprites.add(new_enemy)

            pressed_keys = pygame.key.get_pressed()
            self.player.update(pressed_keys)
            self.enemies.update()
            self.screen.fill((0,0,0))
            #draw the player to the screen
            for entity in self.all_sprites:
                self.screen.blit(entity.surf, entity.rect)
            if pygame.sprite.spritecollideany(self.player, self.enemies):
                print 'score: ' + str(self.score)
                self.score = 0

            screen_image = pygame.surfarray.array3d(pygame.display.get_surface())        
            #update the display
            pygame.display.update()
            #fpsclock.tick(FPS)
        #return reward, screen_image

game = Game()
game.run()
导入pygame
随机输入
从pygame.locals导入*
FPS=25
fpscall=pygame.time.Clock()
#定义玩家
职业玩家(pygame.sprite.sprite):
定义初始化(自):
超级(玩家,自我)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
self.surf=pygame.Surface((30,30))
自冲浪填充((123123123))
self.rect=self.surf.get_rect()
自校正y=550
self.rect.x=175
def更新(自我,按下_键):
"""
如果按下[K\U UP]键:
自校正移动ip(0,-5)
如果按下按键[K向下]:
自校正移动ip(0,5)
"""
如果按[左]键[左]:
自校正移动ip(-5,0)
如果按下按键[K_RIGHT]:
自校正移动ip(5,0)
#让玩家保持在屏幕上
如果self.rect.left<0:
self.rect.left=0
如果self.rect.right>400:
self.rect.right=400
职业敌人(pygame.sprite.sprite):
定义初始化(自):
超级(敌人,自己)。\uuuuu init\uuuuuuu()
self.surf=pygame.Surface((20,20))
self.surf.fill((255,255,255))
self.rect=self.surf.get_rect(中心=(random.randint(0400),0))
self.speed=random.randint(5,10)
def更新(自我):
自校正移动ip(0,自校正速度)
如果self.rect.bottom<0:
self.kill()
类游戏():
定义初始化(自):
#初始化
pygame.init()
#创建屏幕对象
self.screen=pygame.display.set_模式((400600))
#实例化播放器
self.player=player()
self.score=0
#树敌
self.ADDENEMY=pygame.USEREVENT+2
pygame.time.set_定时器(self.ADDENEMY,250)
self.friends=pygame.sprite.Group()
self.all_sprites=pygame.sprite.Group()
self.all_精灵添加(self.player)
def运行(自):
运行=真
#主回路
运行时:
对于pygame.event.get()中的事件:
如果event.type==KEYDOWN:
如果event.key==K_转义:
运行=错误
elif event.type==退出:
运行=错误
elif(event.type==self.ADDENEMY):
新敌人
自我。敌人。添加(新敌人)
self.score=self.score+1
自我。所有精灵。添加(新敌人)
按下按键=pygame.key.get_pressed()
self.player.update(按_键)
self.friends.update()
自我筛选填充((0,0,0))
#将玩家拉到屏幕上
对于self.all_精灵中的实体:
self.screen.blit(entity.surf、entity.rect)
如果pygame.sprite.spriteany(self.player,self.敌人):
打印“分数:”+str(自我分数)
self.score=0
screen\u image=pygame.surfarray.array3d(pygame.display.get\u surface())
#更新显示
pygame.display.update()
#fpsclock.tick(FPS)
#返回奖励,屏幕图片
游戏
game.run()

运行代码大约五分钟后,错误出现。

当敌人的精灵穿过屏幕底部而不是顶部时,你必须杀死他们(y=0是屏幕顶部,y=600是底部):

编辑:要杀死碰撞的精灵,请使用
spritecollideany
返回的值,该值可以是
None
或碰撞的精灵:

collided_sprite = pygame.sprite.spritecollideany(self.player, self.enemies)
if collided_sprite is not None:
    print('score:', self.score)
    self.score = 0
    collided_sprite.kill()

请注意,每帧仅删除一个精灵。如果您想同时删除多个精灵,最好使用
True
并将其作为
dokill
参数传递。

非常感谢。对不起,我怎样才能杀死击中玩家的长方形呢?我已经编辑了答案,尽管这属于另一个问题,你可能会找到很多关于这个主题的其他帖子。事实上,这似乎是以前没有人问过的。也许我应该自己问和回答这个问题。
collided_sprite = pygame.sprite.spritecollideany(self.player, self.enemies)
if collided_sprite is not None:
    print('score:', self.score)
    self.score = 0
    collided_sprite.kill()