I’m currently on the last exercise and can not understand what the " couple of problems " that Mr. Shaw mentioned after the planisphere.py code are. I am completely lost here.
I’m also on Ex52 and encountering a few issues but maybe can offer my input.
Are you referring to the global variables? They are problematic as they call variables outside of the scope of the method/function. A variable inside of a class or function is limited to the class/function. With the use of the global variable call, Python is able to use variables without this limitation. Although this sounds useful, these global calls can be exploited to reveal variable values which should remain hidden etc.
I tried to overcome the problem by using a dictionary within a class which returned the Room but encountered issues with the object being returned.
I hope this helps.
Hey, if you two have your code handy I can try to refactor it for you this week. I do a show where I demonstrate how to fix, debug, and refactor code. And @Lukehog best thing is to post a quote of what you’re referring to so I know I’m giving you the right advice.
Yes, sure.
This is my app.py file.
# create 'app' an instance of Flask
app = Flask(__name__)
# create session secret key
app.secret_key = 'Ex52'
# create root URL which redirects to /game
@app.route('/')
def index():
# creates session, takes the var @ start in planisphere.
session['room_name'] = START
return redirect(url_for('game'))
# create route for /game which takes methods 'POST', 'GET'
@app.route('/game', methods = ['POST', 'GET'])
def game():
# room name is taken from the session name
room_name = session.get('room_name')
# if page method is 'GET' invoke indented code.
if request.method == 'GET':
# if room_name exists, create var room - val from load_room(name_name)
# room = load_room(START) = 'central_corridor'
if room_name:
room = rooms.load(room_name)
return render_template('show_room.html', room = room)
else:
return render_template('you_died.html')
else:
action = request.form.get('action')
if room_name and action:
room = rooms.load(room_name)
next_room = room.go(action)
if not next_room:
session['room_name'] = rooms.load(room)
else:
session['room_name'] = rooms.load(next_room)
return redirect(url_for('game'))
if __name__ == '__main__':
app.run(debug = True)
And this is my planisphere.py
# create class 'Room'
class Room(object):
# define __init__ self function, accepts 'name', 'description'
def __init__(self, name, description):
# maps param 'name' to 'self.name = name' and 'self.description = description'
# 'self.paths = {}'
self.name = name
self.description = description
self.paths = {}
# define function go, accepts params 'self' and 'direction', it calls itself
# using self.paths.get returns the values within the dictionary assigned to
# Rooms.paths
def go(self, direction):
return self.paths.get(direction, None)
# define function 'add_paths', accepts params 'self' and 'paths' which calls
# 'self.paths.update' which is used to update the dictionary in the class
# Room.paths
def add_paths(self, paths):
self.paths.update(paths)
central_corridor = Room('Central Corridor',
"""
The Gothons of Planet Percal #25 have invaded your ship and
destroyed your entire crew. You are the last surviving member
and your last mission is to get the neutron destruct bomb
from the Weapons Armoury, put it in the bridge, and blow up
the ship up after getting into an escape pod.
You're running down the central corridor to the weapons Armoury
when a Gothon jumps out. Red scaly skin, dark grimy teeth, and
evil clown costume flowing around his hate-filled body. He's
blocking the door to the Armoury and about to pull a weapon to
blast you.
""")
laser_weapon_armoury = Room('Laser Weapon Armoury',
"""
Luckily, they make you learn Gothon insults while in the
academy. You tell the one Gothon joke you know:
'Lbhe zbgure vf fb sng, jura fur fvgf nebhaq gur ubhfr,
fur fvgf nebhaq gur ubhfr'. The Gothon stops. It tries not
to laugh but eventually it bursts out laughing and cant'
move. While he's laughing you run up and shoot the Gothon
square in the head, putting it down before jumping through
the Weapon Armoury door.
You do a diving roll into the Weapon Armoury before crouching
and scanning the room for more Gothons that might be hiding
It's dead quiet, too quiet. You stand up and run to the far
side of the room and find the neutron bomb in it's container.
There's a keypad lock on the box and you will need the code
to retrieve the bomb. If you get the code wrong 10 times then
the lock closes and can never be opened. The code is 3 digits.
""")
the_bridge = Room('The Bridge',
"""
The container clicks open and the seal breaks with a hiss
as the gas escapes. You grab the neutron bom and run as
fast as you can to the bridge where you must place it in
the right spot.
You burst onto the Bridge with the neutron bomb under your arm.
You surprise 5 Gothons who are trying to take control of the ship.
Each of them has an even uglier face and costume than the last.
They haven't pulled their weapons yet as they have seen the active
bomb under your arm and don't wish to set it off.
""")
escape_pod = Room('Escape Pod',
"""
You point your blaster at the bomb under your arm and the Gothons
put their hands up and start to move backward. Sweat beads on their
large grotesque foreheads. You inch towards the door, open it, and
then place the bomb on the floor, pointing your blaster at it. You
then jump backwards through the door, punching the close button.
You blast the lock so the Gothons can't get out. Now that the bomb
placed, you run to the escape pod to get off this tin can.
You rush through the ship desperately trying to make it to the escape
pod before the ship explodes. It seems like hardly any Gothons are onboard
the ship so you are left unhindered. You get to the chamber with the escape
pods and now need to pick one. Several have have been damaged, some more than
others, but you don't have time to check them all. There's 5 pods, which one
do you take?
""")
the_end_loser = Room('The End',
"""
You jump into pod {guess} and hit the eject button. The pop escapes out
into the void of space then implodes as the hull ruptures, crushing your
body into human jam.
""")
the_end_winner = Room('The End',
"""
You jump into pod {guess} and hit the eject button. The pod easily
slides out into space heading to the planet below. As it flies to
to the planet, you look back and see your ship explode like a bright
star, taking out the Gothon ship at the same time. You won.
""")
escape_pod.add_paths({
'2': the_end_winner,
'*': the_end_loser
})
generic_death = Room('Death', 'you died')
the_bridge.add_paths({
'throw the bomb': generic_death,
'slowly place the bomb': escape_pod
})
laser_weapon_armoury.add_paths({
'0132': the_bridge,
'*': generic_death
})
central_corridor.add_paths({
'shoot!': generic_death,
'dodge!': generic_death,
'tell a joke': laser_weapon_armoury
})
START = 'Central Corridor'
class rooms():
def __init__(self, name):
self.name = name
def load(name):
rooms = {
'Central Corridor': central_corridor,
'Escape Pod': escape_pod,
'The Bridge': the_bridge,
'Laser Weapon Armoury': laser_weapon_armoury,
'Death': generic_death,
'The End': the_end_loser,
'The End': the_end_winner
}
room = rooms[name]
return room
def name():
rooms = {
'Central Corridor': central_corridor.name,
'Escape Pod': escape_pod.name,
'The Bridge': the_bridge,
'Laser Weapon Armoury': laser_weapon_armoury.name,
'Death': generic_death.name,
'The End': the_end_loser.name,
'The End': the_end_winner.name
}
room = rooms[name]
return room
# def load_room(name):
# return globals().get(name)
#
#
# def name_room(room):
# for key, value in globals().items():
# if value == room:
# return key
While using a dictionary to hold the key and values that refer to the Rooms, the object ‘Room’ in app.py returns a JSON error within flasks debugging.
Thank you for taking a look.
Hmmm, I could go off that but do you feel like trying to get this up on github.com? It could be a very valuable skill to learn, and when you’re done I can then take it and make changes and you can see exactly what I did.
Yep, of course. I’ll just get it up online and get back with the link.
This is my GitHub repository for my LPTHW exercises.
https://github.com/baaldaimon/lpthw/tree/master/Exercises%2041%20-%2051/Ex52
Cheers.
Ok great, BUT, don’t wait around for me to solve it for you. Keep trying to figure it out.
I haven’t stopped trying to solve it as I want to try and find a solution myself.
Thank you, but I finally figured it out myself . Sorry that I am replying after a very long time. I just completed my exams. I will make sure that I add quotes and screenshots to make my question clear.
Once again, thank you.
Nice, can you summarize your solution?
It would be really helpful if you could share an outline of your solution. I’m stuck on the global variables right now as well.