这是我的部分“寻找Wumpus(WAMPA)”游戏的代码。如果我制作范围(0,20),它可以工作,但如果我这样做(1,21),那么仍然有20个洞穴,但没有“洞穴编号0”......这只是我的屁股...而且它告诉我列表索引超出范围...不确定为什么在我的范围内将所有内容移动一位数就会这样做,因为在其他地方没有直接引用该范围内的特定数字...所以删除0应该没有这不是一个问题,但是唉......它是......这里是错误来自的代码:
from random import choice
cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
caves.append([])
for i in cave_numbers:
for j in range(3):
passage_to = choice(cave_numbers)
caves[i].append(passage_to)
以下是完整的代码,只是为了完成:
from random import choice
cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
caves.append([])
for i in cave_numbers:
for j in range(3):
passage_to = choice(cave_numbers)
caves[i].append(passage_to)
wampa_location = choice(cave_numbers)
wampa_friend_location = choice(cave_numbers)
player_location = choice(cave_numbers)
while (player_location == wampa_location or player_location == wampa_friend_location):
player_location = choice(cave_numbers)
print("Welcome to Hunt the Wampa!")
print("You can see", len(cave_numbers), "caves.")
print("To play, just type the number")
print("of the save you wish to enter next.")
player_location != wampa_location
while True:
if player_location != wampa_location:
print("You are in cave", player_location)
print("From here, you can see caves:", caves[player_location])
if(player_location == wampa_location -1 or player_location == wampa_location +1):
print("I smell a Wampa!")
if(player_location == wampa_friend_location -1 or player_location == wampa_friend_location +1):
print("I smell a stinky Wampa!")
print("Which cave next?")
player_input = input(">")
if(not player_input.isdigit() or
int(player_input) not in caves[player_location]):
print(player_input, "isn't a cave you can see from here!")
else:
player_location = int(player_input)
if player_location == wampa_location:
print("Aargh! You got eaten by a Wampa!")
if player_location == wampa_friend_location:
print("Aargh! You got eaten by the Wampa's friend!")
我很抱歉,如果缩进很糟糕,有些线条包裹起来我失去了我的位置...但我认为错误是在前11行中。
谢谢你们
答案 0 :(得分:1)
你的缩进很好,但你需要把(0,20)因为实际发生的事情就是当你追加它时没有定义每个洞穴[int]去的东西,如果你要使用字典这会完全可能,但是你最终会遇到caves = [[]*20]
所以当你说for i in cave_numbers
它试图从1开始并转到20时,但是因为python是从零开始的,所以当你发出错误时会引发错误达到20,因为caves
实际上从0开始并且变为19,这仍然是20个数据。
答案 1 :(得分:0)
for i in cave_numbers:
for j in range(3):
passage_to = choice(cave_numbers)
caves[i].append(passage_to)
这将使每个数字在1..20的范围内并尝试将其用作长度为20的列表的索引,获得洞穴编号2,3,... 20.当它到达i = 20时,它发现列表中没有包含该索引的元素,并且死亡。
答案 2 :(得分:0)
将范围从(0,20)更改为(1,21)不会像您期望的那样更改结果列表的大小。长度保持在20。
但是,由于您使用范围列表中的值作为索引,因此最终索引太高。没有洞穴[20]因为那需要一个包含21个元素的列表,而你的列表只有20个元素(在这两种情况下都是如此)。
答案 3 :(得分:0)
也许你想要这样的东西? (测试)
#!/usr/local/cpython-3.3/bin/python
from random import choice
cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
caves.append([])
for index, cave in enumerate(caves):
for j in range(3):
passage_to = choice(cave_numbers)
cave.append(passage_to)
答案 4 :(得分:0)
让我尝试为您解决这个问题:
首先让我们检查一下前几行:
cave_numbers = range(1,21)
caves = []
for i in cave_numbers:
caves.append([])
如果我们跟踪“内存”,它将看起来像这样:
cave_numbers = iterator
list(cave_numbers) = [1,2,3,4,5,...,20]
caves = [[],[],[],[],[],....,[]]
给您带来麻烦的部分就在这里发生。如您所见,cave_numbers
从1到20,并且caves
数组中正好有20个空列表,但是python中的数组的索引为零。意味着数组中的第一个元素实际上位于零位置。这是一个简单的示例,说明这意味着什么以及程序中将发生什么:
my_indices = [1,2,3,4,5]
my_list = [1,2,3,4,5]
print(f'{my_list[0]}') # print out '1'
for i in my_indices:
print(f'{my_list[i]}') # print out '234' ... and then a index out of exception happens
发生索引超出范围异常是因为您将5
用作绑定设置为[0,4]
的数组的索引。
以下代码片段实际上产生了这个确切的问题:
for i in cave_numbers:
for j in range(3):
passage_to = choice(cave_numbers)
caves[i].append(passage_to) # here i will be substituted for '1' to 20'
访问caves[20]
时会引发异常,因为此数组的边界实际上是[0, 19]
。
最简单的方法是始终将范围从零开始到N
。在大多数情况下,零索引是编程的常态,您应该习惯于零索引。当需要任何包含索引的用户交互时,只需添加“ 1”,如下所示:
print(f'You are in cave {player_location + 1}')
本质上,用户并不关心如何在代码中为数组建立索引,但是您不应该向用户显示索引为零的状态是正确的(因为这可能会造成混淆)。
print('some text', variable)
确实是老派-尝试在Python 3中使用f-strings(例如:print(f'some text {variable}')
)