2017-01-13 5 views
1

Hallo, ich habe ein paar Probleme mit einem Text-basierten Spiel (Python 2.7). Momentan lässt mich das Spiel nur ein zufälliges Monster töten, danach, wenn ich in eine zufällige Schlacht komme, ist das Monster bereits tot und die Kampffunktion startet nicht an ein paar Druckanweisungen vorbei.Text basierte Spiel zufällige Schlacht/HP Python 2.7

Ich habe auch festgestellt, dass nach Kämpfen, My HP für den Helden des Spiels bis max.

Ich bin sehr neu in der Programmierung, so dass jede Hilfe toll wäre.

Ich verwende Code aus einem anderen Spiel von mir zu Testzwecken. Also wird dieses aktuelle Spiel keinen Sinn ergeben.

import random 


class Room: 
    def __init__(self, name, description, doors, items): 
     self.name = name 
     self.description = description 
     self.doors = doors 
     self.items = items 


def check(self,item_name): #checks words in a room description 
    if not (item_name in self.items): 
     print "checked [" + item_name + "], but found nothing " 
     return 


    else: 
     self.items[item_name].check() 


class item: 
    def check(self): 
     print "default check, do nothing" 


class Weapon(): 
    def attack(self,monster): 
     pass 


class PulseRifle(Weapon): 
    def __str__(self,player,damage,ammo): 
     self.name = "pulse rifle" 
     self.player = player 
     self.damage = monster.hp -2 
     self.ammo = 7 


def bullet(self): # should ammo be a class? 
    if ammo > 0: 
     "pulse rifle" == True 
    if ammo <= 0: 
     "pulse rifle" == False 



class CombatKnife(Weapon): 
    def __init__(self,player): 
     self.name = "combat knife" 
     self.damage = monster.hp - 1 


class Character: 
    def __init__(self,hp): 
     self.hp = hp 

def attack(self, other): 
    raise NotImplementedError 


class Player(Character): 
    def __init__(self): 
     self.name = "chad" 
     self.hp = 10 
     self.x = 0 
     self.y = 0 
     self.items = {} 

def attack(self,other): # lets a player attack, and defines the damage his options do 
    answer = input ("what action would you like to pick?") 
    if answer.lower() in ("pulse rifle", "combat knife"): 
     if answer == "pulse rifle": 
      other.hp -= int(2) 
     elif answer == "combat knife": 
      other.hp -= int(1) 


def is_alive(self): 
    return self.hp > 0 


class Monster(Character): # This is the only enemy you encounter. I want the player to fight 1 on 1 battles. 
    def __init__(self): #Right now if you kill 1 monster, it wont let you engage others in battle. 
     self.name = "infested marine" 
     self.hp = 3 

def attack(self, other): 
    print ("the infested marine attacks...".format(self)) 
    player.hp -= int(1) 


def is_alive(self): 
    return self.hp > 0 


class Prison: 
    # This is the main framework of the game 
    global battle 

    global player 
    player = Player() 
    global monster 
    monster = Monster() 

def __init__(self): 
    self.hp = int 
    self.player = Player() 
    self.rooms = [] 
    self.is_playing = True 


