From f866ba10655ceed483f369562e4df71565e29eed Mon Sep 17 00:00:00 2001 From: Elora Date: Mon, 15 Apr 2024 21:28:41 +0200 Subject: [PATCH 1/7] Updated version from Elora --- .../sample-code-checkpoint.ipynb | 434 ++++++++++++++++++ your-code/sample-code.ipynb | 258 +++++++++-- 2 files changed, 656 insertions(+), 36 deletions(-) create mode 100644 your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb 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..8a29f1e1 --- /dev/null +++ b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb @@ -0,0 +1,434 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "# define rooms and items\n", + "#Elora : I defined all rooms and items, should be ok\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", + "outside = {\n", + " \"name\": \"outside\"\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", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "bedroom1 = {\n", + " \"name\": \"bedroom1\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "bedroom2 = {\n", + " \"name\": \"bedroom2\",\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", + "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", + "living_room = {\n", + " \"name\": \"living room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "dining_table = {\n", + " \"name\": \"dining table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "#Elora : I defined all rooms and doors, should be ok\n", + "\n", + "all_rooms = [game_room, outside, bedroom1, bedroom2, living_room]\n", + "\n", + "all_doors = [door_a, door_b, door_c, door_d]\n", + "\n", + "# define which items/rooms are related\n", + "\n", + "#Elora : I defined all related items/rooms\n", + "\n", + "object_relations = {\n", + " \"game room\": [couch, piano, door_a],\n", + " \"piano\": [key_a],\n", + " \"outside\": [door_a, door_c],\n", + " \"door a\": [game_room, outside],\n", + " \"bedroom1\": [queen_bed, door_b, door_c],\n", + " \"queen bed\": [key_b],\n", + " \"door b\": [bedroom1, bedroom2],\n", + " \"door c\": [bedroom1, outside],\n", + " \"bedroom2\": [double_bed, dresser, door_b],\n", + " \"double_bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"living room\": [dining_table, door_c, door_d],\n", + " \"door d\": [living_room, outside]\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": 33, + "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(\"Welcome to your Escape Room!\") #Elora : Added greetings to the user\n", + " player_name = input(\"Before we get started, what's your name? \")\n", + " print(f'Hello {player_name} !')\n", + " print(\"You woke up on a couch and found 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)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Welcome to your Escape Room!\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Before we get started, what's your name? Elora\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Elora !\n", + "You woke up on a couch and found 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" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? piano\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine piano. There isn't anything interesting about it.\n", + "You are now in game room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door a. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Congrats! You escaped the room!\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "game_state = INIT_GAME_STATE.copy()\n", + "\n", + "start_game()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Well done, you're now in the second room !\n", + "You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\n", + "Which do you choose?\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Please type 'queen bed' or 'door' to look at the respective. queen bed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You look under the queen bed. Well done, you found a key.\n", + "Keep it safe !\n" + ] + } + ], + "source": [ + "#Elora : some \"print\" ideas for bedroom1\n", + "\n", + "print(\"Well done, you're now in the second room !\")\n", + "print(\"You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\")\n", + "print(\"Which do you choose?\")\n", + "\n", + "choice1 = ['queen bed', 'door']\n", + "choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", + "\n", + "if(choice2 == \"queen bed\"):\n", + " print(\"You look under the queen bed. Well done, you found a key.\")\n", + " print(\"Keep it safe !\")\n", + " \n", + "elif(choice2 == \"door\"):\n", + " print(\"You look at the door. It is locked.\")\n", + " print(\"You must find a key to open it.\")\n", + " print(\"Explore somewhere else to find it\")\n", + " choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", + " \n", + "else:\n", + " print(\"That didn't seem to be a valid answer. Please make sure you type the options listed above.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index a6f8a94d..8a29f1e1 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -2,11 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# define rooms and items\n", + "#Elora : I defined all rooms and items, should be ok\n", "\n", "couch = {\n", " \"name\": \"couch\",\n", @@ -38,17 +39,98 @@ " \"name\": \"outside\"\n", "}\n", "\n", - "all_rooms = [game_room, outside]\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", + "door_c = {\n", + " \"name\": \"door c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "bedroom1 = {\n", + " \"name\": \"bedroom1\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "bedroom2 = {\n", + " \"name\": \"bedroom2\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "double_bed = {\n", + " \"name\": \"double bed\",\n", + " \"type\": \"furniture\",\n", + "}\n", "\n", - "all_doors = [door_a]\n", + "dresser = {\n", + " \"name\": \"dresser\",\n", + " \"type\": \"furniture\",\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", + "living_room = {\n", + " \"name\": \"living room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "dining_table = {\n", + " \"name\": \"dining table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "#Elora : I defined all rooms and doors, should be ok\n", + "\n", + "all_rooms = [game_room, outside, bedroom1, bedroom2, living_room]\n", + "\n", + "all_doors = [door_a, door_b, door_c, door_d]\n", "\n", "# define which items/rooms are related\n", "\n", + "#Elora : I defined all related items/rooms\n", + "\n", "object_relations = {\n", " \"game room\": [couch, piano, door_a],\n", " \"piano\": [key_a],\n", - " \"outside\": [door_a],\n", - " \"door a\": [game_room, outside]\n", + " \"outside\": [door_a, door_c],\n", + " \"door a\": [game_room, outside],\n", + " \"bedroom1\": [queen_bed, door_b, door_c],\n", + " \"queen bed\": [key_b],\n", + " \"door b\": [bedroom1, bedroom2],\n", + " \"door c\": [bedroom1, outside],\n", + " \"bedroom2\": [double_bed, dresser, door_b],\n", + " \"double_bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"living room\": [dining_table, door_c, door_d],\n", + " \"door d\": [living_room, outside]\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -65,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -79,7 +161,10 @@ " \"\"\"\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", + " print(\"Welcome to your Escape Room!\") #Elora : Added greetings to the user\n", + " player_name = input(\"Before we get started, what's your name? \")\n", + " print(f'Hello {player_name} !')\n", + " print(\"You woke up on a couch and found 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", @@ -162,50 +247,88 @@ " 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)" + " play_room(current_room)\n" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 35, "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", - "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", + "Welcome to your Escape Room!\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Before we get started, what's your name? Elora\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Elora !\n", + "You woke up on a couch and found 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" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? piano\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine piano. There isn't anything interesting about it.\n", + "You are now in game room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door a. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ "Congrats! You escaped the room!\n", "\n", "\n", "\n", "\n", "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", "\n" ] } @@ -216,6 +339,69 @@ "start_game()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Well done, you're now in the second room !\n", + "You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\n", + "Which do you choose?\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Please type 'queen bed' or 'door' to look at the respective. queen bed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You look under the queen bed. Well done, you found a key.\n", + "Keep it safe !\n" + ] + } + ], + "source": [ + "#Elora : some \"print\" ideas for bedroom1\n", + "\n", + "print(\"Well done, you're now in the second room !\")\n", + "print(\"You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\")\n", + "print(\"Which do you choose?\")\n", + "\n", + "choice1 = ['queen bed', 'door']\n", + "choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", + "\n", + "if(choice2 == \"queen bed\"):\n", + " print(\"You look under the queen bed. Well done, you found a key.\")\n", + " print(\"Keep it safe !\")\n", + " \n", + "elif(choice2 == \"door\"):\n", + " print(\"You look at the door. It is locked.\")\n", + " print(\"You must find a key to open it.\")\n", + " print(\"Explore somewhere else to find it\")\n", + " choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", + " \n", + "else:\n", + " print(\"That didn't seem to be a valid answer. Please make sure you type the options listed above.\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -226,7 +412,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -240,9 +426,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.11.7" } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 73301f5093798e6aa73c6d9280f9733f9b33472d Mon Sep 17 00:00:00 2001 From: Elora Date: Wed, 17 Apr 2024 11:46:38 +0200 Subject: [PATCH 2/7] Elora OK MVP --- .../escape-room-plan-checkpoint.jpg | Bin 0 -> 144227 bytes .../sample-code-checkpoint.ipynb | 740 ++++++++++++++++-- your-code/sample-code.ipynb | 740 ++++++++++++++++-- 3 files changed, 1340 insertions(+), 140 deletions(-) create mode 100644 .ipynb_checkpoints/escape-room-plan-checkpoint.jpg diff --git a/.ipynb_checkpoints/escape-room-plan-checkpoint.jpg b/.ipynb_checkpoints/escape-room-plan-checkpoint.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3ea42c1199ca6659abe9a9d299427ef746d54ab GIT binary patch literal 144227 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 C9YX2= literal 0 HcmV?d00001 diff --git a/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb index 8a29f1e1..84cacadc 100644 --- a/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb +++ b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 31, + "execution_count": 47, "metadata": {}, "outputs": [], "source": [ @@ -121,13 +121,13 @@ " \"game room\": [couch, piano, door_a],\n", " \"piano\": [key_a],\n", " \"outside\": [door_a, door_c],\n", - " \"door a\": [game_room, outside],\n", + " \"door a\": [game_room, bedroom1],\n", " \"bedroom1\": [queen_bed, door_b, door_c],\n", " \"queen bed\": [key_b],\n", " \"door b\": [bedroom1, bedroom2],\n", - " \"door c\": [bedroom1, outside],\n", + " \"door c\": [bedroom1, living_room],\n", " \"bedroom2\": [double_bed, dresser, door_b],\n", - " \"double_bed\": [key_c],\n", + " \"double bed\": [key_c],\n", " \"dresser\": [key_d],\n", " \"living room\": [dining_table, door_c, door_d],\n", " \"door d\": [living_room, outside]\n", @@ -141,13 +141,28 @@ "INIT_GAME_STATE = {\n", " \"current_room\": game_room,\n", " \"keys_collected\": [],\n", + " \"target_room\": bedroom1\n", + "}\n", + "BEDROOM1_GAME_STATE = {\n", + " \"current_room\": bedroom1,\n", + " \"keys_collected\": [],\n", + " \"target_room\": bedroom2\n", + "}\n", + "BEDROOM2_GAME_STATE = {\n", + " \"current_room\": bedroom2,\n", + " \"keys_collected\": [],\n", + " \"target_room\": bedroom1,\n", + "}\n", + "LIVING_ROOM_GAME_STATE = {\n", + " \"current_room\": living_room,\n", + " \"keys_collected\": [],\n", " \"target_room\": outside\n", "}" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -250,12 +265,267 @@ " 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" + " play_room(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_state2[\"current_room\"] = room\n", + " if(game_state2[\"current_room\"] == game_state2[\"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_state2[\"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_state2[\"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_state2[\"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", + "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_state3[\"current_room\"] = room\n", + " if(game_state3[\"current_room\"] == game_state3[\"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_state3[\"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_state3[\"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_state3[\"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", + "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_state4[\"current_room\"] = room\n", + " if(game_state4[\"current_room\"] == game_state4[\"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_state4[\"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_state4[\"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_state4[\"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": 35, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -285,15 +555,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? piano\n" + "What would you like to do? Type 'explore' or 'examine'? explore\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "You examine piano. There isn't anything interesting about it.\n", + "You explore the room. This is game room. You find couch, piano, door a\n", "You are now in game room\n" ] }, @@ -302,104 +571,433 @@ "output_type": "stream", "text": [ "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door a\n" + "What would you like to examine? couch\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "You examine door a. You unlock it with a key you have.\n" + "You examine couch. There isn't anything interesting about it.\n", + "You are now in game room\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door a\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Congrats! You escaped the room!\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "You examine door a. It is locked but you don't have the key.\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": [ - "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? piano\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine piano. You find key for door a.\n", + "You are now in game room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door a. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? explore\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You explore the room. This is bedroom1. You find queen bed, door b, door c\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door b\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door b. It is locked but you don't have the key.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? exaine\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? door c\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door c\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door c. It is locked but you don't have the key.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? queen bed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine queen bed. You find key for door b.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door b\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door b. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? explore\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You explore the room. This is bedroom2. You find double bed, dresser, door b\n", + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? dresser\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine dresser. You find key for door d.\n", + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? double bed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine double bed. You find key for door c.\n", + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door b\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door b. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door c\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door c. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in living room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? explore\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You explore the room. This is living room. You find dining table, door c, door d\n", + "You are now in living room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? dining table\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Well done, you're now in the second room !\n", - "You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\n", - "Which do you choose?\n" + "You examine dining table. There isn't anything interesting about it.\n", + "You are now in living room\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ - "Please type 'queen bed' or 'door' to look at the respective. queen bed\n" + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door d\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "You look under the queen bed. Well done, you found a key.\n", - "Keep it safe !\n" + "You examine door d. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Congrats! You escaped the room!\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] } ], "source": [ - "#Elora : some \"print\" ideas for bedroom1\n", - "\n", - "print(\"Well done, you're now in the second room !\")\n", - "print(\"You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\")\n", - "print(\"Which do you choose?\")\n", - "\n", - "choice1 = ['queen bed', 'door']\n", - "choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", - "\n", - "if(choice2 == \"queen bed\"):\n", - " print(\"You look under the queen bed. Well done, you found a key.\")\n", - " print(\"Keep it safe !\")\n", - " \n", - "elif(choice2 == \"door\"):\n", - " print(\"You look at the door. It is locked.\")\n", - " print(\"You must find a key to open it.\")\n", - " print(\"Explore somewhere else to find it\")\n", - " choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", - " \n", - "else:\n", - " print(\"That didn't seem to be a valid answer. Please make sure you type the options listed above.\")" + "game_state = INIT_GAME_STATE.copy()\n", + "game_state2 = BEDROOM1_GAME_STATE.copy()\n", + "game_state3 = BEDROOM2_GAME_STATE.copy()\n", + "game_state4 = LIVING_ROOM_GAME_STATE.copy()\n", + "\n", + "start_game()" ] }, { @@ -407,7 +1005,9 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " + ] } ], "metadata": { diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index 8a29f1e1..84cacadc 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 31, + "execution_count": 47, "metadata": {}, "outputs": [], "source": [ @@ -121,13 +121,13 @@ " \"game room\": [couch, piano, door_a],\n", " \"piano\": [key_a],\n", " \"outside\": [door_a, door_c],\n", - " \"door a\": [game_room, outside],\n", + " \"door a\": [game_room, bedroom1],\n", " \"bedroom1\": [queen_bed, door_b, door_c],\n", " \"queen bed\": [key_b],\n", " \"door b\": [bedroom1, bedroom2],\n", - " \"door c\": [bedroom1, outside],\n", + " \"door c\": [bedroom1, living_room],\n", " \"bedroom2\": [double_bed, dresser, door_b],\n", - " \"double_bed\": [key_c],\n", + " \"double bed\": [key_c],\n", " \"dresser\": [key_d],\n", " \"living room\": [dining_table, door_c, door_d],\n", " \"door d\": [living_room, outside]\n", @@ -141,13 +141,28 @@ "INIT_GAME_STATE = {\n", " \"current_room\": game_room,\n", " \"keys_collected\": [],\n", + " \"target_room\": bedroom1\n", + "}\n", + "BEDROOM1_GAME_STATE = {\n", + " \"current_room\": bedroom1,\n", + " \"keys_collected\": [],\n", + " \"target_room\": bedroom2\n", + "}\n", + "BEDROOM2_GAME_STATE = {\n", + " \"current_room\": bedroom2,\n", + " \"keys_collected\": [],\n", + " \"target_room\": bedroom1,\n", + "}\n", + "LIVING_ROOM_GAME_STATE = {\n", + " \"current_room\": living_room,\n", + " \"keys_collected\": [],\n", " \"target_room\": outside\n", "}" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -250,12 +265,267 @@ " 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" + " play_room(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_state2[\"current_room\"] = room\n", + " if(game_state2[\"current_room\"] == game_state2[\"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_state2[\"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_state2[\"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_state2[\"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", + "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_state3[\"current_room\"] = room\n", + " if(game_state3[\"current_room\"] == game_state3[\"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_state3[\"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_state3[\"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_state3[\"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", + "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_state4[\"current_room\"] = room\n", + " if(game_state4[\"current_room\"] == game_state4[\"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_state4[\"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_state4[\"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_state4[\"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": 35, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -285,15 +555,14 @@ "name": "stdin", "output_type": "stream", "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? piano\n" + "What would you like to do? Type 'explore' or 'examine'? explore\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "You examine piano. There isn't anything interesting about it.\n", + "You explore the room. This is game room. You find couch, piano, door a\n", "You are now in game room\n" ] }, @@ -302,104 +571,433 @@ "output_type": "stream", "text": [ "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door a\n" + "What would you like to examine? couch\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "You examine door a. You unlock it with a key you have.\n" + "You examine couch. There isn't anything interesting about it.\n", + "You are now in game room\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door a\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Congrats! You escaped the room!\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "You examine door a. It is locked but you don't have the key.\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": [ - "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? piano\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine piano. You find key for door a.\n", + "You are now in game room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door a. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? explore\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You explore the room. This is bedroom1. You find queen bed, door b, door c\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door b\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door b. It is locked but you don't have the key.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? exaine\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? door c\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not sure what you mean. Type 'explore' or 'examine'.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door c\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door c. It is locked but you don't have the key.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? queen bed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine queen bed. You find key for door b.\n", + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door b\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door b. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? explore\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You explore the room. This is bedroom2. You find double bed, dresser, door b\n", + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? dresser\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine dresser. You find key for door d.\n", + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? double bed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine double bed. You find key for door c.\n", + "You are now in bedroom2\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door b\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door b. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in bedroom1\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door c\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine door c. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You are now in living room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? explore\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You explore the room. This is living room. You find dining table, door c, door d\n", + "You are now in living room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? dining table\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Well done, you're now in the second room !\n", - "You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\n", - "Which do you choose?\n" + "You examine dining table. There isn't anything interesting about it.\n", + "You are now in living room\n" ] }, { "name": "stdin", "output_type": "stream", "text": [ - "Please type 'queen bed' or 'door' to look at the respective. queen bed\n" + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine? door d\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "You look under the queen bed. Well done, you found a key.\n", - "Keep it safe !\n" + "You examine door d. You unlock it with a key you have.\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Congrats! You escaped the room!\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" ] } ], "source": [ - "#Elora : some \"print\" ideas for bedroom1\n", - "\n", - "print(\"Well done, you're now in the second room !\")\n", - "print(\"You do not have lots of stuff to explore here. You can look under the queen bed or at the door in front of you\")\n", - "print(\"Which do you choose?\")\n", - "\n", - "choice1 = ['queen bed', 'door']\n", - "choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", - "\n", - "if(choice2 == \"queen bed\"):\n", - " print(\"You look under the queen bed. Well done, you found a key.\")\n", - " print(\"Keep it safe !\")\n", - " \n", - "elif(choice2 == \"door\"):\n", - " print(\"You look at the door. It is locked.\")\n", - " print(\"You must find a key to open it.\")\n", - " print(\"Explore somewhere else to find it\")\n", - " choice2 = input(\"Please type 'queen bed' or 'door' to look at the respective.\")\n", - " \n", - "else:\n", - " print(\"That didn't seem to be a valid answer. Please make sure you type the options listed above.\")" + "game_state = INIT_GAME_STATE.copy()\n", + "game_state2 = BEDROOM1_GAME_STATE.copy()\n", + "game_state3 = BEDROOM2_GAME_STATE.copy()\n", + "game_state4 = LIVING_ROOM_GAME_STATE.copy()\n", + "\n", + "start_game()" ] }, { @@ -407,7 +1005,9 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " + ] } ], "metadata": { From 64188e3db5847629b4ce7b7c738e28a71a59cbc2 Mon Sep 17 00:00:00 2001 From: Montaseer Alam <71112777+AlamLab@users.noreply.github.com> Date: Thu, 18 Apr 2024 21:02:08 +0200 Subject: [PATCH 3/7] MVP --- sample-code-eighteen-apr.ipynb | 334 +++++++++++++++++++++++ your-code/sample-code.ipynb | 479 +-------------------------------- 2 files changed, 343 insertions(+), 470 deletions(-) create mode 100644 sample-code-eighteen-apr.ipynb diff --git a/sample-code-eighteen-apr.ipynb b/sample-code-eighteen-apr.ipynb new file mode 100644 index 00000000..4f475365 --- /dev/null +++ b/sample-code-eighteen-apr.ipynb @@ -0,0 +1,334 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining rooms\n", + "door_a = {\n", + " \"name\": \"door_a\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "\n", + "door_b = {\n", + " \"name\": \"door_b\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door_c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door_d\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "# Defining keys\n", + "\n", + "key_a = {\n", + " \"name\": \"key for door a\",\n", + " \"type\": \"key\",\n", + " \"target\": door_a,\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", + "}\n", + "\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", + "}\n", + "\n", + "\n", + "# Defining items\n", + "couch = {\n", + " \"name\": \"couch\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "piano = {\n", + " \"name\": \"piano\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + " \n", + "queen_bed = {\n", + " \"name\": \"queen_bed\",\n", + " \"type\": \"furniture\",\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", + "dinning_table = {\n", + " \"name\": \"dinning_table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "#rooms declaration: \n", + "game_room = {\n", + " \"name\": \"game_room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom_1\",\n", + " \"type\": \"room\",\n", + "}\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom_2\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "livingroom = {\n", + " \"name\": \"livingroom\",\n", + " \"type\": \"room\",\n", + "}\n", + "outside = {\n", + " \"name\": \"outside\",\n", + " \"type\": \"room\",\n", + "}\n", + "\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_b, door_a, door_c],\n", + " \"bedroom_2\": [double_bed, dresser, door_b],\n", + " \"livingroom\": [dinning_table, door_c, door_d],\n", + " \"outside\": [door_d],\n", + " \"door_a\": [game_room, bedroom_1],\n", + " \"door_b\": [bedroom_1, bedroom_2],\n", + " \"door_c\": [bedroom_1, livingroom],\n", + " \"door_d\": [livingroom, outside],\n", + " \"key_a\": [door_a],\n", + " \"key_b\": [door_b],\n", + " \"key_c\": [door_c],\n", + " \"key_d\": [door_d],\n", + " \"piano\": [key_a],\n", + " \"queen_bed\": [key_b],\n", + " \"double_bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"couch\": [],\n", + " \"dinning_table\": [],\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": 4, + "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() # strip is for getting rid of any blank space\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? Ener 'yes' or 'no'\").strip() == 'yes'):\n", + " play_room(next_room)\n", + " else:\n", + " play_room(current_room)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "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", + "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" + ] + } + ], + "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 (ipykernel)", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index 84cacadc..61e46ebb 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -157,12 +157,14 @@ " \"current_room\": living_room,\n", " \"keys_collected\": [],\n", " \"target_room\": outside\n", - "}" + "}\n", + "\n", + "game_state = INIT_GAME_STATE.copy() " ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -180,7 +182,7 @@ " player_name = input(\"Before we get started, what's your name? \")\n", " print(f'Hello {player_name} !')\n", " print(\"You woke up on a couch and found 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", + " play_room(game_state[\"current_room\"]) #Montaseer: where was the dictionary 'game_state' defined? Defining it as a copy of INIT_GAME_STATE\n", "\n", "def play_room(room):\n", " \"\"\"\n", @@ -188,7 +190,7 @@ " 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", + " 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", @@ -525,472 +527,9 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Welcome to your Escape Room!\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Before we get started, what's your name? Elora\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello Elora !\n", - "You woke up on a couch and found 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" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is game room. You find couch, piano, door a\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? couch\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine couch. There isn't anything interesting about it.\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door a\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door a. It is locked but you don't have the key.\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? piano\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine piano. You find key for door a.\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door a\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door a. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is bedroom1. You find queen bed, door b, door c\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door b\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door b. It is locked but you don't have the key.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? exaine\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? door c\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door c\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door c. It is locked but you don't have the key.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? queen bed\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine queen bed. You find key for door b.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door b\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door b. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is bedroom2. You find double bed, dresser, door b\n", - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? dresser\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine dresser. You find key for door d.\n", - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? double bed\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine double bed. You find key for door c.\n", - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door b\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door b. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door c\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door c. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in living room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is living room. You find dining table, door c, door d\n", - "You are now in living room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? dining table\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine dining table. There isn't anything interesting about it.\n", - "You are now in living room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door d\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door d. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Congrats! You escaped the room!\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "game_state = INIT_GAME_STATE.copy()\n", "game_state2 = BEDROOM1_GAME_STATE.copy()\n", From 445b8c290f6e46a36fa981a0c9c5b53f86e204a8 Mon Sep 17 00:00:00 2001 From: Elora Date: Thu, 18 Apr 2024 22:33:36 +0200 Subject: [PATCH 4/7] Elora : MVP + STARTING TIMER + GREETINGS --- .ipynb_checkpoints/Untitled-checkpoint.ipynb | 6 + .../sample-code-eighteen-apr-checkpoint.ipynb | 331 ++++++++++++++++++ Untitled.ipynb | 160 +++++++++ sample-code-eighteen-apr.ipynb | 69 ++-- 4 files changed, 530 insertions(+), 36 deletions(-) create mode 100644 .ipynb_checkpoints/Untitled-checkpoint.ipynb create mode 100644 .ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb create mode 100644 Untitled.ipynb diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 00000000..363fcab7 --- /dev/null +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb b/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb new file mode 100644 index 00000000..b7725b58 --- /dev/null +++ b/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Defining rooms\n", + "door_a = {\n", + " \"name\": \"door_a\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "\n", + "door_b = {\n", + " \"name\": \"door_b\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "door_c = {\n", + " \"name\": \"door_c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door_d\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "# Defining keys\n", + "\n", + "key_a = {\n", + " \"name\": \"key for door a\",\n", + " \"type\": \"key\",\n", + " \"target\": door_a,\n", + "}\n", + "\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", + "}\n", + "\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", + "}\n", + "\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", + "}\n", + "\n", + "\n", + "# Defining items\n", + "couch = {\n", + " \"name\": \"couch\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "piano = {\n", + " \"name\": \"piano\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + " \n", + "queen_bed = {\n", + " \"name\": \"queen_bed\",\n", + " \"type\": \"furniture\",\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", + "dinning_table = {\n", + " \"name\": \"dinning_table\",\n", + " \"type\": \"furniture\",\n", + "}\n", + "\n", + "#rooms declaration: \n", + "game_room = {\n", + " \"name\": \"game_room\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom_1\",\n", + " \"type\": \"room\",\n", + "}\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom_2\",\n", + " \"type\": \"room\",\n", + "}\n", + "\n", + "livingroom = {\n", + " \"name\": \"livingroom\",\n", + " \"type\": \"room\",\n", + "}\n", + "outside = {\n", + " \"name\": \"outside\",\n", + " \"type\": \"room\",\n", + "}\n", + "\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_b, door_a, door_c],\n", + " \"bedroom_2\": [double_bed, dresser, door_b],\n", + " \"livingroom\": [dinning_table, door_c, door_d],\n", + " \"outside\": [door_d],\n", + " \"door_a\": [game_room, bedroom_1],\n", + " \"door_b\": [bedroom_1, bedroom_2],\n", + " \"door_c\": [bedroom_1, livingroom],\n", + " \"door_d\": [livingroom, outside],\n", + " \"key_a\": [door_a],\n", + " \"key_b\": [door_b],\n", + " \"key_c\": [door_c],\n", + " \"key_d\": [door_d],\n", + " \"piano\": [key_a],\n", + " \"queen_bed\": [key_b],\n", + " \"double_bed\": [key_c],\n", + " \"dresser\": [key_d],\n", + " \"couch\": [],\n", + " \"dinning_table\": [],\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": 12, + "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(\"Welcome to your Escape Room!\") \n", + " player_name = input(\"Before we get started, what's your name? \")\n", + " print(f'Hello {player_name} !')\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() # strip is for getting rid of any blank space\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": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "LET'S PLAY!\n", + "Welcome to your Escape Room!\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "Interrupted by user", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[16], line 9\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLET\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mS PLAY!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 7\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m----> 9\u001b[0m start_game()\n", + "Cell \u001b[1;32mIn[12], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + ] + } + ], + "source": [ + "import time\n", + "for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"LET'S PLAY!\")\n", + "\n", + "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 (ipykernel)", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 00000000..bebbc769 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "id": "8d8c1761-1c5e-4a4f-8a33-5ffb590ed136", + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "enter the time in seconds: 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "TIME'S UP !\n" + ] + } + ], + "source": [ + "import time\n", + "my_time = int(input('enter the time in seconds:'))\n", + "for x in range(my_time, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"TIME'S UP !\")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3c42a4ca-6d80-4df6-8ead-dd0f208ede13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "TIME'S UP !\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"TIME'S UP !\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6d0bbed8-8172-47d1-b1dd-22f45b9ff2f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start time\n", + "1713471160.6527634\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "press enter to stop \n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'tim' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[10], line 6\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(start_time)\n\u001b[0;32m 5\u001b[0m stopper\u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpress enter to stop\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m----> 6\u001b[0m end_time \u001b[38;5;241m=\u001b[39m tim\u001b[38;5;241m.\u001b[39mtime()\n", + "\u001b[1;31mNameError\u001b[0m: name 'tim' is not defined" + ] + } + ], + "source": [ + "import time\n", + "print('start time')\n", + "start_time = time.time()\n", + "print(start_time)\n", + "stopper= input('press enter to stop')\n", + "end_time = tim.time()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ef55cdd7-9b98-4048-b82e-b757e3ea43fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + } + ], + "source": [ + "import time\n", + "time_limit = 5\n", + "start_time = time.time()\n", + "elapsed_time = time.time() - start_time\n", + "print(time_limit - int(elapsed_time))\n", + "if elapsed_time > time_limit :\n", + " print('GAME OVER')\n", + " exit()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92a17b9f-8128-42bc-9265-e1f3657fe0d8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sample-code-eighteen-apr.ipynb b/sample-code-eighteen-apr.ipynb index 4f475365..b7725b58 100644 --- a/sample-code-eighteen-apr.ipynb +++ b/sample-code-eighteen-apr.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,6 @@ " \"dinning_table\": [],\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", @@ -151,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -160,11 +159,14 @@ " Print a line break\n", " \"\"\"\n", " print(\"\\n\\n\")\n", - "\n", + " \n", "def start_game():\n", " \"\"\"\n", " Start the game\n", " \"\"\"\n", + " print(\"Welcome to your Escape Room!\") \n", + " player_name = input(\"Before we get started, what's your name? \")\n", + " print(f'Hello {player_name} !')\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", @@ -248,7 +250,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)" @@ -256,47 +258,42 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 16, "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", - "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" + "3\n", + "2\n", + "1\n", + "LET'S PLAY!\n", + "Welcome to your Escape Room!\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "Interrupted by user", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[16], line 9\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLET\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mS PLAY!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 7\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m----> 9\u001b[0m start_game()\n", + "Cell \u001b[1;32mIn[12], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" ] } ], "source": [ + "import time\n", + "for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"LET'S PLAY!\")\n", + "\n", "game_state = INIT_GAME_STATE.copy()\n", "\n", "start_game()" From f887dc55a1b5d9ceac6661af79c063b7930c8ed7 Mon Sep 17 00:00:00 2001 From: Elora Date: Thu, 18 Apr 2024 23:12:58 +0200 Subject: [PATCH 5/7] Elora : Starting countdown + beep sound + greetings --- .ipynb_checkpoints/Untitled-checkpoint.ipynb | 294 +++++++++++++++++- .../sample-code-eighteen-apr-checkpoint.ipynb | 14 +- Untitled.ipynb | 138 +++++++- sample-code-eighteen-apr.ipynb | 14 +- sample-code-eighteen-apr.py | 272 ++++++++++++++++ 5 files changed, 719 insertions(+), 13 deletions(-) create mode 100644 sample-code-eighteen-apr.py diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb index 363fcab7..058fd15f 100644 --- a/.ipynb_checkpoints/Untitled-checkpoint.ipynb +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -1,6 +1,296 @@ { - "cells": [], - "metadata": {}, + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "id": "8d8c1761-1c5e-4a4f-8a33-5ffb590ed136", + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "enter the time in seconds: 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "TIME'S UP !\n" + ] + } + ], + "source": [ + "import time\n", + "my_time = int(input('enter the time in seconds:'))\n", + "for x in range(my_time, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"TIME'S UP !\")\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3c42a4ca-6d80-4df6-8ead-dd0f208ede13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "TIME'S UP !\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"TIME'S UP !\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6d0bbed8-8172-47d1-b1dd-22f45b9ff2f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start time\n", + "1713471160.6527634\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "press enter to stop \n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'tim' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[10], line 6\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;28mprint\u001b[39m(start_time)\n\u001b[0;32m 5\u001b[0m stopper\u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpress enter to stop\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m----> 6\u001b[0m end_time \u001b[38;5;241m=\u001b[39m tim\u001b[38;5;241m.\u001b[39mtime()\n", + "\u001b[1;31mNameError\u001b[0m: name 'tim' is not defined" + ] + } + ], + "source": [ + "import time\n", + "print('start time')\n", + "start_time = time.time()\n", + "print(start_time)\n", + "stopper= input('press enter to stop')\n", + "end_time = tim.time()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "ef55cdd7-9b98-4048-b82e-b757e3ea43fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n" + ] + } + ], + "source": [ + "import time\n", + "time_limit = 5\n", + "start_time = time.time()\n", + "elapsed_time = time.time() - start_time\n", + "print(time_limit - int(elapsed_time))\n", + "if elapsed_time > time_limit :\n", + " print('GAME OVER')\n", + " exit()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "92a17b9f-8128-42bc-9265-e1f3657fe0d8", + "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "enter the time in seconds: 60\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:00\n", + "00:59\n", + "00:58\n", + "00:57\n", + "00:56\n", + "00:55\n", + "00:54\n", + "00:53\n", + "00:52\n", + "00:51\n", + "00:50\n", + "00:49\n", + "00:48\n", + "00:47\n", + "00:46\n", + "00:45\n", + "00:44\n", + "00:43\n", + "00:42\n", + "00:41\n", + "00:40\n", + "00:39\n", + "00:38\n", + "00:37\n", + "00:36\n", + "00:35\n", + "00:34\n", + "00:33\n", + "00:32\n", + "00:31\n", + "00:30\n", + "00:29\n", + "00:28\n", + "00:27\n", + "00:26\n", + "00:25\n", + "00:24\n", + "00:23\n", + "00:22\n", + "00:21\n", + "00:20\n", + "00:19\n", + "00:18\n", + "00:17\n", + "00:16\n", + "00:15\n", + "00:14\n", + "00:13\n", + "00:12\n", + "00:11\n", + "00:10\n", + "00:09\n", + "00:08\n", + "00:07\n", + "00:06\n", + "00:05\n", + "00:04\n", + "00:03\n", + "00:02\n", + "00:01\n", + "TIME'S UP !\n" + ] + } + ], + "source": [ + "import time\n", + "my_time = int(input('enter the time in seconds:'))\n", + "for x in range(my_time, 0, -1):\n", + " seconds = x % 60\n", + " minutes = int(x/60)%60\n", + " hours = int(x/3600)\n", + " print(f'{hours:02}:{seconds:02}')\n", + " time.sleep(1)\n", + "print(\"TIME'S UP !\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "738e3c1d-d228-449b-9923-1b0cdbebf191", + "metadata": {}, + "outputs": [], + "source": [ + "import winsound\n", + "frequency = 1500 # Set Frequency To 2500 Hertz\n", + "duration = 1000 # Set Duration To 1000 ms == 1 second\n", + "winsound.Beep(frequency, duration)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5849d495-0de8-40fc-bc08-0d983b154b27", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pydub'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[11], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# import required module\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpydub\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m AudioSegment\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpydub\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mplayback\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m play\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# for playing mp3 file\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pydub'" + ] + } + ], + "source": [ + "\n", + "# import required module\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + " \n", + "# for playing mp3 file\n", + "song = AudioSegment.from_mp3(\"note.mp3\")\n", + "print('playing sound using pydub')\n", + "play(song)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dbe849a9-c012-4d23-9f13-f23d543e4b9e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.7" + } + }, "nbformat": 4, "nbformat_minor": 5 } diff --git a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb b/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb index b7725b58..f44cc8be 100644 --- a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb +++ b/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -279,8 +279,8 @@ "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[16], line 9\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLET\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mS PLAY!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 7\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m----> 9\u001b[0m start_game()\n", - "Cell \u001b[1;32mIn[12], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[1;32mIn[10], line 13\u001b[0m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[0;32m 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m---> 13\u001b[0m start_game()\n", + "Cell \u001b[1;32mIn[9], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" @@ -293,10 +293,14 @@ " print(x)\n", " time.sleep(1)\n", "print(\"LET'S PLAY!\")\n", + "import winsound\n", + "frequency = 1500 \n", + "duration = 1000 \n", + "winsound.Beep(frequency, duration)\n", "\n", "game_state = INIT_GAME_STATE.copy()\n", "\n", - "start_game()" + "start_game()\n" ] }, { diff --git a/Untitled.ipynb b/Untitled.ipynb index bebbc769..058fd15f 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -129,9 +129,145 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "92a17b9f-8128-42bc-9265-e1f3657fe0d8", "metadata": {}, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "enter the time in seconds: 60\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00:00\n", + "00:59\n", + "00:58\n", + "00:57\n", + "00:56\n", + "00:55\n", + "00:54\n", + "00:53\n", + "00:52\n", + "00:51\n", + "00:50\n", + "00:49\n", + "00:48\n", + "00:47\n", + "00:46\n", + "00:45\n", + "00:44\n", + "00:43\n", + "00:42\n", + "00:41\n", + "00:40\n", + "00:39\n", + "00:38\n", + "00:37\n", + "00:36\n", + "00:35\n", + "00:34\n", + "00:33\n", + "00:32\n", + "00:31\n", + "00:30\n", + "00:29\n", + "00:28\n", + "00:27\n", + "00:26\n", + "00:25\n", + "00:24\n", + "00:23\n", + "00:22\n", + "00:21\n", + "00:20\n", + "00:19\n", + "00:18\n", + "00:17\n", + "00:16\n", + "00:15\n", + "00:14\n", + "00:13\n", + "00:12\n", + "00:11\n", + "00:10\n", + "00:09\n", + "00:08\n", + "00:07\n", + "00:06\n", + "00:05\n", + "00:04\n", + "00:03\n", + "00:02\n", + "00:01\n", + "TIME'S UP !\n" + ] + } + ], + "source": [ + "import time\n", + "my_time = int(input('enter the time in seconds:'))\n", + "for x in range(my_time, 0, -1):\n", + " seconds = x % 60\n", + " minutes = int(x/60)%60\n", + " hours = int(x/3600)\n", + " print(f'{hours:02}:{seconds:02}')\n", + " time.sleep(1)\n", + "print(\"TIME'S UP !\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "738e3c1d-d228-449b-9923-1b0cdbebf191", + "metadata": {}, + "outputs": [], + "source": [ + "import winsound\n", + "frequency = 1500 # Set Frequency To 2500 Hertz\n", + "duration = 1000 # Set Duration To 1000 ms == 1 second\n", + "winsound.Beep(frequency, duration)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "5849d495-0de8-40fc-bc08-0d983b154b27", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pydub'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[11], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# import required module\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpydub\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m AudioSegment\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpydub\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mplayback\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m play\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# for playing mp3 file\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pydub'" + ] + } + ], + "source": [ + "\n", + "# import required module\n", + "from pydub import AudioSegment\n", + "from pydub.playback import play\n", + " \n", + "# for playing mp3 file\n", + "song = AudioSegment.from_mp3(\"note.mp3\")\n", + "print('playing sound using pydub')\n", + "play(song)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dbe849a9-c012-4d23-9f13-f23d543e4b9e", + "metadata": {}, "outputs": [], "source": [] } diff --git a/sample-code-eighteen-apr.ipynb b/sample-code-eighteen-apr.ipynb index b7725b58..f44cc8be 100644 --- a/sample-code-eighteen-apr.ipynb +++ b/sample-code-eighteen-apr.ipynb @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -258,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -279,8 +279,8 @@ "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[16], line 9\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mLET\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mS PLAY!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 7\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m----> 9\u001b[0m start_game()\n", - "Cell \u001b[1;32mIn[12], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[1;32mIn[10], line 13\u001b[0m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[0;32m 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m---> 13\u001b[0m start_game()\n", + "Cell \u001b[1;32mIn[9], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" @@ -293,10 +293,14 @@ " print(x)\n", " time.sleep(1)\n", "print(\"LET'S PLAY!\")\n", + "import winsound\n", + "frequency = 1500 \n", + "duration = 1000 \n", + "winsound.Beep(frequency, duration)\n", "\n", "game_state = INIT_GAME_STATE.copy()\n", "\n", - "start_game()" + "start_game()\n" ] }, { diff --git a/sample-code-eighteen-apr.py b/sample-code-eighteen-apr.py new file mode 100644 index 00000000..d4fbd543 --- /dev/null +++ b/sample-code-eighteen-apr.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[8]: + + +# Defining rooms +door_a = { + "name": "door_a", + "type": "door", +} + + +door_b = { + "name": "door_b", + "type": "door", +} + +door_c = { + "name": "door_c", + "type": "door", +} + +door_d = { + "name": "door_d", + "type": "door", +} + +# Defining keys + +key_a = { + "name": "key for door a", + "type": "key", + "target": door_a, +} + +key_b = { + "name": "key for door b", + "type": "key", + "target": door_b, +} + +key_c = { + "name": "key for door c", + "type": "key", + "target": door_c, +} + +key_d = { + "name": "key for door d", + "type": "key", + "target": door_d, +} + + +# Defining items +couch = { + "name": "couch", + "type": "furniture", +} + +piano = { + "name": "piano", + "type": "furniture", +} + + +queen_bed = { + "name": "queen_bed", + "type": "furniture", +} + +double_bed = { + "name": "double_bed", + "type": "furniture", +} + +dresser = { + "name": "dresser", + "type": "furniture", +} + +dinning_table = { + "name": "dinning_table", + "type": "furniture", +} + +#rooms declaration: +game_room = { + "name": "game_room", + "type": "room", +} + +bedroom_1 = { + "name": "bedroom_1", + "type": "room", +} +bedroom_2 = { + "name": "bedroom_2", + "type": "room", +} + +livingroom = { + "name": "livingroom", + "type": "room", +} +outside = { + "name": "outside", + "type": "room", +} + + +# define which items/rooms are related + +object_relations = { + "game_room": [couch, piano, door_a], + "bedroom_1": [queen_bed, door_b, door_a, door_c], + "bedroom_2": [double_bed, dresser, door_b], + "livingroom": [dinning_table, door_c, door_d], + "outside": [door_d], + "door_a": [game_room, bedroom_1], + "door_b": [bedroom_1, bedroom_2], + "door_c": [bedroom_1, livingroom], + "door_d": [livingroom, outside], + "key_a": [door_a], + "key_b": [door_b], + "key_c": [door_c], + "key_d": [door_d], + "piano": [key_a], + "queen_bed": [key_b], + "double_bed": [key_c], + "dresser": [key_d], + "couch": [], + "dinning_table": [], +} + +# 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 +} + + +# In[12]: + + +def linebreak(): + """ + Print a line break + """ + print("\n\n") + +def start_game(): + """ + Start the game + """ + print("Welcome to your Escape Room!") + player_name = input("Before we get started, what's your name? ") + print(f'Hello {player_name} !') + 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 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'?").strip() # strip is for getting rid of any blank space + if intended_action == "explore": + explore_room(room) + play_room(room) + elif intended_action == "examine": + examine_item(input("What would you like to examine?").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." + 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) + + +# In[16]: + + +import time +for x in range(3, 0, -1): + print(x) + time.sleep(1) +print("LET'S PLAY!") + +game_state = INIT_GAME_STATE.copy() + +start_game() + + +# In[ ]: + + + + From e8c2b01e4d4ec6f1fbd473eae64ede9ab7f09f1a Mon Sep 17 00:00:00 2001 From: Elora Date: Sat, 20 Apr 2024 16:27:17 +0200 Subject: [PATCH 6/7] Elora starting countdown + beep sound + greetings + emojis --- .ipynb_checkpoints/Untitled-checkpoint.ipynb | 337 ++++++++++++++++- .../sample-code-eighteen-apr-checkpoint.ipynb | 50 +-- Untitled.ipynb | 338 +++++++++++++++++- congratulations-deep-voice-172193.mp3 | Bin 0 -> 104489 bytes sample-code-eighteen-apr.ipynb | 50 +-- 5 files changed, 733 insertions(+), 42 deletions(-) create mode 100644 congratulations-deep-voice-172193.mp3 diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb index 058fd15f..efba0e1d 100644 --- a/.ipynb_checkpoints/Untitled-checkpoint.ipynb +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -265,9 +265,344 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "dbe849a9-c012-4d23-9f13-f23d543e4b9e", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Welcome to the Escape Game!\n", + "You have 5 minutes to escape.\n", + "Time remaining: 300 seconds\n", + "Time remaining: 298 seconds\n", + "Time remaining: 297 seconds\n", + "Time remaining: 296 seconds\n", + "Time remaining: 295 seconds\n", + "Time remaining: 294 seconds\n", + "Time remaining: 293 seconds\n", + "Time remaining: 292 seconds\n", + "Time remaining: 291 seconds\n", + "Time remaining: 290 seconds\n", + "Time remaining: 289 seconds\n", + "Time remaining: 288 seconds\n", + "Time remaining: 287 seconds\n", + "Time remaining: 286 seconds\n", + "Time remaining: 285 seconds\n", + "Time remaining: 284 seconds\n", + "Time remaining: 283 seconds\n", + "Time remaining: 282 seconds\n", + "Time remaining: 281 seconds\n", + "Time remaining: 280 seconds\n", + "Time remaining: 279 seconds\n", + "Time remaining: 278 seconds\n", + "Time remaining: 277 seconds\n", + "Time remaining: 276 seconds\n", + "Time remaining: 275 seconds\n", + "Time remaining: 274 seconds\n", + "Time remaining: 273 seconds\n", + "Time remaining: 272 seconds\n", + "Time remaining: 271 seconds\n", + "Time remaining: 270 seconds\n", + "Time remaining: 269 seconds\n", + "Time remaining: 268 seconds\n", + "Time remaining: 267 seconds\n", + "Time remaining: 266 seconds\n", + "Time remaining: 265 seconds\n", + "Time remaining: 264 seconds\n", + "Time remaining: 263 seconds\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 25\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[38;5;66;03m# Add your game logic here\u001b[39;00m\n\u001b[0;32m 24\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m---> 25\u001b[0m escape_game()\n", + "Cell \u001b[1;32mIn[1], line 20\u001b[0m, in \u001b[0;36mescape_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou have 5 minutes to escape.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 19\u001b[0m duration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m5\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m60\u001b[39m \u001b[38;5;66;03m# 5 minutes in seconds\u001b[39;00m\n\u001b[1;32m---> 20\u001b[0m start_timer(duration)\n", + "Cell \u001b[1;32mIn[1], line 10\u001b[0m, in \u001b[0;36mstart_timer\u001b[1;34m(duration)\u001b[0m\n\u001b[0;32m 8\u001b[0m remaining_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(end_time \u001b[38;5;241m-\u001b[39m time\u001b[38;5;241m.\u001b[39mtime())\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTime remaining: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mremaining_time\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 10\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTime\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms up!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "import time\n", + "\n", + "def start_timer(duration):\n", + " start_time = time.time()\n", + " end_time = start_time + duration\n", + " \n", + " while time.time() < end_time:\n", + " remaining_time = int(end_time - time.time())\n", + " print(f\"Time remaining: {remaining_time} seconds\")\n", + " time.sleep(1)\n", + " \n", + " print(\"Time's up!\")\n", + " # Add code to handle game over when time is up\n", + "\n", + "def escape_game():\n", + " print(\"Welcome to the Escape Game!\")\n", + " print(\"You have 5 minutes to escape.\")\n", + " \n", + " duration = 5 * 60 # 5 minutes in seconds\n", + " start_timer(duration)\n", + " \n", + " # Add your game logic here\n", + "\n", + "if __name__ == \"__main__\":\n", + " escape_game()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "89149b9f-73be-4d0d-8930-31dc8c6ea18e", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pygame'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[2], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpygame\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtime\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# Initialize pygame\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pygame'" + ] + } + ], + "source": [ + "import pygame\n", + "import time\n", + "\n", + "# Initialize pygame\n", + "pygame.init()\n", + "\n", + "# Initialize the mixer for sound\n", + "pygame.mixer.init()\n", + "\n", + "def play_sound(sound_file):\n", + " pygame.mixer.music.load(sound_file)\n", + " pygame.mixer.music.play()\n", + " while pygame.mixer.music.get_busy():\n", + " pygame.time.Clock().tick(10)\n", + "\n", + "def main():\n", + " try:\n", + " # Play sound effect\n", + " play_sound('path_to_sound_file.wav') # Replace 'path_to_sound_file.wav' with your sound file path\n", + "\n", + " # Keep the program running to let the sound play\n", + " while True:\n", + " time.sleep(1)\n", + " except KeyboardInterrupt:\n", + " pygame.mixer.music.stop()\n", + " pygame.quit()\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "304af359-56f6-4568-af6d-9ac174f8083e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Audio\n", + "\n", + "Audio(\"congratulations-deep-voice-172193.mp3\", autoplay=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "666a0565-8d60-40aa-96cb-89e672d9ff36", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Audio\n", + "Audio(\"congratulations-deep-voice-172193.mp3\", autoplay=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a0f07218-97d3-4e0c-ae9a-c7e0ae1ed96d", + "metadata": {}, + "outputs": [], + "source": [ + "import winsound\n", + "frequency = 1500 \n", + "duration = 1000 \n", + "winsound.Beep(frequency, duration)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ba2410d7-6959-4318-8430-65ac9e4eca7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " __\n", + " / \\\n", + " | |\n", + " \\____/\n", + "\n" + ] + } + ], + "source": [ + "print(\"\"\"\n", + " __\n", + " / \\\\\n", + " | |\n", + " \\\\____/\n", + "\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ae282eea-20b4-4410-bccf-5c38d9c8e75f", + "metadata": {}, + "outputs": [], + "source": [ + "def make_magic():\n", + " print(\"Abracadabra! Magic happening here!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b4b5238a-8e7f-4e3e-b5d7-569b8cbb0e78", + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "\n", + "def random_joke():\n", + " jokes = [\n", + " \"Why did the programmer quit his job? He didn't get arrays.\",\n", + " \"What's a computer's favorite snack? Microchips!\",\n", + " \"Why did the computer cross the road? To get to the other website.\"\n", + " ]\n", + " print(random.choice(jokes))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f5376b1d-e547-4269-aa52-ca48ceaf9697", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "LET'S PLAY!\n" + ] + } + ], + "source": [ + "import time\n", + "for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"LET'S PLAY!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2ccf695a-58c8-402b-a1cc-17288ed3f669", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "😀\n" + ] + } + ], + "source": [ + "print(\"\\U0001F600\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "6e0f28a7-7193-4098-899c-d5dbd3daac34", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Congrats! You escaped the room!😀\n" + ] + } + ], + "source": [ + "print(\"Congrats! You escaped the room!\"+\"\\U0001F600\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "239bb853-c0c6-481f-9881-0fd94b3e5ebd", + "metadata": {}, "outputs": [], "source": [] } diff --git a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb b/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb index f44cc8be..acc2bd2f 100644 --- a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb +++ b/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -164,7 +164,7 @@ " \"\"\"\n", " Start the game\n", " \"\"\"\n", - " print(\"Welcome to your Escape Room!\") \n", + " print(\"Welcome to your Escape Room!\"+\"\\U0001F600\") \n", " player_name = input(\"Before we get started, what's your name? \")\n", " print(f'Hello {player_name} !')\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", @@ -178,7 +178,7 @@ " \"\"\"\n", " game_state[\"current_room\"] = room\n", " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\")\n", + " print(\"Congrats! You escaped the room!\"+\"\\U0001F600\")\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() # strip is for getting rid of any blank space\n", @@ -186,7 +186,7 @@ " 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?\"+\"\\U0001F914\").strip())\n", " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", " play_room(room)\n", @@ -233,17 +233,17 @@ " if(key[\"target\"] == item):\n", " have_key = True\n", " if(have_key):\n", - " output += \"You unlock it with a key you have.\"\n", + " output += \"You unlock it with a key you have\"+\"\\U0001F44D\"\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", + " output += \"It is locked but you don't have the key\"+\"\\U0001F622\"\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", + " output += \"There isn't anything interesting about it\"+\"\\U0001F644\"\n", " print(output)\n", " break\n", "\n", @@ -258,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -268,22 +268,18 @@ "3\n", "2\n", "1\n", - "LET'S PLAY!\n", - "Welcome to your Escape Room!\n" + "LET'S PLAY!\n" ] }, { - "ename": "KeyboardInterrupt", - "evalue": "Interrupted by user", + "ename": "NameError", + "evalue": "name 'INIT_GAME_STATE' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[10], line 13\u001b[0m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[0;32m 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m---> 13\u001b[0m start_game()\n", - "Cell \u001b[1;32mIn[9], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", - "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[13], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m duration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1500\u001b[39m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[1;32m---> 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 13\u001b[0m start_game()\n", + "\u001b[1;31mNameError\u001b[0m: name 'INIT_GAME_STATE' is not defined" ] } ], @@ -295,7 +291,7 @@ "print(\"LET'S PLAY!\")\n", "import winsound\n", "frequency = 1500 \n", - "duration = 1000 \n", + "duration = 1500\n", "winsound.Beep(frequency, duration)\n", "\n", "game_state = INIT_GAME_STATE.copy()\n", @@ -303,6 +299,20 @@ "start_game()\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/Untitled.ipynb b/Untitled.ipynb index 058fd15f..26b94e1d 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -265,9 +265,345 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "dbe849a9-c012-4d23-9f13-f23d543e4b9e", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Welcome to the Escape Game!\n", + "You have 5 minutes to escape.\n", + "Time remaining: 300 seconds\n", + "Time remaining: 298 seconds\n", + "Time remaining: 297 seconds\n", + "Time remaining: 296 seconds\n", + "Time remaining: 295 seconds\n", + "Time remaining: 294 seconds\n", + "Time remaining: 293 seconds\n", + "Time remaining: 292 seconds\n", + "Time remaining: 291 seconds\n", + "Time remaining: 290 seconds\n", + "Time remaining: 289 seconds\n", + "Time remaining: 288 seconds\n", + "Time remaining: 287 seconds\n", + "Time remaining: 286 seconds\n", + "Time remaining: 285 seconds\n", + "Time remaining: 284 seconds\n", + "Time remaining: 283 seconds\n", + "Time remaining: 282 seconds\n", + "Time remaining: 281 seconds\n", + "Time remaining: 280 seconds\n", + "Time remaining: 279 seconds\n", + "Time remaining: 278 seconds\n", + "Time remaining: 277 seconds\n", + "Time remaining: 276 seconds\n", + "Time remaining: 275 seconds\n", + "Time remaining: 274 seconds\n", + "Time remaining: 273 seconds\n", + "Time remaining: 272 seconds\n", + "Time remaining: 271 seconds\n", + "Time remaining: 270 seconds\n", + "Time remaining: 269 seconds\n", + "Time remaining: 268 seconds\n", + "Time remaining: 267 seconds\n", + "Time remaining: 266 seconds\n", + "Time remaining: 265 seconds\n", + "Time remaining: 264 seconds\n", + "Time remaining: 263 seconds\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 25\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[38;5;66;03m# Add your game logic here\u001b[39;00m\n\u001b[0;32m 24\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m---> 25\u001b[0m escape_game()\n", + "Cell \u001b[1;32mIn[1], line 20\u001b[0m, in \u001b[0;36mescape_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou have 5 minutes to escape.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 19\u001b[0m duration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m5\u001b[39m \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m60\u001b[39m \u001b[38;5;66;03m# 5 minutes in seconds\u001b[39;00m\n\u001b[1;32m---> 20\u001b[0m start_timer(duration)\n", + "Cell \u001b[1;32mIn[1], line 10\u001b[0m, in \u001b[0;36mstart_timer\u001b[1;34m(duration)\u001b[0m\n\u001b[0;32m 8\u001b[0m remaining_time \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mint\u001b[39m(end_time \u001b[38;5;241m-\u001b[39m time\u001b[38;5;241m.\u001b[39mtime())\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTime remaining: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mremaining_time\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m seconds\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m---> 10\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTime\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms up!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "import time\n", + "\n", + "def start_timer(duration):\n", + " start_time = time.time()\n", + " end_time = start_time + duration\n", + " \n", + " while time.time() < end_time:\n", + " remaining_time = int(end_time - time.time())\n", + " print(f\"Time remaining: {remaining_time} seconds\")\n", + " time.sleep(1)\n", + " \n", + " print(\"Time's up!\")\n", + " # Add code to handle game over when time is up\n", + "\n", + "def escape_game():\n", + " print(\"Welcome to the Escape Game!\")\n", + " print(\"You have 5 minutes to escape.\")\n", + " \n", + " duration = 5 * 60 # 5 minutes in seconds\n", + " start_timer(duration)\n", + " \n", + " # Add your game logic here\n", + "\n", + "if __name__ == \"__main__\":\n", + " escape_game()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "89149b9f-73be-4d0d-8930-31dc8c6ea18e", + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pygame'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[2], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpygame\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtime\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# Initialize pygame\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pygame'" + ] + } + ], + "source": [ + "import pygame\n", + "import time\n", + "\n", + "# Initialize pygame\n", + "pygame.init()\n", + "\n", + "# Initialize the mixer for sound\n", + "pygame.mixer.init()\n", + "\n", + "def play_sound(sound_file):\n", + " pygame.mixer.music.load(sound_file)\n", + " pygame.mixer.music.play()\n", + " while pygame.mixer.music.get_busy():\n", + " pygame.time.Clock().tick(10)\n", + "\n", + "def main():\n", + " try:\n", + " # Play sound effect\n", + " play_sound('path_to_sound_file.wav') # Replace 'path_to_sound_file.wav' with your sound file path\n", + "\n", + " # Keep the program running to let the sound play\n", + " while True:\n", + " time.sleep(1)\n", + " except KeyboardInterrupt:\n", + " pygame.mixer.music.stop()\n", + " pygame.quit()\n", + "\n", + "if __name__ == \"__main__\":\n", + " main()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "304af359-56f6-4568-af6d-9ac174f8083e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Audio\n", + "\n", + "Audio(\"congratulations-deep-voice-172193.mp3\", autoplay=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "666a0565-8d60-40aa-96cb-89e672d9ff36", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Audio\n", + "Audio(\"congratulations-deep-voice-172193.mp3\", autoplay=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a0f07218-97d3-4e0c-ae9a-c7e0ae1ed96d", + "metadata": {}, + "outputs": [], + "source": [ + "import winsound\n", + "frequency = 1500 \n", + "duration = 1000 \n", + "winsound.Beep(frequency, duration)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "ba2410d7-6959-4318-8430-65ac9e4eca7a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " __\n", + " / \\\n", + " | |\n", + " \\____/\n", + "\n" + ] + } + ], + "source": [ + "print(\"\"\"\n", + " __\n", + " / \\\\\n", + " | |\n", + " \\\\____/\n", + "\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ae282eea-20b4-4410-bccf-5c38d9c8e75f", + "metadata": {}, + "outputs": [], + "source": [ + "def make_magic():\n", + " print(\"Abracadabra! Magic happening here!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b4b5238a-8e7f-4e3e-b5d7-569b8cbb0e78", + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "\n", + "def random_joke():\n", + " jokes = [\n", + " \"Why did the programmer quit his job? He didn't get arrays.\",\n", + " \"What's a computer's favorite snack? Microchips!\",\n", + " \"Why did the computer cross the road? To get to the other website.\"\n", + " ]\n", + " print(random.choice(jokes))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f5376b1d-e547-4269-aa52-ca48ceaf9697", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "LET'S PLAY!\n" + ] + } + ], + "source": [ + "import time\n", + "for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + "print(\"LET'S PLAY!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "2ccf695a-58c8-402b-a1cc-17288ed3f669", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "😀\n" + ] + } + ], + "source": [ + "print(\"\\U0001F600\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "6e0f28a7-7193-4098-899c-d5dbd3daac34", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "(unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \\UXXXXXXXX escape (1201725009.py, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m Cell \u001b[1;32mIn[18], line 1\u001b[1;36m\u001b[0m\n\u001b[1;33m print(\"Congrats! You escaped the room!\"+\"\\U1F915\")\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m (unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \\UXXXXXXXX escape\n" + ] + } + ], + "source": [ + "print(\"Congrats! You escaped the room!\"+\"\\U1F915\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "239bb853-c0c6-481f-9881-0fd94b3e5ebd", + "metadata": {}, "outputs": [], "source": [] } diff --git a/congratulations-deep-voice-172193.mp3 b/congratulations-deep-voice-172193.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fbfe71de3d4300645e7079ccb46e840ac065e078 GIT binary patch literal 104489 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 literal 0 HcmV?d00001 diff --git a/sample-code-eighteen-apr.ipynb b/sample-code-eighteen-apr.ipynb index f44cc8be..acc2bd2f 100644 --- a/sample-code-eighteen-apr.ipynb +++ b/sample-code-eighteen-apr.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 8, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -164,7 +164,7 @@ " \"\"\"\n", " Start the game\n", " \"\"\"\n", - " print(\"Welcome to your Escape Room!\") \n", + " print(\"Welcome to your Escape Room!\"+\"\\U0001F600\") \n", " player_name = input(\"Before we get started, what's your name? \")\n", " print(f'Hello {player_name} !')\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", @@ -178,7 +178,7 @@ " \"\"\"\n", " game_state[\"current_room\"] = room\n", " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\")\n", + " print(\"Congrats! You escaped the room!\"+\"\\U0001F600\")\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() # strip is for getting rid of any blank space\n", @@ -186,7 +186,7 @@ " 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?\"+\"\\U0001F914\").strip())\n", " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", " play_room(room)\n", @@ -233,17 +233,17 @@ " if(key[\"target\"] == item):\n", " have_key = True\n", " if(have_key):\n", - " output += \"You unlock it with a key you have.\"\n", + " output += \"You unlock it with a key you have\"+\"\\U0001F44D\"\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", + " output += \"It is locked but you don't have the key\"+\"\\U0001F622\"\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", + " output += \"There isn't anything interesting about it\"+\"\\U0001F644\"\n", " print(output)\n", " break\n", "\n", @@ -258,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -268,22 +268,18 @@ "3\n", "2\n", "1\n", - "LET'S PLAY!\n", - "Welcome to your Escape Room!\n" + "LET'S PLAY!\n" ] }, { - "ename": "KeyboardInterrupt", - "evalue": "Interrupted by user", + "ename": "NameError", + "evalue": "name 'INIT_GAME_STATE' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[10], line 13\u001b[0m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[0;32m 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m---> 13\u001b[0m start_game()\n", - "Cell \u001b[1;32mIn[9], line 12\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;124;03mStart the game\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWelcome to your Escape Room!\u001b[39m\u001b[38;5;124m\"\u001b[39m) \n\u001b[1;32m---> 12\u001b[0m player_name \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBefore we get started, what\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms your name? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 13\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHello \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mplayer_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m !\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou wake up on a couch and find yourself in a strange house with no windows which you have never been to before. You don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt 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[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", - "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", - "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[13], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m duration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1500\u001b[39m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[1;32m---> 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 13\u001b[0m start_game()\n", + "\u001b[1;31mNameError\u001b[0m: name 'INIT_GAME_STATE' is not defined" ] } ], @@ -295,7 +291,7 @@ "print(\"LET'S PLAY!\")\n", "import winsound\n", "frequency = 1500 \n", - "duration = 1000 \n", + "duration = 1500\n", "winsound.Beep(frequency, duration)\n", "\n", "game_state = INIT_GAME_STATE.copy()\n", @@ -303,6 +299,20 @@ "start_game()\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, From 9bac130d98af998e1a2b877e1aedc724c989356b Mon Sep 17 00:00:00 2001 From: Elora Date: Sat, 20 Apr 2024 23:05:52 +0200 Subject: [PATCH 7/7] Elora final features countdown+beep sound+timer+greetings --- ...P - Elora final features-checkpoint.ipynb} | 117 +- .ipynb_checkpoints/Untitled-checkpoint.ipynb | 13 +- ....ipynb => MVP - Elora final features.ipynb | 117 +- MVP - Elora final features.py | 313 +++++ sample-code-Elora final features.py | 313 +++++ sample-code-eighteen-apr.py | 95 +- .../sample-code-checkpoint.ipynb | 1051 ++++------------- your-code/sample-code.ipynb | 578 ++++----- 8 files changed, 1271 insertions(+), 1326 deletions(-) rename .ipynb_checkpoints/{sample-code-eighteen-apr-checkpoint.ipynb => MVP - Elora final features-checkpoint.ipynb} (77%) rename sample-code-eighteen-apr.ipynb => MVP - Elora final features.ipynb (77%) create mode 100644 MVP - Elora final features.py create mode 100644 sample-code-Elora final features.py diff --git a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb b/.ipynb_checkpoints/MVP - Elora final features-checkpoint.ipynb similarity index 77% rename from .ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb rename to .ipynb_checkpoints/MVP - Elora final features-checkpoint.ipynb index acc2bd2f..543c3921 100644 --- a/.ipynb_checkpoints/sample-code-eighteen-apr-checkpoint.ipynb +++ b/.ipynb_checkpoints/MVP - Elora final features-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 29, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -82,8 +82,8 @@ " \"type\": \"furniture\",\n", "}\n", "\n", - "dinning_table = {\n", - " \"name\": \"dinning_table\",\n", + "dining_table = {\n", + " \"name\": \"dining_table\",\n", " \"type\": \"furniture\",\n", "}\n", "\n", @@ -118,7 +118,7 @@ " \"game_room\": [couch, piano, door_a],\n", " \"bedroom_1\": [queen_bed, door_b, door_a, door_c],\n", " \"bedroom_2\": [double_bed, dresser, door_b],\n", - " \"livingroom\": [dinning_table, door_c, door_d],\n", + " \"livingroom\": [dining_table, door_c, door_d],\n", " \"outside\": [door_d],\n", " \"door_a\": [game_room, bedroom_1],\n", " \"door_b\": [bedroom_1, bedroom_2],\n", @@ -133,7 +133,7 @@ " \"double_bed\": [key_c],\n", " \"dresser\": [key_d],\n", " \"couch\": [],\n", - " \"dinning_table\": [],\n", + " \"dining_table\": [],\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -159,39 +159,72 @@ " Print a line break\n", " \"\"\"\n", " print(\"\\n\\n\")\n", + "\n", + "import time\n", + "import sys\n", + "\n", + "def start_countdown():\n", + " \"\"\"\n", + " Countdown before starting the game\n", + " \"\"\"\n", + " for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + " print(\"LET'S PLAY!\")\n", + " \n", + " # Play a beep sound\n", + " if sys.platform.startswith('win'):\n", + " import winsound\n", + " frequency = 1500\n", + " duration = 1500\n", + " winsound.Beep(frequency, duration)\n", " \n", + "\n", "def start_game():\n", " \"\"\"\n", " Start the game\n", " \"\"\"\n", - " print(\"Welcome to your Escape Room!\"+\"\\U0001F600\") \n", + " print(\"Welcome to your Escape Room!\"+\"\\U0001F525\") \n", " player_name = input(\"Before we get started, what's your name? \")\n", " print(f'Hello {player_name} !')\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", + " # Start the timer\n", + " start_time = time.time()\n", + " \n", + " play_room(game_state[\"current_room\"], start_time)\n", "\n", - "def play_room(room): \n", + "def play_room(room, start_time): \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", + " \n", + " # Calculate elapsed time\n", + " elapsed_time = int(time.time() - start_time)\n", + " print(f\"\\nElapsed Time: {elapsed_time} seconds\\n\")\n", + " \n", " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\"+\"\\U0001F600\")\n", + " print(\"Congrats! You escaped the room!\"+\"\\U0001F389\")\n", + " print(f\"Total Time: {elapsed_time} seconds\")\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() # strip is for getting rid of any blank space\n", + " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'? \").strip()\n", + " \n", " if intended_action == \"explore\":\n", " explore_room(room)\n", - " play_room(room)\n", + " play_room(room, start_time) # Include start_time argument here\n", " elif intended_action == \"examine\":\n", - " examine_item(input(\"What would you like to examine?\"+\"\\U0001F914\").strip())\n", + " examine_item(input(\"What would you like to examine?\"+\"\\U0001F914\").strip(), start_time) # Pass start_time here\n", " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", - " play_room(room)\n", - " linebreak()\n", + " play_room(room, start_time) # Include start_time argument here\n", + " \n", + " linebreak()\n", "\n", + " \n", "def explore_room(room):\n", " \"\"\"\n", " Explore a room. List all items belonging to this room.\n", @@ -209,7 +242,7 @@ " if(not current_room == room):\n", " return room\n", "\n", - "def examine_item(item_name):\n", + "def examine_item(item_name, start_time): # Pass start_time here\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", @@ -233,7 +266,7 @@ " if(key[\"target\"] == item):\n", " have_key = True\n", " if(have_key):\n", - " output += \"You unlock it with a key you have\"+\"\\U0001F44D\"\n", + " output += \"You unlock it with a key you have\"+\"\\U0001F44F\"\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\"+\"\\U0001F622\"\n", @@ -251,14 +284,14 @@ " 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", + " play_room(next_room, start_time) # Include start_time argument here\n", " else:\n", - " play_room(current_room)" + " play_room(current_room, start_time) # Include start_time argument here" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -268,31 +301,39 @@ "3\n", "2\n", "1\n", - "LET'S PLAY!\n" + "LET'S PLAY!\n", + "Welcome to your Escape Room!🔥\n" ] }, { - "ename": "NameError", - "evalue": "name 'INIT_GAME_STATE' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[13], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m duration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1500\u001b[39m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[1;32m---> 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 13\u001b[0m start_game()\n", - "\u001b[1;31mNameError\u001b[0m: name 'INIT_GAME_STATE' is not defined" + "name": "stdin", + "output_type": "stream", + "text": [ + "Before we get started, what's your name? Elora\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Elora !\n", + "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", + "\n", + "Elapsed Time: 0 seconds\n", + "\n", + "You are now in game_room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n" ] } ], "source": [ - "import time\n", - "for x in range(3, 0, -1):\n", - " print(x)\n", - " time.sleep(1)\n", - "print(\"LET'S PLAY!\")\n", - "import winsound\n", - "frequency = 1500 \n", - "duration = 1500\n", - "winsound.Beep(frequency, duration)\n", + "start_countdown()\n", "\n", "game_state = INIT_GAME_STATE.copy()\n", "\n", diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb index efba0e1d..26b94e1d 100644 --- a/.ipynb_checkpoints/Untitled-checkpoint.ipynb +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -582,20 +582,21 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "id": "6e0f28a7-7193-4098-899c-d5dbd3daac34", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Congrats! You escaped the room!😀\n" + "ename": "SyntaxError", + "evalue": "(unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \\UXXXXXXXX escape (1201725009.py, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m Cell \u001b[1;32mIn[18], line 1\u001b[1;36m\u001b[0m\n\u001b[1;33m print(\"Congrats! You escaped the room!\"+\"\\U1F915\")\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m (unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \\UXXXXXXXX escape\n" ] } ], "source": [ - "print(\"Congrats! You escaped the room!\"+\"\\U0001F600\")" + "print(\"Congrats! You escaped the room!\"+\"\\U1F915\")" ] }, { diff --git a/sample-code-eighteen-apr.ipynb b/MVP - Elora final features.ipynb similarity index 77% rename from sample-code-eighteen-apr.ipynb rename to MVP - Elora final features.ipynb index acc2bd2f..543c3921 100644 --- a/sample-code-eighteen-apr.ipynb +++ b/MVP - Elora final features.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 29, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -82,8 +82,8 @@ " \"type\": \"furniture\",\n", "}\n", "\n", - "dinning_table = {\n", - " \"name\": \"dinning_table\",\n", + "dining_table = {\n", + " \"name\": \"dining_table\",\n", " \"type\": \"furniture\",\n", "}\n", "\n", @@ -118,7 +118,7 @@ " \"game_room\": [couch, piano, door_a],\n", " \"bedroom_1\": [queen_bed, door_b, door_a, door_c],\n", " \"bedroom_2\": [double_bed, dresser, door_b],\n", - " \"livingroom\": [dinning_table, door_c, door_d],\n", + " \"livingroom\": [dining_table, door_c, door_d],\n", " \"outside\": [door_d],\n", " \"door_a\": [game_room, bedroom_1],\n", " \"door_b\": [bedroom_1, bedroom_2],\n", @@ -133,7 +133,7 @@ " \"double_bed\": [key_c],\n", " \"dresser\": [key_d],\n", " \"couch\": [],\n", - " \"dinning_table\": [],\n", + " \"dining_table\": [],\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -159,39 +159,72 @@ " Print a line break\n", " \"\"\"\n", " print(\"\\n\\n\")\n", + "\n", + "import time\n", + "import sys\n", + "\n", + "def start_countdown():\n", + " \"\"\"\n", + " Countdown before starting the game\n", + " \"\"\"\n", + " for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + " print(\"LET'S PLAY!\")\n", + " \n", + " # Play a beep sound\n", + " if sys.platform.startswith('win'):\n", + " import winsound\n", + " frequency = 1500\n", + " duration = 1500\n", + " winsound.Beep(frequency, duration)\n", " \n", + "\n", "def start_game():\n", " \"\"\"\n", " Start the game\n", " \"\"\"\n", - " print(\"Welcome to your Escape Room!\"+\"\\U0001F600\") \n", + " print(\"Welcome to your Escape Room!\"+\"\\U0001F525\") \n", " player_name = input(\"Before we get started, what's your name? \")\n", " print(f'Hello {player_name} !')\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", + " # Start the timer\n", + " start_time = time.time()\n", + " \n", + " play_room(game_state[\"current_room\"], start_time)\n", "\n", - "def play_room(room): \n", + "def play_room(room, start_time): \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", + " \n", + " # Calculate elapsed time\n", + " elapsed_time = int(time.time() - start_time)\n", + " print(f\"\\nElapsed Time: {elapsed_time} seconds\\n\")\n", + " \n", " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\"+\"\\U0001F600\")\n", + " print(\"Congrats! You escaped the room!\"+\"\\U0001F389\")\n", + " print(f\"Total Time: {elapsed_time} seconds\")\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() # strip is for getting rid of any blank space\n", + " intended_action = input(\"What would you like to do? Type 'explore' or 'examine'? \").strip()\n", + " \n", " if intended_action == \"explore\":\n", " explore_room(room)\n", - " play_room(room)\n", + " play_room(room, start_time) # Include start_time argument here\n", " elif intended_action == \"examine\":\n", - " examine_item(input(\"What would you like to examine?\"+\"\\U0001F914\").strip())\n", + " examine_item(input(\"What would you like to examine?\"+\"\\U0001F914\").strip(), start_time) # Pass start_time here\n", " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", - " play_room(room)\n", - " linebreak()\n", + " play_room(room, start_time) # Include start_time argument here\n", + " \n", + " linebreak()\n", "\n", + " \n", "def explore_room(room):\n", " \"\"\"\n", " Explore a room. List all items belonging to this room.\n", @@ -209,7 +242,7 @@ " if(not current_room == room):\n", " return room\n", "\n", - "def examine_item(item_name):\n", + "def examine_item(item_name, start_time): # Pass start_time here\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", @@ -233,7 +266,7 @@ " if(key[\"target\"] == item):\n", " have_key = True\n", " if(have_key):\n", - " output += \"You unlock it with a key you have\"+\"\\U0001F44D\"\n", + " output += \"You unlock it with a key you have\"+\"\\U0001F44F\"\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\"+\"\\U0001F622\"\n", @@ -251,14 +284,14 @@ " 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", + " play_room(next_room, start_time) # Include start_time argument here\n", " else:\n", - " play_room(current_room)" + " play_room(current_room, start_time) # Include start_time argument here" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -268,31 +301,39 @@ "3\n", "2\n", "1\n", - "LET'S PLAY!\n" + "LET'S PLAY!\n", + "Welcome to your Escape Room!🔥\n" ] }, { - "ename": "NameError", - "evalue": "name 'INIT_GAME_STATE' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[13], line 11\u001b[0m\n\u001b[0;32m 8\u001b[0m duration \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1500\u001b[39m\n\u001b[0;32m 9\u001b[0m winsound\u001b[38;5;241m.\u001b[39mBeep(frequency, duration)\n\u001b[1;32m---> 11\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[0;32m 13\u001b[0m start_game()\n", - "\u001b[1;31mNameError\u001b[0m: name 'INIT_GAME_STATE' is not defined" + "name": "stdin", + "output_type": "stream", + "text": [ + "Before we get started, what's your name? Elora\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Elora !\n", + "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", + "\n", + "Elapsed Time: 0 seconds\n", + "\n", + "You are now in game_room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n" ] } ], "source": [ - "import time\n", - "for x in range(3, 0, -1):\n", - " print(x)\n", - " time.sleep(1)\n", - "print(\"LET'S PLAY!\")\n", - "import winsound\n", - "frequency = 1500 \n", - "duration = 1500\n", - "winsound.Beep(frequency, duration)\n", + "start_countdown()\n", "\n", "game_state = INIT_GAME_STATE.copy()\n", "\n", diff --git a/MVP - Elora final features.py b/MVP - Elora final features.py new file mode 100644 index 00000000..e495966b --- /dev/null +++ b/MVP - Elora final features.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[26]: + + +# Defining rooms +door_a = { + "name": "door_a", + "type": "door", +} + + +door_b = { + "name": "door_b", + "type": "door", +} + +door_c = { + "name": "door_c", + "type": "door", +} + +door_d = { + "name": "door_d", + "type": "door", +} + +# Defining keys + +key_a = { + "name": "key for door a", + "type": "key", + "target": door_a, +} + +key_b = { + "name": "key for door b", + "type": "key", + "target": door_b, +} + +key_c = { + "name": "key for door c", + "type": "key", + "target": door_c, +} + +key_d = { + "name": "key for door d", + "type": "key", + "target": door_d, +} + + +# Defining items +couch = { + "name": "couch", + "type": "furniture", +} + +piano = { + "name": "piano", + "type": "furniture", +} + + +queen_bed = { + "name": "queen_bed", + "type": "furniture", +} + +double_bed = { + "name": "double_bed", + "type": "furniture", +} + +dresser = { + "name": "dresser", + "type": "furniture", +} + +dining_table = { + "name": "dining_table", + "type": "furniture", +} + +#rooms declaration: +game_room = { + "name": "game_room", + "type": "room", +} + +bedroom_1 = { + "name": "bedroom_1", + "type": "room", +} +bedroom_2 = { + "name": "bedroom_2", + "type": "room", +} + +livingroom = { + "name": "livingroom", + "type": "room", +} +outside = { + "name": "outside", + "type": "room", +} + + +# define which items/rooms are related + +object_relations = { + "game_room": [couch, piano, door_a], + "bedroom_1": [queen_bed, door_b, door_a, door_c], + "bedroom_2": [double_bed, dresser, door_b], + "livingroom": [dining_table, door_c, door_d], + "outside": [door_d], + "door_a": [game_room, bedroom_1], + "door_b": [bedroom_1, bedroom_2], + "door_c": [bedroom_1, livingroom], + "door_d": [livingroom, outside], + "key_a": [door_a], + "key_b": [door_b], + "key_c": [door_c], + "key_d": [door_d], + "piano": [key_a], + "queen_bed": [key_b], + "double_bed": [key_c], + "dresser": [key_d], + "couch": [], + "dining_table": [], +} + +# 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 +} + + +# In[27]: + + +def linebreak(): + """ + Print a line break + """ + print("\n\n") + +import time +import sys + +def start_countdown(): + """ + Countdown before starting the game + """ + for x in range(3, 0, -1): + print(x) + time.sleep(1) + print("LET'S PLAY!") + + # Play a beep sound + if sys.platform.startswith('win'): + import winsound + frequency = 1500 + duration = 1500 + winsound.Beep(frequency, duration) + + +def start_game(): + """ + Start the game + """ + print("Welcome to your Escape Room!"+"\U0001F525") + player_name = input("Before we get started, what's your name? ") + print(f'Hello {player_name} !') + 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!") + + # Start the timer + start_time = time.time() + + play_room(game_state["current_room"], start_time) + +def play_room(room, start_time): + """ + 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 + + # Calculate elapsed time + elapsed_time = int(time.time() - start_time) + print(f"\nElapsed Time: {elapsed_time} seconds\n") + + if(game_state["current_room"] == game_state["target_room"]): + print("Congrats! You escaped the room!"+"\U0001F389") + print(f"Total Time: {elapsed_time} seconds") + else: + print("You are now in " + room["name"]) + intended_action = input("What would you like to do? Type 'explore' or 'examine'? ").strip() + + if intended_action == "explore": + explore_room(room) + play_room(room, start_time) # Include start_time argument here + elif intended_action == "examine": + examine_item(input("What would you like to examine?"+"\U0001F914").strip(), start_time) # Pass start_time here + else: + print("Not sure what you mean. Type 'explore' or 'examine'.") + play_room(room, start_time) # Include start_time argument here + + 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, start_time): # Pass start_time here + """ + 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"+"\U0001F44F" + next_room = get_next_room_of_door(item, current_room) + else: + output += "It is locked but you don't have the key"+"\U0001F622" + 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"+"\U0001F644" + 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, start_time) # Include start_time argument here + else: + play_room(current_room, start_time) # Include start_time argument here + + +# In[ ]: + + +start_countdown() + +game_state = INIT_GAME_STATE.copy() + +start_game() + + +# In[ ]: + + + + + +# In[ ]: + + + + + +# In[ ]: + + + + diff --git a/sample-code-Elora final features.py b/sample-code-Elora final features.py new file mode 100644 index 00000000..e495966b --- /dev/null +++ b/sample-code-Elora final features.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python +# coding: utf-8 + +# In[26]: + + +# Defining rooms +door_a = { + "name": "door_a", + "type": "door", +} + + +door_b = { + "name": "door_b", + "type": "door", +} + +door_c = { + "name": "door_c", + "type": "door", +} + +door_d = { + "name": "door_d", + "type": "door", +} + +# Defining keys + +key_a = { + "name": "key for door a", + "type": "key", + "target": door_a, +} + +key_b = { + "name": "key for door b", + "type": "key", + "target": door_b, +} + +key_c = { + "name": "key for door c", + "type": "key", + "target": door_c, +} + +key_d = { + "name": "key for door d", + "type": "key", + "target": door_d, +} + + +# Defining items +couch = { + "name": "couch", + "type": "furniture", +} + +piano = { + "name": "piano", + "type": "furniture", +} + + +queen_bed = { + "name": "queen_bed", + "type": "furniture", +} + +double_bed = { + "name": "double_bed", + "type": "furniture", +} + +dresser = { + "name": "dresser", + "type": "furniture", +} + +dining_table = { + "name": "dining_table", + "type": "furniture", +} + +#rooms declaration: +game_room = { + "name": "game_room", + "type": "room", +} + +bedroom_1 = { + "name": "bedroom_1", + "type": "room", +} +bedroom_2 = { + "name": "bedroom_2", + "type": "room", +} + +livingroom = { + "name": "livingroom", + "type": "room", +} +outside = { + "name": "outside", + "type": "room", +} + + +# define which items/rooms are related + +object_relations = { + "game_room": [couch, piano, door_a], + "bedroom_1": [queen_bed, door_b, door_a, door_c], + "bedroom_2": [double_bed, dresser, door_b], + "livingroom": [dining_table, door_c, door_d], + "outside": [door_d], + "door_a": [game_room, bedroom_1], + "door_b": [bedroom_1, bedroom_2], + "door_c": [bedroom_1, livingroom], + "door_d": [livingroom, outside], + "key_a": [door_a], + "key_b": [door_b], + "key_c": [door_c], + "key_d": [door_d], + "piano": [key_a], + "queen_bed": [key_b], + "double_bed": [key_c], + "dresser": [key_d], + "couch": [], + "dining_table": [], +} + +# 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 +} + + +# In[27]: + + +def linebreak(): + """ + Print a line break + """ + print("\n\n") + +import time +import sys + +def start_countdown(): + """ + Countdown before starting the game + """ + for x in range(3, 0, -1): + print(x) + time.sleep(1) + print("LET'S PLAY!") + + # Play a beep sound + if sys.platform.startswith('win'): + import winsound + frequency = 1500 + duration = 1500 + winsound.Beep(frequency, duration) + + +def start_game(): + """ + Start the game + """ + print("Welcome to your Escape Room!"+"\U0001F525") + player_name = input("Before we get started, what's your name? ") + print(f'Hello {player_name} !') + 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!") + + # Start the timer + start_time = time.time() + + play_room(game_state["current_room"], start_time) + +def play_room(room, start_time): + """ + 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 + + # Calculate elapsed time + elapsed_time = int(time.time() - start_time) + print(f"\nElapsed Time: {elapsed_time} seconds\n") + + if(game_state["current_room"] == game_state["target_room"]): + print("Congrats! You escaped the room!"+"\U0001F389") + print(f"Total Time: {elapsed_time} seconds") + else: + print("You are now in " + room["name"]) + intended_action = input("What would you like to do? Type 'explore' or 'examine'? ").strip() + + if intended_action == "explore": + explore_room(room) + play_room(room, start_time) # Include start_time argument here + elif intended_action == "examine": + examine_item(input("What would you like to examine?"+"\U0001F914").strip(), start_time) # Pass start_time here + else: + print("Not sure what you mean. Type 'explore' or 'examine'.") + play_room(room, start_time) # Include start_time argument here + + 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, start_time): # Pass start_time here + """ + 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"+"\U0001F44F" + next_room = get_next_room_of_door(item, current_room) + else: + output += "It is locked but you don't have the key"+"\U0001F622" + 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"+"\U0001F644" + 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, start_time) # Include start_time argument here + else: + play_room(current_room, start_time) # Include start_time argument here + + +# In[ ]: + + +start_countdown() + +game_state = INIT_GAME_STATE.copy() + +start_game() + + +# In[ ]: + + + + + +# In[ ]: + + + + + +# In[ ]: + + + + diff --git a/sample-code-eighteen-apr.py b/sample-code-eighteen-apr.py index d4fbd543..e495966b 100644 --- a/sample-code-eighteen-apr.py +++ b/sample-code-eighteen-apr.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # coding: utf-8 -# In[8]: +# In[26]: # Defining rooms @@ -80,8 +80,8 @@ "type": "furniture", } -dinning_table = { - "name": "dinning_table", +dining_table = { + "name": "dining_table", "type": "furniture", } @@ -116,7 +116,7 @@ "game_room": [couch, piano, door_a], "bedroom_1": [queen_bed, door_b, door_a, door_c], "bedroom_2": [double_bed, dresser, door_b], - "livingroom": [dinning_table, door_c, door_d], + "livingroom": [dining_table, door_c, door_d], "outside": [door_d], "door_a": [game_room, bedroom_1], "door_b": [bedroom_1, bedroom_2], @@ -131,7 +131,7 @@ "double_bed": [key_c], "dresser": [key_d], "couch": [], - "dinning_table": [], + "dining_table": [], } # define game state. Do not directly change this dict. @@ -146,7 +146,7 @@ } -# In[12]: +# In[27]: def linebreak(): @@ -154,39 +154,72 @@ def linebreak(): Print a line break """ print("\n\n") + +import time +import sys + +def start_countdown(): + """ + Countdown before starting the game + """ + for x in range(3, 0, -1): + print(x) + time.sleep(1) + print("LET'S PLAY!") + + # Play a beep sound + if sys.platform.startswith('win'): + import winsound + frequency = 1500 + duration = 1500 + winsound.Beep(frequency, duration) + def start_game(): """ Start the game """ - print("Welcome to your Escape Room!") + print("Welcome to your Escape Room!"+"\U0001F525") player_name = input("Before we get started, what's your name? ") print(f'Hello {player_name} !') 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"]) + + # Start the timer + start_time = time.time() + + play_room(game_state["current_room"], start_time) -def play_room(room): +def play_room(room, start_time): """ 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 + + # Calculate elapsed time + elapsed_time = int(time.time() - start_time) + print(f"\nElapsed Time: {elapsed_time} seconds\n") + if(game_state["current_room"] == game_state["target_room"]): - print("Congrats! You escaped the room!") + print("Congrats! You escaped the room!"+"\U0001F389") + print(f"Total Time: {elapsed_time} seconds") else: print("You are now in " + room["name"]) - intended_action = input("What would you like to do? Type 'explore' or 'examine'?").strip() # strip is for getting rid of any blank space + intended_action = input("What would you like to do? Type 'explore' or 'examine'? ").strip() + if intended_action == "explore": explore_room(room) - play_room(room) + play_room(room, start_time) # Include start_time argument here elif intended_action == "examine": - examine_item(input("What would you like to examine?").strip()) + examine_item(input("What would you like to examine?"+"\U0001F914").strip(), start_time) # Pass start_time here else: print("Not sure what you mean. Type 'explore' or 'examine'.") - play_room(room) - linebreak() + play_room(room, start_time) # Include start_time argument here + + linebreak() + def explore_room(room): """ Explore a room. List all items belonging to this room. @@ -204,7 +237,7 @@ def get_next_room_of_door(door, current_room): if(not current_room == room): return room -def examine_item(item_name): +def examine_item(item_name, start_time): # Pass start_time here """ Examine an item which can be a door or furniture. First make sure the intended item belongs to the current room. @@ -228,17 +261,17 @@ def examine_item(item_name): if(key["target"] == item): have_key = True if(have_key): - output += "You unlock it with a key you have." + output += "You unlock it with a key you have"+"\U0001F44F" next_room = get_next_room_of_door(item, current_room) else: - output += "It is locked but you don't have the key." + output += "It is locked but you don't have the key"+"\U0001F622" 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." + output += "There isn't anything interesting about it"+"\U0001F644" print(output) break @@ -246,19 +279,15 @@ def examine_item(item_name): 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) + play_room(next_room, start_time) # Include start_time argument here else: - play_room(current_room) + play_room(current_room, start_time) # Include start_time argument here -# In[16]: +# In[ ]: -import time -for x in range(3, 0, -1): - print(x) - time.sleep(1) -print("LET'S PLAY!") +start_countdown() game_state = INIT_GAME_STATE.copy() @@ -270,3 +299,15 @@ def examine_item(item_name): + +# In[ ]: + + + + + +# In[ ]: + + + + diff --git a/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb index 84cacadc..c9341338 100644 --- a/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb +++ b/your-code/.ipynb_checkpoints/sample-code-checkpoint.ipynb @@ -2,135 +2,138 @@ "cells": [ { "cell_type": "code", - "execution_count": 47, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "# define rooms and items\n", - "#Elora : I defined all rooms and items, should be ok\n", + "# Defining rooms\n", + "door_a = {\n", + " \"name\": \"door_a\",\n", + " \"type\": \"door\",\n", + "}\n", "\n", - "couch = {\n", - " \"name\": \"couch\",\n", - " \"type\": \"furniture\",\n", + "\n", + "door_b = {\n", + " \"name\": \"door_b\",\n", + " \"type\": \"door\",\n", "}\n", "\n", - "door_a = {\n", - " \"name\": \"door a\",\n", + "door_c = {\n", + " \"name\": \"door_c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door_d\",\n", " \"type\": \"door\",\n", "}\n", "\n", + "# Defining keys\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", - "outside = {\n", - " \"name\": \"outside\"\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", "}\n", "\n", - "queen_bed = {\n", - " \"name\": \"queen bed\",\n", - " \"type\": \"furniture\",\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", "}\n", "\n", - "door_b = {\n", - " \"name\": \"door b\",\n", - " \"type\": \"door\",\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", "}\n", "\n", - "door_c = {\n", - " \"name\": \"door c\",\n", - " \"type\": \"door\",\n", - "}\n", "\n", - "bedroom1 = {\n", - " \"name\": \"bedroom1\",\n", - " \"type\": \"room\",\n", + "# Defining items\n", + "couch = {\n", + " \"name\": \"couch\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", - "key_b = {\n", - " \"name\": \"key for door b\",\n", - " \"type\": \"key\",\n", - " \"target\": door_b,\n", + "piano = {\n", + " \"name\": \"piano\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", - "bedroom2 = {\n", - " \"name\": \"bedroom2\",\n", - " \"type\": \"room\",\n", + " \n", + "queen_bed = {\n", + " \"name\": \"queen_bed\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", "double_bed = {\n", - " \"name\": \"double bed\",\n", + " \"name\": \"double_bed\",\n", " \"type\": \"furniture\",\n", "}\n", - "\n", + " \n", "dresser = {\n", " \"name\": \"dresser\",\n", " \"type\": \"furniture\",\n", "}\n", "\n", - "key_c = {\n", - " \"name\": \"key for door c\",\n", - " \"type\": \"key\",\n", - " \"target\": door_c,\n", + "dining_table = {\n", + " \"name\": \"dining_table\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", - "door_d = {\n", - " \"name\": \"door d\",\n", - " \"type\": \"door\",\n", + "#rooms declaration: \n", + "game_room = {\n", + " \"name\": \"game_room\",\n", + " \"type\": \"room\",\n", "}\n", "\n", - "key_d = {\n", - " \"name\": \"key for door d\",\n", - " \"type\": \"key\",\n", - " \"target\": door_d,\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom_1\",\n", + " \"type\": \"room\",\n", "}\n", - "\n", - "living_room = {\n", - " \"name\": \"living room\",\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom_2\",\n", " \"type\": \"room\",\n", "}\n", "\n", - "dining_table = {\n", - " \"name\": \"dining table\",\n", - " \"type\": \"furniture\",\n", + "livingroom = {\n", + " \"name\": \"livingroom\",\n", + " \"type\": \"room\",\n", + "}\n", + "outside = {\n", + " \"name\": \"outside\",\n", + " \"type\": \"room\",\n", "}\n", "\n", - "#Elora : I defined all rooms and doors, should be ok\n", - "\n", - "all_rooms = [game_room, outside, bedroom1, bedroom2, living_room]\n", - "\n", - "all_doors = [door_a, door_b, door_c, door_d]\n", "\n", "# define which items/rooms are related\n", "\n", - "#Elora : I defined all related items/rooms\n", - "\n", "object_relations = {\n", - " \"game room\": [couch, piano, door_a],\n", + " \"game_room\": [couch, piano, door_a],\n", + " \"bedroom_1\": [queen_bed, door_b, door_a, door_c],\n", + " \"bedroom_2\": [double_bed, dresser, door_b],\n", + " \"livingroom\": [dining_table, door_c, door_d],\n", + " \"outside\": [door_d],\n", + " \"door_a\": [game_room, bedroom_1],\n", + " \"door_b\": [bedroom_1, bedroom_2],\n", + " \"door_c\": [bedroom_1, livingroom],\n", + " \"door_d\": [livingroom, outside],\n", + " \"key_a\": [door_a],\n", + " \"key_b\": [door_b],\n", + " \"key_c\": [door_c],\n", + " \"key_d\": [door_d],\n", " \"piano\": [key_a],\n", - " \"outside\": [door_a, door_c],\n", - " \"door a\": [game_room, bedroom1],\n", - " \"bedroom1\": [queen_bed, door_b, door_c],\n", - " \"queen bed\": [key_b],\n", - " \"door b\": [bedroom1, bedroom2],\n", - " \"door c\": [bedroom1, living_room],\n", - " \"bedroom2\": [double_bed, dresser, door_b],\n", - " \"double bed\": [key_c],\n", + " \"queen_bed\": [key_b],\n", + " \"double_bed\": [key_c],\n", " \"dresser\": [key_d],\n", - " \"living room\": [dining_table, door_c, door_d],\n", - " \"door d\": [living_room, outside]\n", + " \"couch\": [],\n", + " \"dining_table\": [],\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -141,28 +144,13 @@ "INIT_GAME_STATE = {\n", " \"current_room\": game_room,\n", " \"keys_collected\": [],\n", - " \"target_room\": bedroom1\n", - "}\n", - "BEDROOM1_GAME_STATE = {\n", - " \"current_room\": bedroom1,\n", - " \"keys_collected\": [],\n", - " \"target_room\": bedroom2\n", - "}\n", - "BEDROOM2_GAME_STATE = {\n", - " \"current_room\": bedroom2,\n", - " \"keys_collected\": [],\n", - " \"target_room\": bedroom1,\n", - "}\n", - "LIVING_ROOM_GAME_STATE = {\n", - " \"current_room\": living_room,\n", - " \"keys_collected\": [],\n", " \"target_room\": outside\n", "}" ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -172,38 +160,71 @@ " \"\"\"\n", " print(\"\\n\\n\")\n", "\n", + "import time\n", + "import sys\n", + "\n", + "def start_countdown():\n", + " \"\"\"\n", + " Countdown before starting the game\n", + " \"\"\"\n", + " for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + " print(\"LET'S PLAY!\")\n", + " \n", + " # Play a beep sound\n", + " if sys.platform.startswith('win'):\n", + " import winsound\n", + " frequency = 1500\n", + " duration = 1500\n", + " winsound.Beep(frequency, duration)\n", + " \n", + "\n", "def start_game():\n", " \"\"\"\n", " Start the game\n", " \"\"\"\n", - " print(\"Welcome to your Escape Room!\") #Elora : Added greetings to the user\n", + " print(\"Welcome to your Escape Room!\"+\"\\U0001F525\") \n", " player_name = input(\"Before we get started, what's your name? \")\n", " print(f'Hello {player_name} !')\n", - " print(\"You woke up on a couch and found 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", + " 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", + " \n", + " # Start the timer\n", + " start_time = time.time()\n", + " \n", + " play_room(game_state[\"current_room\"], start_time)\n", "\n", - "def play_room(room):\n", + "def play_room(room, start_time): \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", + " \n", + " # Calculate elapsed time\n", + " elapsed_time = int(time.time() - start_time)\n", + " print(f\"\\nElapsed Time: {elapsed_time} seconds\\n\")\n", + " \n", " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\")\n", + " print(\"Congrats! You escaped the room!\"+\"\\U0001F389\")\n", + " print(f\"Total Time: {elapsed_time} seconds\")\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'? \").strip()\n", + " \n", " if intended_action == \"explore\":\n", " explore_room(room)\n", - " play_room(room)\n", + " play_room(room, start_time) # Include start_time argument here\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?\"+\"\\U0001F914\").strip(), start_time) # Pass start_time here\n", " else:\n", " print(\"Not sure what you mean. Type 'explore' or 'examine'.\")\n", - " play_room(room)\n", - " linebreak()\n", + " play_room(room, start_time) # Include start_time argument here\n", + " \n", + " linebreak()\n", "\n", + " \n", "def explore_room(room):\n", " \"\"\"\n", " Explore a room. List all items belonging to this room.\n", @@ -221,7 +242,7 @@ " if(not current_room == room):\n", " return room\n", "\n", - "def examine_item(item_name):\n", + "def examine_item(item_name, start_time): # Pass start_time here\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", @@ -245,102 +266,17 @@ " if(key[\"target\"] == item):\n", " have_key = True\n", " if(have_key):\n", - " output += \"You unlock it with a key you have.\"\n", + " output += \"You unlock it with a key you have\"+\"\\U0001F44F\"\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", + " output += \"It is locked but you don't have the key\"+\"\\U0001F622\"\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", - "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_state2[\"current_room\"] = room\n", - " if(game_state2[\"current_room\"] == game_state2[\"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_state2[\"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_state2[\"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_state2[\"keys_collected\"].append(item_found)\n", - " output += \"You find \" + item_found[\"name\"] + \".\"\n", - " else:\n", - " output += \"There isn't anything interesting about it.\"\n", + " output += \"There isn't anything interesting about it\"+\"\\U0001F644\"\n", " print(output)\n", " break\n", "\n", @@ -348,656 +284,89 @@ " 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", - "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_state3[\"current_room\"] = room\n", - " if(game_state3[\"current_room\"] == game_state3[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\")\n", + " play_room(next_room, start_time) # Include start_time argument here\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", + " play_room(current_room, start_time) # Include start_time argument here" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "LET'S PLAY!\n", + "Welcome to your Escape Room!🔥\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Before we get started, what's your name? Elora\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Elora !\n", + "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", + "\n", + "Elapsed Time: 0 seconds\n", + "\n", + "You are now in game_room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine?🤔 piano\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine piano. You find key for door a.\n", + "\n", + "Elapsed Time: 6 seconds\n", + "\n", + "You are now in game_room\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "Interrupted by user", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[3], line 5\u001b[0m\n\u001b[0;32m 1\u001b[0m start_countdown()\n\u001b[0;32m 3\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m----> 5\u001b[0m start_game()\n", + "Cell \u001b[1;32mIn[2], line 39\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 36\u001b[0m \u001b[38;5;66;03m# Start the timer\u001b[39;00m\n\u001b[0;32m 37\u001b[0m start_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m---> 39\u001b[0m play_room(game_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcurrent_room\u001b[39m\u001b[38;5;124m\"\u001b[39m], start_time)\n", + "Cell \u001b[1;32mIn[2], line 64\u001b[0m, in \u001b[0;36mplay_room\u001b[1;34m(room, start_time)\u001b[0m\n\u001b[0;32m 62\u001b[0m play_room(room, start_time) \u001b[38;5;66;03m# Include start_time argument here\u001b[39;00m\n\u001b[0;32m 63\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m intended_action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexamine\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m---> 64\u001b[0m examine_item(\u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWhat would you like to examine?\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\U0001F914\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m.\u001b[39mstrip(), start_time) \u001b[38;5;66;03m# Pass start_time here\u001b[39;00m\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 66\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNot sure what you mean. Type \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexplore\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexamine\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[1;32mIn[2], line 133\u001b[0m, in \u001b[0;36mexamine_item\u001b[1;34m(item_name, start_time)\u001b[0m\n\u001b[0;32m 131\u001b[0m play_room(next_room, start_time) \u001b[38;5;66;03m# Include start_time argument here\u001b[39;00m\n\u001b[0;32m 132\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 133\u001b[0m play_room(current_room, start_time)\n", + "Cell \u001b[1;32mIn[2], line 58\u001b[0m, in \u001b[0;36mplay_room\u001b[1;34m(room, start_time)\u001b[0m\n\u001b[0;32m 56\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 57\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou are now in \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m room[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m])\n\u001b[1;32m---> 58\u001b[0m intended_action \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWhat would you like to do? Type \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexplore\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexamine\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m.\u001b[39mstrip()\n\u001b[0;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m intended_action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexplore\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 61\u001b[0m explore_room(room)\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + ] + } + ], + "source": [ + "start_countdown()\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", + "game_state = INIT_GAME_STATE.copy()\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_state3[\"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_state3[\"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_state3[\"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", - "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_state4[\"current_room\"] = room\n", - " if(game_state4[\"current_room\"] == game_state4[\"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_state4[\"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_state4[\"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_state4[\"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": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Welcome to your Escape Room!\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Before we get started, what's your name? Elora\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Hello Elora !\n", - "You woke up on a couch and found 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" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is game room. You find couch, piano, door a\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? couch\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine couch. There isn't anything interesting about it.\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door a\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door a. It is locked but you don't have the key.\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? piano\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine piano. You find key for door a.\n", - "You are now in game room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door a\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door a. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is bedroom1. You find queen bed, door b, door c\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door b\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door b. It is locked but you don't have the key.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? exaine\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? door c\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Not sure what you mean. Type 'explore' or 'examine'.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door c\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door c. It is locked but you don't have the key.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? queen bed\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine queen bed. You find key for door b.\n", - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door b\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door b. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is bedroom2. You find double bed, dresser, door b\n", - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? dresser\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine dresser. You find key for door d.\n", - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? double bed\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine double bed. You find key for door c.\n", - "You are now in bedroom2\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door b\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door b. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in bedroom1\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door c\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door c. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You are now in living room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? explore\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You explore the room. This is living room. You find dining table, door c, door d\n", - "You are now in living room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? dining table\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine dining table. There isn't anything interesting about it.\n", - "You are now in living room\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "What would you like to do? Type 'explore' or 'examine'? examine\n", - "What would you like to examine? door d\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "You examine door d. You unlock it with a key you have.\n" - ] - }, - { - "name": "stdin", - "output_type": "stream", - "text": [ - "Do you want to go to the next room? Enter 'yes' or 'no' yes\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Congrats! You escaped the room!\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "game_state = INIT_GAME_STATE.copy()\n", - "game_state2 = BEDROOM1_GAME_STATE.copy()\n", - "game_state3 = BEDROOM2_GAME_STATE.copy()\n", - "game_state4 = LIVING_ROOM_GAME_STATE.copy()\n", - "\n", - "start_game()" + "start_game()\n" ] }, { @@ -1005,9 +374,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " - ] + "source": [] } ], "metadata": { diff --git a/your-code/sample-code.ipynb b/your-code/sample-code.ipynb index 61e46ebb..c9341338 100644 --- a/your-code/sample-code.ipynb +++ b/your-code/sample-code.ipynb @@ -2,135 +2,138 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "# define rooms and items\n", - "#Elora : I defined all rooms and items, should be ok\n", + "# Defining rooms\n", + "door_a = {\n", + " \"name\": \"door_a\",\n", + " \"type\": \"door\",\n", + "}\n", "\n", - "couch = {\n", - " \"name\": \"couch\",\n", - " \"type\": \"furniture\",\n", + "\n", + "door_b = {\n", + " \"name\": \"door_b\",\n", + " \"type\": \"door\",\n", "}\n", "\n", - "door_a = {\n", - " \"name\": \"door a\",\n", + "door_c = {\n", + " \"name\": \"door_c\",\n", + " \"type\": \"door\",\n", + "}\n", + "\n", + "door_d = {\n", + " \"name\": \"door_d\",\n", " \"type\": \"door\",\n", "}\n", "\n", + "# Defining keys\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", - "outside = {\n", - " \"name\": \"outside\"\n", + "key_b = {\n", + " \"name\": \"key for door b\",\n", + " \"type\": \"key\",\n", + " \"target\": door_b,\n", "}\n", "\n", - "queen_bed = {\n", - " \"name\": \"queen bed\",\n", - " \"type\": \"furniture\",\n", + "key_c = {\n", + " \"name\": \"key for door c\",\n", + " \"type\": \"key\",\n", + " \"target\": door_c,\n", "}\n", "\n", - "door_b = {\n", - " \"name\": \"door b\",\n", - " \"type\": \"door\",\n", + "key_d = {\n", + " \"name\": \"key for door d\",\n", + " \"type\": \"key\",\n", + " \"target\": door_d,\n", "}\n", "\n", - "door_c = {\n", - " \"name\": \"door c\",\n", - " \"type\": \"door\",\n", - "}\n", "\n", - "bedroom1 = {\n", - " \"name\": \"bedroom1\",\n", - " \"type\": \"room\",\n", + "# Defining items\n", + "couch = {\n", + " \"name\": \"couch\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", - "key_b = {\n", - " \"name\": \"key for door b\",\n", - " \"type\": \"key\",\n", - " \"target\": door_b,\n", + "piano = {\n", + " \"name\": \"piano\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", - "bedroom2 = {\n", - " \"name\": \"bedroom2\",\n", - " \"type\": \"room\",\n", + " \n", + "queen_bed = {\n", + " \"name\": \"queen_bed\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", "double_bed = {\n", - " \"name\": \"double bed\",\n", + " \"name\": \"double_bed\",\n", " \"type\": \"furniture\",\n", "}\n", - "\n", + " \n", "dresser = {\n", " \"name\": \"dresser\",\n", " \"type\": \"furniture\",\n", "}\n", "\n", - "key_c = {\n", - " \"name\": \"key for door c\",\n", - " \"type\": \"key\",\n", - " \"target\": door_c,\n", + "dining_table = {\n", + " \"name\": \"dining_table\",\n", + " \"type\": \"furniture\",\n", "}\n", "\n", - "door_d = {\n", - " \"name\": \"door d\",\n", - " \"type\": \"door\",\n", + "#rooms declaration: \n", + "game_room = {\n", + " \"name\": \"game_room\",\n", + " \"type\": \"room\",\n", "}\n", "\n", - "key_d = {\n", - " \"name\": \"key for door d\",\n", - " \"type\": \"key\",\n", - " \"target\": door_d,\n", + "bedroom_1 = {\n", + " \"name\": \"bedroom_1\",\n", + " \"type\": \"room\",\n", "}\n", - "\n", - "living_room = {\n", - " \"name\": \"living room\",\n", + "bedroom_2 = {\n", + " \"name\": \"bedroom_2\",\n", " \"type\": \"room\",\n", "}\n", "\n", - "dining_table = {\n", - " \"name\": \"dining table\",\n", - " \"type\": \"furniture\",\n", + "livingroom = {\n", + " \"name\": \"livingroom\",\n", + " \"type\": \"room\",\n", + "}\n", + "outside = {\n", + " \"name\": \"outside\",\n", + " \"type\": \"room\",\n", "}\n", "\n", - "#Elora : I defined all rooms and doors, should be ok\n", - "\n", - "all_rooms = [game_room, outside, bedroom1, bedroom2, living_room]\n", - "\n", - "all_doors = [door_a, door_b, door_c, door_d]\n", "\n", "# define which items/rooms are related\n", "\n", - "#Elora : I defined all related items/rooms\n", - "\n", "object_relations = {\n", - " \"game room\": [couch, piano, door_a],\n", + " \"game_room\": [couch, piano, door_a],\n", + " \"bedroom_1\": [queen_bed, door_b, door_a, door_c],\n", + " \"bedroom_2\": [double_bed, dresser, door_b],\n", + " \"livingroom\": [dining_table, door_c, door_d],\n", + " \"outside\": [door_d],\n", + " \"door_a\": [game_room, bedroom_1],\n", + " \"door_b\": [bedroom_1, bedroom_2],\n", + " \"door_c\": [bedroom_1, livingroom],\n", + " \"door_d\": [livingroom, outside],\n", + " \"key_a\": [door_a],\n", + " \"key_b\": [door_b],\n", + " \"key_c\": [door_c],\n", + " \"key_d\": [door_d],\n", " \"piano\": [key_a],\n", - " \"outside\": [door_a, door_c],\n", - " \"door a\": [game_room, bedroom1],\n", - " \"bedroom1\": [queen_bed, door_b, door_c],\n", - " \"queen bed\": [key_b],\n", - " \"door b\": [bedroom1, bedroom2],\n", - " \"door c\": [bedroom1, living_room],\n", - " \"bedroom2\": [double_bed, dresser, door_b],\n", - " \"double bed\": [key_c],\n", + " \"queen_bed\": [key_b],\n", + " \"double_bed\": [key_c],\n", " \"dresser\": [key_d],\n", - " \"living room\": [dining_table, door_c, door_d],\n", - " \"door d\": [living_room, outside]\n", + " \"couch\": [],\n", + " \"dining_table\": [],\n", "}\n", "\n", "# define game state. Do not directly change this dict. \n", @@ -141,30 +144,13 @@ "INIT_GAME_STATE = {\n", " \"current_room\": game_room,\n", " \"keys_collected\": [],\n", - " \"target_room\": bedroom1\n", - "}\n", - "BEDROOM1_GAME_STATE = {\n", - " \"current_room\": bedroom1,\n", - " \"keys_collected\": [],\n", - " \"target_room\": bedroom2\n", - "}\n", - "BEDROOM2_GAME_STATE = {\n", - " \"current_room\": bedroom2,\n", - " \"keys_collected\": [],\n", - " \"target_room\": bedroom1,\n", - "}\n", - "LIVING_ROOM_GAME_STATE = {\n", - " \"current_room\": living_room,\n", - " \"keys_collected\": [],\n", " \"target_room\": outside\n", - "}\n", - "\n", - "game_state = INIT_GAME_STATE.copy() " + "}" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -174,293 +160,71 @@ " \"\"\"\n", " print(\"\\n\\n\")\n", "\n", - "def start_game():\n", - " \"\"\"\n", - " Start the game\n", - " \"\"\"\n", - " print(\"Welcome to your Escape Room!\") #Elora : Added greetings to the user\n", - " player_name = input(\"Before we get started, what's your name? \")\n", - " print(f'Hello {player_name} !')\n", - " print(\"You woke up on a couch and found 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\"]) #Montaseer: where was the dictionary 'game_state' defined? Defining it as a copy of INIT_GAME_STATE\n", + "import time\n", + "import sys\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", + "def start_countdown():\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", + " Countdown before starting the game\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", + " for x in range(3, 0, -1):\n", + " print(x)\n", + " time.sleep(1)\n", + " print(\"LET'S PLAY!\")\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", + " # Play a beep sound\n", + " if sys.platform.startswith('win'):\n", + " import winsound\n", + " frequency = 1500\n", + " duration = 1500\n", + " winsound.Beep(frequency, duration)\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", - "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_state2[\"current_room\"] = room\n", - " if(game_state2[\"current_room\"] == game_state2[\"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", + "def start_game():\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", + " Start the game\n", " \"\"\"\n", - " current_room = game_state2[\"current_room\"]\n", - " next_room = \"\"\n", - " output = None\n", + " print(\"Welcome to your Escape Room!\"+\"\\U0001F525\") \n", + " player_name = input(\"Before we get started, what's your name? \")\n", + " print(f'Hello {player_name} !')\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", " \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_state2[\"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_state2[\"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", + " # Start the timer\n", + " start_time = time.time()\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", + " play_room(game_state[\"current_room\"], start_time)\n", "\n", - "def play_room(room):\n", + "def play_room(room, start_time): \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_state3[\"current_room\"] = room\n", - " if(game_state3[\"current_room\"] == game_state3[\"target_room\"]):\n", - " print(\"Congrats! You escaped the room!\")\n", + " game_state[\"current_room\"] = room\n", + " \n", + " # Calculate elapsed time\n", + " elapsed_time = int(time.time() - start_time)\n", + " print(f\"\\nElapsed Time: {elapsed_time} seconds\\n\")\n", + " \n", + " if(game_state[\"current_room\"] == game_state[\"target_room\"]):\n", + " print(\"Congrats! You escaped the room!\"+\"\\U0001F389\")\n", + " print(f\"Total Time: {elapsed_time} seconds\")\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'? \").strip()\n", + " \n", " if intended_action == \"explore\":\n", " explore_room(room)\n", - " play_room(room)\n", + " play_room(room, start_time) # Include start_time argument here\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?\"+\"\\U0001F914\").strip(), start_time) # Pass start_time here\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_state3[\"current_room\"]\n", - " next_room = \"\"\n", - " output = None\n", + " play_room(room, start_time) # Include start_time argument here\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_state3[\"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_state3[\"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", + " linebreak()\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", - "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_state4[\"current_room\"] = room\n", - " if(game_state4[\"current_room\"] == game_state4[\"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", @@ -478,7 +242,7 @@ " if(not current_room == room):\n", " return room\n", "\n", - "def examine_item(item_name):\n", + "def examine_item(item_name, start_time): # Pass start_time here\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", @@ -489,7 +253,7 @@ " play either the current or the next room depending on the game state\n", " to keep playing.\n", " \"\"\"\n", - " current_room = game_state4[\"current_room\"]\n", + " current_room = game_state[\"current_room\"]\n", " next_room = \"\"\n", " output = None\n", " \n", @@ -498,21 +262,21 @@ " output = \"You examine \" + item_name + \". \"\n", " if(item[\"type\"] == \"door\"):\n", " have_key = False\n", - " for key in game_state4[\"keys_collected\"]:\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", + " output += \"You unlock it with a key you have\"+\"\\U0001F44F\"\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", + " output += \"It is locked but you don't have the key\"+\"\\U0001F622\"\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_state4[\"keys_collected\"].append(item_found)\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", + " output += \"There isn't anything interesting about it\"+\"\\U0001F644\"\n", " print(output)\n", " break\n", "\n", @@ -520,23 +284,89 @@ " 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", + " play_room(next_room, start_time) # Include start_time argument here\n", " else:\n", - " play_room(current_room)" + " play_room(current_room, start_time) # Include start_time argument here" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "2\n", + "1\n", + "LET'S PLAY!\n", + "Welcome to your Escape Room!🔥\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Before we get started, what's your name? Elora\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello Elora !\n", + "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", + "\n", + "Elapsed Time: 0 seconds\n", + "\n", + "You are now in game_room\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "What would you like to do? Type 'explore' or 'examine'? examine\n", + "What would you like to examine?🤔 piano\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You examine piano. You find key for door a.\n", + "\n", + "Elapsed Time: 6 seconds\n", + "\n", + "You are now in game_room\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "Interrupted by user", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[3], line 5\u001b[0m\n\u001b[0;32m 1\u001b[0m start_countdown()\n\u001b[0;32m 3\u001b[0m game_state \u001b[38;5;241m=\u001b[39m INIT_GAME_STATE\u001b[38;5;241m.\u001b[39mcopy()\n\u001b[1;32m----> 5\u001b[0m start_game()\n", + "Cell \u001b[1;32mIn[2], line 39\u001b[0m, in \u001b[0;36mstart_game\u001b[1;34m()\u001b[0m\n\u001b[0;32m 36\u001b[0m \u001b[38;5;66;03m# Start the timer\u001b[39;00m\n\u001b[0;32m 37\u001b[0m start_time \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m---> 39\u001b[0m play_room(game_state[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcurrent_room\u001b[39m\u001b[38;5;124m\"\u001b[39m], start_time)\n", + "Cell \u001b[1;32mIn[2], line 64\u001b[0m, in \u001b[0;36mplay_room\u001b[1;34m(room, start_time)\u001b[0m\n\u001b[0;32m 62\u001b[0m play_room(room, start_time) \u001b[38;5;66;03m# Include start_time argument here\u001b[39;00m\n\u001b[0;32m 63\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m intended_action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexamine\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m---> 64\u001b[0m examine_item(\u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWhat would you like to examine?\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\U0001F914\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m.\u001b[39mstrip(), start_time) \u001b[38;5;66;03m# Pass start_time here\u001b[39;00m\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 66\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mNot sure what you mean. Type \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexplore\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexamine\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[1;32mIn[2], line 133\u001b[0m, in \u001b[0;36mexamine_item\u001b[1;34m(item_name, start_time)\u001b[0m\n\u001b[0;32m 131\u001b[0m play_room(next_room, start_time) \u001b[38;5;66;03m# Include start_time argument here\u001b[39;00m\n\u001b[0;32m 132\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 133\u001b[0m play_room(current_room, start_time)\n", + "Cell \u001b[1;32mIn[2], line 58\u001b[0m, in \u001b[0;36mplay_room\u001b[1;34m(room, start_time)\u001b[0m\n\u001b[0;32m 56\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 57\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou are now in \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m room[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m])\n\u001b[1;32m---> 58\u001b[0m intended_action \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWhat would you like to do? Type \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexplore\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m or \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexamine\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m? \u001b[39m\u001b[38;5;124m\"\u001b[39m)\u001b[38;5;241m.\u001b[39mstrip()\n\u001b[0;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m intended_action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mexplore\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 61\u001b[0m explore_room(room)\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[1;34m(self, prompt)\u001b[0m\n\u001b[0;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[1;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[0;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[0;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[0;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[0;32m 1267\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\ipykernel\\kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[1;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[0;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[0;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[0;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "\u001b[1;31mKeyboardInterrupt\u001b[0m: Interrupted by user" + ] + } + ], "source": [ + "start_countdown()\n", + "\n", "game_state = INIT_GAME_STATE.copy()\n", - "game_state2 = BEDROOM1_GAME_STATE.copy()\n", - "game_state3 = BEDROOM2_GAME_STATE.copy()\n", - "game_state4 = LIVING_ROOM_GAME_STATE.copy()\n", "\n", - "start_game()" + "start_game()\n" ] }, { @@ -544,9 +374,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "#Elora : improvements ideas : sounds (when user finds a key, when a door opens) // Timer " - ] + "source": [] } ], "metadata": {