鱼C论坛

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

[已解决]为啥小乌龟动不了

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

x
  1. #导入库
  2. import pygame
  3. import sys
  4. from pygame.locals import *

  5. #初始化pygame
  6. pygame.init()

  7. #设置变量
  8. size = width, height = 600, 400
  9. bg = (255, 255, 255)
  10. turtle = pygame.image.load(r"C:\Users\24734\Desktop\code\img\turtle.png")
  11. position = turtle.get_rect()#获取图片

  12. screen = pygame.display.set_mode(size)
  13. pygame.display.set_caption('fihc demo')

  14. #游戏循环
  15. while True:
  16.     #获取事件
  17.     for event in pygame.event.get():
  18.         #如果pygame事件为quit,那么久退出
  19.         if event.type == pygame.QUIT:
  20.             sys.exit()

  21.         if event.type == pygame.KEYDOWN:
  22.             if event.key == K_w:
  23.                 position = position.move((0, -5))

  24.     #刷新
  25.     screen.fill(bg)#刷新背景
  26.     screen.blit(turtle, position)#刷新图像
  27.     pygame.display.flip()#刷新
复制代码

小乌龟动不了,按下W键后乌龟还是没动
最佳答案
5 天前
你的代码问题在于只处理了按键按下(KEYDOWN)事件,且每次按键只移动5像素(可能不明显)。同时缺少其他方向的控制和持续移动逻辑。以下是修正方案:

主要问题:
1. 只处理了W键向上移动,未处理其他方向
2. 移动步长太小(5像素)不易察觉
3. 未实现按键持续移动(需状态跟踪)

改进代码:

  1. import pygame
  2. import sys
  3. from pygame.locals import *

  4. pygame.init()
  5. size = width, height = 600, 400
  6. bg = (255, 255, 255)

  7. # 使用默认乌龟代替外部图片(避免路径问题)
  8. turtle = pygame.Surface((50, 50), pygame.SRCALPHA)
  9. pygame.draw.circle(turtle, (0, 200, 0), (25, 25), 20)  # 绿色圆形作为乌龟

  10. position = turtle.get_rect(center=(300, 200))  # 初始位置居中
  11. speed = 8  # 增大移动速度

  12. screen = pygame.display.set_mode(size)
  13. pygame.display.set_caption('FishC Demo')

  14. # 移动状态跟踪
  15. move = {"up": False, "down": False, "left": False, "right": False}

  16. while True:
  17.     for event in pygame.event.get():
  18.         if event.type == QUIT:
  19.             pygame.quit()
  20.             sys.exit()
  21.         
  22.         # 按键按下
  23.         if event.type == KEYDOWN:
  24.             if event.key == K_w: move["up"] = True
  25.             if event.key == K_s: move["down"] = True
  26.             if event.key == K_a: move["left"] = True
  27.             if event.key == K_d: move["right"] = True
  28.         
  29.         # 按键释放
  30.         if event.type == KEYUP:
  31.             if event.key == K_w: move["up"] = False
  32.             if event.key == K_s: move["down"] = False
  33.             if event.key == K_a: move["left"] = False
  34.             if event.key == K_d: move["right"] = False
  35.    
  36.     # 根据状态持续移动
  37.     if move["up"]: position.y -= speed
  38.     if move["down"]: position.y += speed
  39.     if move["left"]: position.x -= speed
  40.     if move["right"]: position.x += speed
  41.    
  42.     # 边界检查
  43.     position.x = max(0, min(position.x, width - position.width))
  44.     position.y = max(0, min(position.y, height - position.height))
  45.    
  46.     screen.fill(bg)
  47.     screen.blit(turtle, position)
  48.     pygame.display.flip()
  49.     pygame.time.delay(30)  # 控制帧率
复制代码


关键改进:
1. 使用内置绘图代替外部图片(避免路径错误)
2. 增加方向键WASD控制
3. 添加移动状态跟踪实现持续移动
4. 移动速度提高到8像素/帧
5. 添加边界限制防止移出屏幕
6. 增加帧率延迟使移动更平滑

WASD键试试,现在乌龟应该可以自由移动了!如果仍有问题,请检查PyGame是否安装正确(可通过pip install pygame安装)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
屏幕截图 2025-07-26 144925.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
你的小乌龟动不了是因为只处理了按键按下事件(KEYDOWN),没有处理按键持续按住的情况。修改方案如下:

问题原因:
1. KEYDOWN 只在按键被按下时触发一次
2. 没有实现持续按键检测逻辑

