Text Adventure Game(Python)中的Item类

问题描述 投票:0回答:1

我在python中制作一个文本冒险游戏。我有大多数基本项目设置,如链接位置和保存功能。 (设置保存功能有点困难,所以如果有更好的方法请告诉我)。

现在我想制作物品。具体来说,我希望项目位于一个位置(可能与其他位置相互链接的方式相关联),当玩家与它们交互时(例如,拾取它),他们更新了项目的位置。我希望用户必须输入命令并识别他们需要该项目,并且一旦他们进入某个区域就不会被动地拾取该项目。 (这家商店也是非功能性的,如果你能指点我最好的方法并保持玩家的库存,那将是一件好事。)

我知道这将包括很多东西,比如一个新类,以及一些新的函数,它们明确规定哪些命令可以工作。我已经开了一枪,但很快撞到了墙上。如果你们中的任何人能帮助我,那就太棒了。 (此外,有一种更好/更快的方式来做某事,指出它,我会考虑添加它)。

这是代码:

import pickle
import time

# Constants/Valid Commands
# This is a mess, ignore it unless it causes a problem.

invalidChars = '\"\'()*&^%$#@!~`-=_+{}[]\|:;<,>.?/'
validLogin = 'log in', 'log', 'saved', 'in', 'load', 'logging in', 'load game', 'load'
validNewGame = 'new', 'new game', 'new save'
directions = ['north', 'south', 'east', 'west'] 
possibleGenders = ['boy', 'girl']
examineCommands = ['examine yourself', 'look at yourself', 'my stats', 'my statistics', 'stats', 'statistics', 'examine statistics', 'examine stats']
invalidExamine = ['examine', 'look at' ]
stop = ['stop', 'exit', 'cancel']



# FUNCTIONS

def start():


  print("Welcome to XXXXX, created by Ironflame007") #XXXX is the name placeholder. I haven't decided what it will be yet
  while True:
    command = input("Are you making a new game, or logging in?\n> ")
    if command in validNewGame:
      clear()
      newGame()
      break
    elif command in validLogin:
      clear()
      login()
      break
    else:
      clear()
      print("Thats not a valid command. If you wish to exit, type exit\n")



def newGame():
  while True:
    username = input('Type in your username. If you wish to exit, type exit\n> ')
    if username[0] in invalidChars:
      clear()
      print('Your username can\'t start with a space or any other type of misc. character. Just letters please')
    elif username in stop:
      clear()
      start()
    else:
      break

  password = input('Type in your password\n> ')
  playerName = input("What is your character's name?\n> ")

  while True:
    playerGender = input("Is your character a boy or a girl?\n> ".lower())
    if playerGender not in possibleGenders:
      print("That's not a valid gender...")
    else:
      clear()
      break

  inventory = []
  health = 100
  player = Player(playerName, playerGender, 0, 1, inventory, health, password)

  file = username + '.pickle'
  pickle_out = open(file, 'wb')
  pickle.dump(player.player_stats, pickle_out)
  pickle_out.close()


  print("You wake up. You get off of the ground... dirt. You didn't fall asleep on dirt. You look around an observe your surroundings\n(If you need help, use the command help)") # hasn't been made yet

  game('default', username, player.player_stats)





def examine(string, dictionary):
  if string in examineCommands:
    print(dictionary)
  elif string in invalidExamine:
    print('There is nothing to {0}'.format(string))
  else:
    print('Thats an invalid command')



def clear():
  print('\n' * 50)

def game(startLoc, username, dictionary):
  if startLoc == 'default':
    currentLoc = locations['woods']
  else:
    currentLoc = dictionary['location']

  while True:
    print(currentLoc.description)
    for linkDirection,linkedLocation in currentLoc.linkedLocations.items():
      print(linkDirection + ': ' + locations[linkedLocation].name)
    command = input("> ").lower()
    if command in directions:
      if command not in currentLoc.linkedLocations:
        clear()
        print("You cannot go this way")
      else:
        newLocID = currentLoc.linkedLocations[command]
        currentLoc = locations[newLocID]
        clear()
    else:
      clear()
      if command in examineCommands:
        examine(command, dictionary)
      elif command in invalidExamine:
        examine(command, dictionary)
      elif command == 'log out':
        logout(username, dictionary, currentLoc)
        break
      else:
        print('That\'s an invalid command.')
        print("Try one of these directions: {0}\n If you are trying to log out, use the command log out.".format(directions))


