鱼C论坛

 找回密码
 立即注册
查看: 1048|回复: 1

这个接水果小游戏代码为什么out of memory 了啊

[复制链接]
发表于 2021-12-24 13:53:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
正在一点一点测试代码,在只包含PLAYER的类的时候的运行是没问题的,能够实现人物的左右移动和行走的效果,然后添加了掉落物的设置,总是显示pygame.error: Out of memory,而导入的图片和音乐真的都很小很小,才70宽,现在大脑实在转不过来了 ,有大佬可以帮忙看一下吗
import random,pygame,sys
import time
from pygame.locals import *
#定义玩家的类
class PLAYER(pygame.sprite.Sprite):
    def __init__(self,WIDTH,HEIGHT):
        pygame.sprite.Sprite.__init__(self)
        #导入玩家图片用于设置行走动画
        self.PLAYER_walk=[pygame.image.load(r'PLAYER_stand.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk1.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk2.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk3.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk4.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk5.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk6.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk7.png').convert_alpha(),
                       pygame.image.load(r'PLAYER_walk8.png').convert_alpha()]
        将图片相关信息存入字典,键left和right分别对应导入图片的2~5、6~9张,-1和1代表方向
        self.data_walk={'left':[[1,2,3,4],-1],'right':[[5,6,7,8],1]}
        self.x,self.y=WIDTH/2,HEIGHT*3/4
        self.speed=1
        self.frame=-1
        self.direction='left'
        self.life=100
        self.move()
    def move(self,direction='left'):
        #默认方向向左,当键盘按下的方向与人物当前方向不同时,调整人物方向为键盘按下方向,而后增加frame值来转换人物运动状态图片
        if self.direction!=direction:
            self.direction=direction
        else:
            self.frame+=1
#使人物移动
        self.x+=self.speed*self.data_walk[self.direction][1]
#调整人物移动时的状态造成行走的效果
       self.image=self.LYW_walk[self.data_walk[self.direction][0][self.frame%4]]
        self.rect=self.image.get_rect(topleft=(self.x,self.y))
        #避免走出界面
        self.rect.left=0 if self.rect.left<0 else self.rect.x
        self.rect.right=WIDTH if self.rect.right>WIDTH else self.rect.x
    def draw(self,DISPLAYSURF):
        DISPLAYSURF.blit(self.image,self.rect)

#定义掉落物的类
class Drop(pygame.sprite.Sprite):
    def __init__(self,WIDTH,HEIGHT):
        pygame.sprite.Sprite.__init__(self)
        self.type=[pygame.image.load(r'fish.png').convert_alpha(),
                   pygame.image.load(r'fox.png').convert_alpha(),
                   pygame.image.load(r'horse.png').convert_alpha(),
                   pygame.image.load(r'squirrel.png').convert_alpha(),
                   pygame.image.load(r'rabbit.png').convert_alpha(),
                   pygame.image.load(r'bear.png').convert_alpha()]
        self.kind=random.randint(0,5)
        #随机生成以上6种掉落物
        self.image=self.type[self.kind]
       #如果掉落物是第一种,即self.kind=0,就算基础分为1,其他的掉落物基础分都为-2
        self.basevalue=1 if self.kind==0 else -2
       #设置奖励分为0
        self.awardvalue=0
        #先默认每个掉落物的分值为基础分
        self.value=self.basevalue
        self.speed=3
        self.rect=self.image.get_rect()
        self.x=random.randint(0,WIDTH-self.rect.width)#掉落物的横坐标随意位置,但是不出界
        self.y=0
        self.rect.left,self.rect.top=self.x,self.y
        #设置字典存储掉落物的次序和种类,即键为第i个掉落,值为第i个掉落物的类型,先默认第0个掉落物是fish
        self.drops={0:'fish'}
    def move(self):
        self.y+=self.speed
        self.rect.top=self.y
    #设置掉落物的分值
    def value_set(self,player):
        #drop_get是代表接到的掉落物的个数,先默认为0
        drop_get=0
        if pygame.sprite.collide_rect(self,player):#如果掉落物和玩家碰到
            drop_get+=1#接到掉落物的个数加1
            self.drops.update({drop_get:self.kind})#把接到的这个掉落物的次数和类型存到字典里
            if drop_get==1:#当第一次接到掉落物时,设奖励分为基础分值,即fish为1分,其他为-2分
                self.awardvalue=self.basevalue
            else:#如果不是第一次接到,判断这一次接到的掉落物和上一次的是不是一样
                if self.drops[drop_get-1]!=self.drops[drop_get]:#如果不一样的话,就重置drop_get为0,下一轮重新开始判断
                    drop_get=0
                else:#如果一样的话,奖励分就这样计算,然后最后每次接到的掉落物的分值就设置为此
                    self.awardvalue=self.awardvalue*drop_get
            self.value=self.awardvalue
        #如果连续9次接到同一种掉落物,生命值发生改变,实际上为如果接到fish,生命值就加10%,如果接到其他的,生命值就减20%
        if drop_get%9==0:
            player.life+=self.awardvalue*10
    def draw(self,DISPLAYSURF):
        DISPLAYSURF.blit(self.image,self.rect)



