浪矢秀一 2023-10-18 20:57 采纳率: 81.3%
浏览 10

pygame开发游戏时遇到的问题

前几天没什么事,用Python的Pygame写了个小游戏,但是今天出现了bug。
以下为我的代码:

import pygame
from pygame import *
from random import choice,randint
from sys import exit

class BackGround(sprite.Sprite):
    def __init__(self):
        global ww,wh
        super().__init__()
        self.image=Surface((ww,wh))
        self.image.fill((10,150,70))
        self.rect=self.image.get_rect()
        self.rect.x=0
        self.rect.y=0
class Player(sprite.Sprite):
    def __init__(self):
        global ww,wh
        super().__init__()
        self.image=Surface((50,50))
        self.image.fill((0,255,255))
        self.rect=self.image.get_rect()
        self.rect.center=((ww//2,wh//2))
class Number(sprite.Sprite):
    def __init__(self,s:str,x:int,y:int,index:int):
        super().__init__()
        self.image=font.Font(None,1000).render(s,True,(0,0,0),None)
        self.image=transform.scale(self.image,(50,100))
        self.rect=self.image.get_rect()
        self.rect.center=(x,y)
        self.index=index
        self.name=s
    def DeleteNumber(self):
        self.index-=1
    def Move(self):
        global ww, wh
        global NumberList, NumberCnt
        global AllSprites
        global Domain
        keys = key.get_pressed()
        if keys[K_a]:
            self.rect.x += 1
        elif keys[K_d]:
            self.rect.x -= 1
        elif keys[K_w]:
            self.rect.y += 1
        elif keys[K_s]:
            self.rect.y -= 1
        if self.rect.right < 0 - Domain or self.rect.left > ww + Domain or self.rect.bottom < 0 - Domain or self.rect.top > wh + Domain:
            AllSprites.remove(NumberList[self.index])
            NumberList.pop(self.index)
            NumberCnt -= 1
            if not self.index >= len(NumberList):
                for i in range(self.index, len(NumberList), 1):
                    NumberList[i].DeleteNumber()
    def Get(self):
        global P
        global AllSprites
        global NumberList,NumberCnt
        global PlayerThings
        if sprite.collide_rect(NumberList[self.index],P):
            keys=key.get_pressed()
            if keys[K_g]:
                PlayerThings[self.name]+=1
                AllSprites.remove(NumberList[self.index])
                del NumberList[self.index]
                NumberCnt -= 1
                if not self.index >= len(NumberList):
                    for i in range(self.index, len(NumberList), 1):
                        NumberList[i].DeleteNumber()
    def update(self):
        self.Move()
        self.Get()
init()
ww=1000
wh=600
scr=display.set_mode((ww,wh))
display.set_caption("数学之美")
AllSprites=sprite.Group()
BG=BackGround()
P=Player()
AllSprites.add(BG)
AllSprites.add(P)
scr.fill((0,0,0))
display.update()
fps=175
clock=time.Clock()
NumberList=list()
NumberCnt=0
FpsTime=0
Domain=150
MaxNumberCnt=7
PlayerThings=dict()
AllThings="11111111111111111111111112222223+-*/"
for i in "".join(list(set(list(AllThings)))):
    PlayerThings[i]=0
run=True
while run:
    scr.fill((0,0,0))
    for event in pygame.event.get():
        if event.type==QUIT:
            run=False
        if event.type==KEYDOWN:
            if event.key==K_ESCAPE:
                run=False
    if FpsTime/fps==3:
        FpsTime=0
        if NumberCnt<MaxNumberCnt:
            t=Number(choice(AllThings),randint(0-Domain,ww+Domain),randint(0-Domain,wh+Domain),len(NumberList))
            NumberList.append(t)
            AllSprites.add(t)
            NumberCnt+=1
    AllSprites.draw(scr)
    AllSprites.update()
    clock.tick(fps)
    display.update()
    FpsTime+=1
quit()
exit()

报错内容:

Traceback (most recent call last):
  File "C:\Users\浪矢秀一\Desktop\数学之美\main.py", line 113, in <module>
    AllSprites.update()
  File "C:\Users\浪矢秀一\Desktop\数学之美\venv\Script\Lib\site-packages\pygame\sprite.py", line 555, in update
    sprite.update(*args, **kwargs)
  File "C:\Users\浪矢秀一\Desktop\数学之美\main.py", line 72, in update
    self.Get()
  File "C:\Users\浪矢秀一\Desktop\数学之美\main.py", line 60, in Get
    if sprite.collide_rect(NumberList[self.index],P):
                           ~~~~~~~~~~^^^^^^^^^^^^
IndexError: list index out of range

Process finished with exit code 1

代码逻辑比较乱,自己也看不出什么来,可能是删除精灵时出现了问题,但个人感觉逻辑上没问题,不知道错在哪,希望大家指出,万分感谢。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-19 13:15
    关注

    【以下回答由 GPT 生成】

    这段代码中,有两个明显的问题会导致bug:

    1. 字体文件没有找到:代码中使用了font.Font(None, 1000)来创建字体,但是在这里的None表示默认字体,如果系统中没有默认字体,那么代码会无法找到合适的字体文件,进而导致异常。为了解决这个问题,我们可以手动指定一个字体文件,例如:
    self.image = pygame.font.Font('font.ttf', 1000).render(s, True, (0, 0, 0), None)
    
    1. 控制方向的按键逻辑错误:在Move函数中,按下不同的方向键,实际上只进行了一种移动操作。这是因为用了一系列的elif语句,每个elif都是独立的条件,只会选中第一个满足条件的。为了解决这个问题,我们可以将所有的移动操作放在独立的if语句中,这样每个按键都会独立生效,例如:
    if keys[K_a]:
        self.rect.x += 1
    if keys[K_d]:
        self.rect.x -= 1
    if keys[K_w]:
        self.rect.y += 1
    if keys[K_s]:
        self.rect.y -= 1
    

    如果解决了以上代码中的两个问题,应该能够修复这个bug。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 10月18日
  • 创建了问题 10月18日

悬赏问题

  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22