def login():
  while True:
    while True:
      print('If you wish to exit, type exit or cancel')
      username = input("What is your username\n> ")
      if username in stop:
        clear()
        start()
        break
      else:
        break
    inputPass = input("What is your password\n> ")
    try:
      filename = username + '.pickle'
      pickle_in = open(filename, 'rb') 
      loaded_stats = pickle.load(pickle_in, )
      if loaded_stats['password'] == inputPass:
        clear()
        print("Your game was succesfully loaded")
        game('location', username, loaded_stats)
        break
      else:
        clear()
        print("That's an invalid username or password.")
    except:
      clear()
      print("Thats an invalid username or password.")



def logout(username, dictionary, currentLoc):
  print("Please don't close the window, the programming is saving.")
  dictionary.update({'location': currentLoc})
  file = username + '.pickle'
  pickle_out = open(file, 'wb')
  pickle.dump(dictionary, pickle_out)
  pickle_out.close()
  time.sleep(3)
  print("Your game has been saved. You may close the window now")


class Location:
  def __init__(self, name, description):
    self.name = name
    self.description = description
    self.linkedLocations = {} # stores linked locations in this dictionary

  def addLink(self, direction, destination):
    # adds link to the linked locations dictionary (assuming the direction and destination are valid)
    if direction not in directions:
      raise ValueError("Invalid Direction")
    elif destination not in locations:
      raise ValueError("Invalid Destination")
    else:
      self.linkedLocations[direction] = destination


class Player:

  def __init__(self, name, gender, gold, lvl, inventory, health, password):
    self.name = name
    self.gender = gender
    self.gold = gold
    self.lvl = lvl
    self.inventory = inventory
    self.health = health
    self.player_stats = {'name': name, 'gender': gender, 'gold': gold, 'lvl': lvl, 'inventory': inventory, 'health': health, 'password': password, 'location': 'default'}

# ACTUALLY WHERE THE PROGRAM STARTS

locations = {'woods': Location("The Woods", "You are surrounded by trees. You realize you are in the woods."),
'lake': Location("The Lake", "You go north and are at the lake. It is very watery."),
'town': Location("The Town", "You go north, and find yourself in town."),
'shop': Location("The Shop", "You go east, and walk into the shop. The shop owner asks what you want")
} 



locations['woods'].addLink('north', 'lake')
locations['lake'].addLink('south', 'woods')
locations['lake'].addLink('north', 'town')
locations['town'].addLink('south', 'lake')
locations['town'].addLink('east', 'shop')
locations['shop'].addLink('west', 'town')




start()
python python-3.x
1个回答
0
投票

至于拾取内容,您可以在播放器类中使用一种方法将该项目附加到播放器的清单列表中。如果您希望项目位于特定位置,则可以在位置处获得可通过检查功能访问的项目列表。

因此,在Class Location:中,您可以添加类位置:

def __init__(self, name, description):
    self.name = name
    self.description = description
    self.linkedLocations = {} # stores linked locations in this dictionary
    self.items = items        # List of items on location

Class Player:你可以添加,

Class Player:

def PickUp(self, Location, item):
    Location.items.remove(item)
    self.inventory.append(item)

您不必以实现Locations的方式实现项目,因为项目不会有任何邻居。

我希望用户必须输入命令并识别他们需要该项目,并且一旦他们进入某个区域就不会被动地拾取该项目。

我想这应该是你的检查功能。除了在某个位置调用的检查函数之外,应该生成该特定位置的项目列表。也许了解一个冒险游戏(你最喜欢的一个)如何通过制作一个较小的版本来工作可能有助于你理解它们之间的抽象交互是如何。我想添加一个具体的例子可以激发对交互的讨论。祝你好运!

干杯

© www.soinside.com 2019 - 2024. All rights reserved.