错误使基于文本的游戏生成怪物



我正在和我的朋友一起为编程课制作一个基于文本的游戏,我们避免使用面向对象的东西,所以请避免这些建议。 要使用该程序,我通常会键入"帮助",然后当我尝试使用这些命令时,我可以向任何方向移动,例如"右","左","下"和"上",我收到错误。 这发生在我添加 spawnMonster 命令部分之后

#Connor and Griffin's text based adventure
import os
import random
############################
####---Variable setup---####


#########ADD COMMAND VARIATION############
#########ADD ITEM LISTS#################


commands = 1 #for debuging only please
maxHealth = 100 #Default begin health
health = 100 #Current health
mana = 0 #THERES NO MAGIC
mapS = [5, 5]
objects = {}
color = "0f"
output = "" #this is where whats happening is told to you
level = 1

canMove = 1
playerSym = "P"

# for activeQuests remember that if the value is 0 its not completed and if its 1 its completed
activeQuests = {"Journey To Riverwood": 0}
# Add new quest names above^
commandList = {"help", "legend", "color", "show inv", "quests", "console", "up", "left", "right", "down", "clear", "map"}
#Default inventory
inv = {"apple(s)":2, "shortsword":1, "gold":50,"cloth shirt":1,"pair of cloth pants":1,"pair of shoes":1}
clearedSpaces = []
##### "Name":baseDMG #####
monsters = {"Goblin":1, "Troll":3, "Bear":2, "Giant Spider": 1, "Bandit":1, "Goblin Chief":3}
###########################
###########################

#####   Name:lv:monsterSpawnRate    #####
zones = {"Forest":[1,90]}

#######################
#---Quest Log Stuff---#

def checkQuest():
    for questn in activeQuests:
        print("n------", questn, "------")
        if activeQuests[questn] == 0:
            print("nNot  Complete")
        else:
            print("nComplete")
            ######Description for quests######
        if questn == "Journey To Riverwood":
            print("""
Welcome to Connor and Griffins excellent adventure!
try out some of the commands like; help, quests,
color, inv or show inv. now using your new found
commands move to the city of riverwood.nn""")

#########################
#########################

############################
###---Scenes/Functions---###

def mapSize(x, y):
    global mapS
    mapS = [x, y]
####Ads point to map
def addObject(name, x, y, symbol):
    objects[name] = [x, y, symbol]
    legend[symbol] = name
#### Clears some variables
def roomStart():
    global objects
    objects = {}
    global legend
    legend = {"░":"Unknown area"}
    global roomName
    roomName = "BLANK"
def newArea():
    for area in zones:
        global spawnChance
        spawnChance = zones[area][1]

def spawnMonster():
    enemy, DMG = random.choice(monsters)
    return enemy

def moveToNewSpace():
    rand = random.randint(1,100)
    if rand <= spawnChance:
        global spawnedMonster
        spawnMonster()
###Move player
def changePos(name, newx, newy):
    objects[name][0] += newx
    objects[name][1] += newy
    global clearedSpaces
    clearedSpaces.append([objects[name][0],objects[name][1]])
    moveToNewSpace()


###First room
def roomBegin():
    roomStart()
    mapSize(15,10)
    global roomName
    roomName = "Forest"
    newArea()
    addObject("Riverwood",10,5,"R")
    addObject("Griffin's House",2,2,"G")
    addObject("Player",2,3,playerSym) #######Remember to make a "ChangePos" command to change the pos of the player when they move#######
    clearedSpaces.append([2,3])


    ################### MAPPING HERE ##################
def makeMap():
    print("n------"+roomName+"------")
    for y in range(mapS[1]):
        line = ""
        numy = y+1
        for x in range(mapS[0]):
            numx = x + 1
            for place in objects:
                if objects[place][:2] == [numx, numy]:
                    line += objects[place][2] 
                    break
            else:
                if [numx, numy] in clearedSpaces:
                    line += " "
                else:
                    line += "░"
        print(line)
    print("n----Legend----n")
    for thing in legend:
        print(thing + " - " + legend[thing])

############################
############################

#######################
###--- MAIN LOOP ---###
roomBegin()
while 1 == 1:
    makeMap()
    print("nn" + output + "nn")
    print("nnHealth is at ",health,"/",maxHealth)
    command = input("Enter action: ")
    if command.lower() == "quests":
        os.system("cls")
        checkQuest()
    elif command.lower() == "legend":
        os.system("cls")
        print("n----Legend----n")
        for thing in legend:
            print(thing + " - " + legend[thing])

    elif command.lower() == "help":
        os.system("cls")
        print("nn------HelpMenu------n")
        for comd in commandList:
            print(comd)
    elif command.lower() == "color":
        newc = input("new color: ")
        os.system("color 0" + newc)
        os.system("cls")
    elif command.lower() == "show inv" or command.lower() == "inv" or command.lower() == "inventory":
        os.system("cls")
        print("n------Inventory------n")
        for item in inv:
            print(" ", inv[item]," ", item)
    elif command.lower() == "console":
        if commands == 1:
            consolecmd = input("Enter a command: ")
            os.system(consolecmd)
        else:
            print("Sorry, you dont have permition to use that command.")
    elif command.lower() == "up":
        if canMove == 1:
            os.system("cls")
            changePos("Player", 0,-1)
        else:
            os.system("cls")
            output += "nCant move that way right now!"
    elif command.lower() == "down":
        if canMove == 1:
            os.system("cls")
            changePos("Player", 0,1)
        else:
            os.system("cls")
            output += "nCant move that way right now!"

    elif command.lower() == "left":
        if canMove == 1:
            os.system("cls")
            changePos("Player", -1,0)
        else:
            os.system("cls")
            output += "nCant move that way right now!"
    elif command.lower() == "right":
        if canMove == 1:
            os.system("cls")
            output = "There are some trees here, and a small pond"
            changePos("Player", 1,0)
        else:
            os.system("cls")
            output += "nCant move that way right now!"
    elif command.lower() == "clear":
        os.system("cls")
    else:
        os.system("cls")
        print("Previous attempt was an invalid command, try again.")

#######END MAIN#######
######################

random.choice函数需要一个序列

在你的代码的先前版本中(或者可能是来自你同学的代码,只是在类似的代码中存在类似但不相同的问题?),您将怪物存储在一个列表中,例如[("Goblin", 1), ("Troll", 3), …]。对于该代码,random.choice有效,因为列表是一个序列。

但是现在你有一个字典。字典不是一个序列。

您只需编写 list(d) 即可获取字典中所有键的列表。因此,您可以这样做:

return random.choice(list(monsters))

但是,从我能说的monsters,你实际上并没有从得到任何好处,那么为什么不首先使用列表呢?

>monsters是一个字典。然而,它被传递给random.choice()random.choice()接受一个序列作为它的参数(它从中随机选择一个元素)。这不适用于字典,如果您尝试,您将看到KeyError异常。

由于您只想从spawnMonster()返回敌人,因此您可以使用monsters的键,这是一个列表:

monsters = {"Goblin":1, "Troll":3, "Bear":2, "Giant Spider": 1, "Bandit":1, "Goblin Chief":3}
def spawnMonster():
    return random.choice(monsters.keys())

更新

由于您使用的是 Python 3,因此您可以改为这样做(也适用于 Python 2):

def spawnMonster():
    return random.choice(tuple(monsters))

最新更新