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

使用Pygame遇'Tuple has no attribute colliderect'错误的解决求助

问题修复:Pygame角色图片替换后碰撞检测错误

错误根源是你把player_rect从Rect对象改成了元组:

player_rect = pygame.Surface.get_rect(player)  # 这里得到的是带碰撞、移动方法的Rect对象
player_rect = (275, 650)  # 直接赋值成元组后,丢失了Rect的所有方法,导致报错

正确做法是通过Rect对象的属性设置初始位置,而非替换成元组,同时要在循环内实时绘制角色,保证位置跟随更新。

修改后的完整代码:

#cross the sea
import pygame

pygame.init()

#set screen
SCREEN_HEIGHT = 800
SCREEN_WIDTH = 600

screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Cross the Sea")

#sprite dimensions
goal_boundary1 = pygame.Rect((275, 200, 50, 50))
goal_boundary2 = pygame.Rect((275, 100, 50, 50))
goal_boundary3 = pygame.Rect((325, 150, 50, 50))
goal_boundary4 = pygame.Rect((225, 150, 50, 50))
goal = pygame.Rect((275, 150, 50, 50))
player = pygame.image.load('turtle1.png')
# 获取图片Rect并设置初始左上角位置
player_rect = player.get_rect(topleft=(275, 650))
wall1 = pygame.Rect((-25, 300, 400, 50))
wall2 = pygame.Rect((225, 500, 400, 50))
left_boundary = pygame.Rect((-50, 0, 50, 800))
right_boundary = pygame.Rect((600, 0, 50, 800))
top_boundary = pygame.Rect((0, -50, 600, 50))
bottom_boundary = pygame.Rect((0, 800, 600, 50))

run = True
while run:
    # 处理窗口退出事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    
    screen.fill((0, 0, 0))
    
    pygame.draw.rect(screen, (0, 255, 0), wall1)
    pygame.draw.rect(screen, (0, 255, 0), wall2)
    pygame.draw.rect(screen, (255, 255, 0), left_boundary)
    pygame.draw.rect(screen, (255, 255, 0), right_boundary)
    pygame.draw.rect(screen, (255, 255, 0), top_boundary)
    pygame.draw.rect(screen, (255, 255, 0), bottom_boundary)
    pygame.draw.rect(screen, (0, 0, 255), goal)

    #controls:改用if支持多方向同时移动
    key = pygame.key.get_pressed()
    if key[pygame.K_a]:
        player_rect.move_ip(-1, 0)
    if key[pygame.K_d]:
        player_rect.move_ip(1, 0)
    if key[pygame.K_s]:
        player_rect.move_ip(0, 1)   
    if key[pygame.K_w]:
        player_rect.move_ip(0, -1) 
    
    #wall collisions
    if player_rect.colliderect(wall1):
        if key[pygame.K_a]:
            player_rect.move_ip(10, 0)
        elif key[pygame.K_d]:
            player_rect.move_ip(-10, 0)
        elif key[pygame.K_s]:
            player_rect.move_ip(0, -10)
        elif key[pygame.K_w]:
            player_rect.move_ip(0, 10) 
    # 补充wall2碰撞检测
    if player_rect.colliderect(wall2):
        if key[pygame.K_a]:
            player_rect.move_ip(10, 0)
        elif key[pygame.K_d]:
            player_rect.move_ip(-10, 0)
        elif key[pygame.K_s]:
            player_rect.move_ip(0, -10)
        elif key[pygame.K_w]:
            player_rect.move_ip(0, 10) 
    # 边界碰撞限制,防止角色出界
    if player_rect.colliderect(left_boundary):
        player_rect.left = left_boundary.right
    if player_rect.colliderect(right_boundary):
        player_rect.right = right_boundary.left
    if player_rect.colliderect(top_boundary):
        player_rect.top = top_boundary.bottom
    if player_rect.colliderect(bottom_boundary):
        player_rect.bottom = bottom_boundary.top

    # 实时绘制角色
    screen.blit(player, player_rect)
    # 更新屏幕显示
    pygame.display.flip()

pygame.quit()

额外优化说明:

  • 加入窗口退出事件处理,避免程序无法正常关闭
  • 方向键判断改用if,支持斜向移动
  • 补充wall2碰撞检测和屏幕边界限制
  • 循环内实时绘制角色并更新屏幕,保证位置同步

内容的提问来源于stack exchange,提问作者Sandwich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:30:19