鱼C论坛

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

[已解决]pygame问题

[复制链接]
发表于 2023-11-18 22:27:46 | 显示全部楼层 |阅读模式

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

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

x
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)

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:
            Money = pygame.sprite.Group()
            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, snake, (left, top, 10, 10), 0)
        #if 金币.money
    #绘制贪吃蛇
    pygame.draw.rect(screen, YELLOW, (金币.money.width, 金币.money.height, 10, 10), 0)
    pygame.display.flip()
为什么pygame说Money未定义?谢谢
最佳答案
2023-11-18 22:28:21
Money的定义应该在while循环外部,而不是在事件处理中。在while循环外部定义Money变量并将其初始化为pygame.sprite.Group(),然后在事件处理中添加金币对象到Money中。另外,金币对象的绘制也需要在循环中进行。另外,金币对象的绘制应该使用m.rect属性而不是直接使用金币.money.width和金币.money.height属性。

修正后的代码应该如下所示:

  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. import 金币

  5. pygame.init()
  6. size = width, height = 600, 400
  7. bg = (255, 255, 255)
  8. YELLOW = (255, 255, 0)
  9. snake = (0, 255, 0)
  10. fanxiang = 'right'
  11. left = 300
  12. top = 200
  13. screen = pygame.display.set_mode(size)
  14. pygame.display.set_caption('贪吃蛇')
  15. move = USEREVENT
  16. pygame.time.set_timer(move, 1 * 1000)
  17. money = USEREVENT + 1
  18. pygame.time.set_timer(money, 5 * 1000)

  19. Money = pygame.sprite.Group()  # 在while循环外部定义Money变量

  20. while True:
  21.     for event in pygame.event.get():
  22.         if event.type == pygame.QUIT:
  23.             sys.exit()
  24.         elif event.type == move:
  25.             if fanxiang == 'left':
  26.                 left -= 11
  27.             elif fanxiang == 'top':
  28.                 top -= 11
  29.             elif fanxiang == 'right':
  30.                 left += 11
  31.             elif fanxiang == 'bottom':
  32.                 top += 11
  33.         elif event.type == money:
  34.             m = 金币.money()
  35.             Money.add(m)  # 在事件处理中添加金币对象到Money中

  36.     key_pressed = pygame.key.get_pressed()
  37.     if key_pressed[K_w] or key_pressed[K_UP]:
  38.         fanxiang = 'top'
  39.     if key_pressed[K_s] or key_pressed[K_DOWN]:
  40.         fanxiang = 'bottom'
  41.     if key_pressed[K_d] or key_pressed[K_RIGHT]:
  42.         fanxiang = 'right'
  43.     if key_pressed[K_a] or key_pressed[K_LEFT]:
  44.         fanxiang = 'left'

  45.     screen.fill(bg)

  46.     for i in Money:
  47.         pygame.draw.rect(screen, snake, i.rect)  # 绘制金币对象

  48.     pygame.draw.rect(screen, YELLOW, (left, top, 10, 10), 0)  # 绘制贪吃蛇
  49.     pygame.display.flip()
复制代码


通过将Money的定义移至while循环外部,并在事件处理中添加金币对象到Money中,可以解决Money未定义的问题。同时,修正了金币对象的绘制方式。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-11-18 22:28:21 | 显示全部楼层    本楼为最佳答案   
Money的定义应该在while循环外部,而不是在事件处理中。在while循环外部定义Money变量并将其初始化为pygame.sprite.Group(),然后在事件处理中添加金币对象到Money中。另外,金币对象的绘制也需要在循环中进行。另外,金币对象的绘制应该使用m.rect属性而不是直接使用金币.money.width和金币.money.height属性。

