鱼C论坛

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

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

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

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

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

x
正在一点一点测试代码,在只包含PLAYER的类的时候的运行是没问题的,能够实现人物的左右移动和行走的效果,然后添加了掉落物的设置,总是显示pygame.error: Out of memory,而导入的图片和音乐真的都很小很小,才70宽,现在大脑实在转不过来了 ,有大佬可以帮忙看一下吗

  1. import random,pygame,sys
  2. import time
  3. from pygame.locals import *
  4. #定义玩家的类
  5. class PLAYER(pygame.sprite.Sprite):
  6.     def __init__(self,WIDTH,HEIGHT):
  7.         pygame.sprite.Sprite.__init__(self)
  8.         #导入玩家图片用于设置行走动画
  9.         self.PLAYER_walk=[pygame.image.load(r'PLAYER_stand.png').convert_alpha(),
  10.                        pygame.image.load(r'PLAYER_walk1.png').convert_alpha(),
  11.                        pygame.image.load(r'PLAYER_walk2.png').convert_alpha(),
  12.                        pygame.image.load(r'PLAYER_walk3.png').convert_alpha(),
  13.                        pygame.image.load(r'PLAYER_walk4.png').convert_alpha(),
  14.                        pygame.image.load(r'PLAYER_walk5.png').convert_alpha(),
  15.                        pygame.image.load(r'PLAYER_walk6.png').convert_alpha(),
  16.                        pygame.image.load(r'PLAYER_walk7.png').convert_alpha(),
  17.                        pygame.image.load(r'PLAYER_walk8.png').convert_alpha()]
  18.         将图片相关信息存入字典,键left和right分别对应导入图片的2~5、6~9张,-1和1代表方向
  19.         self.data_walk={'left':[[1,2,3,4],-1],'right':[[5,6,7,8],1]}
  20.         self.x,self.y=WIDTH/2,HEIGHT*3/4
  21.         self.speed=1
  22.         self.frame=-1
  23.         self.direction='left'
  24.         self.life=100
  25.         self.move()
  26.     def move(self,direction='left'):
  27.         #默认方向向左,当键盘按下的方向与人物当前方向不同时,调整人物方向为键盘按下方向,而后增加frame值来转换人物运动状态图片
  28.         if self.direction!=direction:
  29.             self.direction=direction
  30.         else:
  31.             self.frame+=1
  32. #使人物移动
  33.         self.x+=self.speed*self.data_walk[self.direction][1]
  34. #调整人物移动时的状态造成行走的效果
  35.        self.image=self.LYW_walk[self.data_walk[self.direction][0][self.frame%4]]
  36.         self.rect=self.image.get_rect(topleft=(self.x,self.y))
  37.         #避免走出界面
  38.         self.rect.left=0 if self.rect.left<0 else self.rect.x
  39.         self.rect.right=WIDTH if self.rect.right>WIDTH else self.rect.x
  40.     def draw(self,DISPLAYSURF):
  41.         DISPLAYSURF.blit(self.image,self.rect)

  42. #定义掉落物的类
  43. class Drop(pygame.sprite.Sprite):
  44.     def __init__(self,WIDTH,HEIGHT):
  45.         pygame.sprite.Sprite.__init__(self)
  46.         self.type=[pygame.image.load(r'fish.png').convert_alpha(),
  47.                    pygame.image.load(r'fox.png').convert_alpha(),
  48.                    pygame.image.load(r'horse.png').convert_alpha(),
  49.                    pygame.image.load(r'squirrel.png').convert_alpha(),
  50.                    pygame.image.load(r'rabbit.png').convert_alpha(),
  51.                    pygame.image.load(r'bear.png').convert_alpha()]
  52.         self.kind=random.randint(0,5)
  53.         #随机生成以上6种掉落物
  54.         self.image=self.type[self.kind]
  55.        #如果掉落物是第一种,即self.kind=0,就算基础分为1,其他的掉落物基础分都为-2
  56.         self.basevalue=1 if self.kind==0 else -2
  57.        #设置奖励分为0
  58.         self.awardvalue=0
  59.         #先默认每个掉落物的分值为基础分
  60.         self.value=self.basevalue
  61.         self.speed=3
  62.         self.rect=self.image.get_rect()
  63.         self.x=random.randint(0,WIDTH-self.rect.width)#掉落物的横坐标随意位置,但是不出界
  64.         self.y=0
  65.         self.rect.left,self.rect.top=self.x,self.y
  66.         #设置字典存储掉落物的次序和种类,即键为第i个掉落,值为第i个掉落物的类型,先默认第0个掉落物是fish
  67.         self.drops={0:'fish'}
  68.     def move(self):
  69.         self.y+=self.speed
  70.         self.rect.top=self.y
  71.     #设置掉落物的分值
  72.     def value_set(self,player):
  73.         #drop_get是代表接到的掉落物的个数,先默认为0
  74.         drop_get=0
  75.         if pygame.sprite.collide_rect(self,player):#如果掉落物和玩家碰到
  76.             drop_get+=1#接到掉落物的个数加1
  77.             self.drops.update({drop_get:self.kind})#把接到的这个掉落物的次数和类型存到字典里
  78.             if drop_get==1:#当第一次接到掉落物时,设奖励分为基础分值,即fish为1分,其他为-2分
  79.                 self.awardvalue=self.basevalue
  80.             else:#如果不是第一次接到,判断这一次接到的掉落物和上一次的是不是一样
  81.                 if self.drops[drop_get-1]!=self.drops[drop_get]:#如果不一样的话,就重置drop_get为0,下一轮重新开始判断
  82.                     drop_get=0
  83.                 else:#如果一样的话,奖励分就这样计算,然后最后每次接到的掉落物的分值就设置为此
  84.                     self.awardvalue=self.awardvalue*drop_get
  85.             self.value=self.awardvalue
  86.         #如果连续9次接到同一种掉落物,生命值发生改变,实际上为如果接到fish,生命值就加10%,如果接到其他的,生命值就减20%
  87.         if drop_get%9==0:
  88.             player.life+=self.awardvalue*10
  89.     def draw(self,DISPLAYSURF):
  90.         DISPLAYSURF.blit(self.image,self.rect)



  91. FPS=30
  92. WIDTH=800
  93. HEIGHT=600
  94. WHITE=(255,255,255)
  95. RED=(255,0,0)
  96. BLICK=(0,0,0)
  97. #设置掉落物的初始个数为0个
  98. drop_count=0
  99. def main():
  100.     global drop_count
  101.     pygame.init()
  102.     FPSCLOCK=pygame.time.Clock()
  103.     DISPLAYSURF=pygame.display.set_mode((WIDTH,HEIGHT))
  104.     pygame.display.set_caption('game1')
  105.     image_background1=pygame.image.load(r'image_background1.png')
  106.     rect_background1=image_background1.get_rect(topleft=(0,0))
  107.     rect_background1.width,rect_background1.height=WIDTH,HEIGHT
  108.     pygame.mixer.music.load('music_background.mid')
  109.     pygame.mixer.music.set_volume(0.2)
  110.     pygame.mixer.music.play(-1)
  111.     music_get=pygame.mixer.Sound('music_get.wav')
  112.     music_get.set_volume(0.3)
  113.     music_antiget=pygame.mixer.Sound('music_antiget.wav')
  114.     music_antiget.set_volume(0.3)
  115.     player=LYW(WIDTH,HEIGHT)
  116.     dropGroup=pygame.sprite.Group()
  117.     score=0
  118.     pygame.key.set_repeat(10)
  119.     while True:
  120.         for event in pygame.event.get():
  121.             if event.type==pygame.QUIT:
  122.                 pygame.quit()
  123.                 sys.exit()
  124.             if event.type==KEYDOWN:
  125.                 if event.key==pygame.K_LEFT or event.type==pygame.K_a:
  126.                     direction='left'
  127.                     player.move(direction)
  128.                 elif event.key==pygame.K_RIGHT or event.type==pygame.K_d:
  129.                     direction='right'
  130.                     player.move(direction)
  131.             DISPLAYSURF.fill(WHITE)
  132.             DISPLAYSURF.blit(image_background1,rect_background1)
  133.             player.draw(DISPLAYSURF)
  134.         while drop_count>=0:#当掉落物个数不为负数时,每次掉落物个数都加1
  135.             drop_count+=1
  136.             drop=Drop(WIDTH,HEIGHT)
  137.             dropGroup.add(drop)
  138.             drop.value_set(player)
  139.             for drop in dropGroup:
  140.                 drop.move()
  141.                 if pygame.sprite.collide_rect(drop,player):
  142.                     score+=drop.value
  143.                     if drop.kind==0:
  144.                         music_get.play(1)
  145.                     else:
  146.                         music_antiget.play(1)
  147.                     dropGroup.remove(drop)
  148.                 if drop.rect.top>HEIGHT:
  149.                     dropGroup.remove(drop)
  150.                     music_antiget.play(1)
  151.                     continue
  152.                 drop.draw(DISPLAYSURF)
  153.             if player.life<0 or score>304:
  154.                 DISPLAYSURF.fill(WHITE)#游戏结束页面还没写,就用空白代替了
  155.         pygame.display.flip()
  156.         pygame.display.update()
  157.         FPSCLOCK.tick(FPS)

  158. if __name__ == '__main__':
  159.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-16 15:25:32 | 显示全部楼层
测试了好几次问题已经被解决了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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