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

Python迷宫游戏:到达终点前循环提前终止问题求助

问题描述

我开发的Python小型迷宫游戏中,终点由数值2(显示为G)标识。期望玩家抵达终点时,先显示玩家站在G位置并变为D(代表完成),再终止游戏循环,但当前循环会提前终止,无法实现该效果。尝试使用at_goal变量解决但未成功,恳请协助。

原代码
import random
import time
maze = [[1, 1, 1, 1, 1, 1],
        [1, 0, 1, 1, 1, 1],
        [1, 0, 1, 0, 1, 1],
        [1, 0, 0, 0, 1, 1],
        [1, 0, 1, 0, 1, 1],
        [1, 1, 1, 0, 1, 1],
        [1, 2, 1, 0, 1, 1],
        [1, 0, 0, 0, 1, 1],
        [1, 0, 1, 0, 1, 1],
        [1, 1, 1, 1, 1, 1]]

player_x = 1
player_y = 1

at_goal = False

done = False
while done == False:
    print("\033[H\033[2J", end="")
    for y, row in enumerate(maze):
        for x, element in enumerate(row):
            if x == player_x and y == player_y:
                if at_goal:
                    print("D", end=" ")
                else:
                    print("P", end=" ")
            elif element == 1:
                print("#", end=" ")
            elif element == 2:
                print("G", end=" ")
            else:
                print(" ", end=" ")
        print()
    move = input("Enter a move (up, down, left, right): ")
    if move == "up":
        player_y -= 1 
    elif move == "down":
        player_y += 1
    elif move == "left":
        player_x -= 1
    elif move == "right":
        player_x += 1
    else:
        print("Invalid move")
        time.sleep(0.5)
        continue
    
    if maze[player_y][player_x] == 2:
        at_goal = True
    elif maze[player_y][player_x] == 1:
        print("You have hit a wall and lost the game. Try again.")
        player_x = 1
        player_y = 1
        at_goal = False
        time.sleep(0.5)
    if at_goal:
        print("You have reached the goal and won the game!")
        done = True
问题原因

当前代码逻辑是:显示迷宫 → 接受移动输入 → 处理移动 → 判断终止。当玩家移动到终点后,会立刻设置done=True终止循环,导致循环无法再执行一次迷宫显示,因此玩家看不到D的状态。

解决方案

调整终止逻辑的位置,让程序在标记at_goal=True后,先完成一次迷宫显示(渲染D),再终止循环。修改后的代码如下:

import random
import time
maze = [[1, 1, 1, 1, 1, 1],
        [1, 0, 1, 1, 1, 1],
        [1, 0, 1, 0, 1, 1],
        [1, 0, 0, 0, 1, 1],
        [1, 0, 1, 0, 1, 1],
        [1, 1, 1, 0, 1, 1],
        [1, 2, 1, 0, 1, 1],
        [1, 0, 0, 0, 1, 1],
        [1, 0, 1, 0, 1, 1],
        [1, 1, 1, 1, 1, 1]]

player_x = 1
player_y = 1

at_goal = False

done = False
while done == False:
    print("\033[H\033[2J", end="")
    for y, row in enumerate(maze):
        for x, element in enumerate(row):
            if x == player_x and y == player_y:
                if at_goal:
                    print("D", end=" ")
                else:
                    print("P", end=" ")
            elif element == 1:
                print("#", end=" ")
            elif element == 2:
                print("G", end=" ")
            else:
                print(" ", end=" ")
        print()
    
    # 先判断是否到达终点,若是则终止循环
    if at_goal:
        print("You have reached the goal and won the game!")
        done = True
        break
    
    move = input("Enter a move (up, down, left, right): ")
    if move == "up":
        player_y -= 1 
    elif move == "down":
        player_y += 1
    elif move == "left":
        player_x -= 1
    elif move == "right":
        player_x += 1
    else:
        print("Invalid move")
        time.sleep(0.5)
        continue
    
    if maze[player_y][player_x] == 2:
        at_goal = True
    elif maze[player_y][player_x] == 1:
        print("You have hit a wall and lost the game. Try again.")
        player_x = 1
        player_y = 1
        at_goal = False
        time.sleep(0.5)
修改说明
  1. 将at_goal的终止判断移到迷宫显示之后、移动输入之前:玩家移动到终点后,下一次循环会先显示带有D的迷宫,再触发终止逻辑,确保玩家能看到完成状态。
  2. 添加break语句确保循环立即终止,避免不必要的输入等待。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:07