修正后的代码应该如下所示:

  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. import 金币

  5. pygame.init()
  6. size = width, height = 600, 400
  7. bg = (255, 255, 255)
  8. YELLOW = (255, 255, 0)
  9. snake = (0, 255, 0)
  10. fanxiang = 'right'
  11. left = 300
  12. top = 200
  13. screen = pygame.display.set_mode(size)
  14. pygame.display.set_caption('贪吃蛇')
  15. move = USEREVENT
  16. pygame.time.set_timer(move, 1 * 1000)
  17. money = USEREVENT + 1
  18. pygame.time.set_timer(money, 5 * 1000)

  19. Money = pygame.sprite.Group()  # 在while循环外部定义Money变量

  20. while True:
  21.     for event in pygame.event.get():
  22.         if event.type == pygame.QUIT:
  23.             sys.exit()
  24.         elif event.type == move:
  25.             if fanxiang == 'left':
  26.                 left -= 11
  27.             elif fanxiang == 'top':
  28.                 top -= 11
  29.             elif fanxiang == 'right':
  30.                 left += 11
  31.             elif fanxiang == 'bottom':
  32.                 top += 11
  33.         elif event.type == money:
  34.             m = 金币.money()
  35.             Money.add(m)  # 在事件处理中添加金币对象到Money中

  36.     key_pressed = pygame.key.get_pressed()
  37.     if key_pressed[K_w] or key_pressed[K_UP]:
  38.         fanxiang = 'top'
  39.     if key_pressed[K_s] or key_pressed[K_DOWN]:
  40.         fanxiang = 'bottom'
  41.     if key_pressed[K_d] or key_pressed[K_RIGHT]:
  42.         fanxiang = 'right'
  43.     if key_pressed[K_a] or key_pressed[K_LEFT]:
  44.         fanxiang = 'left'

  45.     screen.fill(bg)

  46.     for i in Money:
  47.         pygame.draw.rect(screen, snake, i.rect)  # 绘制金币对象

  48.     pygame.draw.rect(screen, YELLOW, (left, top, 10, 10), 0)  # 绘制贪吃蛇
  49.     pygame.display.flip()
复制代码


通过将Money的定义移至while循环外部,并在事件处理中添加金币对象到Money中,可以解决Money未定义的问题。同时,修正了金币对象的绘制方式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-18 22:29:26 | 显示全部楼层
在你的代码中,你在事件循环内部定义了 Money,在循环外部并没有定义。因此,在绘制金币的部分无法识别 Money。此外,在绘制贪吃蛇和金币时出现了一些错误。

以下是修改后的代码:
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. import 金币
  5. pygame.init()
  6. size = width, height = 600, 400
  7. bg = (255, 255, 255)
  8. YELLOW = (255, 255, 0)
  9. snake = (0, 255, 0)
  10. fanxiang = 'right'
  11. left = 300
  12. top = 200
  13. screen = pygame.display.set_mode(size)
  14. pygame.display.set_caption('贪吃蛇')
  15. move = USEREVENT
  16. pygame.time.set_timer(move, 1 * 1000)
  17. money = USEREVENT + 1
  18. pygame.time.set_timer(money, 5 * 1000)
  19. # 将金币定义移至事件循环外部
  20. Money = pygame.sprite.Group()
  21. while True:
  22.     for event in pygame.event.get():
  23.         if event.type == pygame.QUIT:
  24.             sys.exit()
  25.         elif event.type == move:
  26.             if fanxiang == 'left':
  27.                 left -= 11
  28.             elif fanxiang == 'top':
  29.                 top -= 11
  30.             elif fanxiang == 'right':
  31.                 left += 11
  32.             elif fanxiang == 'bottom':
  33.                 top += 11
  34.         # 生成金币
  35.         elif event.type == money:
  36.             m = 金币.money()
  37.             Money.add(m)
  38.     key_pressed = pygame.key.get_pressed()
  39.     # 控制方向
  40.     if key_pressed[K_w] or key_pressed[K_UP]:
  41.         fanxiang = 'top'
  42.     if key_pressed[K_s] or key_pressed[K_DOWN]:
  43.         fanxiang = 'bottom'
  44.     if key_pressed[K_d] or key_pressed[K_RIGHT]:
  45.         fanxiang = 'right'
  46.     if key_pressed[K_a] or key_pressed[K_LEFT]:
  47.         fanxiang = 'left'
  48.     screen.fill(bg)
  49.     # 绘制金币与贪吃蛇
  50.     for i in Money:
  51.         pygame.draw.rect(screen, snake, i.rect)  # 绘制金币
  52.     pygame.draw.rect(screen, YELLOW, (left, top, 10, 10), 0)  # 绘制贪吃蛇
  53.     pygame.display.flip()
复制代码

希望对你有所帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 20:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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