You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyGame开发问题:为什么我的rock对象无法实现自动移动?

问题原因
  • 你在循环中修改的rock_x变量没有同步更新到rock_move这个Rect对象上,Python中int是不可变类型,初始化Rect时传入的是rock_x的初始值,后续修改rock_x不会自动同步到Rect的x属性
  • draw_window函数中绘制rock时直接写死了坐标为(400, 250),完全没有用到传入的rock_move参数的坐标值,所以不管你怎么改坐标变量,绘制位置永远不变
  • 另外你要实现向左移动的需求,应该是x坐标减少,你写的rock_x +=3是向右移动,需要调整符号
修复方案
  1. 直接修改rock_move.x属性即可,不需要额外维护独立的rock_x变量
  2. 修改draw_window函数中绘制rock的代码,使用rock_move的x、y属性作为绘制坐标
  3. 把移动数值改为负数实现左移
修复后完整代码
import pygame

p = pygame.display.set_mode((900, 600))
pygame.display.set_caption("First game")
FPS = 60
WHITE = 255, 255, 255
RED = 255, 0, 0
GREEN = 0, 255, 0
BLUE = 0, 0, 255
DBLUE = 57, 64, 90

board1 = pygame.image.load("board.png")
board2 = pygame.image.load("board.png")
rock = pygame.image.load("rock.png")


def draw_window(board1_move, board2_move, rock_move):
    p.fill(DBLUE)
    board1_scaled = pygame.transform.rotate(pygame.transform.scale(board1, (55, 40)), 40)
    board2_scaled = pygame.transform.rotate(pygame.transform.scale(board2, (55, 40)), 40)
    rock_scaled = pygame.transform.rotate(pygame.transform.scale(rock, (55, 40)), 0)
    p.blit(board1_scaled, (board1_move.x, board1_move.y))
    p.blit(board2_scaled, (board2_move.x, board2_move.y))
    # 使用rock_move的动态坐标绘制
    p.blit(rock_scaled, (rock_move.x, rock_move.y))
    pygame.display.update()


keypress = pygame.key.get_pressed()


def board1_move_func(keypress, board1_move):
    if keypress[pygame.K_w] and board1_move.y > 0:
        board1_move.y -= 3
    if keypress[pygame.K_s] and board1_move.y < 530:
        board1_move.y += 3


def board2_move_func(keypress, board2_move):
    if keypress[pygame.K_UP] and board2_move.y > 0:
        board2_move.y -= 3
    if keypress[pygame.K_DOWN] and board2_move.y < 530:
        board2_move.y += 3


def main():
    board1_move = pygame.Rect(20, 250, 55, 40)
    board2_move = pygame.Rect(805, 250, 55, 40)
    # 直接用Rect存储rock的坐标属性
    rock_move = pygame.Rect(450, 250, 55, 40)


    clock = pygame.time.Clock()

    run = True
    while run == True:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        keypress = pygame.key.get_pressed()
        # 左移对应x坐标减3
        rock_move.x -= 3

        board1_move_func(keypress, board1_move)
        board2_move_func(keypress, board2_move)
        draw_window(board1_move, board2_move, rock_move)

    pygame.quit()


if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Leeyo-27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:05