# Text adventure game code

I'm just looking for someone to review this and see if it all works, here you go. I must mention that once you start this code adventure, all answers to questions must be in single quotes (i.e. ') and lowercase.

import time
items = ['backpack','deagle','stick','mushrooms']
stupid = 0
backpack = 0
deagle = 0
stick = 0
def game():
def house():
print ("You walk inside slowly, nearly crying because you are such a baby")
print ("You look around the building, there is a selection of objects on the ground, a stick, a backpack, and a deagle with 100 rounds next to it. oh and lest we not forget, some mushrooms, picking them up will make you eat them immediately.")
print ("What do you want to do now?")
items1()
def evendeeperhouse():
print ("yeet")
def deeperhouse():
global stupid
global deagle
global stick
print ("You see a Hole In The Wall near the back of the house, do you wish to go inside?[y/n]")
print ("Should you go through the Hole In The Wall, or hang out with the unknown figure creeping up behind you?")
ch5 = str(input("Do you enter? [(enter)y/(pass)n]"))
if ch5 in ['y']:
print ("*LOUD SPRINTING NOISES* You run through the hole as fast as possible. you can hear the other being clanging a metal bar as he attempts to follow you. What do you do.")
if stupid > 4:
print ("Your level of Stupid is",stupid,"so you manage to hit your head on your way through the human sized hole, congrats, you are now even more stupid. Sadly, you did escape deeper into the house. Stupid +4")
stupid += 4
evendeeperhouse()
else:
print ("you now have a small selection of choices")
ch6 = str(input("Wanna use an item? or nah? [stick",stick,",deagle",deagle,"/(keep running)n]"))
if ch6 in ['deagle']:
print ("You turn around and fire 72 rounds into the being, as you investigate the rags remaining, you realize that you recognize the face, then realize that this guy isnt holding a metal bar, and hes wearing a uniform, oh man, you killed a cop, nice going, now they will just leave you here to die, but perhaps his vehicle is still here, you move on.")
time.sleep(3)
if ch6 in ['stick']:
print ("you turn around and stab at the being, shooing them off barely as you head into the deeper house")
print ("The tunnel collapses behind you, hopefully you wont see that creature again.")

else:
print ("You decide to turn away from the hole and end up making conversation with this creature, you both wind up finding a game of chess, playing, talking about eachother and whatnot, and you learn that they just wanted someone to play a game with, wow, fascinating, its a shame you beat a phsychotic murderer at chess, you shouldve let him win.")
time.sleep(.5)
print ("Achievement Get!")
time.sleep(.5)
print ("Metal Bar Lodged Through Spine")
time.sleep(.5)
print ("Shouldve let him win... *sigh*")
time.sleep(2)
game()
def foresttrail():
print("You leave the house with nothing but a backpack, congrats, you will likely die out here. you can see two more buildings ahead, they are in far worse shape, there is a flashlight on the ground as well, what do you do?")
def items1():
global items
global deagle
global backpack
global stick
global stupid
for x in range(4):
ch4 = str(input("Type what you would like to pick up if anything, or say no to move on like a brave little boy. [Deagle/Stick/Backpack/Mushrooms/N]"))
if "backpack" in ch4:
backpack +=1
print ("alright, you got a thug bag now, what would you like to steal?")
print ch4
print backpack
if "deagle" in ch4:
deagle+=1

if stupid > 0:
print ('alright, you got a Loaded Illegal Firearm now, youve got a stupid level of', stupid, 'you sure you know how to use this?')
else:
print ("Alright you got a gun, congrats bud, dont get yourself killed.")
print ch4
print deagle
if "stick" in ch4:
stick +=1
print ("alright, you got a stick now, in your case, this is better than the gun.")
print ch4
print stick

if "mushrooms" in ch4:
stupid +=3
print ("alright, you ate the shrooms, now you are 3 times more stupid, congrats... Stupid +3")
print ch4
print stupid
if ch4 not in items:
stupid +=1
print ("that's not a valid choice. Stupid +1")

if 'n'in ch4:
stupid + 3
print ("Somehow you manage to drop anything you just picked up and decide to leave.")
stick == 0
deagle == 0
backpack == 0

print ("Narrator-No? NO?!?! you just REFUSE?! *Thunder Cracks as a large storm has appeared outside* *The voice is Grim* You've made a mistake, Move Along.")
print ("Probably gonna die tbh")
foresttrail()
deeperhouse()

# game function
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
print ("Welcome to the Text Based Adventure!")
print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
deagle == 0
backpack == 0
stick == 0
stupid == 0

time.sleep(1.5)

print ("You are walking down a forest trail among a dense stand of trees. Ahead you see a clearing. As you enter the clearing, you see the trail continue off to the south. In the clearing is a little hut about 6 feet tall.")
ch1 = str(input("Do you head down the trail(y)? I think you should go to the trail [y/y]: "))
if ch1 in ['y', 'Y']:
print("Sorry bud, the trail is FILLED with wolves, you are dead.")
game()

# Trail NOT Followed
else:
print("You decide to go look at the house first. How dare you defy me tiny being, you will pay later on.")

