鱼C论坛

 找回密码
 立即注册
查看: 751|回复: 4

pygame贪吃蛇问题

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

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

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

x
#贪吃蛇.py
import pygame
import sys
from pygame.locals import *
import 金币
import 蛇身
pygame.init()
pygame.mixer.init()
size = width, height = 600, 400
bg = (0, 0, 255)
YELLOW = (255, 255, 0)
snake = (0, 255, 0)
white = (255, 255, 255)
Sbody = {}
fanxiang = 'right'
left = 300
top = 200
pygame.mouse.set_visible(False)
#pygame.mixer.music.load('Ximalaya-4.0.0_99B_sc100006.exe')
pygame.mixer.music.load('game_music.ogg')
pygame.mixer.music.set_volume(1)
a = pygame.mixer.Sound('upgrade.wav')
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)
GameOver_font = pygame.font.Font(None, 100)
Money = pygame.sprite.Group()
snakebody = pygame.sprite.Group()
pygame.mixer.music.play()
running = True
clock = pygame.time.Clock()



while running:    
    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
                for b in snakebody:
                    Sbody[int(b.number)] = [b.width, b.height]
                
                
            elif fanxiang == 'top':
                Sbody[0] = [left, top]
                top -= 11
                for b in snakebody:
                    Sbody[int(b.number)] = [b.width, b.height]
                
                
            elif fanxiang == 'right':
                Sbody[0] = [left, top]
                left += 11
                for b in snakebody:
                    Sbody[int(b.number)] = [b.width, b.height]
                
                
            elif fanxiang == 'bottom':
                Sbody[0] = [left, top]
                top += 11
                for b in snakebody:
                    Sbody[int(b.number)] = [b.width, b.height]
                
                
        
        #生成金币
        elif event.type == money:
            print(left, top)
            m = 金币.money()
            Money.add(m)
    
    key_pressed = pygame.key.get_pressed()
    
    #控制方向
    if key_pressed[K_w] or key_pressed[K_UP]:
        fanxiang = 'top'
    elif key_pressed[K_s] or key_pressed[K_DOWN]:
        fanxiang = 'bottom'
    elif key_pressed[K_d] or key_pressed[K_RIGHT]:
        fanxiang = 'right'
    elif key_pressed[K_a] or key_pressed[K_LEFT]:
        fanxiang = 'left'

    if left <= 0 or left >= 600 or top <= 0 or top >= 400:
        pygame.mixer.music.stop()
        #raise OSError('不能碰到身体或边缘!!!')
        running = False
        GameOver = True
        

    screen.fill(bg)
    #蛇身机制
    for b in snakebody:
        lastnumber = b.number - 1
        nextnumber = b.number + 1
        
        #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)
        if b.rect.colliderect(pygame.Rect(left, top, 10, 10)):
            pygame.mixer.music.stop()
            #raise OSError('不能碰到身体或边缘!!!')
            running = False
            GameOver = True
            
        
    #金币机制
    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
            last = thousand - 1
            #增加长度
            s = 蛇身.body(int(Sbody[last][0]), int(Sbody[last][1]), thousand, size)
            snakebody.add(s)
            Money.remove(i)
            a.play()
    #绘制贪吃蛇
    pygame.draw.rect(screen, snake, (left, top, 10, 10), 0)
       #显示字迹
    score_text = score_font.render(f'Score:{score}', True, white)
    screen.blit(score_text, (10, 5))
    pygame.display.flip()

while GameOver:
    #print('已经准备就绪!')
    GameOver_text = GameOver_font.render('Game Over', True, white)
    screen.blit(GameOver_text, (100, 100))
    pygame.time.delay(1000)
    clock.tick(1000)
#蛇身.py
import pygame
class body(pygame.sprite.Sprite):
    def __init__(self, width, height, number, bg_size):
        pygame.sprite.Sprite.__init__(self)
        self.width = width
        self.height = height
        self.rect = pygame.Rect(self.width, self.height, 10, 10)
        self.number = number
        self.left = bg_size[0]
        self.top = bg_size[1]
#金币.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)
不知道为什么游戏失败时突然卡住了,求各位帮忙修复,谢谢

本帖被以下淘专辑推荐:

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

使用道具 举报

 楼主| 发表于 2023-11-26 20:37:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 20:38:01 | 显示全部楼层
在你的代码中,有几个地方可能导致游戏失败时卡住:

1. 在主循环中的`for event in pygame.event.get():`循环中,当检测到"QUIT"事件后应该退出游戏,但你的代码中只是调用了`sys.exit()`,并没有将`running`置为`False`。所以可以修改为 `running = False`,这样就能正确退出主循环。

2. 在主循环中的键盘控制部分,你使用了`or`逻辑运算符,这是错误的。应该使用`and`逻辑运算符来判断多个按键的组合。例如,应该将 `if key_pressed: fanxiang = 'top'` 修改为 `if key_pressed[K_w] and not key_pressed[K_s]: fanxiang = 'top'`。

3. 判断是否碰到边缘的条件语句有错误。在 `if left = 600 or top = 400:` 这一行中,应该使用相等比较运算符`==`而不是赋值运算符`=`。 所以应该修改为 `if left == 600 or top == 400:`。

修复以上问题后,你的代码应该能够正确处理游戏失败,并退出主循环。