FPS=30
WIDTH=800
HEIGHT=600
WHITE=(255,255,255)
RED=(255,0,0)
BLICK=(0,0,0)
#设置掉落物的初始个数为0个
drop_count=0
def main():
    global drop_count
    pygame.init()
    FPSCLOCK=pygame.time.Clock()
    DISPLAYSURF=pygame.display.set_mode((WIDTH,HEIGHT))
    pygame.display.set_caption('game1')
    image_background1=pygame.image.load(r'image_background1.png')
    rect_background1=image_background1.get_rect(topleft=(0,0))
    rect_background1.width,rect_background1.height=WIDTH,HEIGHT
    pygame.mixer.music.load('music_background.mid')
    pygame.mixer.music.set_volume(0.2)
    pygame.mixer.music.play(-1)
    music_get=pygame.mixer.Sound('music_get.wav')
    music_get.set_volume(0.3)
    music_antiget=pygame.mixer.Sound('music_antiget.wav')
    music_antiget.set_volume(0.3)
    player=LYW(WIDTH,HEIGHT)
    dropGroup=pygame.sprite.Group()
    score=0
    pygame.key.set_repeat(10)
    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type==KEYDOWN:
                if event.key==pygame.K_LEFT or event.type==pygame.K_a:
                    direction='left'
                    player.move(direction)
                elif event.key==pygame.K_RIGHT or event.type==pygame.K_d:
                    direction='right'
                    player.move(direction)
            DISPLAYSURF.fill(WHITE)
            DISPLAYSURF.blit(image_background1,rect_background1)
            player.draw(DISPLAYSURF)
        while drop_count>=0:#当掉落物个数不为负数时,每次掉落物个数都加1
            drop_count+=1
            drop=Drop(WIDTH,HEIGHT)
            dropGroup.add(drop)
            drop.value_set(player)
            for drop in dropGroup:
                drop.move()
                if pygame.sprite.collide_rect(drop,player):
                    score+=drop.value
                    if drop.kind==0:
                        music_get.play(1)
                    else:
                        music_antiget.play(1)
                    dropGroup.remove(drop)
                if drop.rect.top>HEIGHT:
                    dropGroup.remove(drop)
                    music_antiget.play(1)
                    continue
                drop.draw(DISPLAYSURF)
            if player.life<0 or score>304:
                DISPLAYSURF.fill(WHITE)#游戏结束页面还没写,就用空白代替了
        pygame.display.flip()
        pygame.display.update()
        FPSCLOCK.tick(FPS)

if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-16 15:25:32 | 显示全部楼层
测试了好几次问题已经被解决了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表