From 77b1fdba250248dcc3ddee2161420f5af6c9fbbb Mon Sep 17 00:00:00 2001 From: thaisternus Date: Fri, 16 Apr 2021 18:19:12 -0300 Subject: [PATCH 01/11] escape_v1 --- .DS_Store | Bin 0 -> 6148 bytes .../sample-code-checkpoint.ipynb | 304 ++++++++++++++++++ your-code/sample-code.ipynb | 126 ++++++-- 3 files changed, 395 insertions(+), 35 deletions(-) create mode 100644 .DS_Store create mode 100644 your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3dcd9092d222cf11a39611e0626a9bc24356afde GIT binary patch literal 6148 zcmeHKJ5EC}5S)b+L1|J_`T{AqffXeu-~xy|x=2q7Nlu zk6wbLoQI;@%xtDCJl6pPz=ev5QiPt+&{q`;*D z_qkkq{om97=>IQCT1f#Za8nA{V)wk;@<~-&XOHt*+vqQJ&-tReaUK*7QI3gGj=Au1 e{1{1@*L=?XUN|KNo$;U(^)ukQ$fUr3EAS16%oQL2 literal 0 HcmV?d00001 diff --git a/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb new file mode 100644 index 00000000..5069a335 --- /dev/null +++ b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# define rooms and items\n", + "\n", + "couch = {\n", + " \"name\": \"couch\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_a = {\n", + " \"name\": \"door a\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_a = {\n", + " \"name\": \"key for door a\",\n", + " \"type\": \"key\",\n", + " \"target\": door_a,\n", + "}\n", + "\n", + "piano = {\n", + " \"name\": \"piano\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "game_room = {\n", + " \"name\": \"game room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom 1\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "queen_bed = {\n", + " \"name\": \"queen bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_b = {\n", + " \"name\": \"door b\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom 2\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "double_bed = {\n", + " \"name\": \"double bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "dresser = {\n", + " \"name\": \"dresser\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "\n", + "living_room = {\n", + " \"name\": \"living room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "dining_table = {\n", + " \"name\": \"dining table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door d\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", + "}\n", + "\n", + "outside = {\n", + " \"name\": \"outside\"\n", + "}\n", + "\n", + "all_rooms = [game_room, outside,bedroom_1,bedroom_2,living_room]\n", + "\n", + "all_doors = [door_a,door_b,door_c,door_d]\n", + "\n", + "# define which items/rooms are related\n", + "\n", + "object_relations = {\n", + " \"game room\": [couch, piano, door_a],\n", + " \"bedroom 1\": [queen_bed, door_a, door_b, door_c],\n", + " \"bedroom 2\": [double_bed, dresser, door_b],\n", + " \"living room\":[dining_table, door_c, door_d],\n", + " \"piano\": [key_a],\n", + " \"queen bed\": [key_b],\n", + " \"double bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"outside\": [door_a],\n", + " \"door a\": [game_room, bedroom_1],\n", + " \"door b\": [bedroom_1, bedroom_2],\n", + " \"door c\": [bedroom_1, living_room],\n", + " \"door d\": [living_room, outside],\n", + "\n", + "}\n", + "\n", + "# define game state. Do not directly change this dict. \n", + "# Instead, when a new game starts, make a copy of this\n", + "# dict and use the copy to store gameplay state. This \n", + "# way you can replay the game multiple times.\n", + "\n", + "INIT_GAME_STATE = {\n", + " \"current_room\": game_room,\n", + " \"keys_collected\": [],\n", + " \"target_room\": outside\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def linebreak():\n", + " \"\"\"\n", + " Print a line break\n", + " \"\"\"\n", + " print(\"\\n\\n\")\n", + "\n", + "def start_game():\n", + " \"\"\"\n", + " Start the game\n", + " \"\"\"\n", + " print(\"You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\")\n", + " play_room(game_state[\"current_room\"])\n", + "\n", + "def play_room(room):\n", + " \"\"\"\n", + " Play a room. First check if the room being played is the target room.\n", + " If it is, the game will end with success. Otherwise, let player either \n", + " explore (list all items in this room) or examine an item found here.\n", + " \"\"\"\n", + " game_state[\"current_room\"] = room\n", + " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", + " print(\"Congrats! You escaped the room!\")\n", + " else:\n", + " print(\"You are now in \" + room[\"name\"])\n", + " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'?\").strip()\n", + " if intended_action == \"explore\":\n", + " explore_room(room)\n", + " play_room(room)\n", + " elif intended_action == \"examine\":\n", + " examine_item(input(\"What would you like to examine?\").strip())\n", + " else:\n", + " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", + " play_room(room)\n", + " linebreak()\n", + "\n", + "def explore_room(room):\n", + " \"\"\"\n", + " Explore a room. List all items belonging to this room.\n", + " \"\"\"\n", + " items = [i[\"name\"] for i in object_relations[room[\"name\"]]]\n", + " print(\"You explore the room. This is \" + room[\"name\"] + \". You find \" + \", \".join(items))\n", + "\n", + "def get_next_room_of_door(door, current_room):\n", + " \"\"\"\n", + " From object_relations, find the two rooms connected to the given door.\n", + " Return the room that is not the current_room.\n", + " \"\"\"\n", + " connected_rooms = object_relations[door[\"name\"]]\n", + " for room in connected_rooms:\n", + " if(not current_room == room):\n", + " return room\n", + "\n", + "def examine_item(item_name):\n", + " \"\"\"\n", + " Examine an item which can be a door or furniture.\n", + " First make sure the intended item belongs to the current room.\n", + " Then check if the item is a door. Tell player if key hasn't been \n", + " collected yet. Otherwise ask player if they want to go to the next\n", + " room. If the item is not a door, then check if it contains keys.\n", + " Collect the key if found and update the game state. At the end,\n", + " play either the current or the next room depending on the game state\n", + " to keep playing.\n", + " \"\"\"\n", + " current_room = game_state[\"current_room\"]\n", + " next_room = \"\"\n", + " output = None\n", + " \n", + " for item in object_relations[current_room[\"name\"]]:\n", + " if(item[\"name\"] == item_name):\n", + " output = \"You examine \" + item_name + \". \"\n", + " if(item[\"type\"] == \"door\"):\n", + " have_key = False\n", + " for key in game_state[\"keys_collected\"]:\n", + " if(key[\"target\"] == item):\n", + " have_key = True\n", + " if(have_key):\n", + " output += \"You unlock it with a key you have.\"\n", + " next_room = get_next_room_of_door(item, current_room)\n", + " else:\n", + " output += \"It is locked but you don't have the key.\"\n", + " else:\n", + " if(item[\"name\"] in object_relations and len(object_relations[item[\"name\"]])>0):\n", + " item_found = object_relations[item[\"name\"]].pop()\n", + " game_state[\"keys_collected\"].append(item_found)\n", + " output += \"You find \" + item_found[\"name\"] + \".\"\n", + " else:\n", + " output += \"There isn't anything interesting about it.\"\n", + " print(output)\n", + " break\n", + "\n", + " if(output is None):\n", + " print(\"The item you requested is not found in the current room.\")\n", + " \n", + " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", + " play_room(next_room)\n", + " else:\n", + " play_room(current_room)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\n", + "You are now in game room\n" + ] + } + ], + "source": [ + "game_state = INIT_GAME_STATE.copy()\n", + "\n", + "start_game()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index a6f8a94d..5069a335 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -34,21 +34,105 @@ " \"type\": \"room\",\n", "}\n", "\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom 1\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "queen_bed = {\n", + " \"name\": \"queen bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_b = {\n", + " \"name\": \"door b\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom 2\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "double_bed = {\n", + " \"name\": \"double bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "dresser = {\n", + " \"name\": \"dresser\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "\n", + "living_room = {\n", + " \"name\": \"living room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "dining_table = {\n", + " \"name\": \"dining table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door d\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", + "}\n", + "\n", "outside = {\n", " \"name\": \"outside\"\n", "}\n", "\n", - "all_rooms = [game_room, outside]\n", + "all_rooms = [game_room, outside,bedroom_1,bedroom_2,living_room]\n", "\n", - "all_doors = [door_a]\n", + "all_doors = [door_a,door_b,door_c,door_d]\n", "\n", "# define which items/rooms are related\n", "\n", "object_relations = {\n", " \"game room\": [couch, piano, door_a],\n", + " \"bedroom 1\": [queen_bed, door_a, door_b, door_c],\n", + " \"bedroom 2\": [double_bed, dresser, door_b],\n", + " \"living room\":[dining_table, door_c, door_d],\n", " \"piano\": [key_a],\n", + " \"queen bed\": [key_b],\n", + " \"double bed\": [key_c],\n", + " \"dresser\": [key_d],\n", " \"outside\": [door_a],\n", - " \"door a\": [game_room, outside]\n", + " \"door a\": [game_room, bedroom_1],\n", + " \"door b\": [bedroom_1, bedroom_2],\n", + " \"door c\": [bedroom_1, living_room],\n", + " \"door d\": [living_room, outside],\n", + "\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -162,7 +246,7 @@ " if(output is None):\n", " print(\"The item you requested is not found in the current room.\")\n", " \n", - " if(next_room and input(\"Do you want to go to the next room? Ener 'yes' or 'no'\").strip() == 'yes'):\n", + " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", " play_room(next_room)\n", " else:\n", " play_room(current_room)" @@ -170,7 +254,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -178,35 +262,7 @@ "output_type": "stream", "text": [ "You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\n", - "You are now in game room\n", - "What would you like to do? Type 'explore' or 'examine'?explore\n", - "You explore the room. This is game room. You find couch, piano, door a\n", - "You are now in game room\n", - "What would you like to do? Type 'explore' or 'examine'?examine\n", - "What would you like to examine?door a\n", - "You examine door a. It is locked but you don't have the key.\n", - "You are now in game room\n", - "What would you like to do? Type 'explore' or 'examine'?examine\n", - "What would you like to examine?piano\n", - "You examine piano. You find key for door a.\n", - "You are now in game room\n", - "What would you like to do? Type 'explore' or 'examine'?examine\n", - "What would you like to examine?door a\n", - "You examine door a. You unlock it with a key you have.\n", - "Do you want to go to the next room? Ener 'yes' or 'no'yes\n", - "Congrats! You escaped the room!\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "You are now in game room\n" ] } ], @@ -240,7 +296,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.9.2" } }, "nbformat": 4, From fb581a64ebba5ab7a35704d5739b2b85bc7b7a95 Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Sat, 17 Apr 2021 12:57:51 +0100 Subject: [PATCH 02/11] [Cat][add lower()] --- your-code/code.py | 245 ++++++++++++++++++++++++++++++++++++ your-code/sample-code.ipynb | 57 +++++++-- 2 files changed, 292 insertions(+), 10 deletions(-) create mode 100644 your-code/code.py diff --git a/your-code/code.py b/your-code/code.py new file mode 100644 index 00000000..96c7ee3b --- /dev/null +++ b/your-code/code.py @@ -0,0 +1,245 @@ +#Python Game + +# define rooms and items + +couch = { + "name": "couch", + "type": "furniture", +} + +door_a = { + "name": "door a", + "type": "door", +} + +key_a = { + "name": "key for door a", + "type": "key", + "target": door_a, +} + +piano = { + "name": "piano", + "type": "furniture", +} + +game_room = { + "name": "game room", + "type": "room", +} + +bedroom_1 = { + "name": "bedroom 1", + "type": "room", +} + +queen_bed = { + "name": "queen bed", + "type": "furniture", +} + +door_b = { + "name": "door b", + "type": "door", +} + +key_b = { + "name": "key for door b", + "type": "key", + "target": door_b, +} + +door_c = { + "name": "door c", + "type": "door", +} + +bedroom_2 = { + "name": "bedroom 2", + "type": "room", +} + +double_bed = { + "name": "double bed", + "type": "furniture", +} + +dresser = { + "name": "dresser", + "type": "furniture", +} + + +living_room = { + "name": "living room", + "type": "room", +} + +dining_table = { + "name": "dining table", + "type": "furniture", +} + +door_c = { + "name": "door c", + "type": "door", +} + +key_c = { + "name": "key for door c", + "type": "key", + "target": door_c, +} + +door_d = { + "name": "door d", + "type": "door", +} + +key_d = { + "name": "key for door d", + "type": "key", + "target": door_d, +} + +outside = { + "name": "outside" +} + +all_rooms = [game_room, outside,bedroom_1,bedroom_2,living_room] + +all_doors = [door_a,door_b,door_c,door_d] + +# define which items/rooms are related + +object_relations = { + "game room": [couch, piano, door_a], + "bedroom 1": [queen_bed, door_a, door_b, door_c], + "bedroom 2": [double_bed, dresser, door_b], + "living room":[dining_table, door_c, door_d], + "piano": [key_a], + "queen bed": [key_b], + "double bed": [key_c], + "dresser": [key_d], + "outside": [door_a], + "door a": [game_room, bedroom_1], + "door b": [bedroom_1, bedroom_2], + "door c": [bedroom_1, living_room], + "door d": [living_room, outside], + +} + +# define game state. Do not directly change this dict. +# Instead, when a new game starts, make a copy of this +# dict and use the copy to store gameplay state. This +# way you can replay the game multiple times. + +INIT_GAME_STATE = { + "current_room": game_room, + "keys_collected": [], + "target_room": outside +} + +#Print a line break +def linebreak(): + print("\n\n") + + +#Start the game +def start_game(): + print("You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!") + play_room(game_state["current_room"]) + + +#Play a room. First check if the room being played is the target room. +#If it is, the game will end with success. Otherwise, let player either +#explore (list all items in this room) or examine an item found here. + +def play_room(room): + game_state["current_room"] = room + if(game_state["current_room"] == game_state["target_room"]): + print("Congrats! You escaped the room!") + else: + print("You are now in " + room["name"]) + intended_action = input("What would you like to do? Type 'explore' or 'examine'?").lower().strip() + if intended_action == "explore": + explore_room(room) + play_room(room) + elif intended_action == "examine": + examine_item(input("What would you like to examine?").lower().strip()) + else: + print("Not sure what you mean. Type 'explore' or 'examine'.") + play_room(room) + linebreak() + + +#Explore a room. List all items belonging to this room. + +def explore_room(room): + + items = [i["name"] for i in object_relations[room["name"]]] + print("You explore the room. This is " + room["name"] + ". You find " + ", ".join(items)) + + +#From object_relations, find the two rooms connected to the given door. +#Return the room that is not the current_room. + +def get_next_room_of_door(door, current_room): + connected_rooms = object_relations[door["name"]] + for room in connected_rooms: + if(not current_room == room): + return room + + + +#Examine an item which can be a door or furniture. +#First make sure the intended item belongs to the current room. +#Then check if the item is a door. Tell player if key hasn't been +#collected yet. Otherwise ask player if they want to go to the next +#room. If the item is not a door, then check if it contains keys. +#Collect the key if found and update the game state. At the end, +#play either the current or the next room depending on the game state +#to keep playing. + + +def examine_item(item_name): + current_room = game_state["current_room"] + next_room = "" + output = None + + for item in object_relations[current_room["name"]]: + if(item["name"] == item_name): + output = "You examine " + item_name + ". " + if(item["type"] == "door"): + have_key = False + for key in game_state["keys_collected"]: + if(key["target"] == item): + have_key = True + if(have_key): + output += "You unlock it with a key you have." + next_room = get_next_room_of_door(item, current_room) + else: + output += "It is locked but you don't have the key." + else: + if(item["name"] in object_relations and len(object_relations[item["name"]])>0): + item_found = object_relations[item["name"]].pop() + game_state["keys_collected"].append(item_found) + output += "You find " + item_found["name"] + "." + else: + output += "There isn't anything interesting about it." + print(output) + break + + if(output is None): + print("The item you requested is not found in the current room.") + + if(next_room and input("Do you want to go to the next room? Enter 'yes' or 'no'").lower().strip() == 'yes'): + play_room(next_room) + else: + play_room(current_room) + +#start the game + +game_state = INIT_GAME_STATE.copy() + +start_game() diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index 5069a335..eeedf3ca 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -177,12 +177,12 @@ " print(\"Congrats! You escaped the room!\")\n", " else:\n", " print(\"You are now in \" + room[\"name\"])\n", - " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'?\").strip()\n", + " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'?\").lower().strip()\n", " if intended_action == \"explore\":\n", " explore_room(room)\n", " play_room(room)\n", " elif intended_action == \"examine\":\n", - " examine_item(input(\"What would you like to examine?\").strip())\n", + " examine_item(input(\"What would you like to examine?\").lower().strip())\n", " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", " play_room(room)\n", @@ -246,7 +246,7 @@ " if(output is None):\n", " print(\"The item you requested is not found in the current room.\")\n", " \n", - " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", + " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").lower().strip() == 'yes'):\n", " play_room(next_room)\n", " else:\n", " play_room(current_room)" @@ -254,16 +254,54 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\n", + "You are now in game room\n", + "You examine door a. It is locked but you don't have the key.\n", + "You are now in game room\n", + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in game room\n", + "The item you requested is not found in the current room.\n", + "You are now in game room\n", + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in game room\n", + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in game room\n", + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in game room\n", + "Not sure what you mean. Type 'explore' or 'examine'.\n", "You are now in game room\n" ] + }, + { + "output_type": "error", + "ename": "KeyboardInterrupt", + "evalue": "Interrupted by user", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mgame_state\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mINIT_GAME_STATE\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mstart_game\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 10\u001b[0m \"\"\"\n\u001b[0;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgame_state\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"current_room\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mintended_action\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"examine\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 30\u001b[1;33m \u001b[0mexamine_item\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"What would you like to examine?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mexamine_item\u001b[1;34m(item_name)\u001b[0m\n\u001b[0;32m 95\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnext_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 96\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 97\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcurrent_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mintended_action\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"examine\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 30\u001b[1;33m \u001b[0mexamine_item\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"What would you like to examine?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mexamine_item\u001b[1;34m(item_name)\u001b[0m\n\u001b[0;32m 95\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnext_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 96\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 97\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcurrent_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"You are now in \"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mroom\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"name\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 25\u001b[1;33m \u001b[0mintended_action\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"What would you like to do? Type 'explore' or 'examine'?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 26\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mintended_action\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"explore\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[0mexplore_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\ipykernel\\kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 846\u001b[0m \u001b[1;34m\"raw_input was called, but this frontend does not support input requests.\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 847\u001b[0m )\n\u001b[1;32m--> 848\u001b[1;33m return self._input_request(str(prompt),\n\u001b[0m\u001b[0;32m 849\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 850\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\ipykernel\\kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 890\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 891\u001b[0m \u001b[1;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 892\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Interrupted by user\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 893\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 894\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwarning\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Invalid Message:\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + ] } ], "source": [ @@ -282,9 +320,8 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + "name": "python392jvsc74a57bd07101ece57323ae226d3ee33127f20849298572704d5292ba75a6e287de47f3f2", + "display_name": "Python 3.9.2 64-bit" }, "language_info": { "codemirror_mode": { @@ -296,9 +333,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2" + "version": "3.9.2-final" } }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file From 1bb779fad5828f344f1de4502326f1c57f4c4dad Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Sat, 17 Apr 2021 18:13:05 +0100 Subject: [PATCH 03/11] [Cat][Add New game option] --- your-code/__pycache__/code.cpython-39.pyc | Bin 0 -> 3845 bytes your-code/code.py | 14 +++- your-code/sample-code.ipynb | 86 ++++++---------------- 3 files changed, 32 insertions(+), 68 deletions(-) create mode 100644 your-code/__pycache__/code.cpython-39.pyc diff --git a/your-code/__pycache__/code.cpython-39.pyc b/your-code/__pycache__/code.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5815b2f27c33b6ef53c23f6e6097aa53ac08a722 GIT binary patch literal 3845 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 literal 0 HcmV?d00001 diff --git a/your-code/code.py b/your-code/code.py index 96c7ee3b..d22a79c0 100644 --- a/your-code/code.py +++ b/your-code/code.py @@ -170,7 +170,7 @@ def play_room(room): else: print("Not sure what you mean. Type 'explore' or 'examine'.") play_room(room) - linebreak() + #linebreak() #Explore a room. List all items belonging to this room. @@ -240,6 +240,12 @@ def examine_item(item_name): #start the game -game_state = INIT_GAME_STATE.copy() - -start_game() +while True: + INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + game_state = INIT_GAME_STATE.copy() + start_game() + restart = input("New Game: Yes or No?").lower().strip() + if restart == "No": + break + elif restart == "Yes": + continue diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index eeedf3ca..dd8fec36 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -2,10 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "#Python Game\n", + "\n", "# define rooms and items\n", "\n", "couch = {\n", @@ -127,7 +129,7 @@ " \"queen bed\": [key_b],\n", " \"double bed\": [key_c],\n", " \"dresser\": [key_d],\n", - " \"outside\": [door_a],\n", + " \"outside\": [door_d],\n", " \"door a\": [game_room, bedroom_1],\n", " \"door b\": [bedroom_1, bedroom_2],\n", " \"door c\": [bedroom_1, living_room],\n", @@ -149,8 +151,10 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, + "execution_count": null, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "def linebreak():\n", @@ -186,7 +190,7 @@ " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", " play_room(room)\n", - " linebreak()\n", + " #linebreak()\n", "\n", "def explore_room(room):\n", " \"\"\"\n", @@ -249,65 +253,19 @@ " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").lower().strip() == 'yes'):\n", " play_room(next_room)\n", " else:\n", - " play_room(current_room)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\n", - "You are now in game room\n", - "You examine door a. It is locked but you don't have the key.\n", - "You are now in game room\n", - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in game room\n", - "The item you requested is not found in the current room.\n", - "You are now in game room\n", - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in game room\n", - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in game room\n", - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in game room\n", - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in game room\n" - ] - }, - { - "output_type": "error", - "ename": "KeyboardInterrupt", - "evalue": "Interrupted by user", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mgame_state\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mINIT_GAME_STATE\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mstart_game\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m\u001b[0m in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 10\u001b[0m \"\"\"\n\u001b[0;32m 11\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 12\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgame_state\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"current_room\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mintended_action\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"examine\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 30\u001b[1;33m \u001b[0mexamine_item\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"What would you like to examine?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mexamine_item\u001b[1;34m(item_name)\u001b[0m\n\u001b[0;32m 95\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnext_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 96\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 97\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcurrent_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mintended_action\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"examine\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 30\u001b[1;33m \u001b[0mexamine_item\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"What would you like to examine?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mexamine_item\u001b[1;34m(item_name)\u001b[0m\n\u001b[0;32m 95\u001b[0m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnext_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 96\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 97\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcurrent_room\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Not sure what you mean. Type 'explore' or 'examine'.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 33\u001b[1;33m \u001b[0mplay_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 34\u001b[0m \u001b[0mlinebreak\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 35\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m\u001b[0m in \u001b[0;36mplay_room\u001b[1;34m(room)\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"You are now in \"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mroom\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"name\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 25\u001b[1;33m \u001b[0mintended_action\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minput\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"What would you like to do? Type 'explore' or 'examine'?\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlower\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 26\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mintended_action\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"explore\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 27\u001b[0m \u001b[0mexplore_room\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mroom\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\ipykernel\\kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 846\u001b[0m \u001b[1;34m\"raw_input was called, but this frontend does not support input requests.\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 847\u001b[0m )\n\u001b[1;32m--> 848\u001b[1;33m return self._input_request(str(prompt),\n\u001b[0m\u001b[0;32m 849\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 850\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32m~\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages\\ipykernel\\kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 890\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 891\u001b[0m \u001b[1;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 892\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Interrupted by user\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 893\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 894\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwarning\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Invalid Message:\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" - ] - } - ], - "source": [ - "game_state = INIT_GAME_STATE.copy()\n", - "\n", - "start_game()" + " play_room(current_room)\n", + "\n", + "\n", + "while True:\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy()\n", + " start_game()\n", + " restart = input(\"New Game: Yes or No?\").lower().strip()\n", + " if restart == \"No\":\n", + " break\n", + " elif restart == \"Yes\":\n", + " continue\n", + "\n" ] }, { From 3dabe78de131f3e6b22e67fca5b7cb84edd137f9 Mon Sep 17 00:00:00 2001 From: thaisternus Date: Tue, 20 Apr 2021 22:53:55 -0300 Subject: [PATCH 04/11] [python-project][kitchen-monster] --- .DS_Store | Bin 6148 -> 6148 bytes .../sample-code-2-checkpoint.ipynb | 373 ++++++++++++++++++ your-code/.DS_Store | Bin 0 -> 6148 bytes your-code/__pycache__/code.cpython-38.pyc | Bin 0 -> 3968 bytes your-code/__pycache__/code.cpython-39.pyc | Bin 3845 -> 3962 bytes your-code/sample-code-2.ipynb | 373 ++++++++++++++++++ your-code/sample-code.ipynb | 190 +++------ your-code/sample-code.py | 333 ++++++++++++++++ 8 files changed, 1142 insertions(+), 127 deletions(-) create mode 100644 .ipynb_checkpoints/sample-code-2-checkpoint.ipynb create mode 100644 your-code/.DS_Store create mode 100644 your-code/__pycache__/code.cpython-38.pyc create mode 100644 your-code/sample-code-2.ipynb create mode 100644 your-code/sample-code.py diff --git a/.DS_Store b/.DS_Store index 3dcd9092d222cf11a39611e0626a9bc24356afde..acb8a41d64e7c48d36e668b12bc981b118efba06 100644 GIT binary patch delta 84 zcmZoMXfc=|&e%S&P;8=}A|unp0PD#HA}ka8^YMa?P1UMMmHeUSBJeglamz9x$ Mf#JYrTam-e01G@3lmGw# diff --git a/.ipynb_checkpoints/sample-code-2-checkpoint.ipynb b/.ipynb_checkpoints/sample-code-2-checkpoint.ipynb new file mode 100644 index 00000000..52f1ece0 --- /dev/null +++ b/.ipynb_checkpoints/sample-code-2-checkpoint.ipynb @@ -0,0 +1,373 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define rooms and items\n", + "\n", + "couch = {\n", + " \"name\": \"couch\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_a = {\n", + " \"name\": \"door a\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_a = {\n", + " \"name\": \"key for door a\",\n", + " \"type\": \"key\",\n", + " \"target\": door_a,\n", + "}\n", + "\n", + "piano = {\n", + " \"name\": \"piano\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "game_room = {\n", + " \"name\": \"game room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom 1\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "queen_bed = {\n", + " \"name\": \"queen bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "closet = {\n", + " \"name\": \"closet\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "monster = {\n", + " \"name\": \"monster\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_b = {\n", + " \"name\": \"door b\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom 2\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "double_bed = {\n", + " \"name\": \"double bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "dresser = {\n", + " \"name\": \"dresser\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "kitchen = {\n", + " \"name\": \"kitchen\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "cup_board = {\n", + " \"name\": \"cup board\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "fridge = {\n", + " \"name\": \"fridge\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "cooker = {\n", + " \"name\": \"cooker\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door d\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", + "}\n", + "\n", + "living_room = {\n", + " \"name\": \"living room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "dining_table = {\n", + " \"name\": \"dining table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", + "}\n", + "\n", + "door_e = {\n", + " \"name\": \"door e\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_e = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_e,\n", + "}\n", + "\n", + "\n", + "\n", + "outside = {\n", + " \"name\": \"outside\"\n", + "}\n", + "\n", + "all_rooms = [game_room, outside,bedroom_1,bedroom_2,kitchen,living_room]\n", + "\n", + "all_doors = [door_a,door_b,door_c,door_d,door_d]\n", + "\n", + "# define which items/rooms are related\n", + "\n", + "object_relations = {\n", + " \"game room\": [couch, piano, door_a],\n", + " \"bedroom 1\": [queen_bed, closet, door_a, door_b, door_c],\n", + " \"bedroom 2\": [double_bed, dresser, door_b],\n", + " \"kitchen\": [cup_board, fridge, cooker, door_c, door_d],\n", + " \"living room\":[dining_table, door_d, door_e],\n", + " \"closet\": [monster],\n", + " \"piano\": [key_a],\n", + " \"queen bed\": [key_b],\n", + " \"double bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"cup board\": [key_e],\n", + " \"outside\": [door_e],\n", + " \"door a\": [game_room, bedroom_1],\n", + " \"door b\": [bedroom_1, bedroom_2],\n", + " \"door c\": [bedroom_1, kitchen],\n", + " \"door d\": [kitchen, living_room],\n", + " \"door e\": [living_room, outside],\n", + "\n", + "}\n", + "\n", + "# define game state. Do not directly change this dict. \n", + "# Instead, when a new game starts, make a copy of this\n", + "# dict and use the copy to store gameplay state. This \n", + "# way you can replay the game multiple times.\n", + "\n", + "INIT_GAME_STATE = {\n", + " \"current_room\": game_room,\n", + " \"keys_collected\": [],\n", + " \"target_room\": outside\n", + " \n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def linebreak():\n", + " \"\"\"\n", + " Print a line break\n", + " \"\"\"\n", + " print(\"\\n\\n\")\n", + "\n", + "def start_game():\n", + " \"\"\"\n", + " Start the game\n", + " \"\"\"\n", + " print(\"You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\")\n", + " play_room(game_state[\"current_room\"])\n", + "\n", + " \n", + "def new_start_game():\n", + "# \"\"\"\n", + "# Start the game\n", + "# \"\"\"\n", + " print(\"There's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys.\")\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy()\n", + " play_room(game_state[\"current_room\"])\n", + " \n", + "\n", + "def play_room(room):\n", + " \"\"\"\n", + " Play a room. First check if the room being played is the target room.\n", + " If it is, the game will end with success. Otherwise, let player either \n", + " explore (list all items in this room) or examine an item found here.\n", + " \"\"\"\n", + " game_state[\"current_room\"] = room\n", + " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", + " print(\"Congrats! You escaped the room!\")\n", + " else:\n", + " print(\"You are now in \" + room[\"name\"])\n", + " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'?\").lower().strip()\n", + " if intended_action == \"explore\":\n", + " explore_room(room)\n", + " play_room(room)\n", + " elif intended_action == \"examine\":\n", + " examine_item(input(\"What would you like to examine?\").lower().strip())\n", + " else:\n", + " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", + " play_room(room)\n", + " linebreak()\n", + "\n", + "def explore_room(room):\n", + " \"\"\"\n", + " Explore a room. List all items belonging to this room.\n", + " \"\"\"\n", + " items = [i[\"name\"] for i in object_relations[room[\"name\"]]]\n", + " print(\"You explore the room. This is \" + room[\"name\"] + \". You find \" + \", \".join(items))\n", + "\n", + "def get_next_room_of_door(door, current_room):\n", + " \"\"\"\n", + " From object_relations, find the two rooms connected to the given door.\n", + " Return the room that is not the current_room.\n", + " \"\"\"\n", + " connected_rooms = object_relations[door[\"name\"]]\n", + " for room in connected_rooms:\n", + " if(not current_room == room):\n", + " return room\n", + "\n", + "def examine_item(item_name):\n", + " \"\"\"\n", + " Examine an item which can be a door or furniture.\n", + " First make sure the intended item belongs to the current room.\n", + " Then check if the item is a door. Tell player if key hasn't been \n", + " collected yet. Otherwise ask player if they want to go to the next\n", + " room. If the item is not a door, then check if it contains keys.\n", + " Collect the key if found and update the game state. At the end,\n", + " play either the current or the next room depending on the game state\n", + " to keep playing.\n", + " \"\"\"\n", + " current_room = game_state[\"current_room\"]\n", + " next_room = \"\"\n", + " output = None\n", + " \n", + " for item in object_relations[current_room[\"name\"]]:\n", + " if(item[\"name\"] == item_name):\n", + " output = \"You examine \" + item_name + \". \"\n", + " if(item[\"type\"] == \"door\"):\n", + " have_key = False\n", + " for key in game_state[\"keys_collected\"]:\n", + " if(key[\"target\"] == item):\n", + " have_key = True\n", + " if(have_key):\n", + " output += \"You unlock it with a key you have.\"\n", + " next_room = get_next_room_of_door(item, current_room)\n", + " else:\n", + " output += \"It is locked but you don't have the key.\"\n", + " elif(item[\"name\"] == \"closet\"):\n", + " #new_start_game()\n", + " #output = \"\\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys\"\n", + " return print(\"\\nThere's a monster at the closet, and now you will go back to the Game Room!\") \n", + " else:\n", + " if(item[\"name\"] in object_relations and len(object_relations[item[\"name\"]])>0):\n", + " item_found = object_relations[item[\"name\"]].pop()\n", + " game_state[\"keys_collected\"].append(item_found)\n", + " output += \"You find \" + item_found[\"name\"] + \".\"\n", + " else:\n", + " output += \"There isn't anything interesting about it.\"\n", + " print(output)\n", + " break\n", + "\n", + " if(output is None):\n", + " print(\"The item you requested is not found in the current room.\")\n", + " \n", + " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", + " play_room(next_room)\n", + " else:\n", + " play_room(current_room)\n", + "\n", + " \n", + "while True:\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy() \n", + " start_game()\n", + " object_relations = {\n", + " \"game room\": [couch, piano, door_a],\n", + " \"bedroom 1\": [queen_bed, closet, door_a, door_b, door_c],\n", + " \"bedroom 2\": [double_bed, dresser, door_b],\n", + " \"kitchen\": [cup_board, fridge, cooker, door_c, door_d],\n", + " \"living room\":[dining_table, door_d, door_e],\n", + " \"closet\": [monster],\n", + " \"piano\": [key_a],\n", + " \"queen bed\": [key_b],\n", + " \"double bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"cup board\": [key_e],\n", + " \"outside\": [door_e],\n", + " \"door a\": [game_room, bedroom_1],\n", + " \"door b\": [bedroom_1, bedroom_2],\n", + " \"door c\": [bedroom_1, kitchen],\n", + " \"door d\": [kitchen, living_room],\n", + " \"door e\": [living_room, outside],\n", + "\n", + "}\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy()\n", + " start_game()\n", + " restart = input(\"New Game: Yes or No?\").lower().strip()\n", + " if restart == \"No\":\n", + " break\n", + " elif restart == \"Yes\":\n", + " continue" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/your-code/.DS_Store b/your-code/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7e4844fa99e431170093db7829ad53f74a5c77ef GIT binary patch literal 6148 zcmeHKJ8Hu~5S@ut2-LWAxmWNF7NeZN2T&Z_Aw|G}kRqKbpUX$fn-2ydr!lw*Z(!!_ zj^=6ES7tBGS^&_#3j&^%dlLQy{*?=N01S_2uW z02P=ju!!x_`u{WhkNJN};*JVXfq$idHvP8W;7ZwBXP2{HTi`EntGU3PgimmayCXRtlN8af`{tTEdG%E0D1%3g!_7#x; literal 0 HcmV?d00001 diff --git a/your-code/__pycache__/code.cpython-38.pyc b/your-code/__pycache__/code.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4318079e84b05a5161034d559410761cafc5ac04 GIT binary patch literal 3968 zcmaJ@J!~Au72dzw`{5mVq9{_7C}~I~p-+)cu@hKEAV@JR#ZVE(h-esIShy^2hIi{b z?i^?LMDcJ;BNwRxrAQ|PVwu)Rmo7+=CS9t9JEuvTbOiGAy|*ihq7olDZ|Cp5`FY=b z?|s~8)GYkM8`GcvY}vBDrpC$NEE+#TN&akGmb9cTo##$qNmqJYvt>#8%9iElZs5pD zG49H$tns)fXNp=$){9YJHVW;soP~CowJUP2=&j0Tp;MD*3Y{4_U)1XIY%$u93q{}T z3EgwBSY?ZIa=UM@#=Ft0o{uS%+>8og3*R@thos;b%Zf(2zMSJ^#R z;bhd?^VE#0t1^0Kd5)``o~h{>g zQ93rNLi*Z z&X8Cj;gM*Npl4#vLbTkh-W?mG;jdkT|FGCZi>y%~B6B-*3>tU8QhwPjQ|ct#7-%9d>|LcXyp@-Xk}JSs1DmD;Hzon`BI zhwet`gCjoGW3d+wlo*eMjzuUKXd;ZI*p47*Cy5$vi--o3)P!+QiM}2uO6)~xU&I>U zSn9n*?DeB=pEN{2e5^#Q9xDR`06nS37l2f4K?_P9ucyMO9ksKCDSQ2W)(Q9vVBGEwYI3C1$FBXzEW<-<-%r`ph_6c2Ni8iz|PErBH3qVKc zZISkiLtGadKmBCYoWoV&h0u*<)zL8A&(Tn$htWyW5NplLF!)TNp^D9)Q?3&vwmr24o1IMhTwsgr!aUV5rYRS^FwZv|N1AUN( z3-a&|tpj@s8i&SbX=$2|`}sF+W2AzSNm_I#3Sap(RQR%Oy6gjI>fEy)EgZO0d+H9Hq&amRMDd5#ZnI!{J`?V39f~c_ zkni{%1#?{;#~eZ!N(sZ})b_G-V5Cm0p5(EoqqjR0u>Sxf2?a6Bt}|W?ZR<66(&#Zx z-UZJP&11tr%Yh@U12-jhC=m1LuLs`Lqt=udW`$TK#|;kVNq^a59{HuL9F$ZnO{s@S-(XqI8$$GKgD{xe?wn``r^;>by9oao3B#Z1+PnC zN6rpB^d0vwhn4g7UX-TgLogET%uUO*Q|zy~WUkH$ zO`+2MJ4{-WDw$-^XLfsXZIk0*lu(=uV=Axo@cmbo3 zuOX|Dw0I1T+}2~nKyWmzSEM@3;_b<;dzy9j!Z;#S~EG967m_KnLAW*=8p6z^EqToex~LMO%NnjNf76?DnXTY+@TCMe=pVJXOQ_g z88Nd*Q-TUzRtFbld}szW*5gB+dQIjk#{YtnybD2`>)9SSx6XeaOCNm|yYAE+0WO|p z7OvR714edMz|d@Cvaq4{#E01055=b{p;)z{?*`6>4qUW1T2~E4_JDKlP8gK1xlYJw zXTX^>zxd!~4&8Y>$aClplHo#WD_7bon%!5E-wBG;nPzkD8Wd@BZna38JDfJ>R=R~1 znKvaTyFoP^4s+_stHdk`^HebRVB^7N=fn4Za=-I%^Zm{HoJMlW!rozyWS8=FWL{T~ z_H$>y?#rM|XhZ^Z!V{b&ac)$(y`$xLsP2&8l0QN?w)1b_KbE%hFTZ@;IyrK({!O#~ zxAyBAdCPMC<9V}Ay_82^#s=X7e}4Y=Pk#w};n|f^rCM1)nXjx91N#)cA#3)30q=F% APXGV_ literal 0 HcmV?d00001 diff --git a/your-code/__pycache__/code.cpython-39.pyc b/your-code/__pycache__/code.cpython-39.pyc index 5815b2f27c33b6ef53c23f6e6097aa53ac08a722..97d67e4bb0d7a02ed024650d74b722f3a6e7a6d7 100644 GIT binary patch delta 570 zcmYLFzi-n(6u##;@sGwKqLC>-k~&E%l9*r>BnAc;yIBH6B`l~KlFCdG z0}Cp;l_3^?0X0)61_q>xk%hki2L1sio}Ga^z3=qh_ujkj-kZkXhBdG(li(Wkf) zLEg*xE97}l_YvvdNYCIq^ly8QBgP|7j0Vpm!T9(v@+MO;3dj8k5BJzmc+>EZ_lF^6 zUV2{m0q{;H#kJj$0IJ4>7B7=aWClQlLQCkQfIifOyoMO4wy*G~q8Kmq(&8N7L`6sC zSZG*d{IAKnjH}q!%=_i}X|DuOd=VZoF1uPsZfP4=RkOUzvDP*+pWMwLEB&bs!^w2<%xZS&WY9ziG|nP1;6nB)ZTKSn%I6E$ N%lP3^HUdNw{sEz8ir@eM delta 472 zcmYk1ze^)Q6vyXnvhELemtaIRngl&fE)fweEfS6kC>C0XBDx30-IdG9?S|Qj5LpXZ zY{WttyxRN;=UUm=T4-rwqyK;iR~=TqjaS@*@4R6?-u&SN?t?4s8 z3&+1F14s{CWIJRd=M07fi2ZqmluFTGxQE)JHD|8+4)sl|&g#@$cAXk+>^Wx5vsynL zmwCQ9-(U-^ZL`^C-#vG#NxdJA#mu(XqEnV|L^_OP@k425Bohw^ zGNeEiQlQ~Z1{KvO$PnF0TaX?_!zId3##Uhf=qRr$Yf$9BlyCVmo>>r+e0):\n", + " item_found = object_relations[item[\"name\"]].pop()\n", + " game_state[\"keys_collected\"].append(item_found)\n", + " output += \"You find \" + item_found[\"name\"] + \".\"\n", + " else:\n", + " output += \"There isn't anything interesting about it.\"\n", + " print(output)\n", + " break\n", + "\n", + " if(output is None):\n", + " print(\"The item you requested is not found in the current room.\")\n", + " \n", + " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", + " play_room(next_room)\n", + " else:\n", + " play_room(current_room)\n", + "\n", + " \n", + "while True:\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy() \n", + " start_game()\n", + " object_relations = {\n", + " \"game room\": [couch, piano, door_a],\n", + " \"bedroom 1\": [queen_bed, closet, door_a, door_b, door_c],\n", + " \"bedroom 2\": [double_bed, dresser, door_b],\n", + " \"kitchen\": [cup_board, fridge, cooker, door_c, door_d],\n", + " \"living room\":[dining_table, door_d, door_e],\n", + " \"closet\": [monster],\n", + " \"piano\": [key_a],\n", + " \"queen bed\": [key_b],\n", + " \"double bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"cup board\": [key_e],\n", + " \"outside\": [door_e],\n", + " \"door a\": [game_room, bedroom_1],\n", + " \"door b\": [bedroom_1, bedroom_2],\n", + " \"door c\": [bedroom_1, kitchen],\n", + " \"door d\": [kitchen, living_room],\n", + " \"door e\": [living_room, outside],\n", + "\n", + "}\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy()\n", + " start_game()\n", + " restart = input(\"New Game: Yes or No?\").lower().strip()\n", + " if restart == \"No\":\n", + " break\n", + " elif restart == \"Yes\":\n", + " continue" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index dd8fec36..0c6f01ef 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -6,8 +6,6 @@ "metadata": {}, "outputs": [], "source": [ - "#Python Game\n", - "\n", "# define rooms and items\n", "\n", "couch = {\n", @@ -46,6 +44,16 @@ " \"type\": \"furniture\",\n", "}\n", "\n", + "closet = {\n", + " \"name\": \"closet\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "monster = {\n", + " \"name\": \"monster\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", "door_b = {\n", " \"name\": \"door b\",\n", " \"type\": \"door\",\n", @@ -77,6 +85,36 @@ " \"type\": \"furniture\",\n", "}\n", "\n", + "kitchen = {\n", + " \"name\": \"kitchen\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "cup_board = {\n", + " \"name\": \"cup board\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "fridge = {\n", + " \"name\": \"fridge\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "cooker = {\n", + " \"name\": \"cooker\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door d\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", + "}\n", "\n", "living_room = {\n", " \"name\": \"living room\",\n", @@ -99,41 +137,47 @@ " \"target\": door_c,\n", "}\n", "\n", - "door_d = {\n", - " \"name\": \"door d\",\n", + "door_e = {\n", + " \"name\": \"door e\",\n", " \"type\": \"door\",\n", "}\n", "\n", - "key_d = {\n", + "key_e = {\n", " \"name\": \"key for door d\",\n", " \"type\": \"key\",\n", - " \"target\": door_d,\n", + " \"target\": door_e,\n", "}\n", "\n", + "\n", + "\n", "outside = {\n", " \"name\": \"outside\"\n", "}\n", "\n", - "all_rooms = [game_room, outside,bedroom_1,bedroom_2,living_room]\n", + "all_rooms = [game_room, outside,bedroom_1,bedroom_2,kitchen,living_room]\n", "\n", - "all_doors = [door_a,door_b,door_c,door_d]\n", + "all_doors = [door_a,door_b,door_c,door_d,door_d]\n", "\n", "# define which items/rooms are related\n", "\n", "object_relations = {\n", " \"game room\": [couch, piano, door_a],\n", - " \"bedroom 1\": [queen_bed, door_a, door_b, door_c],\n", + " \"bedroom 1\": [queen_bed, closet, door_a, door_b, door_c],\n", " \"bedroom 2\": [double_bed, dresser, door_b],\n", - " \"living room\":[dining_table, door_c, door_d],\n", + " \"kitchen\": [cup_board, fridge, cooker, door_c, door_d],\n", + " \"living room\":[dining_table, door_d, door_e],\n", + " \"closet\": [monster],\n", " \"piano\": [key_a],\n", " \"queen bed\": [key_b],\n", " \"double bed\": [key_c],\n", " \"dresser\": [key_d],\n", - " \"outside\": [door_d],\n", + " \"cup board\": [key_e],\n", + " \"outside\": [door_e],\n", " \"door a\": [game_room, bedroom_1],\n", " \"door b\": [bedroom_1, bedroom_2],\n", - " \"door c\": [bedroom_1, living_room],\n", - " \"door d\": [living_room, outside],\n", + " \"door c\": [bedroom_1, kitchen],\n", + " \"door d\": [kitchen, living_room],\n", + " \"door e\": [living_room, outside],\n", "\n", "}\n", "\n", @@ -146,6 +190,7 @@ " \"current_room\": game_room,\n", " \"keys_collected\": [],\n", " \"target_room\": outside\n", + " \n", "}" ] }, @@ -156,117 +201,7 @@ "tags": [] }, "outputs": [], - "source": [ - "def linebreak():\n", - " \"\"\"\n", - " Print a line break\n", - " \"\"\"\n", - " print(\"\\n\\n\")\n", - "\n", - "def start_game():\n", - " \"\"\"\n", - " Start the game\n", - " \"\"\"\n", - " print(\"You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\")\n", - " play_room(game_state[\"current_room\"])\n", - "\n", - "def play_room(room):\n", - " \"\"\"\n", - " Play a room. First check if the room being played is the target room.\n", - " If it is, the game will end with success. Otherwise, let player either \n", - " explore (list all items in this room) or examine an item found here.\n", - " \"\"\"\n", - " game_state[\"current_room\"] = room\n", - " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\")\n", - " else:\n", - " print(\"You are now in \" + room[\"name\"])\n", - " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'?\").lower().strip()\n", - " if intended_action == \"explore\":\n", - " explore_room(room)\n", - " play_room(room)\n", - " elif intended_action == \"examine\":\n", - " examine_item(input(\"What would you like to examine?\").lower().strip())\n", - " else:\n", - " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", - " play_room(room)\n", - " #linebreak()\n", - "\n", - "def explore_room(room):\n", - " \"\"\"\n", - " Explore a room. List all items belonging to this room.\n", - " \"\"\"\n", - " items = [i[\"name\"] for i in object_relations[room[\"name\"]]]\n", - " print(\"You explore the room. This is \" + room[\"name\"] + \". You find \" + \", \".join(items))\n", - "\n", - "def get_next_room_of_door(door, current_room):\n", - " \"\"\"\n", - " From object_relations, find the two rooms connected to the given door.\n", - " Return the room that is not the current_room.\n", - " \"\"\"\n", - " connected_rooms = object_relations[door[\"name\"]]\n", - " for room in connected_rooms:\n", - " if(not current_room == room):\n", - " return room\n", - "\n", - "def examine_item(item_name):\n", - " \"\"\"\n", - " Examine an item which can be a door or furniture.\n", - " First make sure the intended item belongs to the current room.\n", - " Then check if the item is a door. Tell player if key hasn't been \n", - " collected yet. Otherwise ask player if they want to go to the next\n", - " room. If the item is not a door, then check if it contains keys.\n", - " Collect the key if found and update the game state. At the end,\n", - " play either the current or the next room depending on the game state\n", - " to keep playing.\n", - " \"\"\"\n", - " current_room = game_state[\"current_room\"]\n", - " next_room = \"\"\n", - " output = None\n", - " \n", - " for item in object_relations[current_room[\"name\"]]:\n", - " if(item[\"name\"] == item_name):\n", - " output = \"You examine \" + item_name + \". \"\n", - " if(item[\"type\"] == \"door\"):\n", - " have_key = False\n", - " for key in game_state[\"keys_collected\"]:\n", - " if(key[\"target\"] == item):\n", - " have_key = True\n", - " if(have_key):\n", - " output += \"You unlock it with a key you have.\"\n", - " next_room = get_next_room_of_door(item, current_room)\n", - " else:\n", - " output += \"It is locked but you don't have the key.\"\n", - " else:\n", - " if(item[\"name\"] in object_relations and len(object_relations[item[\"name\"]])>0):\n", - " item_found = object_relations[item[\"name\"]].pop()\n", - " game_state[\"keys_collected\"].append(item_found)\n", - " output += \"You find \" + item_found[\"name\"] + \".\"\n", - " else:\n", - " output += \"There isn't anything interesting about it.\"\n", - " print(output)\n", - " break\n", - "\n", - " if(output is None):\n", - " print(\"The item you requested is not found in the current room.\")\n", - " \n", - " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").lower().strip() == 'yes'):\n", - " play_room(next_room)\n", - " else:\n", - " play_room(current_room)\n", - "\n", - "\n", - "while True:\n", - " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", - " game_state = INIT_GAME_STATE.copy()\n", - " start_game()\n", - " restart = input(\"New Game: Yes or No?\").lower().strip()\n", - " if restart == \"No\":\n", - " break\n", - " elif restart == \"Yes\":\n", - " continue\n", - "\n" - ] + "source": [] }, { "cell_type": "code", @@ -278,8 +213,9 @@ ], "metadata": { "kernelspec": { - "name": "python392jvsc74a57bd07101ece57323ae226d3ee33127f20849298572704d5292ba75a6e287de47f3f2", - "display_name": "Python 3.9.2 64-bit" + "display_name": "Python 3", + "language": "python", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -296,4 +232,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/your-code/sample-code.py b/your-code/sample-code.py new file mode 100644 index 00000000..de4c777b --- /dev/null +++ b/your-code/sample-code.py @@ -0,0 +1,333 @@ +# define rooms and items + +couch = { + "name": "couch", + "type": "furniture", +} + +door_a = { + "name": "door a", + "type": "door", +} + +key_a = { + "name": "key for door a", + "type": "key", + "target": door_a, +} + +piano = { + "name": "piano", + "type": "furniture", +} + +game_room = { + "name": "game room", + "type": "room", +} + +bedroom_1 = { + "name": "bedroom 1", + "type": "room", +} + +queen_bed = { + "name": "queen bed", + "type": "furniture", +} + +closet = { + "name": "closet", + "type": "furniture", +} + +monster = { + "name": "monster", + "type": "furniture", +} + +door_b = { + "name": "door b", + "type": "door", +} + +key_b = { + "name": "key for door b", + "type": "key", + "target": door_b, +} + +door_c = { + "name": "door c", + "type": "door", +} + +bedroom_2 = { + "name": "bedroom 2", + "type": "room", +} + +double_bed = { + "name": "double bed", + "type": "furniture", +} + +dresser = { + "name": "dresser", + "type": "furniture", +} + +kitchen = { + "name": "kitchen", + "type": "room", +} + +cup_board = { + "name": "cup board", + "type": "furniture", +} + +fridge = { + "name": "fridge", + "type": "furniture", +} + +cooker = { + "name": "cooker", + "type": "furniture", +} + +door_d = { + "name": "door d", + "type": "door", +} + +key_d = { + "name": "key for door d", + "type": "key", + "target": door_d, +} + +living_room = { + "name": "living room", + "type": "room", +} + +dining_table = { + "name": "dining table", + "type": "furniture", +} + +door_c = { + "name": "door c", + "type": "door", +} + +key_c = { + "name": "key for door c", + "type": "key", + "target": door_c, +} + +door_e = { + "name": "door e", + "type": "door", +} + +key_e = { + "name": "key for door d", + "type": "key", + "target": door_e, +} + + + +outside = { + "name": "outside" +} + +all_rooms = [game_room, outside,bedroom_1,bedroom_2,kitchen,living_room] + +all_doors = [door_a,door_b,door_c,door_d,door_d] + +# define which items/rooms are related + +object_relations = { + "game room": [couch, piano, door_a], + "bedroom 1": [queen_bed, closet, door_a, door_b, door_c], + "bedroom 2": [double_bed, dresser, door_b], + "kitchen": [cup_board, fridge, cooker, door_c, door_d], + "living room":[dining_table, door_d, door_e], + "closet": [monster], + "piano": [key_a], + "queen bed": [key_b], + "double bed": [key_c], + "dresser": [key_d], + "cup board": [key_e], + "outside": [door_e], + "door a": [game_room, bedroom_1], + "door b": [bedroom_1, bedroom_2], + "door c": [bedroom_1, kitchen], + "door d": [kitchen, living_room], + "door e": [living_room, outside], + +} + +# define game state. Do not directly change this dict. +# Instead, when a new game starts, make a copy of this +# dict and use the copy to store gameplay state. This +# way you can replay the game multiple times. + +INIT_GAME_STATE = { + "current_room": game_room, + "keys_collected": [], + "target_room": outside + +} + +def linebreak(): + """ + Print a line break + """ + print("\n\n") + +def start_game(): + """ + Start the game + """ + print("You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!") + play_room(game_state["current_room"]) + + +def new_start_game(): +# """ +# Start the game +# """ + print("There's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys.") + INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + game_state = INIT_GAME_STATE.copy() + play_room(game_state["current_room"]) + + +def play_room(room): + """ + Play a room. First check if the room being played is the target room. + If it is, the game will end with success. Otherwise, let player either + explore (list all items in this room) or examine an item found here. + """ + game_state["current_room"] = room + if(game_state["current_room"] == game_state["target_room"]): + print("Congrats! You escaped the room!") + else: + print("You are now in " + room["name"]) + intended_action = input("What would you like to do? Type 'explore' or 'examine'?").lower().strip() + if intended_action == "explore": + explore_room(room) + play_room(room) + elif intended_action == "examine": + examine_item(input("What would you like to examine?").lower().strip()) + else: + print("Not sure what you mean. Type 'explore' or 'examine'.") + play_room(room) + linebreak() + +def explore_room(room): + """ + Explore a room. List all items belonging to this room. + """ + items = [i["name"] for i in object_relations[room["name"]]] + print("You explore the room. This is " + room["name"] + ". You find " + ", ".join(items)) + +def get_next_room_of_door(door, current_room): + """ + From object_relations, find the two rooms connected to the given door. + Return the room that is not the current_room. + """ + connected_rooms = object_relations[door["name"]] + for room in connected_rooms: + if(not current_room == room): + return room + +def examine_item(item_name): + """ + Examine an item which can be a door or furniture. + First make sure the intended item belongs to the current room. + Then check if the item is a door. Tell player if key hasn't been + collected yet. Otherwise ask player if they want to go to the next + room. If the item is not a door, then check if it contains keys. + Collect the key if found and update the game state. At the end, + play either the current or the next room depending on the game state + to keep playing. + """ + current_room = game_state["current_room"] + next_room = "" + output = None + + for item in object_relations[current_room["name"]]: + if(item["name"] == item_name): + output = "You examine " + item_name + ". " + if(item["type"] == "door"): + have_key = False + for key in game_state["keys_collected"]: + if(key["target"] == item): + have_key = True + if(have_key): + output += "You unlock it with a key you have." + next_room = get_next_room_of_door(item, current_room) + else: + output += "It is locked but you don't have the key." + elif(item["name"] == "closet"): + #new_start_game() + #output = "\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys" + return print("\nThere's a monster at the closet, and now you will go back to the Game Room!") + else: + if(item["name"] in object_relations and len(object_relations[item["name"]])>0): + item_found = object_relations[item["name"]].pop() + game_state["keys_collected"].append(item_found) + output += "You find " + item_found["name"] + "." + else: + output += "There isn't anything interesting about it." + print(output) + break + + if(output is None): + print("The item you requested is not found in the current room.") + + if(next_room and input("Do you want to go to the next room? Enter 'yes' or 'no'").strip() == 'yes'): + play_room(next_room) + else: + play_room(current_room) + + +while True: + INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + game_state = INIT_GAME_STATE.copy() + start_game() + object_relations = { + "game room": [couch, piano, door_a], + "bedroom 1": [queen_bed, closet, door_a, door_b, door_c], + "bedroom 2": [double_bed, dresser, door_b], + "kitchen": [cup_board, fridge, cooker, door_c, door_d], + "living room":[dining_table, door_d, door_e], + "closet": [monster], + "piano": [key_a], + "queen bed": [key_b], + "double bed": [key_c], + "dresser": [key_d], + "cup board": [key_e], + "outside": [door_e], + "door a": [game_room, bedroom_1], + "door b": [bedroom_1, bedroom_2], + "door c": [bedroom_1, kitchen], + "door d": [kitchen, living_room], + "door e": [living_room, outside], + +} + INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + game_state = INIT_GAME_STATE.copy() + start_game() + restart = input("New Game: Yes or No?").lower().strip() + if restart == "No": + break + elif restart == "Yes": + continue \ No newline at end of file From 03db94ad35e388aa5df988c2c665281e2a91b604 Mon Sep 17 00:00:00 2001 From: thaisternus Date: Tue, 20 Apr 2021 23:53:12 -0300 Subject: [PATCH 05/11] [tt][new-plan-add] --- .DS_Store | Bin 6148 -> 6148 bytes new-escape_room.jpg | Bin 0 -> 120191 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 new-escape_room.jpg diff --git a/.DS_Store b/.DS_Store index acb8a41d64e7c48d36e668b12bc981b118efba06..bc67497c976cac16218afd4af291d4b1ecb4dafc 100644 GIT binary patch delta 57 zcmZoMXfc=|&e%4wP;8=}A|vC(0Ba!8Be(IQ8T-Ts>YLd)1UMMmHeUSBJeglamz9x$ Mf#JYrTam-e01C_zkpKVy delta 88 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�nrjDDeyar+V47|At(-VZ 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 X-`kQW18}N8`5piL{Cl3zee3x@kn Date: Thu, 22 Apr 2021 23:49:21 +0100 Subject: [PATCH 06/11] [Cat][delete ipynb extra file] --- your-code/__pycache__/code.cpython-39.pyc | Bin 3962 -> 3985 bytes your-code/sample-code-2.ipynb | 373 ---------------------- your-code/sample-code.ipynb | 164 +++++++++- 3 files changed, 156 insertions(+), 381 deletions(-) delete mode 100644 your-code/sample-code-2.ipynb diff --git a/your-code/__pycache__/code.cpython-39.pyc b/your-code/__pycache__/code.cpython-39.pyc index 97d67e4bb0d7a02ed024650d74b722f3a6e7a6d7..a3f071f47965b1ef1ebaf3838aeec38f6d0b1d7c 100644 GIT binary patch delta 97 zcmew*H&LE1k(ZZ?0SLN&HYWH=ZRFd|?BbPd6%$&VT2vg9oLG`r6yu+l>Qa delta 74 zcmbOz|4WW9k(ZZ?0SFRxYZ8JaH}Y*~)-~1-Elw>e)-TCO%q%WREy^n`)-R|m$;i*s cEhx&*N=+`&ugotk(oN1!N!8!X$0):\n", - " item_found = object_relations[item[\"name\"]].pop()\n", - " game_state[\"keys_collected\"].append(item_found)\n", - " output += \"You find \" + item_found[\"name\"] + \".\"\n", - " else:\n", - " output += \"There isn't anything interesting about it.\"\n", - " print(output)\n", - " break\n", - "\n", - " if(output is None):\n", - " print(\"The item you requested is not found in the current room.\")\n", - " \n", - " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", - " play_room(next_room)\n", - " else:\n", - " play_room(current_room)\n", - "\n", - " \n", - "while True:\n", - " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", - " game_state = INIT_GAME_STATE.copy() \n", - " start_game()\n", - " object_relations = {\n", - " \"game room\": [couch, piano, door_a],\n", - " \"bedroom 1\": [queen_bed, closet, door_a, door_b, door_c],\n", - " \"bedroom 2\": [double_bed, dresser, door_b],\n", - " \"kitchen\": [cup_board, fridge, cooker, door_c, door_d],\n", - " \"living room\":[dining_table, door_d, door_e],\n", - " \"closet\": [monster],\n", - " \"piano\": [key_a],\n", - " \"queen bed\": [key_b],\n", - " \"double bed\": [key_c],\n", - " \"dresser\": [key_d],\n", - " \"cup board\": [key_e],\n", - " \"outside\": [door_e],\n", - " \"door a\": [game_room, bedroom_1],\n", - " \"door b\": [bedroom_1, bedroom_2],\n", - " \"door c\": [bedroom_1, kitchen],\n", - " \"door d\": [kitchen, living_room],\n", - " \"door e\": [living_room, outside],\n", - "\n", - "}\n", - " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", - " game_state = INIT_GAME_STATE.copy()\n", - " start_game()\n", - " restart = input(\"New Game: Yes or No?\").lower().strip()\n", - " if restart == \"No\":\n", - " break\n", - " elif restart == \"Yes\":\n", - " continue" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index 0c6f01ef..8b658f76 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -2,10 +2,11 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ + "#Game\n", "# define rooms and items\n", "\n", "couch = {\n", @@ -178,7 +179,6 @@ " \"door c\": [bedroom_1, kitchen],\n", " \"door d\": [kitchen, living_room],\n", " \"door e\": [living_room, outside],\n", - "\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -201,7 +201,156 @@ "tags": [] }, "outputs": [], - "source": [] + "source": [ + "def linebreak():\n", + " \"\"\"\n", + " Print a line break\n", + " \"\"\"\n", + " print(\"\\n\\n\")\n", + "\n", + "def start_game():\n", + " \"\"\"\n", + " Start the game\n", + " \"\"\"\n", + " print(\"You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\")\n", + " play_room(game_state[\"current_room\"])\n", + "\n", + " \n", + "def new_start_game():\n", + "# \"\"\"\n", + "# Start the game\n", + "# \"\"\"\n", + " print(\"There's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys.\")\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy()\n", + " play_room(game_state[\"current_room\"])\n", + " \n", + "\n", + "def play_room(room):\n", + " \"\"\"\n", + " Play a room. First check if the room being played is the target room.\n", + " If it is, the game will end with success. Otherwise, let player either \n", + " explore (list all items in this room) or examine an item found here.\n", + " \"\"\"\n", + " game_state[\"current_room\"] = room\n", + " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", + " print(\"Congrats! You escaped the room!\")\n", + " else:\n", + " print(\"You are now in \" + room[\"name\"])\n", + " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'?\").lower().strip()\n", + " if intended_action == \"explore\":\n", + " explore_room(room)\n", + " play_room(room)\n", + " elif intended_action == \"examine\":\n", + " examine_item(input(\"What would you like to examine?\").lower().strip())\n", + " else:\n", + " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", + " play_room(room)\n", + " linebreak()\n", + "\n", + "\n", + "def explore_room(room):\n", + " \"\"\"\n", + " Explore a room. List all items belonging to this room.\n", + " \"\"\"\n", + " items = [i[\"name\"] for i in object_relations[room[\"name\"]]]\n", + " print(\"You explore the room. This is \" + room[\"name\"] + \". You find \" + \", \".join(items))\n", + "\n", + "def get_next_room_of_door(door, current_room):\n", + " \"\"\"\n", + " From object_relations, find the two rooms connected to the given door.\n", + " Return the room that is not the current_room.\n", + " \"\"\"\n", + " connected_rooms = object_relations[door[\"name\"]]\n", + " for room in connected_rooms:\n", + " if(not current_room == room):\n", + " return room\n", + "\n", + "\n", + "\n", + "def examine_item(item_name):\n", + " \"\"\"\n", + " Examine an item which can be a door or furniture.\n", + " First make sure the intended item belongs to the current room.\n", + " Then check if the item is a door. Tell player if key hasn't been \n", + " collected yet. Otherwise ask player if they want to go to the next\n", + " room. If the item is not a door, then check if it contains keys.\n", + " Collect the key if found and update the game state. At the end,\n", + " play either the current or the next room depending on the game state\n", + " to keep playing.\n", + " \"\"\"\n", + " current_room = game_state[\"current_room\"]\n", + " next_room = \"\"\n", + " output = None\n", + " for item in object_relations[current_room[\"name\"]]:\n", + " if(item[\"name\"] == item_name):\n", + " output = \"You examine \" + item_name + \". \"\n", + " if(item[\"type\"] == \"door\"):\n", + " have_key = False\n", + " for key in game_state[\"keys_collected\"]:\n", + " if(key[\"target\"] == item):\n", + " have_key = True\n", + " if(have_key):\n", + " output += \"You unlock it with a key you have.\"\n", + " next_room = get_next_room_of_door(item, current_room)\n", + " else:\n", + " output += \"It is locked but you don't have the key.\"\n", + " elif(item[\"name\"] == \"closet\"):\n", + " #new_start_game()\n", + " #output = \"\\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys\"\n", + " return print(\"\\nThere's a monster at the closet, and now you will go back to the Game Room!\") \n", + " else:\n", + " if(item[\"name\"] in object_relations and len(object_relations[item[\"name\"]])>0):\n", + " item_found = object_relations[item[\"name\"]].pop()\n", + " game_state[\"keys_collected\"].append(item_found)\n", + " output += \"You find \" + item_found[\"name\"] + \".\"\n", + " else:\n", + " output += \"There isn't anything interesting about it.\"\n", + " print(output)\n", + " break\n", + "\n", + " if(output is None):\n", + " print(\"The item you requested is not found in the current room.\")\n", + " \n", + " if(next_room and input(\"Do you want to go to the next room? Enter 'yes' or 'no'\").strip() == 'yes'):\n", + " play_room(next_room)\n", + " else:\n", + " play_room(current_room)\n", + "\n", + " \n", + " \n", + "while True:\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy() \n", + " start_game()\n", + " object_relations = {\n", + " \"game room\": [couch, piano, door_a],\n", + " \"bedroom 1\": [queen_bed, closet, door_a, door_b, door_c],\n", + " \"bedroom 2\": [double_bed, dresser, door_b],\n", + " \"kitchen\": [cup_board, fridge, cooker, door_c, door_d],\n", + " \"living room\":[dining_table, door_d, door_e],\n", + " \"closet\": [monster],\n", + " \"piano\": [key_a],\n", + " \"queen bed\": [key_b],\n", + " \"double bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"cup board\": [key_e],\n", + " \"outside\": [door_e],\n", + " \"door a\": [game_room, bedroom_1],\n", + " \"door b\": [bedroom_1, bedroom_2],\n", + " \"door c\": [bedroom_1, kitchen],\n", + " \"door d\": [kitchen, living_room],\n", + " \"door e\": [living_room, outside],\n", + "}\n", + " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " game_state = INIT_GAME_STATE.copy()\n", + " start_game()\n", + " restart = input(\"New Game: Yes or No?\").lower().strip()\n", + " if restart == \"No\":\n", + " break\n", + " elif restart == \"Yes\":\n", + " continue\n" + ] }, { "cell_type": "code", @@ -213,9 +362,8 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + "name": "python392jvsc74a57bd07101ece57323ae226d3ee33127f20849298572704d5292ba75a6e287de47f3f2", + "display_name": "Python 3.9.2 64-bit" }, "language_info": { "codemirror_mode": { @@ -227,9 +375,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.2-final" + "version": "3.9.2" } }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file From 5b5f2c80a6ea70ecc473a87978841744cfb06478 Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Fri, 23 Apr 2021 00:12:11 +0100 Subject: [PATCH 07/11] [Cat][Add Tic Tac Toe] --- your-code/sample-code.ipynb | 90 ++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index 8b658f76..d347b618 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -196,11 +196,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!\nYou are now in game room\n" + ] + } + ], "source": [ "def linebreak():\n", " \"\"\"\n", @@ -352,6 +360,84 @@ " continue\n" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "output_type": "error", + "ename": "NameError", + "evalue": "name 'winner' is not defined", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[1;31m# current_player()\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 49\u001b[0m \u001b[1;31m#concl.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 50\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwinner\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 51\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mwinner\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"player\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 52\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Player win\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'winner' is not defined" + ] + } + ], + "source": [ + "\n", + "\n", + "#import random\n", + "#define board\n", + "#board = [i for i in range(0,9)]\n", + "# Function to print the board\n", + "#def print_board():\n", + "# print(' ', board[0], ' | ', board[1], ' | ', board[2], ' ')\n", + "# print('-----------')\n", + "# print(' ', board[3], ' | ', board[4], ' | ', board[5], ' ')\n", + "# print('-----------')\n", + "# print(' ', board[6], ' | ', board[7], ' | ', board[8], ' ')\n", + "# Function to check if win condition is satisfied.\n", + "#winner=[]\n", + "#def win_check():\n", + "# if ((board[0] == \"X\" and board[4] == \"X\" and board[8] == \"X\") or (board[0] == \"X\" and board[3] == \"X\" and board[6] == \"X\") or (board[1] == \"X\" and board[4] == \"X\" and board[7] == \"X\") or (board[2] == \"X\" and board[5] == \"X\" and board[8] == \"X\") or (board[2] == \"X\" and board[4] == \"X\" and board[6] == \"X\") or (board[0] == \"X\" and board[1] == \"X\" and board[2] == \"X\") or (board[3] == \"X\" and board[4] == \"X\" and board[5] == \"X\") or (board[6] == \"X\" and board[7] == \"X\" and board[8] == \"X\")):\n", + "# print_board()\n", + "# winner.append(\"player\")\n", + "# elif ((board[0] == \"O\" and board[4] == \"O\" and board[8] == \"O\") or (board[0] == \"O\" and board[3] == \"O\" and board[6] == \"O\") or (board[1] == \"O\" and board[4] == \"O\" and board[7] == \"O\") or (board[2] == \"O\" and board[5] == \"O\" and board[8] == \"O\") or (board[2] == \"O\" and board[4] == \"O\" and board[6] == \"O\") or (board[0] == \"O\" and board[1] == \"O\" and board[2] == \"O\") or (board[3] == \"O\" and board[4] == \"O\" and board[5] == \"O\") or (board[6] == \"O\" and board[7] == \"O\" and board[8] == \"O\")):\n", + "# print_board()\n", + "# winner.append(\"monster\")\n", + "# elif len([i for i in board if i != \"X\" and i != \"O\"]) == 0:\n", + "# print_board()\n", + "# winner.append(\"tie\")\n", + "# else:\n", + "# current_player()\n", + "# define move\n", + "#def current_player():\n", + "# print_board()\n", + "# a = board.count(\"X\")\n", + "# b = board.count(\"O\")\n", + "# if (int(a) > int(b)):\n", + "# possible_moves = [i for i in board if i != \"X\" and i != \"O\"]\n", + "# move = random.choice(possible_moves)\n", + "# monster_move = int(move)\n", + "# board[monster_move]=\"O\"\n", + "# win_check()\n", + "# elif (int(a) == int(b) or int(a) == 0 ):\n", + "# player_choices = [i for i in board if i != \"X\" and i != \"O\" ]\n", + "# player_move = int(input(\"Make your move [0-8]: \"))\n", + "# if player_move not in player_choices:\n", + "# print(\"Position not possible!\")\n", + "# else:\n", + "# board[player_move]=\"X\"\n", + "# win_check()\n", + "# else:\n", + "# print(\"error here\")\n", + "#loop\n", + "#while len(winner) == 0:\n", + "# current_player()\n", + "#concl.\n", + "#if len(winner) != 0:\n", + "# if winner[0] == \"player\":\n", + "# print(\"Player win\")\n", + "# elif winner [0] == \"monster\":\n", + "# print(\"Monster win\")\n", + "# elif winner[0] == \"tie\":\n", + "# print(\"Its a Tie\")\n" + ] + }, { "cell_type": "code", "execution_count": null, From f9eda516cc453b5ba0606cb77df981a996dee0fa Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Fri, 23 Apr 2021 19:22:58 +0100 Subject: [PATCH 08/11] [Cat][Update Tic Tac Toe Code] --- your-code/sample-code.ipynb | 154 ++++++++++++++++++------------------ 1 file changed, 76 insertions(+), 78 deletions(-) diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index d347b618..a9f60816 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -7,6 +7,10 @@ "outputs": [], "source": [ "#Game\n", + "\n", + "#Imports\n", + "import random\n", + "\n", "# define rooms and items\n", "\n", "couch = {\n", @@ -194,6 +198,78 @@ "}" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "#Tic Tac Toe\n", + "\n", + "#define board\n", + "board = [i for i in range(0,9)]\n", + "winner=[]\n", + "\n", + "# Function to print the board\n", + "def print_board():\n", + " print(' ', board[0], ' | ', board[1], ' | ', board[2], ' ')\n", + " print('-----------')\n", + " print(' ', board[3], ' | ', board[4], ' | ', board[5], ' ')\n", + " print('-----------')\n", + " print(' ', board[6], ' | ', board[7], ' | ', board[8], ' ')\n", + "\n", + "# Function to check if win condition is satisfied.\n", + "def win_check():\n", + " if ((board[0] == \"X\" and board[4] == \"X\" and board[8] == \"X\") or (board[0] == \"X\" and board[3] == \"X\" and board[6] == \"X\") or (board[1] == \"X\" and board[4] == \"X\" and board[7] == \"X\") or (board[2] == \"X\" and board[5] == \"X\" and board[8] == \"X\") or (board[2] == \"X\" and board[4] == \"X\" and board[6] == \"X\") or (board[0] == \"X\" and board[1] == \"X\" and board[2] == \"X\") or (board[3] == \"X\" and board[4] == \"X\" and board[5] == \"X\") or (board[6] == \"X\" and board[7] == \"X\" and board[8] == \"X\")):\n", + " print_board()\n", + " winner.append(\"player\")\n", + " elif ((board[0] == \"O\" and board[4] == \"O\" and board[8] == \"O\") or (board[0] == \"O\" and board[3] == \"O\" and board[6] == \"O\") or (board[1] == \"O\" and board[4] == \"O\" and board[7] == \"O\") or (board[2] == \"O\" and board[5] == \"O\" and board[8] == \"O\") or (board[2] == \"O\" and board[4] == \"O\" and board[6] == \"O\") or (board[0] == \"O\" and board[1] == \"O\" and board[2] == \"O\") or (board[3] == \"O\" and board[4] == \"O\" and board[5] == \"O\") or (board[6] == \"O\" and board[7] == \"O\" and board[8] == \"O\")):\n", + " print_board()\n", + " winner.append(\"game\")\n", + " elif len([i for i in board if i != \"X\" and i != \"O\"]) == 0:\n", + " print_board()\n", + " winner.append(\"tie\")\n", + " else:\n", + " current_player()\n", + "\n", + "# define move\n", + "def current_player():\n", + " print_board()\n", + " a = board.count(\"X\")\n", + " b = board.count(\"O\")\n", + " if (int(a) > int(b)):\n", + " possible_moves = [i for i in board if i != \"X\" and i != \"O\"]\n", + " move = random.choice(possible_moves)\n", + " monster_move = int(move)\n", + " board[monster_move]=\"O\"\n", + " win_check()\n", + " elif (int(a) == int(b) or int(a) == 0 ):\n", + " player_choices = [i for i in board if i != \"X\" and i != \"O\" ]\n", + " player_move = int(input(\"Make your move [0-8]: \"))\n", + " if player_move not in player_choices:\n", + " print(\"Position not possible!\")\n", + " else:\n", + " board[player_move]=\"X\"\n", + " win_check()\n", + " else:\n", + " print(\"error here\")\n", + "\n", + "\n", + "\n", + "#loop\n", + "#while len(winner) == 0:\n", + "# current_player()\n", + "#concl.\n", + "#if len(winner) != 0:\n", + "# if winner[0] == \"player\":\n", + "# print(\"Player win\")\n", + "# elif winner [0] == \"game\":\n", + "# print(\"Monster win\")\n", + "# elif winner[0] == \"tie\":\n", + "# print(\"Its a Tie\")\n", + "\n" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -360,84 +436,6 @@ " continue\n" ] }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "output_type": "error", - "ename": "NameError", - "evalue": "name 'winner' is not defined", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[1;31m# current_player()\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 49\u001b[0m \u001b[1;31m#concl.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 50\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwinner\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 51\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mwinner\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;34m\"player\"\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 52\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Player win\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNameError\u001b[0m: name 'winner' is not defined" - ] - } - ], - "source": [ - "\n", - "\n", - "#import random\n", - "#define board\n", - "#board = [i for i in range(0,9)]\n", - "# Function to print the board\n", - "#def print_board():\n", - "# print(' ', board[0], ' | ', board[1], ' | ', board[2], ' ')\n", - "# print('-----------')\n", - "# print(' ', board[3], ' | ', board[4], ' | ', board[5], ' ')\n", - "# print('-----------')\n", - "# print(' ', board[6], ' | ', board[7], ' | ', board[8], ' ')\n", - "# Function to check if win condition is satisfied.\n", - "#winner=[]\n", - "#def win_check():\n", - "# if ((board[0] == \"X\" and board[4] == \"X\" and board[8] == \"X\") or (board[0] == \"X\" and board[3] == \"X\" and board[6] == \"X\") or (board[1] == \"X\" and board[4] == \"X\" and board[7] == \"X\") or (board[2] == \"X\" and board[5] == \"X\" and board[8] == \"X\") or (board[2] == \"X\" and board[4] == \"X\" and board[6] == \"X\") or (board[0] == \"X\" and board[1] == \"X\" and board[2] == \"X\") or (board[3] == \"X\" and board[4] == \"X\" and board[5] == \"X\") or (board[6] == \"X\" and board[7] == \"X\" and board[8] == \"X\")):\n", - "# print_board()\n", - "# winner.append(\"player\")\n", - "# elif ((board[0] == \"O\" and board[4] == \"O\" and board[8] == \"O\") or (board[0] == \"O\" and board[3] == \"O\" and board[6] == \"O\") or (board[1] == \"O\" and board[4] == \"O\" and board[7] == \"O\") or (board[2] == \"O\" and board[5] == \"O\" and board[8] == \"O\") or (board[2] == \"O\" and board[4] == \"O\" and board[6] == \"O\") or (board[0] == \"O\" and board[1] == \"O\" and board[2] == \"O\") or (board[3] == \"O\" and board[4] == \"O\" and board[5] == \"O\") or (board[6] == \"O\" and board[7] == \"O\" and board[8] == \"O\")):\n", - "# print_board()\n", - "# winner.append(\"monster\")\n", - "# elif len([i for i in board if i != \"X\" and i != \"O\"]) == 0:\n", - "# print_board()\n", - "# winner.append(\"tie\")\n", - "# else:\n", - "# current_player()\n", - "# define move\n", - "#def current_player():\n", - "# print_board()\n", - "# a = board.count(\"X\")\n", - "# b = board.count(\"O\")\n", - "# if (int(a) > int(b)):\n", - "# possible_moves = [i for i in board if i != \"X\" and i != \"O\"]\n", - "# move = random.choice(possible_moves)\n", - "# monster_move = int(move)\n", - "# board[monster_move]=\"O\"\n", - "# win_check()\n", - "# elif (int(a) == int(b) or int(a) == 0 ):\n", - "# player_choices = [i for i in board if i != \"X\" and i != \"O\" ]\n", - "# player_move = int(input(\"Make your move [0-8]: \"))\n", - "# if player_move not in player_choices:\n", - "# print(\"Position not possible!\")\n", - "# else:\n", - "# board[player_move]=\"X\"\n", - "# win_check()\n", - "# else:\n", - "# print(\"error here\")\n", - "#loop\n", - "#while len(winner) == 0:\n", - "# current_player()\n", - "#concl.\n", - "#if len(winner) != 0:\n", - "# if winner[0] == \"player\":\n", - "# print(\"Player win\")\n", - "# elif winner [0] == \"monster\":\n", - "# print(\"Monster win\")\n", - "# elif winner[0] == \"tie\":\n", - "# print(\"Its a Tie\")\n" - ] - }, { "cell_type": "code", "execution_count": null, From 79b124e261d0f69db7b5f8a7d8a1f0471abc648e Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Fri, 23 Apr 2021 19:46:45 +0100 Subject: [PATCH 09/11] [Cat][Functional Tic Tac Toe] --- your-code/__pycache__/code.cpython-39.pyc | Bin 3985 -> 165 bytes your-code/code.py | 233 ++++++++++++++++++---- your-code/sample-code.ipynb | 31 ++- 3 files changed, 201 insertions(+), 63 deletions(-) diff --git a/your-code/__pycache__/code.cpython-39.pyc b/your-code/__pycache__/code.cpython-39.pyc index a3f071f47965b1ef1ebaf3838aeec38f6d0b1d7c..3e7cabe094cbf9c59e3750b4a8f67ec0892c1455 100644 GIT binary patch delta 95 zcmbOzzm(BAk(ZZ?0SML$Hz();>Bk@rGGGL99Dul(1xTbY1T$zd`mJOr0trKj$p@JO Ugg9(+^HWN5QtdzzpMjVG0D=+@a{vGU literal 3985 zcmaJ@OKcp+5uM-8ez^RIqDWDqq$ZVwT3KGiMqn9+AjPm0M*&P55Cg*l3Y+0{b9c<; z^s;AG6c@_?fqV#Z2$Vx^LLeS0ecU z>h-G%Cnp;ge!uwV&wldJ1f^h$Yp#N<%+zD?*;iS`E7hJ%J0Zke3wq@s`=-a4z1v_ zI{(D7Ep0#6h z>RUsT#M#iOmXmu)xTA6}+aIVSUutbcn0xdcO>L`vv4xJZ*G0SK8VA5IE=2BUq3NnD zuMFZa(MRMx{x4s$cRE@~R$YX)IN1($wil6C|cd%#x^) zXp)#AafZYk36I1i33?{xEJVxAo6*o1m1G@0KV4ngiFCiOq70j#C~k@eBPhJ`qYM22 zC8gCeytXH{jaLVcIcp=Q(P-JYVG}3WZ!NQkDJ+hD6ur0cW86o&5rwe6@o}Q=n)s30 zxT~Y#4tAo`jSu7Ohr`W{!G6}$$(sYCKgV`9_Vv)b8EL6DNVEt0dA%PeYSXB2`zh^% zHe}i6BIIkECCBq-&!h5UvzeVa(pj{QH}0;5KB(g}JrsN4wi3gE(1{2I<4=T%6k9O_ z?IczGEfLdTnwc=^D$&!!REfPf>xo3;n@GKvioISO^+-eX!beIZ>X9-420)c*e1TKd z7PO$$$!aEy+EF{3n6lT~XRXk{vVx%1_j+LlI}&9uP>GVSSlCjkFH#LK50mXg?LA9)$&p4h~<2x`5*xKmI2RiARFiV%&T`G;j0USV=MsH_%G)-P4cj4*@ z8T?#FH$Nqx?df5^xb%JuT*38H-x2E|FR`i~5BfmCssLr75$*ugt9OEG*-sVj8(sN7 zrpoaUPRlVAmxF1%b(KgZJ7JW?Iyr$30tRdT29=Z$MTnTO8_o=54Sx-kc?T#V z`>&y-f=))syQokc{Q~F!4%|g+(YgyyAJ`=_(6a!1p!m<7v3+P4IAMQQ*IqMB@Oyxg z5=VAn@?n!f1hc<#c0G`pT|^FIFoYea{oUM-Pn|4p-0H_^7U`YA?cZVE*C^IVoV>R7 zt-g-JetH{~7gGy>Tqf9*Q;*REm-X;!@jsd<=z)o6CD)55ZE7ByE7&6^OV`^|%N} z9lh0|82%NEq!iaIyUAEFZ=n8)D{1r?BkzD?h~lwfAmzZ3)`6Q5Gn8m~_~!#}>``k> z?6O3RQeXxL^Q6CMF^BwI)($GLQzwMs(Eiw$4d{5#`9w|}RCYfZSIkexu58|<6`Zj* zwx3|V-M^u4lKPU3Vx7!>WSPHYv>!TH#H%tKWZ4ra*CA3uZK$H|D5J(?2K=(0MvDC0vjXs{k1>eOp8S26x4 zl=K}4;#<%5z_(5Q^H}=mtJzJb;Rx{X6f6{3wI@Er*4`7Jsg&Z> zn!Xb_YdUbzUTa-76x9Px!#iP6!R9(4XQBZo*Zksx7io3pt)NJ&JIIeqrOiTVvus8$ zC%+w(*)+}ObT%k6>B4H6Nq0DtF04eQ6u>St~Jx(DxU19GqN3u)#I&v@4gZ;wUulh2m5*m^GobUu^zML1;ZtZ9}?5o@4 zxAgZAj_v&0_m8FR{L8N%w@!|ntbfz2|E>M12DiNbc;1xLtQ2vVkwNIdpI`ia?Jr;_ XJhxV<)oXJov$a*?U!USOWW)Y1Ok3qj diff --git a/your-code/code.py b/your-code/code.py index d22a79c0..3c9cd941 100644 --- a/your-code/code.py +++ b/your-code/code.py @@ -1,4 +1,7 @@ -#Python Game +#Game + +#Imports +import random # define rooms and items @@ -38,6 +41,16 @@ "type": "furniture", } +closet = { + "name": "closet", + "type": "furniture", +} + +monster = { + "name": "monster", + "type": "furniture", +} + door_b = { "name": "door b", "type": "door", @@ -69,6 +82,36 @@ "type": "furniture", } +kitchen = { + "name": "kitchen", + "type": "room", +} + +cup_board = { + "name": "cup board", + "type": "furniture", +} + +fridge = { + "name": "fridge", + "type": "furniture", +} + +cooker = { + "name": "cooker", + "type": "furniture", +} + +door_d = { + "name": "door d", + "type": "door", +} + +key_d = { + "name": "key for door d", + "type": "key", + "target": door_d, +} living_room = { "name": "living room", @@ -91,44 +134,48 @@ "target": door_c, } -door_d = { - "name": "door d", +door_e = { + "name": "door e", "type": "door", } -key_d = { +key_e = { "name": "key for door d", "type": "key", - "target": door_d, + "target": door_e, } outside = { "name": "outside" } -all_rooms = [game_room, outside,bedroom_1,bedroom_2,living_room] +all_rooms = [game_room, outside,bedroom_1,bedroom_2,kitchen,living_room] -all_doors = [door_a,door_b,door_c,door_d] +all_doors = [door_a,door_b,door_c,door_d,door_d] # define which items/rooms are related object_relations = { "game room": [couch, piano, door_a], - "bedroom 1": [queen_bed, door_a, door_b, door_c], + "bedroom 1": [queen_bed, closet, door_a, door_b, door_c], "bedroom 2": [double_bed, dresser, door_b], - "living room":[dining_table, door_c, door_d], + "kitchen": [cup_board, fridge, cooker, door_c, door_d], + "living room":[dining_table, door_d, door_e], + "closet": [monster], "piano": [key_a], "queen bed": [key_b], "double bed": [key_c], "dresser": [key_d], - "outside": [door_a], + "cup board": [key_e], + "outside": [door_e], "door a": [game_room, bedroom_1], "door b": [bedroom_1, bedroom_2], - "door c": [bedroom_1, living_room], - "door d": [living_room, outside], - + "door c": [bedroom_1, kitchen], + "door d": [kitchen, living_room], + "door e": [living_room, outside], } + # define game state. Do not directly change this dict. # Instead, when a new game starts, make a copy of this # dict and use the copy to store gameplay state. This @@ -140,22 +187,86 @@ "target_room": outside } -#Print a line break +#Tic Tac Toe + +#define board +board = [i for i in range(0,9)] +winner=[] + +# Function to print the board +def print_board(): + print(' ', board[0], ' | ', board[1], ' | ', board[2], ' ') + print('-----------') + print(' ', board[3], ' | ', board[4], ' | ', board[5], ' ') + print('-----------') + print(' ', board[6], ' | ', board[7], ' | ', board[8], ' ') + +# Function to check if win condition is satisfied. +def win_check(): + if ((board[0] == "X" and board[4] == "X" and board[8] == "X") or (board[0] == "X" and board[3] == "X" and board[6] == "X") or (board[1] == "X" and board[4] == "X" and board[7] == "X") or (board[2] == "X" and board[5] == "X" and board[8] == "X") or (board[2] == "X" and board[4] == "X" and board[6] == "X") or (board[0] == "X" and board[1] == "X" and board[2] == "X") or (board[3] == "X" and board[4] == "X" and board[5] == "X") or (board[6] == "X" and board[7] == "X" and board[8] == "X")): + print_board() + winner.append("player") + elif ((board[0] == "O" and board[4] == "O" and board[8] == "O") or (board[0] == "O" and board[3] == "O" and board[6] == "O") or (board[1] == "O" and board[4] == "O" and board[7] == "O") or (board[2] == "O" and board[5] == "O" and board[8] == "O") or (board[2] == "O" and board[4] == "O" and board[6] == "O") or (board[0] == "O" and board[1] == "O" and board[2] == "O") or (board[3] == "O" and board[4] == "O" and board[5] == "O") or (board[6] == "O" and board[7] == "O" and board[8] == "O")): + print_board() + winner.append("game") + elif len([i for i in board if i != "X" and i != "O"]) == 0: + print_board() + winner.append("tie") + else: + current_player() + + +# define move +def current_player(): + print_board() + a = board.count("X") + b = board.count("O") + if (int(a) > int(b)): + possible_moves = [i for i in board if i != "X" and i != "O"] + move = random.choice(possible_moves) + monster_move = int(move) + board[monster_move]="O" + win_check() + elif (int(a) == int(b) or int(a) == 0 ): + player_choices = [i for i in board if i != "X" and i != "O" ] + player_move = int(input("Make your move [0-8]: ")) + if player_move not in player_choices: + print("Position not possible!") + else: + board[player_move]="X" + win_check() + else: + print("error here") + def linebreak(): + """ + Print a line break + """ print("\n\n") - -#Start the game def start_game(): + """ + Start the game + """ print("You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!") play_room(game_state["current_room"]) - -#Play a room. First check if the room being played is the target room. -#If it is, the game will end with success. Otherwise, let player either -#explore (list all items in this room) or examine an item found here. - + +def new_start_game(): +# """ +# Start the game +# """ + print("There's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys.") + INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + game_state = INIT_GAME_STATE.copy() + play_room(game_state["current_room"]) + def play_room(room): + """ + Play a room. First check if the room being played is the target room. + If it is, the game will end with success. Otherwise, let player either + explore (list all items in this room) or examine an item found here. + """ game_state["current_room"] = room if(game_state["current_room"] == game_state["target_room"]): print("Congrats! You escaped the room!") @@ -170,43 +281,41 @@ def play_room(room): else: print("Not sure what you mean. Type 'explore' or 'examine'.") play_room(room) - #linebreak() + linebreak() -#Explore a room. List all items belonging to this room. - def explore_room(room): - + """ + Explore a room. List all items belonging to this room. + """ items = [i["name"] for i in object_relations[room["name"]]] print("You explore the room. This is " + room["name"] + ". You find " + ", ".join(items)) - -#From object_relations, find the two rooms connected to the given door. -#Return the room that is not the current_room. - def get_next_room_of_door(door, current_room): + """ + From object_relations, find the two rooms connected to the given door. + Return the room that is not the current_room. + """ connected_rooms = object_relations[door["name"]] for room in connected_rooms: if(not current_room == room): return room - -#Examine an item which can be a door or furniture. -#First make sure the intended item belongs to the current room. -#Then check if the item is a door. Tell player if key hasn't been -#collected yet. Otherwise ask player if they want to go to the next -#room. If the item is not a door, then check if it contains keys. -#Collect the key if found and update the game state. At the end, -#play either the current or the next room depending on the game state -#to keep playing. - - def examine_item(item_name): + """ + Examine an item which can be a door or furniture. + First make sure the intended item belongs to the current room. + Then check if the item is a door. Tell player if key hasn't been + collected yet. Otherwise ask player if they want to go to the next + room. If the item is not a door, then check if it contains keys. + Collect the key if found and update the game state. At the end, + play either the current or the next room depending on the game state + to keep playing. + """ current_room = game_state["current_room"] next_room = "" output = None - for item in object_relations[current_room["name"]]: if(item["name"] == item_name): output = "You examine " + item_name + ". " @@ -220,6 +329,21 @@ def examine_item(item_name): next_room = get_next_room_of_door(item, current_room) else: output += "It is locked but you don't have the key." + elif(item["name"] == "closet"): + #new_start_game() + #output = "\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys" + return print("\nThere's a monster at the closet, and now you will go back to the Game Room!") + elif(item["name"] == "dining table"): + print("The Monster invites you for one last challenge!") + while len(winner) == 0: + current_player() + if len(winner) != 0: + if winner[0] == "player": + print("Congratulations! You defeat the Monster") + elif winner [0] == "game": + print("Nooo! The Monster win! Run!") + elif winner[0] == "tie": + print("It's a Tie!") else: if(item["name"] in object_relations and len(object_relations[item["name"]])>0): item_found = object_relations[item["name"]].pop() @@ -233,14 +357,35 @@ def examine_item(item_name): if(output is None): print("The item you requested is not found in the current room.") - if(next_room and input("Do you want to go to the next room? Enter 'yes' or 'no'").lower().strip() == 'yes'): + if(next_room and input("Do you want to go to the next room? Enter 'yes' or 'no'").strip() == 'yes'): play_room(next_room) else: play_room(current_room) -#start the game - + while True: + INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + game_state = INIT_GAME_STATE.copy() + start_game() + object_relations = { + "game room": [couch, piano, door_a], + "bedroom 1": [queen_bed, closet, door_a, door_b, door_c], + "bedroom 2": [double_bed, dresser, door_b], + "kitchen": [cup_board, fridge, cooker, door_c, door_d], + "living room":[dining_table, door_d, door_e], + "closet": [monster], + "piano": [key_a], + "queen bed": [key_b], + "double bed": [key_c], + "dresser": [key_d], + "cup board": [key_e], + "outside": [door_e], + "door a": [game_room, bedroom_1], + "door b": [bedroom_1, bedroom_2], + "door c": [bedroom_1, kitchen], + "door d": [kitchen, living_room], + "door e": [living_room, outside], +} INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} game_state = INIT_GAME_STATE.copy() start_game() diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index a9f60816..1764f263 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -256,17 +256,6 @@ "\n", "\n", "\n", - "#loop\n", - "#while len(winner) == 0:\n", - "# current_player()\n", - "#concl.\n", - "#if len(winner) != 0:\n", - "# if winner[0] == \"player\":\n", - "# print(\"Player win\")\n", - "# elif winner [0] == \"game\":\n", - "# print(\"Monster win\")\n", - "# elif winner[0] == \"tie\":\n", - "# print(\"Its a Tie\")\n", "\n" ] }, @@ -382,7 +371,18 @@ " elif(item[\"name\"] == \"closet\"):\n", " #new_start_game()\n", " #output = \"\\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys\"\n", - " return print(\"\\nThere's a monster at the closet, and now you will go back to the Game Room!\") \n", + " return print(\"\\nThere's a monster at the closet, and now you will go back to the Game Room!\")\n", + " elif(item[\"name\"] == \"dining table\"):\n", + " print(\"The Monster invites you for one last challenge!\")\n", + " while len(winner) == 0:\n", + " current_player()\n", + " if len(winner) != 0:\n", + " if winner[0] == \"player\":\n", + " print(\"Congratulations! You defeat the Monster\")\n", + " elif winner [0] == \"game\":\n", + " print(\"Nooo! The Monster win! Run!\")\n", + " elif winner[0] == \"tie\":\n", + " print(\"It's a Tie!\")\n", " else:\n", " if(item[\"name\"] in object_relations and len(object_relations[item[\"name\"]])>0):\n", " item_found = object_relations[item[\"name\"]].pop()\n", @@ -435,13 +435,6 @@ " elif restart == \"Yes\":\n", " continue\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 80eb693181d76cfbdaafbb7d9941e644990ba166 Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Fri, 23 Apr 2021 19:51:28 +0100 Subject: [PATCH 10/11] [Cat][Chg Jupyter fl name/ dlt duplicate py file] --- your-code/{sample-code.ipynb => main.ipynb} | 0 your-code/sample-code.py | 333 -------------------- 2 files changed, 333 deletions(-) rename your-code/{sample-code.ipynb => main.ipynb} (100%) delete mode 100644 your-code/sample-code.py diff --git a/your-code/sample-code.ipynb b/your-code/main.ipynb similarity index 100% rename from your-code/sample-code.ipynb rename to your-code/main.ipynb diff --git a/your-code/sample-code.py b/your-code/sample-code.py deleted file mode 100644 index de4c777b..00000000 --- a/your-code/sample-code.py +++ /dev/null @@ -1,333 +0,0 @@ -# define rooms and items - -couch = { - "name": "couch", - "type": "furniture", -} - -door_a = { - "name": "door a", - "type": "door", -} - -key_a = { - "name": "key for door a", - "type": "key", - "target": door_a, -} - -piano = { - "name": "piano", - "type": "furniture", -} - -game_room = { - "name": "game room", - "type": "room", -} - -bedroom_1 = { - "name": "bedroom 1", - "type": "room", -} - -queen_bed = { - "name": "queen bed", - "type": "furniture", -} - -closet = { - "name": "closet", - "type": "furniture", -} - -monster = { - "name": "monster", - "type": "furniture", -} - -door_b = { - "name": "door b", - "type": "door", -} - -key_b = { - "name": "key for door b", - "type": "key", - "target": door_b, -} - -door_c = { - "name": "door c", - "type": "door", -} - -bedroom_2 = { - "name": "bedroom 2", - "type": "room", -} - -double_bed = { - "name": "double bed", - "type": "furniture", -} - -dresser = { - "name": "dresser", - "type": "furniture", -} - -kitchen = { - "name": "kitchen", - "type": "room", -} - -cup_board = { - "name": "cup board", - "type": "furniture", -} - -fridge = { - "name": "fridge", - "type": "furniture", -} - -cooker = { - "name": "cooker", - "type": "furniture", -} - -door_d = { - "name": "door d", - "type": "door", -} - -key_d = { - "name": "key for door d", - "type": "key", - "target": door_d, -} - -living_room = { - "name": "living room", - "type": "room", -} - -dining_table = { - "name": "dining table", - "type": "furniture", -} - -door_c = { - "name": "door c", - "type": "door", -} - -key_c = { - "name": "key for door c", - "type": "key", - "target": door_c, -} - -door_e = { - "name": "door e", - "type": "door", -} - -key_e = { - "name": "key for door d", - "type": "key", - "target": door_e, -} - - - -outside = { - "name": "outside" -} - -all_rooms = [game_room, outside,bedroom_1,bedroom_2,kitchen,living_room] - -all_doors = [door_a,door_b,door_c,door_d,door_d] - -# define which items/rooms are related - -object_relations = { - "game room": [couch, piano, door_a], - "bedroom 1": [queen_bed, closet, door_a, door_b, door_c], - "bedroom 2": [double_bed, dresser, door_b], - "kitchen": [cup_board, fridge, cooker, door_c, door_d], - "living room":[dining_table, door_d, door_e], - "closet": [monster], - "piano": [key_a], - "queen bed": [key_b], - "double bed": [key_c], - "dresser": [key_d], - "cup board": [key_e], - "outside": [door_e], - "door a": [game_room, bedroom_1], - "door b": [bedroom_1, bedroom_2], - "door c": [bedroom_1, kitchen], - "door d": [kitchen, living_room], - "door e": [living_room, outside], - -} - -# define game state. Do not directly change this dict. -# Instead, when a new game starts, make a copy of this -# dict and use the copy to store gameplay state. This -# way you can replay the game multiple times. - -INIT_GAME_STATE = { - "current_room": game_room, - "keys_collected": [], - "target_room": outside - -} - -def linebreak(): - """ - Print a line break - """ - print("\n\n") - -def start_game(): - """ - Start the game - """ - print("You wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don't remember why you are here and what had happened before. You feel some unknown danger is approaching and you must get out of the house, NOW!") - play_room(game_state["current_room"]) - - -def new_start_game(): -# """ -# Start the game -# """ - print("There's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys.") - INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} - game_state = INIT_GAME_STATE.copy() - play_room(game_state["current_room"]) - - -def play_room(room): - """ - Play a room. First check if the room being played is the target room. - If it is, the game will end with success. Otherwise, let player either - explore (list all items in this room) or examine an item found here. - """ - game_state["current_room"] = room - if(game_state["current_room"] == game_state["target_room"]): - print("Congrats! You escaped the room!") - else: - print("You are now in " + room["name"]) - intended_action = input("What would you like to do? Type 'explore' or 'examine'?").lower().strip() - if intended_action == "explore": - explore_room(room) - play_room(room) - elif intended_action == "examine": - examine_item(input("What would you like to examine?").lower().strip()) - else: - print("Not sure what you mean. Type 'explore' or 'examine'.") - play_room(room) - linebreak() - -def explore_room(room): - """ - Explore a room. List all items belonging to this room. - """ - items = [i["name"] for i in object_relations[room["name"]]] - print("You explore the room. This is " + room["name"] + ". You find " + ", ".join(items)) - -def get_next_room_of_door(door, current_room): - """ - From object_relations, find the two rooms connected to the given door. - Return the room that is not the current_room. - """ - connected_rooms = object_relations[door["name"]] - for room in connected_rooms: - if(not current_room == room): - return room - -def examine_item(item_name): - """ - Examine an item which can be a door or furniture. - First make sure the intended item belongs to the current room. - Then check if the item is a door. Tell player if key hasn't been - collected yet. Otherwise ask player if they want to go to the next - room. If the item is not a door, then check if it contains keys. - Collect the key if found and update the game state. At the end, - play either the current or the next room depending on the game state - to keep playing. - """ - current_room = game_state["current_room"] - next_room = "" - output = None - - for item in object_relations[current_room["name"]]: - if(item["name"] == item_name): - output = "You examine " + item_name + ". " - if(item["type"] == "door"): - have_key = False - for key in game_state["keys_collected"]: - if(key["target"] == item): - have_key = True - if(have_key): - output += "You unlock it with a key you have." - next_room = get_next_room_of_door(item, current_room) - else: - output += "It is locked but you don't have the key." - elif(item["name"] == "closet"): - #new_start_game() - #output = "\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys" - return print("\nThere's a monster at the closet, and now you will go back to the Game Room!") - else: - if(item["name"] in object_relations and len(object_relations[item["name"]])>0): - item_found = object_relations[item["name"]].pop() - game_state["keys_collected"].append(item_found) - output += "You find " + item_found["name"] + "." - else: - output += "There isn't anything interesting about it." - print(output) - break - - if(output is None): - print("The item you requested is not found in the current room.") - - if(next_room and input("Do you want to go to the next room? Enter 'yes' or 'no'").strip() == 'yes'): - play_room(next_room) - else: - play_room(current_room) - - -while True: - INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} - game_state = INIT_GAME_STATE.copy() - start_game() - object_relations = { - "game room": [couch, piano, door_a], - "bedroom 1": [queen_bed, closet, door_a, door_b, door_c], - "bedroom 2": [double_bed, dresser, door_b], - "kitchen": [cup_board, fridge, cooker, door_c, door_d], - "living room":[dining_table, door_d, door_e], - "closet": [monster], - "piano": [key_a], - "queen bed": [key_b], - "double bed": [key_c], - "dresser": [key_d], - "cup board": [key_e], - "outside": [door_e], - "door a": [game_room, bedroom_1], - "door b": [bedroom_1, bedroom_2], - "door c": [bedroom_1, kitchen], - "door d": [kitchen, living_room], - "door e": [living_room, outside], - -} - INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} - game_state = INIT_GAME_STATE.copy() - start_game() - restart = input("New Game: Yes or No?").lower().strip() - if restart == "No": - break - elif restart == "Yes": - continue \ No newline at end of file From 132104c01df03ff32898870c1ffb4ab0c1c81128 Mon Sep 17 00:00:00 2001 From: Catarina Pires Date: Sat, 24 Apr 2021 11:38:51 +0100 Subject: [PATCH 11/11] [Cat]][Final version - update loop] --- your-code/code.py | 12 ++++++------ your-code/main.ipynb | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/your-code/code.py b/your-code/code.py index 3c9cd941..dd0192c3 100644 --- a/your-code/code.py +++ b/your-code/code.py @@ -332,7 +332,7 @@ def examine_item(item_name): elif(item["name"] == "closet"): #new_start_game() #output = "\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys" - return print("\nThere's a monster at the closet, and now you will go back to the Game Room!") + return print("\nThere's a monster at the closet! You lose and now you will go back to the Game Room!") elif(item["name"] == "dining table"): print("The Monster invites you for one last challenge!") while len(winner) == 0: @@ -386,11 +386,11 @@ def examine_item(item_name): "door d": [kitchen, living_room], "door e": [living_room, outside], } - INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} - game_state = INIT_GAME_STATE.copy() - start_game() + #INIT_GAME_STATE = {"current_room": game_room,"keys_collected": [],"target_room": outside} + #game_state = INIT_GAME_STATE.copy() + #start_game() restart = input("New Game: Yes or No?").lower().strip() - if restart == "No": + if restart == "no": break - elif restart == "Yes": + elif restart == "yes": continue diff --git a/your-code/main.ipynb b/your-code/main.ipynb index 1764f263..d585f57f 100644 --- a/your-code/main.ipynb +++ b/your-code/main.ipynb @@ -371,7 +371,7 @@ " elif(item[\"name\"] == \"closet\"):\n", " #new_start_game()\n", " #output = \"\\nThere's a monster at the closet, and now you will go back to the Game Room! Don`t be sad, you didn't lose your keys\"\n", - " return print(\"\\nThere's a monster at the closet, and now you will go back to the Game Room!\")\n", + " return print(\"\\nThere's a monster at the closet! You lose and now you will go back to the Game Room!\")\n", " elif(item[\"name\"] == \"dining table\"):\n", " print(\"The Monster invites you for one last challenge!\")\n", " while len(winner) == 0:\n", @@ -426,13 +426,13 @@ " \"door d\": [kitchen, living_room],\n", " \"door e\": [living_room, outside],\n", "}\n", - " INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", - " game_state = INIT_GAME_STATE.copy()\n", - " start_game()\n", + " #INIT_GAME_STATE = {\"current_room\": game_room,\"keys_collected\": [],\"target_room\": outside}\n", + " #game_state = INIT_GAME_STATE.copy()\n", + " #start_game()\n", " restart = input(\"New Game: Yes or No?\").lower().strip()\n", - " if restart == \"No\":\n", + " if restart == \"no\":\n", " break\n", - " elif restart == \"Yes\":\n", + " elif restart == \"yes\":\n", " continue\n" ] }