print ("Should you knock on the door, or pass by?")
ch2 = str(input("Do you knock? [(knock)y/(pass)n]"))
if ch2 in ['y', 'Y']:
print ("BangBangBang.” You knock on the door, but even if someone was home, your weak arms didnt make enough noise for them to hear you. The door isn’t locked. Should you open it and commit a crime?")
else:
print ("You walk away from the house slowly because you are too scared, lucky for you, a car happens to pull up, oh no! they cant stop because of the mud, they slam into you and you die on impact, twas a shame.")
time.sleep(1)
game()
ch3 = str(input("Do you enter? [y/n]"))
if ch3 in ['y', 'Y']:
house()
elif ch3 in ['n','N']:
print ("You walk away from the house slowly because you are too scared, lucky for you, a car happens to pull up, oh no! they cant stop because of the mud, they slam into you and you die on impact, twas a shame it had to end this way, well, for you, im laughing.")
game()

• Is this supposed to be used with Python 2 or Python 3? If it's really Python 3 as the tag suggests, the code is not working correctly, since there are a few spots where you're missing the (...) behind print. – AlexV Mar 28 '19 at 21:40
• Leaving items aside, a text adventure is basically a directed graph: Each room is a node and you can move from one room to another depending on the edges. You could try to separate the game logic (moving between rooms) from the game data (room content, possible answers, connections between rooms). This way, you could add new rooms or change the texts just by modifying some data files without touching the python code. Once you have done this, you could try to implement how the items and the other global variables of your example are handled in a data-driven way. – pschill Mar 29 '19 at 9:37
• If your goal is to make a quality text adventure, rather than to learn python, you might want to look into one of the languages specifically designed for them like Inform, TADS, or Hugo. They or their standard libraries handle a lot of common difficult pieces like parsing typed commands, modeling objects and verbs, etc. – aschepler Mar 29 '19 at 11:01

Welcome to CodeReview. Your program is a fun start to programming, and Python is a great way to learn. For the following topics, I'm going to trust your ability to google, but if you can't find the appropriate documentation leave a comment and I'll add some links.

## Avoid globals

Sometimes globals can be useful, but more often they hinder a developer's ability to maintain and debug code. It's a better idea to group related variables together into a class. This applies to the following variables:

items = ['backpack','deagle','stick','mushrooms']
stupid = 0
backpack = 0
deagle = 0
stick = 0


## Avoid stringly-typed objects

These things:

items = ['backpack','deagle','stick','mushrooms']


are strings. But in this case, it's not very good practice to handle them as strings until they need to be presented to the user. In other words, in this statement:

if "mushrooms" in ch4:


What if you misspelled 'mushrooms'? You wouldn't know until halfway through a program run; in other words, string-typing hinders static analysis, among other problems. One solution to this is to have an enum: a kind of object that can take only one of a set of mutually exclusive values. In other words, an item can be only a backpack, or a deagle, or a stick, or a mushroom. Python IDEs are better able to perform static analysis on this, and programmers make fewer errors when following this strategy.

## Indenting

For legibility, you should ensure that each additional level of indentation only introduces 3-4 characters - pick one and stick with it. This:

    def items1():
global items


is too far in for the comfort of most developers.

## These aren't assignments

    deagle == 0
backpack == 0
stick == 0
stupid == 0


They're comparisons. Assignments need only one =.

## Input comparison

This:

if ch3 in ['y', 'Y']:


is more easily done by first converting the character to lowercase, and then comparing it to a single character; in other words:

if ch3.lower() == 'y':

• @Alex thanks; language cross talk. – Reinderien Mar 28 '19 at 23:59

There are a few points I would like to add ontop of the feedback already given by Reinderien.

## Remove nested functions

There is no good reason to define house(), deeperhouse(), etc. inside of game(). If your plan was to hide them from the user in this ways, you have probably chosen the wrong language. If you intend to indicate that these are not to be used directly, prefix their name with a leading underscore _house(). This is a common convention to notify others that these functions are not intended to be used by them and are subject to change/removal/... without further notice.

Also think about how you use these functions. Basically, your game's "flow" is encoded in them by calling deeper and deeper into other functions without ever returning.

## Break lines to improve readability

Your text message come in super-long lines of text. Most text editors support automatic line breaking or soft wrap to cram those lines to the available screen width, but some don't (like the code preview here) or are deliberately configured not to do so. So be nice and break your lines if they get to long.
Python's official style guide recommends 79/80 characters as maximum line length, although most modern IDEs and their style tools let you get away with about 100 (without manual tweaking) before getting upset.
Python allows you to do this within the parenthesis of a function call without further line continuation markers.

Applying this to house(), your code could look like this:

def house():
print("You walk inside slowly, nearly crying because you are such a baby")
print("You look around the building, there is a selection of objects on the ground, "
"a stick, a backpack, and a deagle with 100 rounds next to it. oh and lest we not "
"forget, some mushrooms, picking them up will make you eat them immediately.")
print("What do you want to do now?")
items1()


For more information on this refer to the previous link.

• I'm rather startled that you're just telling OP to unindent the nested functions, when they are clearly using function calls as a substitute for goto. Nothing ever returns! – Kevin Mar 28 '19 at 23:46
• @Kevin: Yep, that's absolutely true and I'm fully aware of this. I added a note on that topic, but without further explanation towards a solution. Feel free to give the OP feedback yourself, and I will be happy to upvote your answer! – AlexV Mar 29 '19 at 0:02
• I'd also offer that either a single print with a docstring, or a single print with implicit string concatenation - print("foo" "bar") - are more appropriate than multiple prints. – Reinderien Mar 29 '19 at 0:48