解决方案:
使用 pygame.key.get_pressed() 实时检测按键状态


  1. import pygame
  2. import sys
  3. from pygame.locals import *

  4. pygame.init()

  5. size = width, height = 600, 400
  6. bg = (255, 255, 255)
  7. turtle = pygame.image.load(r"C:\Users\24734\Desktop\code\img\turtle.png")
  8. position = turtle.get_rect()

  9. screen = pygame.display.set_mode(size)
  10. pygame.display.set_caption('fihc demo')

  11. # 游戏循环
  12. while True:
  13.     # 获取事件
  14.     for event in pygame.event.get():
  15.         if event.type == pygame.QUIT:
  16.             sys.exit()
  17.    
  18.     # 新增:实时检测按键状态
  19.     keys = pygame.key.get_pressed()
  20.     if keys[K_w]:  # 持续检测W键
  21.         position = position.move(0, -5)
  22.    
  23.     # 刷新
  24.     screen.fill(bg)
  25.     screen.blit(turtle, position)
  26.     pygame.display.flip()
复制代码


关键修改说明:
1. 添加了 keys = pygame.key.get_pressed() 获取当前所有按键状态
2. 使用 if keys[K_w]: 持续检测W键是否被按住
3. 这样按住W键时,每帧都会向上移动5像素

其他建议:
1. 可以添加方向键控制(上下左右):

  1.     if keys[K_UP]:
  2.         position = position.move(0, -5)
  3.     if keys[K_DOWN]:
  4.         position = position.move(0, 5)
  5.     if keys[K_LEFT]:
  6.         position = position.move(-5, 0)
  7.     if keys[K_RIGHT]:
  8.         position = position.move(5, 0)
复制代码


2. 建议添加帧率控制:

  1. clock = pygame.time.Clock()  # 初始化时钟
  2. while True:
  3.     clock.tick(60)  # 控制60帧/秒
  4.     # ...其他代码...
复制代码


修改后按住W键小乌龟就会持续向上移动啦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层    本楼为最佳答案   
你的代码问题在于只处理了按键按下(KEYDOWN)事件,且每次按键只移动5像素(可能不明显)。同时缺少其他方向的控制和持续移动逻辑。以下是修正方案:

主要问题:
1. 只处理了W键向上移动,未处理其他方向
2. 移动步长太小(5像素)不易察觉
3. 未实现按键持续移动(需状态跟踪)

改进代码:

  1. import pygame
  2. import sys
  3. from pygame.locals import *

  4. pygame.init()
  5. size = width, height = 600, 400
  6. bg = (255, 255, 255)

  7. # 使用默认乌龟代替外部图片(避免路径问题)
  8. turtle = pygame.Surface((50, 50), pygame.SRCALPHA)
  9. pygame.draw.circle(turtle, (0, 200, 0), (25, 25), 20)  # 绿色圆形作为乌龟

  10. position = turtle.get_rect(center=(300, 200))  # 初始位置居中
  11. speed = 8  # 增大移动速度

  12. screen = pygame.display.set_mode(size)
  13. pygame.display.set_caption('FishC Demo')

  14. # 移动状态跟踪
  15. move = {"up": False, "down": False, "left": False, "right": False}

  16. while True:
  17.     for event in pygame.event.get():
  18.         if event.type == QUIT:
  19.             pygame.quit()
  20.             sys.exit()
  21.         
  22.         # 按键按下
  23.         if event.type == KEYDOWN:
  24.             if event.key == K_w: move["up"] = True
  25.             if event.key == K_s: move["down"] = True
  26.             if event.key == K_a: move["left"] = True
  27.             if event.key == K_d: move["right"] = True
  28.         
  29.         # 按键释放
  30.         if event.type == KEYUP:
  31.             if event.key == K_w: move["up"] = False
  32.             if event.key == K_s: move["down"] = False
  33.             if event.key == K_a: move["left"] = False
  34.             if event.key == K_d: move["right"] = False
  35.    
  36.     # 根据状态持续移动
  37.     if move["up"]: position.y -= speed
  38.     if move["down"]: position.y += speed
  39.     if move["left"]: position.x -= speed
  40.     if move["right"]: position.x += speed
  41.    
  42.     # 边界检查
  43.     position.x = max(0, min(position.x, width - position.width))
  44.     position.y = max(0, min(position.y, height - position.height))
  45.    
  46.     screen.fill(bg)
  47.     screen.blit(turtle, position)
  48.     pygame.display.flip()
  49.     pygame.time.delay(30)  # 控制帧率
复制代码


关键改进:
1. 使用内置绘图代替外部图片(避免路径错误)
2. 增加方向键WASD控制
3. 添加移动状态跟踪实现持续移动
4. 移动速度提高到8像素/帧
5. 添加边界限制防止移出屏幕
6. 增加帧率延迟使移动更平滑

WASD键试试,现在乌龟应该可以自由移动了!如果仍有问题,请检查PyGame是否安装正确(可通过pip install pygame安装)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-31 10:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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