另外,你的代码中存在一些不规范的写法和缺少部分代码,下面是修改后的代码示例:
# 贪吃蛇.pyimport pygameimport sysfrom pygame.locals import *import 金币import 蛇身pygame.init()pygame.mixer.init()size = width, height = 600, 400bg = (0, 0, 255)YELLOW = (255, 255, 0)snake = (0, 255, 0)white = (255, 255, 255)Sbody = 10 # 初始蛇身大小fanxiang = 'right'left = 300top = 200pygame.mouse.set_visible(False)pygame.mixer.music.load('game_music.ogg')pygame.mixer.music.set_volume(1)a = pygame.mixer.Sound('upgrade.wav')screen = pygame.display.set_mode(size)pygame.display.set_caption('贪吃蛇')move = USEREVENTpygame.time.set_timer(move, 1 * 100)money = USEREVENT + 1pygame.time.set_timer(money, 5 * 1000)score = 0 score_font = pygame.font.Font(None, 20)GameOver_font = pygame.font.Font(None, 100)Money = pygame.sprite.Group()snakebody = pygame.sprite.Group()pygame.mixer.music.play()running = Trueclock = pygame.time.Clock()while running:        for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False        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] and not key_pressed[K_s]:        fanxiang = 'top'    elif key_pressed[K_s] and not key_pressed[K_w]:        fanxiang = 'bottom'    elif key_pressed[K_d] and not key_pressed[K_a]:        fanxiang = 'right'    elif key_pressed[K_a] and not key_pressed[K_d]:        fanxiang = 'left'    if left >= 600 or top >= 400:        pygame.mixer.music.stop()        running = False            screen.fill(bg)        # 蛇身机制    for b in snakebody:        lastnumber = b.number - 1        nextnumber = b.number + 1                b.width = Sbody        b.height = Sbody        b.rect = pygame.Rect(b.width, b.height, 10, 10)        pygame.draw.rect(screen, snake, b.rect, 0)        if b.rect.colliderect(pygame.Rect(left, top, 10, 10)):            pygame.mixer.music.stop()            running = False                # 金币机制    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            last = thousand - 1            # 增加长度            s = 蛇身.body(int(Sbody), int(Sbody), thousand, size)            snakebody.add(s)            Money.remove(i)            a.play()                # 绘制贪吃蛇    pygame.draw.rect(screen, snake, (left, top, 10, 10), 0)        # 显示字迹    score_text = score_font.render(f'Score:{score}', True, white)    screen.blit(score_text, (10, 5))        pygame.display.flip()GameOver = Truewhile GameOver:    GameOver_text = GameOver_font.render('Game Over', True, white)    screen.blit(GameOver_text, (100, 100))    pygame.time.delay(1000)    clock.tick(1000)
希望这能帮助到你修复问题。如果还有其他问题,请随时问我。

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

使用道具 举报

 楼主| 发表于 2023-11-26 20:49:03 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-26 20:49:24 | 显示全部楼层

抱歉,我之前的回答有错误,我理解错了你的代码问题。真正导致游戏卡住的原因是因为在主循环中没有处理事件监听与更新屏幕的间隔时间。

下面是修复问题的修改代码:
import pygameimport sysfrom pygame.locals import *import randompygame.init()size = width, height = 600, 400bg = (0, 0, 255)YELLOW = (255, 255, 0)snake = (0, 255, 0)white = (255, 255, 255)Sbody = 10 # 初始蛇身大小fanxiang = 'right'left = 300top = 200screen = pygame.display.set_mode(size)pygame.display.set_caption('贪吃蛇')clock = pygame.time.Clock()class SnakeBody(pygame.sprite.Sprite):    def __init__(self, width, height):        pygame.sprite.Sprite.__init__(self)        self.image = pygame.Surface((10, 10))        self.image.fill(snake)        self.rect = self.image.get_rect()        self.rect.x = width        self.rect.y = heightclass Money(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.image = pygame.Surface((10, 10))        self.image.fill(YELLOW)        self.rect = self.image.get_rect()        self.rect.x = random.randint(0, 590)        self.rect.y = random.randint(0, 390)snakebody = pygame.sprite.Group()moneygroup = pygame.sprite.Group()score = 0score_font = pygame.font.Font(None, 20)GameOver_font = pygame.font.Font(None, 100)running = Truemove_event = pygame.USEREVENTmoney_event = pygame.USEREVENT + 1pygame.time.set_timer(move_event, 100)pygame.time.set_timer(money_event, 5000)while running:    for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False        elif event.type == move_event:            if fanxiang == 'left':                left -= 11            elif fanxiang == 'top':                top -= 11            elif fanxiang == 'right':                left += 11            elif fanxiang == 'bottom':                top += 11        elif event.type == money_event:            m = Money()            moneygroup.add(m)    key_pressed = pygame.key.get_pressed()    if key_pressed[K_UP] and not key_pressed[K_DOWN]:        fanxiang = 'top'    elif key_pressed[K_DOWN] and not key_pressed[K_UP]:        fanxiang = 'bottom'    elif key_pressed[K_RIGHT] and not key_pressed[K_LEFT]:        fanxiang = 'right'    elif key_pressed[K_LEFT] and not key_pressed[K_RIGHT]:        fanxiang = 'left'    snakebody.update()        screen.fill(bg)    snakebody.draw(screen)    moneygroup.draw(screen)    for b in snakebody:        if b.rect.colliderect(pygame.Rect(left, top, 10, 10)):            running = False    for i in moneygroup:        if i.rect.colliderect(pygame.Rect(left, top, 10, 10)):            score += 1000            thousand = score // 1000            last = thousand - 1            s = SnakeBody(int(left), int(top))            snakebody.add(s)            moneygroup.remove(i)    score_text = score_font.render(f'Score:{score}', True, white)    screen.blit(score_text, (10, 5))    pygame.display.flip()    clock.tick(10)pygame.quit()sys.exit()
希望这次能解决你的问题。如果还有其他问题,请随时问我。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 17:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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