Python文本冒险游戏中如何实现数组内元组坐标的递增移动?
问题分析与修复方案
你的代码存在几个关键问题导致坐标无法更新,下面逐个说明并修复:
1. 字符串方法调用错误
update_player_coordinates.lower 没有调用方法,只是引用了lower方法本身,永远不会等于字符串'east',必须加上括号:update_player_coordinates.lower()。
2. 元组不可变性错误
player_coordinates是从map_array里取出的元组(比如(3,3)),元组是不可变类型,无法直接用+=修改。需要直接创建新的元组来存储修改后的坐标。另外player_coordinates += [1][1]的写法完全错误,[1][1]会触发索引越界,正确的东方向应该是x坐标+1,即新坐标为(player_coordinates[0]+1, player_coordinates[1])。
3. 递归逻辑错误
你的explore函数在修改坐标后返回了新坐标,但递归调用时没有传递这个新坐标,导致每次递归都使用原始坐标。需要在递归时传入更新后的坐标。
4. 缺失其他方向处理与边界检查
原代码只处理了东方向,还需要补充南、北、西的逻辑,同时要检查坐标是否在地图范围内,防止玩家移出地图。
修正后的完整代码
map_array = [ [(1, 5), (2, 5), (3, 5), (4, 5), (5, 5)], [(1, 4), (2, 4), (3, 4), (4, 4), (5, 4)], [(1, 3), (2, 3), (3, 3), (4, 3), (5, 3)], [(1, 2), (2, 2), (3, 2), (4, 2), (5, 2)], [(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)] ] # 提取地图的坐标范围,用于边界检查 max_x = max(coord[0] for row in map_array for coord in row) max_y = max(coord[1] for row in map_array for coord in row) min_x = min(coord[0] for row in map_array for coord in row) min_y = min(coord[1] for row in map_array for coord in row) starting_point = map_array[2][2] def show_map(): for row in map_array: print('\n' + str(row)) show_map() def explore(player_coordinates): print(f"Current player coordinates are {player_coordinates}.") direction = input("Where do you go? ").strip().lower() new_coords = player_coordinates # 处理四个方向的坐标更新 if direction == 'east': new_coords = (player_coordinates[0] + 1, player_coordinates[1]) elif direction == 'west': new_coords = (player_coordinates[0] - 1, player_coordinates[1]) elif direction == 'north': new_coords = (player_coordinates[0], player_coordinates[1] + 1) elif direction == 'south': new_coords = (player_coordinates[0], player_coordinates[1] - 1) else: print("Invalid direction! Please enter north, south, east, or west.") explore(player_coordinates) return # 边界检查,防止移出地图 if min_x <= new_coords[0] <= max_x and min_y <= new_coords[1] <= max_y: explore(new_coords) else: print("You can't go that way! It's the edge of the map.") explore(player_coordinates) explore(starting_point)
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