def build_rooms(self): 



    cell_1 = Room(name="Cell 1", 
        description="The door to your cell is open. There is a bucket of urine and feces in the corner. .", 
        doors={"north": False, "south": False, "west": False, "east": True}, 
        items={}) 
    forced_feeding_room = Room(name="Forced Eating Room", 
           description="There is a chair with straps. \nIn a corner of the room is a blender with tubes attaced to the top\n" + 
              "You see hundreds of rats hanging around a stool.\n Stools are great for reaching high places", 
           doors={"north": False, "south": True, "west": True, "east": True}, 
           items={}) 
    hall_1 = Room(name="hall one", 
        description="The lights flicker on and off in the long hall.", 
        doors={"north": False, "south": True, "west": True, "east": True}, 
        items={}) 
    janitor_closet = Room(name="janitor closet", 
          description="There are a lot of cleaning supplies in here. Along with a small box", 
          doors={"north": False, "south": False, "west": True, "east": False}, 
          items={}) 
    cell2 = Room(name="cell 2", 
       description="A babbling old man begs you to relase him n\ There is a guard with a bite wound on his neck. He is no longer alive.", 
       doors={"north": False, "south": False, "west": False, "east": True}, 
       items={}) 
    needle_room = Room(name="needle room", 
         description="There is a blood stained mattress that is soiled with feces and cum amount other things,why would you want to touch that? \n There is a pile of dirty needles that look useless. \n There is also an old dresser with a red lock", 
         doors={"north": True, "south": True, "west": True, "east": True}, 
         items={}) 
    hall_2 = Room(name="hall 2", 
        description="This hallway is boring", 
        doors={"north": True, "south": True, "west": True, "east": True}, 
        items={}) 
    food_lift = Room(name="food lift", 
        description="The lift wire has sharp barbs on it,gloves would be nice to have. \n The lift looks like a small child could fit up there.", 
        doors={"north": False, "south": False, "west": True, "east": False}, 
        items={}) 
    cell3 = Room(name="cell 3", 
       description="The darkness is everywhere in here. You can hear a loud skittering noise in the darkness. If only you had a light source. \n A burnable item,something to hold it,something to ignite it,and some lighter fluid would do the trick", 
       doors={"north": False, "south": False, "west": False, "east": True}, 
       items={}) 
    eat_shit_room = Room(name="eat shit room", 
         description="This room has a man that weighs 700 pounds tied to a chair.\n A small constant stream of liquid taco bell is going down his throat. Attached to his ass is a tube that ends in a funnel with a head strap", 
         doors={"north": True, "south": True, "west": True, "east": True}, 
         items={}) 
    hall_3 = Room(name="hall3", 
        description="Nothing to do but walk", 
        doors={"north": True, "south": True, "west": True, "east": True}, 
        items={}) 
    generator = Room(name="generator room ", 
        description="There is a sign that reads. \n use the station here to test oil before pouring. check the oil. \n There is a small red key on the floor", 
        doors={"north": False, "south": False, "west": True, "east": False}, 
        items={ }) 
    cell4 = Room(name="cell4", 
       description=" There is a dead naked prison guard in a tiny cage. n\ next to the cage is a pile of clothes ", 
       doors={"north": False, "south": False, "west": False, "east": True}, 
       items={}) 
    pinata_room = Room(name="pinata room", 
         description="There are several dead men in here,each of which is hanging by his feet. one of the dead men has a pair of thick gloves. Each of the bodies is covered in deep bruises \n There is a shelf that is too high for you to reach without a stool.", 
         doors={"north": True, "south": False, "east": True, "west": True}, 
         items={}) 
    hall_4 = Room(name="hall4", 
        description="There is a door to the east with a key card reader.", 
        doors={"north": True, "south": False, "west": True, "east": False}, 
        items={}) 
    storage_room = Room(name="storage room", 
         description="A room with blankets and pillows. None of which the prisoners ever get to use. There is a ladder that leads up, and a hole that you can squeeze through.", 
         doors={"north": False, "south": False, "west": True, "east": False}, 
         items={} 
         ) 


    self.rooms = [ #an array of rooms this is how you move about the prison 
       [cell_1, forced_feeding_room, hall_1, janitor_closet], 
       [cell2, needle_room, hall_2, food_lift], 
       [cell3, eat_shit_room, hall_3, generator], 
       [cell4, pinata_room, hall_4, storage_room] 
      ] 


def new_game(self): 
    self.player = Player() 

    self.player.y = 0 
    self.player.x = 0 

    self.build_rooms() 
    self.is_playing = True 
    print "starting game" 


def battle(self): 
    # this is what i use for random monster battles 
    print "an infested marine appears" 
    print "type pulse rifle or battle knife in parenthesis" 


    while player.hp > 0 and monster.hp > 0: 
     player.attack(monster) 
     print ("the health of the monster is now {0.hp}.".format(monster)) 
     if monster.hp <= 0: 
      break 
     monster.attack(player) 
     print ("your hp is now{0.hp}.".format(player)) 
    if player.hp > 0: 
     print ("you killed the infested marine") 
    elif monster.hp > 0: 
     print ("the infested marine killed you.".format(monster)) 
     exit() 


