鱼C论坛

 找回密码
 立即注册
查看: 860|回复: 3

[已解决]pygame贪吃蛇问题(不想说了。。。)

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

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

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

x
#贪吃蛇.py
import pygame
import sys
from pygame.locals import *
import 金币
import 蛇身
pygame.init()
size = width, height = 600, 400
bg = (255, 255, 255)
YELLOW = (255, 255, 0)
snake = (0, 255, 0)
BLACK = (0, 0, 0)
Sbody = {}
fanxiang = 'right'
left = 300
top = 200

screen = pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇')
move = USEREVENT
pygame.time.set_timer(move, 1 * 100)
money = USEREVENT + 1
pygame.time.set_timer(money, 5 * 1000)
score = 0
score_font = pygame.font.Font(None, 20)

Money = pygame.sprite.Group()
snakebody = 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':
                Sbody[0] = [left, top]
                left -= 11
               
            elif fanxiang == 'top':
                Sbody[0] = [left, top]
                top -= 11
               
            elif fanxiang == 'right':
                Sbody[0] = [left, top]
                left += 11
               
            elif fanxiang == 'bottom':
                Sbody[0] = [left, top]
                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 b in snakebody:
        lastnumber = b.number - 1
        nextnumber = b.number + 1
        Sbody[b.number] = [b.width, b.height]
        #pygame.time.delay(1)
        #print(Sbody)
        b.width = Sbody[lastnumber][0]
        b.height = Sbody[lastnumber][1]
        b.rect = pygame.Rect(b.width, b.height, 10, 10)
        pygame.draw.rect(screen, snake, b.rect, 0)
        
    #金币机制
    for i in Money:
        pygame.draw.rect(screen, YELLOW, i.rect, 0)
        if i.rect.colliderect(pygame.Rect(left, top, 10, 10)):
            score+=1000
            thousand = score / 1000
            #增加长度
            for b in snakebody:
                lastnumber = b.number - 1
                s = 蛇身.body(int(Sbody[lastnumber][0]), int(Sbody[lastnumber][1]), thousand)
                snakebody.add(s)
            Money.remove(i)
    #绘制贪吃蛇
    pygame.draw.rect(screen, snake, (left, top, 10, 10), 0)
       #显示字迹
    score_text = score_font.render(f'Score:{score}', True, BLACK)
    screen.blit(score_text, (10, 5))
    pygame.display.flip()
#蛇身.py
import pygame
class body(pygame.sprite.Sprite):
    def __init__(self, width, height, number):
        pygame.sprite.Sprite.__init__(self)
        self.width = width
        self.height = height
        self.rect = pygame.Rect(self.width, self.height, 10, 10)
        self.number = number
#金币.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)
请各位帮忙修贪吃蛇增长的bug,谢谢(为了解决这个困扰了我一个星期的bug,我发了好几个帖子,希望这次能有结果)
@isdkz
最佳答案
2023-11-26 18:34:09
同志,建议看完所有教程(哪怕是旧版)再回来写游戏,

如果你已经看完了教程,这里建议你重构代码,可以使你更方便后续的更新,同时可以解决bug如下:
1、将蛇作为单独的一个类,内部存放移动速度,长度。蛇的本体只有他的”脑袋“那一个方块,其余的部分属于特效,请先做好蛇头。
2、金币单独作为一个类,与蛇碰撞,金币消失,蛇长度加一
3、蛇的身体就是一个拖尾,可以在蛇类内部存放一个位置列表,列表的长度为蛇的长度,
列表帧每更新,根据此帧蛇的长度和位置更新位置列表,删除长度超出的部分。
向上面这样你会更清晰的写出游戏

简而言之,你现在的代码有些凌乱,希望你能够更好的使用类、方法、函数,进行封装,
从而达到更清晰的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-26 14:13:10 | 显示全部楼层
在你提供的代码中,我看到了一些问题。

首先,在处理贪吃蛇移动的时候,你没有使用适当的数据结构来保存蛇身体的坐标。我建议使用一个列表来保存蛇身体的每个部分的坐标。每当蛇移动的时候,你需要将新的头部坐标插入到列表的第一个位置,并且删除列表的最后一个元素。这样就能实现蛇的增长和移动。

其次,在控制方向的部分,你需要根据用户按下的键来改变蛇头移动的方向。你可以通过监听键盘事件来获取用户按下的键,并根据不同的按键设置不同的移动方向。

