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

如何用WASD键控制字符'o'在字符串地图中移动?

WASD控制字符移动的简单实现

对于新手来说,直接修改字符串确实麻烦——因为字符串是不可变的,没法直接改某个位置的字符。最直观高效的方法是把地图转换成二维列表(列表的列表),这样就能像改表格里的单元格一样轻松修改字符位置。

完整代码(带详细注释)

# 原始地图字符串,直接复制你提供的房屋地图
map_str = """###################################
####         ######################
####  ###        ###           ####
####  ###        ###           ####
####  ###                      ####
o     ###        ##################
###################################"""

# 把字符串拆成每行,再转成二维列表(每行是一个子列表)
# 这样我们可以直接通过 game_map[行号][列号] 修改任意位置的字符
game_map = [list(line) for line in map_str.split('\n')]

# 找到玩家'o'的初始位置(x是列号,y是行号)
player_x, player_y = 0, 0
for y in range(len(game_map)):
    if 'o' in game_map[y]:
        player_x = game_map[y].index('o')
        player_y = y
        break

# 游戏主循环
while True:
    # 打印当前地图:把二维列表转回字符串打印
    print('\n'.join([''.join(row) for row in game_map]))
    
    # 获取按键输入(支持大小写,按Q退出)
    key = input("\nWASD移动,Q退出:").strip().upper()
    
    if key == 'Q':
        print("游戏结束")
        break
    
    # 计算移动后的新位置
    new_x, new_y = player_x, player_y
    if key == 'W':
        new_y -= 1  # 向上走,行号减1
    elif key == 'S':
        new_y += 1  # 向下走,行号加1
    elif key == 'A':
        new_x -= 1  # 向左走,列号减1
    elif key == 'D':
        new_x += 1  # 向右走,列号加1
    else:
        print("无效按键!请按WASD或Q")
        continue
    
    # 检查新位置是否合法:在地图范围内,且是空格
    if 0 <= new_y < len(game_map) and 0 <= new_x < len(game_map[new_y]):
        if game_map[new_y][new_x] == ' ':
            # 交换'o'和空格的位置
            game_map[player_y][player_x] = ' '
            game_map[new_y][new_x] = 'o'
            # 更新玩家当前位置
            player_x, player_y = new_x, new_y
        else:
            print("撞墙了!这里不能走")
    else:
        print("超出地图边界了!")

核心逻辑说明

  1. 二维列表的优势:
    字符串不能直接修改单个字符,但列表可以。把地图转成game_map后,game_map[y][x]就能直接访问/修改第y行第x列的字符,完全不用复杂的字符串切片。
  2. 初始位置查找:
    遍历每一行,用index()快速找到'o'的位置,比双重循环更简洁。
  3. 移动判断:
    每次按键后先计算新位置,再检查是否在地图内且是空格——只有满足条件才交换位置,否则提示不能移动。

进阶:实时按键(无需回车)

上面的代码需要按回车确认按键,如果想实现按下WASD直接移动,需要用到keyboard库:

  1. 先安装库:pip install keyboard
  2. 修改主循环部分:
import keyboard

while True:
    print('\n'.join([''.join(row) for row in game_map]))
    
    # 等待按键按下(只响应按下事件)
    event = keyboard.read_event()
    if event.event_type != keyboard.KEY_DOWN:
        continue
    
    key = event.name.upper()
    if key == 'Q':
        print("游戏结束")
        break
    
    new_x, new_y = player_x, player_y
    if key == 'W':
        new_y -= 1
    elif key == 'S':
        new_y += 1
    elif key == 'A':
        new_x -= 1
    elif key == 'D':
        new_x += 1
    else:
        continue
    
    # 合法性检查和移动逻辑和之前一样
    if 0 <= new_y < len(game_map) and 0 <= new_x < len(game_map[new_y]):
        if game_map[new_y][new_x] == ' ':
            game_map[player_y][player_x] = ' '
            game_map[new_y][new_x] = 'o'
            player_x, player_y = new_x, new_y

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:50:38