def describe_room(self): 
    print self.get_current_room().description 


def print_room_name(self): 
    print "you are in the " + self.get_current_room().name 


def get_current_room(self): 
    return self.rooms[self.player.y][self.player.x] 


def handle_input(self): 
    input = raw_input("enter a commmand") 


    if input == "help" or input == "h": 
     self.help() 


    elif input == "me" or input == "m": # this is a check to see your current stats. When I do this check, I notice my HP goes back to max after a battle is over. 
     print "HP: " + str(self.player.hp) 
     print "Your location (" + str(self.player.x) + "," + str(self.player.y) + ")" 
     print "Doors: " + str(self.get_current_room().doors) 
     print "Inventory: " + str(self.player.items) 

    elif input == "describe" or input == "d": 
     self.describe_room() 


    elif input == "north" or input == "n": 
     global player 
     if self.get_current_room().doors["north"]: 
      print "Walking North" 
      self.player.y -= 1 
      animal = random.randint(1,20) 
      if animal <= 5: # this is what i use to determine the probablity of a random batttle 
       print ("hi") 
       battle(self) # starts the battle function 
      elif animal >= 6: 
       print ("no") 


     else: 
      print "There is no door in that direction" 


    elif input == "south" or input == "s": 
     if self.get_current_room().doors["south"]: 
      global player 
      print "Walking South" 
      self.player.y += 1 
      animal = random.randint(1,20) 
      if animal <= 5: # this is what i use to determine the probablity of a random batttle 
       print ("hi") 
      elif animal >= 6: 
       battle(self) # starts the battle function 
       print ("no") 


     else: 
      print "you try going south......there is no door" 


    elif input == "west" or input == "w": 
     if self.get_current_room().doors["west"]: 
      print "Walking West" 
      self.player.x -= 1 
      animal = random.randint(1,20) 
      if animal <= 5: # this is what i use to determine the probablity of a random batttle 
       print ("hi") 
       battle(self) # starts the battle function 
      elif animal >= 6: 
       print ("no") 


     else: 
      print "it would be nice to go west. To bad there isn't a door there. pay attention to where your going" 


    elif input == "east" or input == "e": 
     if self.get_current_room().doors["east"]: 
      print "Walking East" 
      self.player.x += 1 
      animal = random.randint(1,6) 
      if animal <= 5: # this is what i use to determine the probablity of a random batttle 
       print ("hi") 
       battle(self)# starts the battle function 
      elif animal >= 6: 
       print ("no") 


     else: 
      print "you try going east but you run right into a wall." 


    elif input.startswith("check ") or input.startswith("c "): # checks items in a room 
     pieces = input.split(" ") 
     item_name = pieces[1] 
     self.get_current_room().check(item_name) 


    elif input.startswith("use ") or input.startswith("u "): # command to use items that are in your inventory 
     pieces = input.split(" ") 
     item_name = pieces[1] 
     if item_name in self.player.items: 


      if isinstance(self.player.items[item_name], UsableItem): #this is code to use an usable item. 
       self.player.items[item_name].use(self.player) 
       del self.player.items[item_name] 


      else: 
       print "The item [" + item_name + "] is not usable." 


     else: 
      print "The item [" + item_name + "] is not in your inventory." 


    elif input == "exit": 
     self.is_playing = False 


    else: 
     print "Unknown command [" + input + "] " 
     self.help() 


def help(self): # this prints when an invalid command is inputted 
    print "bad command. Check an item, use an item, or check your environment.??" 


def play(self):# starts a new game 
    self.new_game() 
    print "Type m to check your stats, type d for room descriptions." 
    print "The command check. Check your environment, or you can check an item. The use command is for medkits " 

    while self.is_playing: 
     self.print_room_name() 
     self.handle_input() 


     if not self.player.is_alive(): 
      print "you are dead" 
      self.is_playing = False 


    print "game over try again" 
    exit() 


prison = Prison() 
prison.play() 

Antwort

2

1) Warum ist das Monster tot

Wenn Sie schauen, wo das Monster definiert:

class Prison: 
    # This is the main framework of the game 
    global battle 

    global player 
    player = Player() 
    global monster 
    monster = Monster() # <-- one monster created here, line is only executed once (definition of class, instantiation of static variable) 

