鱼C论坛

 找回密码
 立即注册
查看: 813|回复: 2

[已解决]pygame贪吃蛇问题(没错,又是我)

[复制链接]
发表于 2023-11-19 12:23:11 | 显示全部楼层 |阅读模式

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

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

x
#贪吃蛇.py
import pygame
import sys
from pygame.locals import *
import 金币
pygame.init()
size = width, height = 600, 400
bg = (255, 255, 255)
YELLOW = (255, 255, 0)
snake = (0, 255, 0)
fanxiang = 'right'
left = 300
top = 200
screen = pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇')
move = USEREVENT
pygame.time.set_timer(move, 1 * 1000)
money = USEREVENT + 1
pygame.time.set_timer(money, 5 * 1000)

Money = pygame.sprite.Group()

while True:
   
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == move:
            if fanxiang == 'left':
                left -= 11
            elif fanxiang == 'top':
                top -= 11
            elif fanxiang == 'right':
                left += 11
            elif fanxiang == 'bottom':
                top += 11
        #生成金币
        elif event.type == money:
            
            m = 金币.money()
            Money.add(m)
   
    key_pressed = pygame.key.get_pressed()
   
    #控制方向
    if key_pressed[K_w] or key_pressed[K_UP]:
        fanxiang = 'top'
    if key_pressed[K_s] or key_pressed[K_DOWN]:
        fanxiang = 'bottom'
    if key_pressed[K_d] or key_pressed[K_RIGHT]:
        fanxiang = 'right'
    if key_pressed[K_a] or key_pressed[K_LEFT]:
        fanxiang = 'left'

   
   
        

    screen.fill(bg)
    #金币机制
    for i in Money:
        pygame.draw.rect(screen, YELLOW, i.rect, 0)
        for x1 in range(-5, 5):
            ifanwei_x = x1 + i.width
            for x2 in range(-5, 5):
                sfanwei_x = x2 + left
                for x1 in range(-5, 5):
                    ifanwei_y = x1 + i.height
                    for x2 in range(-5, 5):
                        sfanwei_y = x2 + top
                        if ifanwei_x == sfanwei_x or ifanwei_y == sfanwei_y:
                            print('1')
                            Money.remove(i)
    #绘制贪吃蛇
    pygame.draw.rect(screen, snake, (left, top, 10, 10), 0)
    pygame.display.flip()
#金币.py
import pygame
import random
class money(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.width = random.randint(1, 600)
        self.height = random.randint(1, 400)
        self.rect = (self.width, self.height, 10, 10)
麻烦看一下为什么金币机制会出现bug,谢谢
最佳答案
2023-11-19 12:23:23
金币机制出现bug的原因在于金币的碰撞检测部分存在问题。在代码中,金币的碰撞检测部分使用了多层嵌套的for循环,但是逻辑有些混乱,并且判断条件也存在问题。

首先,金币的位置应该是由左上角坐标和宽高来确定,因此在金币类的初始化方法中,应该将self.rect定义为pygame.Rect对象,而不是一个元组。同时,金币的位置应该在屏幕范围内随机生成,而不是直接使用随机数。

其次,碰撞检测部分的逻辑也存在问题,for循环的嵌套和变量命名混乱,导致判断条件不正确。应该使用pygame.Rect对象的colliderect方法来进行碰撞检测,判断贪吃蛇和金币的矩形是否相交。

最后,当金币被吃掉时,应该从金币组中移除金币对象,而不是直接使用remove方法,这可能导致迭代错误。

以下是修复后的代码:
# 金币.py
import pygame
import random

class Money(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.Rect(random.randint(0, 590), random.randint(0, 390), 10, 10)

# 贪吃蛇.py
# ...(其他部分不变)

# 金币机制
for i in Money:
    pygame.draw.rect(screen, YELLOW, i.rect, 0)
    if i.rect.colliderect(pygame.Rect(left, top, 10, 10)):
        Money.remove(i)
# ...(其他部分不变)

通过以上修改,金币的位置和碰撞检测逻辑得到了修复,金币应该能够正确生成并且可以被贪吃蛇吃掉了。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-19 12:23:23 | 显示全部楼层    本楼为最佳答案   
金币机制出现bug的原因在于金币的碰撞检测部分存在问题。在代码中,金币的碰撞检测部分使用了多层嵌套的for循环,但是逻辑有些混乱,并且判断条件也存在问题。

首先,金币的位置应该是由左上角坐标和宽高来确定,因此在金币类的初始化方法中,应该将self.rect定义为pygame.Rect对象,而不是一个元组。同时,金币的位置应该在屏幕范围内随机生成,而不是直接使用随机数。

其次,碰撞检测部分的逻辑也存在问题,for循环的嵌套和变量命名混乱,导致判断条件不正确。应该使用pygame.Rect对象的colliderect方法来进行碰撞检测,判断贪吃蛇和金币的矩形是否相交。

最后,当金币被吃掉时,应该从金币组中移除金币对象,而不是直接使用remove方法,这可能导致迭代错误。

以下是修复后的代码:
# 金币.py
import pygame
import random

class Money(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.Rect(random.randint(0, 590), random.randint(0, 390), 10, 10)

# 贪吃蛇.py
# ...(其他部分不变)

# 金币机制
for i in Money:
    pygame.draw.rect(screen, YELLOW, i.rect, 0)
    if i.rect.colliderect(pygame.Rect(left, top, 10, 10)):
        Money.remove(i)
# ...(其他部分不变)

通过以上修改,金币的位置和碰撞检测逻辑得到了修复,金币应该能够正确生成并且可以被贪吃蛇吃掉了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-19 12:23:33 | 显示全部楼层
你好,根据你提供的代码,我发现在金币机制部分有一些问题。在你的贪吃蛇游戏中,金币的生成和检测碰撞的逻辑存在一些小问题。下面我将帮你逐个解决:

1. 金币生成问题:在金币.py中,你定义了money类来表示金币,但是你没有在类中创建self.rect属性,而是直接使用了(self.width, self.height, 10, 10)作为self.rect,这样会导致金币位置的初始化出现问题。正确的做法应该是使用pygame.Rect对象来表示金币的矩形区域。
class money(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.rect = pygame.Rect(random.randint(0, 590), random.randint(0, 390), 10, 10)
2. 金币碰撞检测问题:在主程序中,检测金币与贪吃蛇头部是否碰撞的逻辑也存在一些问题。你可以使用pygame.sprite.spritecollide()函数来检测是否有金币与贪吃蛇头部碰撞,并将已经碰撞的金币移除。
# 金币碰撞检测hit_list = pygame.sprite.spritecollide(snake_head, Money, True)for hit in hit_list:    print('Got money!')
解决以上问题后,你的金币机制应该就能正常运行了。希望对你有所帮助!如果还有其他问题,欢迎继续向我提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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