2016-01-24 113 views
0

在python中,我试图创建一个简单的游戏,玩家在尝试避免wumpus时选择下一个洞穴。在建立它在某种程度上停止,永不初始洞穴结构开始游戏,并出现以下错误:无法在python中启动游戏。游戏永远不会启动,下面的错误显示

Traceback (most recent call last): 
    File "/Users/JPagz95/Documents/Hunt_the_Wumpus_3.py", line 80, in <module> 
    link_caves() 
    File "/Users/JPagz95/Documents/Hunt_the_Wumpus_3.py", line 28, in link_caves 
    this_cave = choose_cave(visited_caves) 
    File "/Users/JPagz95/Documents/Hunt_the_Wumpus_3.py", line 50, in choose_cave 
    cave_number = choice(cave_list) 
    File "/Users/JPagz95/anaconda/lib/python3.5/random.py", line 253, in choice 
    i = self._randbelow(len(seq)) 
KeyboardInterrupt 

这里我是为游戏当前的代码。任何帮助表示赞赏:)

from random import choice 

cave_numbers = [x for x in range(20)] 
unvisited_caves = [x for x in range(20)] 
visited_caves = [] 

def setup_caves(cave_numbers): 
    """ create a starting list of caves """ 
    caves = [] 
    for number in cave_numbers: 
     caves.append(number) 
    return caves 

def visit_cave(cave_number): 
    """ mark a cave as visited """ 
    visited_caves.append(cave_number) 
    unvisited_caves.remove(cave_number) 

def print_caves(): 
    """ print out the current cave structure """ 
    for number in cave_numbers: 
     print (number, ":", caves[number]) 
    print ('----------') 

def link_caves(): 
    """ make sure all of the caves are connected with two way tunnels""" 
    while unvisited_caves != []: 
     this_cave = choose_cave(visited_caves) 
     next_cave = choose_cave(unvisited_caves) 
    create_tunnel(this_cave, next_cave) 
    visit_cave(next_cave) 

def create_tunnel(cave_from, cave_to): 
    """ create a tunnel between cave_from and cave_to """ 
    caves[cave_from].append(cave_to) 
    caves[cave_to].append(cave_from) 

def finish_caves(): 
    """ link the rest of the caves with one way tunnels """ 
    for caves in cave_numbers: 
     while len(caves) < 3: 
      passage_to = choose_cave(cave_numbers) 
      caves[cave].append(passage_to) 

def choose_cave(cave_list): 
    """ pick a cave from a list, provided that the 
    cave has less than 3 tunnels """ 
    cave_number = choice(cave_list) 
    while len(caves) >= 3: 
     cave_number = choice(cave_list) 
    return cave_number 

def print_location(player_location): 
    """ tell the player about where they are """ 
    print ("You are in a cave ", player_location) 
    print ("From here you can see caves: ") 
    print (caves[player_location]) 
    if wumpus_location in caves[player_location]: 
     print ("I smell a wumpus!") 

def get_next_location(): 
    """ Get the player's next location """ 
    print ("Which cave next?") 
    player_input = input(">") 
    if (not player_input.isdigit() or 
     int(player_input) not in 
      caves[player_location]): 
     print (player_input + "?") 
     print ("That's not a direction I can see!") 
     return none 
    else: 
     return int(player_input) 

caves = setup_caves(cave_numbers) 

visit_cave(0) 
print_caves() 
link_caves() 
print_caves() 
finish_caves() 

wumpus_location = choice(cave_numbers) 
player_location = choice(cave_numbers) 
while player_location == wumpus_location: 
    player_location = choice(cave_numbers) 

print ("Welcome to Hunt the Wumpus!") 
print ("You can see ", len(cave_numbers), " caves") 
print ("To play, just type the number") 
print ("of the cave you wish to enter next") 

while True: 
    print_location(player_location) 
    new_location = get_next_location() 
    if new_location != None: 
     player_location = new_location 
    if player_location == wumpus_location: 
     print ("Aargh! You got eaten by a wumpus!") 

回答

2

第一:

visited_caves = [] 

然后:

link_caves() 

然后:

this_cave = choose_cave(visited_caves) 

然后:

cave_number = choice(cave_list) 

您正在发送一个空的listrandom.choice(),失败。

变化link_caves()只处理非空list S:

def link_caves(): 
    """ make sure all of the caves are connected with two way tunnels""" 
    if not (visited_caves and unvisited_caves): 
     return 
    this_cave = choose_cave(visited_caves) 
    next_cave = choose_cave(unvisited_caves) 
    create_tunnel(this_cave, next_cave) 
    visit_cave(next_cave) 

注意,如果该功能没有通过无效参数random.choice(),就已经得到了根本卡住了,因为它采用的是while循环中条件从未改变。我注意到您也在choose_cave()中执行此操作,while len(caves) >= 3: cave_number = choice(cave_list)。这个特定的片段将检查caves的长度,如果它是>= 3,则从cave_list中选择一个随机洞穴。然后它会检查caves的长度,发现它与以前一样,永远选择一个随机洞穴等。也许你期待random.choice()从传递的序列中删除其选定的项目。它不这样做。如果你愿意,你可以通过多种方式删除它,比如在cave_number之后选择caves.remove(cave_number)

请记住,除了提示您的问题和我指出的其他问题之外,您的代码中可能还有其他错误。

+0

感谢在这个生病的样子,早上时查看调试!我喜欢你冗长的答案! –

0

TigerhawkT3很好的答案。

我最近查看了这段代码的一个版本,你可以用一个小小的修改来解决一个问题。修正了link_caves错别字()函数,通过缩进的最后两行,让他们在里面的“而”循环:

def link_caves(): 
    """ make sure all of the caves are connected with two way tunnels""" 
    while unvisited_caves != []: 
     this_cave = choose_cave(visited_caves) 
     next_cave = choose_cave(unvisited_caves) 
     create_tunnel(this_cave, next_cave) 
     visit_cave(next_cave) 

这种变化应该创建所需的隧道,并调用visit_cave()每次通过循环。 visit_cave()的最后一行从unvisited_caves列表中删除了正确的洞穴,这是TigerhawkT3提到的必要的。

你还有一些问题需要修复,以完成初始化并让游戏运行。

回溯语句会告诉你从哪里开始寻找。

您可以添加打印语句来显示洞穴列表,以帮助您在代码挂起之前调试代码。

输出可能会更容易,如果你改变洞窟的数量小东西像4-5代替20