Beachten Sie, dass dies der einzige Ort ist, wo ein Monster erstellt (Aufruf Monster()) in der gesamten Datei und in einem Bereich, der nur einmal ausgeführt wird, wenn dieses Skript ausgeführt wird. Dies bedeutet, dass es nur ein Monster für das gesamte Spiel gibt.

Zu wissen, dass es nur ein Monster ist, und das HP-Monster wird nie wieder vollständig in der Datei (suchen Sie nach monster.hp) gesetzt, sollten Sie den folgenden Code ein:

def battle(self): 
    # this is what i use for random monster battles 
    print "an infested marine appears" 
    print "type pulse rifle or battle knife in parenthesis" 

    # monster = Monster() - Try this for a new monster each battle 

    while player.hp > 0 and monster.hp > 0: 
     player.attack(monster) 
     print ("the health of the monster is now {0.hp}.".format(monster)) 
     if monster.hp <= 0: 
      break 
     monster.attack(player) 
     print ("your hp is now{0.hp}.".format(player)) 
    if player.hp > 0: 
     print ("you killed the infested marine") 
    elif monster.hp > 0: 
     print ("the infested marine killed you.".format(monster)) 
     exit() 

Die erste Schlacht fein läuft. In der nächsten Schlacht ist das Monster tot ... weil es das gleiche Monster ist wie die letzte Schlacht! Erinnern Sie sich, dieser Code bezieht sich auf ein definiertes globales Monster. Die oben hinzugefügte Zeile auskommentieren und das Monster wird in jedem Kampf neu sein.

2) HP scheint nach jeder Schlacht ausgereizt werden

Mal sehen, wo der HP des Spielers beeinflusst:

def attack(self, other): 
    print ("the infested marine attacks...".format(self)) 
    player.hp -= int(1) 

wo es angezeigt:

 print "HP: " + str(self.player.hp) 

Hinweis der erste Fall bezieht sich auf player.hp und der andere self.player.hp. DAMIT? Was ist der Unterschied? Betrachten Sie den folgenden Code ein:

class Prison: 

    # This is the main framework of the game 
    global battle 

    global player 
    player = Player() # 1) <-- One global player that exists no matter how many Prisons there are! 
    global monster 
    monster = Monster() 

def __init__(self): 
    self.hp = int 
    self.player = Player() # 2) <-- A player that exists PER Prison! 
    self.rooms = [] 
    self.is_playing = True 

Hinweis, dass es mindestens zwei Spieler im Spiel sind, sehen, wo Player() oben auftritt. Einer ist ein global player, der in allen Gefängnissen existiert, und es gibt nur einen und immer nur einen von ihnen! Die andere ist eine self.player, die pro Gefängnis existiert, das Sie erstellen. Das bedeutet, dass jedes Mal, wenn Sie Prison() aufrufen, die __init__-Funktion ausgeführt wird und ein neues Player für dieses Spiel erstellt wird, das nicht das gleiche wie das vorherige ist.

Das Problem ist, dass, wenn der Kampf stattfindet, der eine global player.hp betroffen ist. Aber wenn du deine HP checkst, wird das andere self.player in diesem Gefängnisspiel überprüft und das Jungs immer gesund sind, er muss nie kämpfen! FAUL! Versuchen Sie, other zu beeinflussen, die stattdessen in die Angriffsfunktion übergeben wird.

Beachten Sie, dass andere Teile des Codes wahrscheinlich auch überprüft werden müssen, wenn Sie diese globalen Referenzen ändern! Versuchen Sie nicht, globales Zeug zu verwenden, es sei denn, es macht am meisten Sinn! Sollte es ein globales Monster geben? Oder sollen Monster pro Kampf existieren?

+0

Vielen Dank für die Hilfe. Viele meiner Freunde kommentierten, wie gut deine Antwort war. –

+0

Kein Problem und danke für die Rückmeldung. Hoffe es hat das Problem gelöst. Es wird viele Fallstricke geben, wenn man neuen Code lernt, aber ein wenig Sturheit und das Wissen, wie man die richtige Frage stellt, gehen weit. – GantTheWanderer