用python启动游戏有困难。游戏永远不会开始,下面的错误就会出现

2024-09-25 00:29:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我尝试创建一个简单的游戏,玩家可以选择下一个要去的洞穴,同时尽量避开wumpus。在设置初始洞穴结构时,它会以某种方式停止,并且永远不会启动游戏,出现以下错误:

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!")

Tags: thetoinnumberdeflocationnextplayer
2条回答

TigerhawkT3的详细回答。你知道吗

我最近研究了这段代码的一个版本,您可能只需稍加修改就可以解决一个问题。通过缩进最后两行使其位于“while”循环中,修复link\u 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\u cave()。 visit_cave()的最后一行从unvisted_caves列表中删除正确的洞穴,这是TigerhawkT3提到的必要条件。你知道吗

你确实有一些问题要解决,完成初始化并让游戏运行。你知道吗

回溯语句将告诉您从何处开始查找。你知道吗

您可以添加print语句来显示列表,以帮助您在代码挂起之前调试代码。你知道吗

如果您将洞的数量改为4-5而不是20,那么在调试时输出可能更容易查看。你知道吗

首先:

visited_caves = []

然后:

link_caves()

然后:

this_cave = choose_cave(visited_caves)

然后:

cave_number = choice(cave_list)

您正在向random.choice()发送一个空的list,但失败了。你知道吗

link_caves()更改为仅处理非空的list

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)。你知道吗

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

相关问题 更多 >