最后,在金币生成的部分,你需要将金币添加到`Money`组中,并在每一帧中更新金币的位置。当蛇头碰到金币时,你需要增加得分并生成新的金币。同时,你还需要在每一帧中检测蛇头是否和蛇身体碰撞,如果碰撞了,则游戏结束。

下面是修改后的代码示例:
import pygameimport sysimport randomfrom pygame.locals import *pygame.init()size = width, height = 600, 400bg = (255, 255, 255)YELLOW = (255, 255, 0)snake = (0, 255, 0)BLACK = (0, 0, 0)screen = pygame.display.set_mode(size)pygame.display.set_caption('贪吃蛇')move = USEREVENTpygame.time.set_timer(move, 200)  # 设置蛇移动的时间间隔score = 0 score_font = pygame.font.Font(None, 20)snake_body = [(300, 200)]  # 蛇身体坐标列表direction = 'right'def generate_food():    x = random.randint(0, width-10)    y = random.randint(0, height-10)    return (x//10 * 10, y//10 * 10)food = generate_food()while True:    for event in pygame.event.get():        if event.type == pygame.QUIT:            sys.exit()        elif event.type == move:            if direction == 'right':                head_x = snake_body[0][0] + 10                head_y = snake_body[0][1]            elif direction == 'left':                head_x = snake_body[0][0] - 10                head_y = snake_body[0][1]            elif direction == 'up':                head_x = snake_body[0][0]                head_y = snake_body[0][1] - 10            elif direction == 'down':                head_x = snake_body[0][0]                head_y = snake_body[0][1] + 10                        snake_body.insert(0, (head_x, head_y))  # 插入新的蛇头位置            snake_body.pop()  # 删除最后一个蛇身部分        key_pressed = pygame.key.get_pressed()    if key_pressed[K_RIGHT] and direction != 'left':        direction = 'right'    elif key_pressed[K_LEFT] and direction != 'right':        direction = 'left'    elif key_pressed[K_UP] and direction != 'down':        direction = 'up'    elif key_pressed[K_DOWN] and direction != 'up':        direction = 'down'    if snake_body[0] == food:        score += 10        food = generate_food()        # 在蛇尾增加一个身体部分        snake_body.append(snake_body[-1])    screen.fill(bg)    for body_part in snake_body:        pygame.draw.rect(screen, snake, (*body_part, 10, 10))    pygame.draw.rect(screen, YELLOW, (*food, 10, 10))    score_text = score_font.render(f'Score: {score}', True, BLACK)    screen.blit(score_text, (10, 5))    pygame.display.flip()
你可以根据自己的需求对代码进行进一步的修改和完善。希望能帮到你解决问题!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 18:02:31 | 显示全部楼层
本帖最后由 cjjJasonchen 于 2023-11-26 18:06 编辑

第一,建议不要重复发帖,你可以试着把快要沉下去的帖子顶起来
第二,请给鱼油们一些时间解答你的问题,如果你发现有人飞快的回复,那么这个人可能是ai,ai的话仅供参考,别太当真
第三,我现在正准备尝试解决你的问题,如果我今天没有继续回复,说明我没解决
第四,请使用代码格式发代码提问
第五,如果你发现长时间没有人来解决你的问题,可以试试看使用详细的问题描述,例如使用图文之类的



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

使用道具 举报

发表于 2023-11-26 18:34:09 | 显示全部楼层    本楼为最佳答案   
同志,建议看完所有教程(哪怕是旧版)再回来写游戏,

如果你已经看完了教程,这里建议你重构代码,可以使你更方便后续的更新,同时可以解决bug如下:
1、将蛇作为单独的一个类,内部存放移动速度,长度。蛇的本体只有他的”脑袋“那一个方块,其余的部分属于特效,请先做好蛇头。
2、金币单独作为一个类,与蛇碰撞,金币消失,蛇长度加一
3、蛇的身体就是一个拖尾,可以在蛇类内部存放一个位置列表,列表的长度为蛇的长度,
列表帧每更新,根据此帧蛇的长度和位置更新位置列表,删除长度超出的部分。
向上面这样你会更清晰的写出游戏

简而言之,你现在的代码有些凌乱,希望你能够更好的使用类、方法、函数,进行封装,
从而达到更清晰的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 23:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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