From c7e3c632644511d1f271366e8eaa3daf5fb565f6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:22:49 -0500 Subject: [PATCH 01/70] Complete args.py --- src/day-1-toy/args.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/day-1-toy/args.py b/src/day-1-toy/args.py index 06a830e4c8..223f99c9dd 100644 --- a/src/day-1-toy/args.py +++ b/src/day-1-toy/args.py @@ -4,7 +4,8 @@ # Write a function f1 that takes two integer positional arguments and returns # the sum. This is what you'd consider to be a regular, normal function. -#def f1(... +def f1(num, num2): + return num + num2 print(f1(1, 2)) @@ -12,6 +13,11 @@ # sum. Google for "python arbitrary arguments" and look for "*args" # def f2(... +def f2(*args, **kwargs): + sum = 0 + for num in args: + sum += num + return sum print(f2(1)) # Should print 1 print(f2(1, 3)) # Should print 4 @@ -21,13 +27,16 @@ a = [7, 6, 5, 4] # What thing do you have to add to make this work? -print(f2(a)) # Should print 22 +print(f2(*a)) # Should print 22 # Write a function f3 that accepts either one or two arguments. If one argument, # it returns that value plus 1. If two arguments, it returns the sum of the # arguments. Google "python default arguments" for a hint. -#def f3(... +def f3(arg, arg2=None): + if arg2 is None: + return arg + 1 + return arg + arg2 print(f3(1, 2)) # Should print 3 print(f3(8)) # Should print 9 @@ -41,7 +50,10 @@ # # Google "python keyword arguments". -#def f4(... +def f4(*args, **kwargs): + for key, val in kwargs.items(): + print(f"Key: {key}, Value: {val}") + # Should print # key: a, value: 12 @@ -60,4 +72,4 @@ } # What thing do you have to add to make this work? -f4(d) \ No newline at end of file +f4(**d) \ No newline at end of file From 02f50cc2f2ead37f2343d40c7e93f5e9e216bb96 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:28:15 -0500 Subject: [PATCH 02/70] Complete bignum.py --- src/day-1-toy/bignum.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/day-1-toy/bignum.py b/src/day-1-toy/bignum.py index 77e8d66ffa..84eddd1925 100644 --- a/src/day-1-toy/bignum.py +++ b/src/day-1-toy/bignum.py @@ -1 +1,2 @@ -# Print out 2 to the 65536 power \ No newline at end of file +# Print out 2 to the 65536 power +print(2**65536) \ No newline at end of file From 3bd1c2bab3ea5990517e86795901f390ef582308 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:40:04 -0500 Subject: [PATCH 03/70] Complete comp.py --- src/day-1-toy/comp.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/day-1-toy/comp.py b/src/day-1-toy/comp.py index 083e9b9140..fd22b54fa8 100644 --- a/src/day-1-toy/comp.py +++ b/src/day-1-toy/comp.py @@ -1,13 +1,13 @@ # Write a list comprehension to produce the array [1, 2, 3, 4, 5] -y = [] +y = [x for x in range(1, 6)] -print (y) +print(y) # Write a list comprehension to produce the cubes of the numbers 0-9: # [0, 1, 8, 27, 64, 125, 216, 343, 512, 729] -y = [] +y = [x**3 for x in range(10)] print(y) @@ -16,7 +16,7 @@ a = ["foo", "bar", "baz"] -y = [] +y = [x.upper() for x in a] print(y) @@ -26,7 +26,7 @@ x = input("Enter comma-separated numbers: ").split(',') # What do you need between the square brackets to make it work? -y = [] +y = [num for num in x if int(num) % 2 == 0] print(y) From 2077a7c1c5025859f96d53a30c1ac9732c851ee1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:40:37 -0500 Subject: [PATCH 04/70] Complete hello --- src/day-1-toy/hello.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/day-1-toy/hello.py b/src/day-1-toy/hello.py index 37968da4d4..2289831365 100644 --- a/src/day-1-toy/hello.py +++ b/src/day-1-toy/hello.py @@ -1 +1,2 @@ -# Write Hello, world \ No newline at end of file +# Write Hello, world +print("Hello, world") \ No newline at end of file From b334e360654f0cde0768c211c7f77d5ae50002d3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:42:00 -0500 Subject: [PATCH 05/70] Complete datatypes --- src/day-1-toy/datatypes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/day-1-toy/datatypes.py b/src/day-1-toy/datatypes.py index f5967611a7..aaa2797b2c 100644 --- a/src/day-1-toy/datatypes.py +++ b/src/day-1-toy/datatypes.py @@ -2,7 +2,7 @@ y = "7" # Write a print statement that combines x + y into the integer value 12 -print(x + y) +print(x + int(y)) # Write a print statement that combines x + y into the string value 57 -print(x + y) \ No newline at end of file +print(str(x) + y) \ No newline at end of file From 79e27ecef4ae66fa063d4bc75facaf67a19ba154 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:52:04 -0500 Subject: [PATCH 06/70] Complete dicts --- src/day-1-toy/dicts.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/day-1-toy/dicts.py b/src/day-1-toy/dicts.py index eac1779a42..dc05e1ad1f 100644 --- a/src/day-1-toy/dicts.py +++ b/src/day-1-toy/dicts.py @@ -11,12 +11,12 @@ "lat": 43, "lon": -121, "name": "a place" - }, + }, { "lat": 41, "lon": -123, "name": "another place" - }, + }, { "lat": 43, "lon": -122, @@ -25,5 +25,11 @@ ] # Write a loop that prints out all the field values for all the waypoints +for point in waypoints: + print(point.items()) # Add a new waypoint to the list +waypoints.append({"lat": 41, "lon": 20, "name": "a fourth place"}) + +for point in waypoints: + print(point.items()) From 45fa33d4cc6b32d9805db238698794bbd869fac3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:56:25 -0500 Subject: [PATCH 07/70] Complete fileio --- src/day-1-toy/bar.txt | 3 +++ src/day-1-toy/fileio.py | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src/day-1-toy/bar.txt diff --git a/src/day-1-toy/bar.txt b/src/day-1-toy/bar.txt new file mode 100644 index 0000000000..f0a7afd9c5 --- /dev/null +++ b/src/day-1-toy/bar.txt @@ -0,0 +1,3 @@ +Hello +This is easy +I am ready for Django \ No newline at end of file diff --git a/src/day-1-toy/fileio.py b/src/day-1-toy/fileio.py index bc8e79b7cc..b2f92d1712 100644 --- a/src/day-1-toy/fileio.py +++ b/src/day-1-toy/fileio.py @@ -3,10 +3,15 @@ # Print all the lines in the file # Close the file - +with open('foo.txt', 'r') as f: + for line in f.readlines(): + print(line) # Use open to open file "bar.txt" for writing # Use the write() method to write three lines to the file -# Close the file \ No newline at end of file +# Close the file +with open('bar.txt', 'w') as f: + f.write('Hello\nThis is easy\nI am ready for Django') + From a74007e16e2fac7898474146feb850ecf0e6c756 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 21:59:39 -0500 Subject: [PATCH 08/70] Complete func.py --- src/day-1-toy/func.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/day-1-toy/func.py b/src/day-1-toy/func.py index 2b7f435ffa..23f3ecc91f 100644 --- a/src/day-1-toy/func.py +++ b/src/day-1-toy/func.py @@ -1,6 +1,11 @@ # Write a function is_even that will return true if the passed in number is even. - +def is_even(num): + return int(num) % 2 == 0 # Read a number from the keyboard num = input("Enter a number: ") -# Print out "Even!" if the number is even. Otherwise print "Odd" \ No newline at end of file +# Print out "Even!" if the number is even. Otherwise print "Odd" +if is_even(num): + print('Even!') +else: + print('Odd') \ No newline at end of file From c0f545f80436dc3ff7ea043fde6d8455fe091c93 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:02:06 -0500 Subject: [PATCH 09/70] Complete lists.py --- src/day-1-toy/lists.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/day-1-toy/lists.py b/src/day-1-toy/lists.py index 6076f340a9..97ec771f46 100644 --- a/src/day-1-toy/lists.py +++ b/src/day-1-toy/lists.py @@ -7,23 +7,24 @@ # For the following, DO NOT USE AN ASSIGNMENT (=). # Change x so that it is [1, 2, 3, 4] -# [command here] +x.append(4) print(x) # Using y, change x so that it is [1, 2, 3, 4, 8, 9, 10] -# [command here] +x+=y print(x) # Change x so that it is [1, 2, 3, 4, 9, 10] -# [command here] +x.remove(8) print(x) # Change x so that it is [1, 2, 3, 4, 9, 99, 10] -# [command here] +x.insert(5, 99) print(x) # Print the length of list x -# [command here] print(len(x)) -# Using a for loop, print all the element values multiplied by 1000 \ No newline at end of file +# Using a for loop, print all the element values multiplied by 1000 +for num in x: + print(num*1000) \ No newline at end of file From 236ff04f6a013410bf955f7498a4b5b41a344793 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:09:37 -0500 Subject: [PATCH 10/70] Complete modules.py --- src/day-1-toy/modules.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/day-1-toy/modules.py b/src/day-1-toy/modules.py index 5313fc1934..a473c920ae 100644 --- a/src/day-1-toy/modules.py +++ b/src/day-1-toy/modules.py @@ -6,13 +6,14 @@ # See docs for the sys module: https://docs.python.org/3.7/library/sys.html # Print out the command line arguments in sys.argv, one per line: +print(sys.argv[1:]) # Print out the plaform from sys: -print() +print(sys.platform) # Print out the Python version from sys: -print() +print(sys.version) @@ -21,11 +22,11 @@ # See the docs for the OS module: https://docs.python.org/3.7/library/os.html # Print the current process ID -print() +print(os.getpid()) # Print the current working directory (cwd): -print() +print(os.getcwd()) # Print your login name -print() +print(os.getlogin()) From 74f32642f69d415accc5baec1012033edf9e9a64 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:36:26 -0500 Subject: [PATCH 11/70] Complete obj.py --- src/day-1-toy/obj.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/day-1-toy/obj.py b/src/day-1-toy/obj.py index 84c78a2f53..3026a6cb58 100644 --- a/src/day-1-toy/obj.py +++ b/src/day-1-toy/obj.py @@ -1,21 +1,42 @@ # Make a class LatLon that can be passed parameters `lat` and `lon` to the # constructor - +class LatLon: + def __init__(self, lat, lon): + self.lat = lat + self.lon = lon # Make a class Waypoint that can be passed parameters `name`, `lat`, and `lon` to the # constructor. It should inherit from LatLon. +class Waypoint(LatLon): + def __init__(self, name, lat, lon): + super().__init__(lat, lon) + self.name = name + + def __repr__(self): + return f"Waypoint: {self.name}, {self.lat}, {self.lon}" + # Make a class Geocache that can be passed parameters `name`, `difficulty`, # `size`, `lat`, and `lon` to the constructor. What should it inherit from? +class Geocache(Waypoint): + def __init__(self, name, difficulty, size, lat, lon): + super().__init__(name, lat, lon) + self.difficulty = difficulty + self.size = size + + def __repr__(self): + return f'Geocache: {self.name}, diff {self.difficulty}, size {self.size}, {self.lat}, {self.lon}' + # Make a new waypoint "Catacombs", 41.70505, -121.51521 +cata = Waypoint('Catacombs', 41.70505, -121.51521) # Print it -# +print(cata) # Without changing the following line, how can you make it print into something # more human-readable? -print(w) # Make a new geocache "Newberry Views", diff 1.5, size 2, 44.052137, -121.41556 +geo = Geocache('Newberry Views', 1.5, 2, 44.052137, -121.41556) # Print it--also make this print more nicely -print(g) +print(geo) From 2490097bc3750543b738fc13380dc6cbca29c766 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:39:14 -0500 Subject: [PATCH 12/70] Complete printf.py --- src/day-1-toy/printf.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/day-1-toy/printf.py b/src/day-1-toy/printf.py index d4bc9abb48..bdf11dd773 100644 --- a/src/day-1-toy/printf.py +++ b/src/day-1-toy/printf.py @@ -5,6 +5,8 @@ # Using the printf operator (%), print the following feeding in the values of x, # y, and z: # x is 10, y is 2.25, z is "I like turtles!" +print(f"x is {x}, y is {y}, z is {z}") -# Use the 'format' string method to print the same thing \ No newline at end of file +# Use the 'format' string method to print the same thing +print("x is {}, y is {}, z is {}".format(x, y, z)) \ No newline at end of file From bfa4f6cdd576257ac2d34add59e8e39be84dad37 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:47:00 -0500 Subject: [PATCH 13/70] scope.py --- src/day-1-toy/scope.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/day-1-toy/scope.py b/src/day-1-toy/scope.py index 68ecc6c412..045393ce9a 100644 --- a/src/day-1-toy/scope.py +++ b/src/day-1-toy/scope.py @@ -5,6 +5,7 @@ x = 12 def changeX(): + global x x = 99 changeX() @@ -19,6 +20,7 @@ def outer(): y = 120 def inner(): + nonlocal y y = 999 inner() From 85c4b8539be1d738915c298cc4acb63f40871e44 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:51:32 -0500 Subject: [PATCH 14/70] Complete slice.py --- src/day-1-toy/slice.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/day-1-toy/slice.py b/src/day-1-toy/slice.py index 3c6cb38730..33412ef60c 100644 --- a/src/day-1-toy/slice.py +++ b/src/day-1-toy/slice.py @@ -1,26 +1,26 @@ a = [2, 4, 1, 7, 9, 6] # Output the second element: 4: -print() +print(a[1]) # Output the second-to-last element: 9 -print() +print(a[4]) # Output the last three elements in the array: [7, 9, 6] -print() +print(a[3:]) # Output the two middle elements in the array: [1, 7] -print() +print(a[2:4]) # Output every element except the first one: [4, 1, 7, 9, 6] -print() +print(a[1:]) # Output every element except the last one: [2, 4, 1, 7, 9] -print() +print(a[:5]) # For string s... s = "Hello, world!" # Output just the 8th-12th characters: "world" -print() \ No newline at end of file +print(s[7:]) \ No newline at end of file From 41a713ff22b2b39ea665e2d3960f610b156b4588 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 30 Jul 2018 22:54:29 -0500 Subject: [PATCH 15/70] Complete tuples.py --- src/day-1-toy/tuples.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/day-1-toy/tuples.py b/src/day-1-toy/tuples.py index ec42b0cdf8..d8775bd05f 100644 --- a/src/day-1-toy/tuples.py +++ b/src/day-1-toy/tuples.py @@ -9,7 +9,7 @@ def dist(a, b): """Compute the distance between two x,y points.""" x0, y0 = a # Destructuring assignment x1, y1 = b - + return math.sqrt((x1 - x0)**2 + (y1 - y0)**2) a = (2, 7) # <-- x,y coordinates stored in tuples @@ -22,11 +22,13 @@ def dist(a, b): # Write a function that prints all the values in a tuple -# def print_tuple(... +def print_tuple(tuple): + for t in tuple: + print(t) t = (1, 2, 5, 7, 99) print_tuple(t) # Prints 1 2 5 7 99, one per line # Declare a tuple of 1 element then print it -u = (1) # What needs to be added to make this work? +u = (1,) # What needs to be added to make this work? print_tuple(u) From 3f7d8aefcf733a681cd52c10e992c0ba51919150 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 31 Jul 2018 18:51:20 -0500 Subject: [PATCH 16/70] Complete cal.py --- src/day-1-toy/cal.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/day-1-toy/cal.py b/src/day-1-toy/cal.py index 2a3771eb5b..f5700838fa 100644 --- a/src/day-1-toy/cal.py +++ b/src/day-1-toy/cal.py @@ -14,3 +14,9 @@ # docs for the calendar module closely. import sys +import calendar +import datetime + +year, month = int(sys.argv[1]), int(sys.argv[2]) +print(calendar.monthcalendar(year, month)) + From 70b69825857718b774e76d798a3f71aaa27b270f Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 31 Jul 2018 19:40:10 -0500 Subject: [PATCH 17/70] Complete adv --- src/days-2-4-adv/adv.py | 16 +++++++++++++++- src/days-2-4-adv/player.py | 3 +++ src/days-2-4-adv/room.py | 9 ++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index c9e26b0f85..64a6c16e3c 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,4 +1,5 @@ from room import Room +from player import Player # Declare all the rooms @@ -36,9 +37,22 @@ # # Main # - # Make a new player object that is currently in the 'outside' room. +player = Player(room['outside']) +directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} + +print(player.room) +inpt = input('Enter a direction: ') +while inpt.lower() != 'q': + if inpt.lower() not in directions.keys(): + print('Input was not recongnized') + elif hasattr(player.room, directions[inpt]): + player.room = getattr(player.room, directions[inpt]) + print(player.room) + else: + print('Cannot move in that direction. Try again!') + inpt = input('Enter a direction: ') # Write a loop that: # # * Prints the current room name diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index d79a175029..94edfa5b99 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -1,2 +1,5 @@ # Write a class to hold player information, e.g. what room they are in # currently. +class Player: + def __init__(self, room): + self.room = room diff --git a/src/days-2-4-adv/room.py b/src/days-2-4-adv/room.py index 24c07ad4c8..c6bc711974 100644 --- a/src/days-2-4-adv/room.py +++ b/src/days-2-4-adv/room.py @@ -1,2 +1,9 @@ # Implement a class to hold room information. This should have name and -# description attributes. \ No newline at end of file +# description attributes. +class Room: + def __init__(self, name, desc): + self.name = name + self.desc = desc + + def __repr__(self): + return f"{self.name}: {self.desc}" From 4a6ceecd3508a2af395be877077886bc66e3f935 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:03:14 -0500 Subject: [PATCH 18/70] Add item class --- src/days-2-4-adv/item.py | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/days-2-4-adv/item.py diff --git a/src/days-2-4-adv/item.py b/src/days-2-4-adv/item.py new file mode 100644 index 0000000000..b842c63c68 --- /dev/null +++ b/src/days-2-4-adv/item.py @@ -0,0 +1,7 @@ +class Item: + def __init__(self, name, description): + self.name = name + self.desc = description + + def __repr__(self): + return f'{self.name}' \ No newline at end of file From dec6926e0877b85d6ed5eacc46d9d3025816096a Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:03:45 -0500 Subject: [PATCH 19/70] Add game class --- src/days-2-4-adv/adv.py | 75 ++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 15 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 64a6c16e3c..199bb07292 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -37,22 +37,52 @@ # # Main # +class Game: + def __init__(self, player): + self.player = player + self.dir = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} + self.input = None + + def run(self): + self.display_room() + self.get_input() + self.execute_loop() + + def get_input(self): + self.input = input('Enter a direction: ') + + def display_room(self): + print(self.player.room) + + def display_items(self): + print(f"Items available: {self.player.room.items}") + + def execute_loop(self): + while self.input.lower() != 'q': + if self.input.lower() not in self.dir.keys(): + print('Input was not recognized') + elif hasattr(self.player.room, self.dir[self.input.lower()]): + self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) + self.display_room() + self.display_items() + else: + print('Cannot move in that direction. Try again!') + self.input = input('Enter a direction: ') + + def __repr__(self): + return f"Game: {self.player}" # Make a new player object that is currently in the 'outside' room. -player = Player(room['outside']) -directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} - -print(player.room) -inpt = input('Enter a direction: ') - -while inpt.lower() != 'q': - if inpt.lower() not in directions.keys(): - print('Input was not recongnized') - elif hasattr(player.room, directions[inpt]): - player.room = getattr(player.room, directions[inpt]) - print(player.room) - else: - print('Cannot move in that direction. Try again!') - inpt = input('Enter a direction: ') + + +def start_game(): + """Starts the game""" + name = input('Enter your name: ') + player = Player(name, room['outside']) + game = Game(player) + game.run() + +if __name__ == "__main__": + start_game() # Write a loop that: # # * Prints the current room name @@ -63,3 +93,18 @@ # Print an error message if the movement isn't allowed. # # If the user enters "q", quit the game. +# player = Player(room['outside']) +# directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} + +# print(player.room) +# inpt = input('Enter a direction: ') + +# while inpt.lower() != 'q': +# if inpt.lower() not in directions.keys(): +# print('Input was not recongnized') +# elif hasattr(player.room, directions[inpt]): +# player.room = getattr(player.room, directions[inpt]) +# print(player.room) +# else: +# print('Cannot move in that direction. Try again!') +# inpt = input('Enter a direction: ') From 445a95ba047f5a7821171ddb88482bcfe5750538 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:04:13 -0500 Subject: [PATCH 20/70] Allow player to carry items --- src/days-2-4-adv/player.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index 94edfa5b99..35566df5b0 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -1,5 +1,26 @@ # Write a class to hold player information, e.g. what room they are in # currently. class Player: - def __init__(self, room): - self.room = room + def __init__(self, name, room): + self.name = name + self._room = room + self._items = [] + + @property + def room(self): + return self._room + + @room.setter + def room(self, room): + self._room = room + + @property + def items(self): + return self._items + + def take(self, item): + self._items.append(item) + + + def __repr__(self): + return f"Player: {self.name}" From 365489356cc3c644e7b186a9e5d42bbba4be3911 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:04:28 -0500 Subject: [PATCH 21/70] Allow room to contain items --- src/days-2-4-adv/room.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/days-2-4-adv/room.py b/src/days-2-4-adv/room.py index c6bc711974..2800dcb771 100644 --- a/src/days-2-4-adv/room.py +++ b/src/days-2-4-adv/room.py @@ -4,6 +4,18 @@ class Room: def __init__(self, name, desc): self.name = name self.desc = desc + self._items = [] + + @property + def items(self): + if self._items: + return self._items + else: + return None + + @items.setter + def items(self, item): + self._items.append(item) def __repr__(self): return f"{self.name}: {self.desc}" From 3e3f3f300b7caf1ce853bc92043e53bc3ac080a1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:14:45 -0500 Subject: [PATCH 22/70] import the random module --- src/mini-challenge/hangman.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 9b73b9249d..16dc35f42b 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -2,15 +2,17 @@ # These could include syntax errors, logical errors, spelling errors... # Find the mistakes and fix the game! # -# STRETCH GOAL: If you fix all the errors, can you find a way to improve +# STRETCH GOAL: If you fix all the errors, can you find a way to improve # it? Add a cheat code, more error handling, chose randomly # from a set of win/loss messages...basically, make it better! # Initial setup -bodies = [ " ------\n | |\n | O\n |\n |\n |\n |\n |\n---", -" ------\n | |\n | O\n | |\n | |\n |\n |\n |\n---", -" ------\n | |\n | O\n | |\n | |\n | / \n |\n |\n---", -" ------\n | |\n | O\n | |\n | |\n | / \ \n |\n |\n---", +import random + +bodies = [ " ------\n | |\n | O\n |\n |\n |\n |\n |\n---", +" ------\n | |\n | O\n | |\n | |\n |\n |\n |\n---", +" ------\n | |\n | O\n | |\n | |\n | / \n |\n |\n---", +" ------\n | |\n | O\n | |\n | |\n | / \ \n |\n |\n---", " ------\n | |\n | O\n | \|\n | |\n | / \ \n |\n |\n---", " ------\n | |\n | O\n | \|/\n | |\n | / \ \n |\n |\n---" ] strikes = 0 @@ -26,7 +28,7 @@ alphabet = [chr(65+x) for x in range(1, 26) ] # Draw body based on # of incorrect guesses -def drawBody() +def drawBody(): print(bodies[strikes]) # Replace blanks with correctly guessed letters From 97acc376d34c75559e21cfc127a2f012e5bd1c0b Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:17:01 -0500 Subject: [PATCH 23/70] Bug fix: properly read words text file --- src/mini-challenge/hangman.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 16dc35f42b..3a5bd1d648 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -16,11 +16,10 @@ " ------\n | |\n | O\n | \|\n | |\n | / \ \n |\n |\n---", " ------\n | |\n | O\n | \|/\n | |\n | / \ \n |\n |\n---" ] strikes = 0 -words = [None] -file = open("word.txt", "r") -for line in file: - words.append(line) -file.close() + +with open('words.txt', 'r') as file: + words = [line for line in file] + targetWord = words[random.randint(0, 100)] lettersLeft = len(targetWord)-1 length = len(targetWord)-1 From 8e8c3af861e0905540178fb34203ed232f66d0f3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:22:11 -0500 Subject: [PATCH 24/70] Convert strikes into a string when printing --- src/mini-challenge/hangman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 3a5bd1d648..7cd96249a2 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -60,7 +60,7 @@ def printWord( word ): fillLetters(letter) else: strikes += 1 - print( strikes + " / 5 strikes" ) + print( str(strikes) + " / 5 strikes" ) printWord(curWord) drawBody() alphabet.remove(letter.upper()) From 31b33ec2aeec7fee4a59870f45c4ca0628432248 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:24:26 -0500 Subject: [PATCH 25/70] Random number generator's range should be no greater than length of words list --- src/mini-challenge/hangman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 7cd96249a2..b1b3ec2df5 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -20,7 +20,7 @@ with open('words.txt', 'r') as file: words = [line for line in file] -targetWord = words[random.randint(0, 100)] +targetWord = words[random.randint(0, 80)] lettersLeft = len(targetWord)-1 length = len(targetWord)-1 curWord = "_" * length From a5c48702a742d2460090ea0710c0b1392c61d30a Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:28:44 -0500 Subject: [PATCH 26/70] Fix typo in greeting --- src/mini-challenge/hangman.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index b1b3ec2df5..deade4dd53 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -31,7 +31,7 @@ def drawBody(): print(bodies[strikes]) # Replace blanks with correctly guessed letters -def fillLetters( letter ): +def fillLetters(letter): for i in range(len(targetWord)-1): if( targetWord[i : i+1]) == letter: curWord = curWord[0: i] + letter + curWord[i: ] @@ -39,14 +39,14 @@ def fillLetters( letter ): lettersLeft -= 1 # Add spaces when displaying letters / blanks for readability -def printWord( word ): +def printWord(word): prntWord = "" for letter in word: prntWord += letter + " " print(prntWord) # Begin game -print( "Welcome to Hangmn!" ) +print( "Welcome to Hangman!" ) printWord(curWord) drawBody() print("Letters left:") From 02f0db9c79a207b394ad8691efa20df0ff5ec6a6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:30:43 -0500 Subject: [PATCH 27/70] Correctly add all alpha characters into alphabet list --- src/mini-challenge/hangman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index deade4dd53..19e0ba248b 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -24,7 +24,7 @@ lettersLeft = len(targetWord)-1 length = len(targetWord)-1 curWord = "_" * length -alphabet = [chr(65+x) for x in range(1, 26) ] +alphabet = [chr(65+x) for x in range(0, 26) ] # Draw body based on # of incorrect guesses def drawBody(): From 4b4670b8217c7fb1b633b22fc36afcfeef763924 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:36:12 -0500 Subject: [PATCH 28/70] Initialize curWord to be global variable --- src/mini-challenge/hangman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 19e0ba248b..1ed55e50ae 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -32,10 +32,10 @@ def drawBody(): # Replace blanks with correctly guessed letters def fillLetters(letter): + global lettersLeft, curWord for i in range(len(targetWord)-1): if( targetWord[i : i+1]) == letter: curWord = curWord[0: i] + letter + curWord[i: ] - global lettersLeft lettersLeft -= 1 # Add spaces when displaying letters / blanks for readability From 3bc128e8c4ea618a004a6663ef02c781127830ed Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:39:50 -0500 Subject: [PATCH 29/70] Remove all camelcase and convert to snake case --- src/mini-challenge/hangman.py | 40 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 1ed55e50ae..6fce4a6b63 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -20,26 +20,26 @@ with open('words.txt', 'r') as file: words = [line for line in file] -targetWord = words[random.randint(0, 80)] -lettersLeft = len(targetWord)-1 -length = len(targetWord)-1 -curWord = "_" * length +target_word = words[random.randint(0, 80)] +letters_left = len(target_word)-1 +length = len(target_word)-1 +cur_word = "_" * length alphabet = [chr(65+x) for x in range(0, 26) ] # Draw body based on # of incorrect guesses -def drawBody(): +def draw_body(): print(bodies[strikes]) # Replace blanks with correctly guessed letters -def fillLetters(letter): - global lettersLeft, curWord - for i in range(len(targetWord)-1): - if( targetWord[i : i+1]) == letter: - curWord = curWord[0: i] + letter + curWord[i: ] +def fill_letters(letter): + global lettersLeft, cur_word + for i in range(len(target_word)-1): + if( target_word[i : i+1]) == letter: + cur_word = cur_word[0: i] + letter + cur_word[i: ] lettersLeft -= 1 # Add spaces when displaying letters / blanks for readability -def printWord(word): +def print_word(word): prntWord = "" for letter in word: prntWord += letter + " " @@ -47,28 +47,28 @@ def printWord(word): # Begin game print( "Welcome to Hangman!" ) -printWord(curWord) -drawBody() +print_word(cur_word) +draw_body() print("Letters left:") -printWord(alphabet) +print_word(alphabet) # Gameplay loop while strikes < 5 and lettersLeft > 0: letter = input("\nPlease guess a letter...") - if letter in targetWord: + if letter in target_word: print("Great!") - fillLetters(letter) + fill_letters(letter) else: strikes += 1 print( str(strikes) + " / 5 strikes" ) - printWord(curWord) - drawBody() + print_word(cur_word) + draw_body() alphabet.remove(letter.upper()) print("Letters left:") - printWord(alphabet) + print_word(alphabet) # Game over, print outcome if lettersLeft < 0: print("YOU WIN!!") else: - print("YOU LOSE...word was " + targetWord) \ No newline at end of file + print("YOU LOSE...word was " + target_word) \ No newline at end of file From 31fc2aa3d057dae73887005ca3d8843fd44acb40 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:41:43 -0500 Subject: [PATCH 30/70] More snake_case changes --- src/mini-challenge/hangman.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 6fce4a6b63..400cc075be 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -32,11 +32,11 @@ def draw_body(): # Replace blanks with correctly guessed letters def fill_letters(letter): - global lettersLeft, cur_word + global letters_left, cur_word for i in range(len(target_word)-1): if( target_word[i : i+1]) == letter: cur_word = cur_word[0: i] + letter + cur_word[i: ] - lettersLeft -= 1 + letters_left -= 1 # Add spaces when displaying letters / blanks for readability def print_word(word): @@ -53,7 +53,7 @@ def print_word(word): print_word(alphabet) # Gameplay loop -while strikes < 5 and lettersLeft > 0: +while strikes < 5 and letters_left > 0: letter = input("\nPlease guess a letter...") if letter in target_word: print("Great!") @@ -68,7 +68,7 @@ def print_word(word): print_word(alphabet) # Game over, print outcome -if lettersLeft < 0: +if letters_left < 0: print("YOU WIN!!") else: print("YOU LOSE...word was " + target_word) \ No newline at end of file From 2b28b3ad767b7bb464f5f28247961fb945424e49 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 11:57:42 -0500 Subject: [PATCH 31/70] Fix off by one error in fill_letters function --- src/mini-challenge/hangman.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 400cc075be..028192c1e9 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -33,10 +33,11 @@ def draw_body(): # Replace blanks with correctly guessed letters def fill_letters(letter): global letters_left, cur_word - for i in range(len(target_word)-1): - if( target_word[i : i+1]) == letter: - cur_word = cur_word[0: i] + letter + cur_word[i: ] - letters_left -= 1 + + for index, char in enumerate(target_word): + if char == letter: + cur_word = cur_word[0: index] + letter + cur_word[index+1: ] + letters_left -=1 # Add spaces when displaying letters / blanks for readability def print_word(word): From 0861741318bd13c89acaa72519a5a3164fdbc999 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 12:07:57 -0500 Subject: [PATCH 32/70] Print actual letters left each turn --- src/mini-challenge/hangman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 028192c1e9..6730817a7b 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -65,7 +65,7 @@ def print_word(word): print_word(cur_word) draw_body() alphabet.remove(letter.upper()) - print("Letters left:") + print(f"Letters left: {letters_left}") print_word(alphabet) # Game over, print outcome From 470818c6813368b6922ccbeb7fea7aa09ca16881 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 4 Aug 2018 12:09:05 -0500 Subject: [PATCH 33/70] Fix bug where winning displays the correct message --- src/mini-challenge/hangman.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mini-challenge/hangman.py b/src/mini-challenge/hangman.py index 6730817a7b..72f47828cd 100644 --- a/src/mini-challenge/hangman.py +++ b/src/mini-challenge/hangman.py @@ -69,7 +69,7 @@ def print_word(word): print_word(alphabet) # Game over, print outcome -if letters_left < 0: +if letters_left == 0: print("YOU WIN!!") else: print("YOU LOSE...word was " + target_word) \ No newline at end of file From 329241aa792caaec5d2bd36a41603c2f8fbd5922 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 16:58:20 -0500 Subject: [PATCH 34/70] Seperate game class and add text colors --- src/days-2-4-adv/adv.py | 68 ++-------------------------------------- src/days-2-4-adv/game.py | 37 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 66 deletions(-) create mode 100644 src/days-2-4-adv/game.py diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 199bb07292..307d66be81 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,6 +1,6 @@ from room import Room from player import Player - +from game import Game # Declare all the rooms room = { @@ -22,7 +22,6 @@ earlier adventurers. The only exit is to the south."""), } - # Link rooms together room['outside'].n_to = room['foyer'] @@ -34,45 +33,6 @@ room['narrow'].n_to = room['treasure'] room['treasure'].s_to = room['narrow'] -# -# Main -# -class Game: - def __init__(self, player): - self.player = player - self.dir = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} - self.input = None - - def run(self): - self.display_room() - self.get_input() - self.execute_loop() - - def get_input(self): - self.input = input('Enter a direction: ') - - def display_room(self): - print(self.player.room) - - def display_items(self): - print(f"Items available: {self.player.room.items}") - - def execute_loop(self): - while self.input.lower() != 'q': - if self.input.lower() not in self.dir.keys(): - print('Input was not recognized') - elif hasattr(self.player.room, self.dir[self.input.lower()]): - self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) - self.display_room() - self.display_items() - else: - print('Cannot move in that direction. Try again!') - self.input = input('Enter a direction: ') - - def __repr__(self): - return f"Game: {self.player}" -# Make a new player object that is currently in the 'outside' room. - def start_game(): """Starts the game""" @@ -81,30 +41,6 @@ def start_game(): game = Game(player) game.run() + if __name__ == "__main__": start_game() -# Write a loop that: -# -# * Prints the current room name -# * Prints the current description (the textwrap module might be useful here). -# * Waits for user input and decides what to do. -# -# If the user enters a cardinal direction, attempt to move to the room there. -# Print an error message if the movement isn't allowed. -# -# If the user enters "q", quit the game. -# player = Player(room['outside']) -# directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} - -# print(player.room) -# inpt = input('Enter a direction: ') - -# while inpt.lower() != 'q': -# if inpt.lower() not in directions.keys(): -# print('Input was not recongnized') -# elif hasattr(player.room, directions[inpt]): -# player.room = getattr(player.room, directions[inpt]) -# print(player.room) -# else: -# print('Cannot move in that direction. Try again!') -# inpt = input('Enter a direction: ') diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py new file mode 100644 index 0000000000..745b58ce99 --- /dev/null +++ b/src/days-2-4-adv/game.py @@ -0,0 +1,37 @@ +import crayons + +class Game: + def __init__(self, player): + self.player = player + self.dir = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} + self.input = None + + def run(self): + self.display_room() + self.display_items() + self.get_input() + self.execute_loop() + + def get_input(self): + self.input = input('Enter a direction: ') + + def display_room(self): + print(f"\n{self.player.room}") + + def display_items(self): + print(crayons.green("Items Available"), f": {self.player.room.items}\n") + + def execute_loop(self): + while self.input.lower() != 'q': + if self.input.lower() not in self.dir.keys(): + print('Input was not recognized') + elif hasattr(self.player.room, self.dir[self.input.lower()]): + self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) + self.display_room() + self.display_items() + else: + print(crayons.red('Cannot move in that direction. Try again!\n')) + self.input = input('Enter a direction: ') + + def __repr__(self): + return f"Game: {self.player}" \ No newline at end of file From 423a6ce7d42707852390d69bd83c8252feabd9b0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 16:59:12 -0500 Subject: [PATCH 35/70] Rename some attributes in Player class --- src/days-2-4-adv/player.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index 35566df5b0..728ce2242b 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -4,7 +4,7 @@ class Player: def __init__(self, name, room): self.name = name self._room = room - self._items = [] + self._inventory = [] @property def room(self): @@ -16,10 +16,10 @@ def room(self, room): @property def items(self): - return self._items + return self._inventory def take(self, item): - self._items.append(item) + self._inventory.append(item) def __repr__(self): From c4b3c1f34988472c7210c4a63a271b819fbf54bc Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 16:59:59 -0500 Subject: [PATCH 36/70] Make the name a private attribute --- src/days-2-4-adv/player.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index 728ce2242b..cf330a7572 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -2,7 +2,7 @@ # currently. class Player: def __init__(self, name, room): - self.name = name + self._name = name self._room = room self._inventory = [] @@ -23,4 +23,4 @@ def take(self, item): def __repr__(self): - return f"Player: {self.name}" + return f"Player: {self._name}" From af3e38cb043ccde23d37562f713f4b866f3af81b Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 17:00:28 -0500 Subject: [PATCH 37/70] Add color to room string representation --- src/days-2-4-adv/room.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/days-2-4-adv/room.py b/src/days-2-4-adv/room.py index 2800dcb771..b86ff1f9f4 100644 --- a/src/days-2-4-adv/room.py +++ b/src/days-2-4-adv/room.py @@ -1,5 +1,7 @@ # Implement a class to hold room information. This should have name and # description attributes. +import crayons + class Room: def __init__(self, name, desc): self.name = name @@ -8,14 +10,11 @@ def __init__(self, name, desc): @property def items(self): - if self._items: - return self._items - else: - return None + return self._items if self._items else None @items.setter def items(self, item): self._items.append(item) def __repr__(self): - return f"{self.name}: {self.desc}" + return crayons.yellow(self.name, bold=True) + f": {self.desc}" From dcf6127a3aa44681de522dbcc4d522170d28414b Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 17:18:54 -0500 Subject: [PATCH 38/70] Dynamically add new rooms by reading file --- src/days-2-4-adv/adv.py | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 307d66be81..bdd44e81e2 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -3,32 +3,19 @@ from game import Game # Declare all the rooms -room = { - 'outside': Room("Outside Cave Entrance", - "North of you, the cave mount beckons"), - - 'foyer': Room("Foyer", """Dim light filters in from the south. Dusty -passages run north and east."""), - - 'overlook': Room("Grand Overlook", """A steep cliff appears before you, falling -into the darkness. Ahead to the north, a light flickers in -the distance, but there is no way across the chasm."""), - - 'narrow': Room("Narrow Passage", """The narrow passage bends here from west -to north. The smell of gold permeates the air."""), - - 'treasure': Room("Treasure Chamber", """You've found the long-lost treasure -chamber! Sadly, it has already been completely emptied by -earlier adventurers. The only exit is to the south."""), -} - +room = {} +with open('rooms.txt', 'r') as file: + for line in file.readlines(): + name, description = line.split('|') + key = name.split()[0].lower() + room[key] = Room(name.rstrip(), description.rstrip()) # Link rooms together room['outside'].n_to = room['foyer'] room['foyer'].s_to = room['outside'] -room['foyer'].n_to = room['overlook'] +room['foyer'].n_to = room['grand'] room['foyer'].e_to = room['narrow'] -room['overlook'].s_to = room['foyer'] +room['grand'].s_to = room['foyer'] room['narrow'].w_to = room['foyer'] room['narrow'].n_to = room['treasure'] room['treasure'].s_to = room['narrow'] From 0455d5aa84819808969b60b39a359cea3423adc1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 17:19:16 -0500 Subject: [PATCH 39/70] Create rooms file for reading list of rooms --- src/days-2-4-adv/rooms.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/days-2-4-adv/rooms.txt diff --git a/src/days-2-4-adv/rooms.txt b/src/days-2-4-adv/rooms.txt new file mode 100644 index 0000000000..758b814a3d --- /dev/null +++ b/src/days-2-4-adv/rooms.txt @@ -0,0 +1,5 @@ +Outside Cave Entrance|North of you, the cave mount beckons. +Foyer|Dim light filters in from the south. Dusty passages run north and east. +Grand Overlook|A steep cliff appears before you, falling into the darkness. Ahead to the north, a light flickers in the distance, but there is no way across the chasm. +Narrow Passage|The narrow passage bends here from west to north. The smell of gold permeates the air. +Treasure Chamber|You've found the long-lost treasure chamber! Sadly, it has already been completely emptied by earlier adventurers. The only exit is to the south. \ No newline at end of file From 54e7c249c812de8ef7614ecc88ed6daf83024ef2 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 17:23:13 -0500 Subject: [PATCH 40/70] Invalid input will now appear as magenta --- src/days-2-4-adv/game.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 745b58ce99..2ec0297cf1 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -24,7 +24,7 @@ def display_items(self): def execute_loop(self): while self.input.lower() != 'q': if self.input.lower() not in self.dir.keys(): - print('Input was not recognized') + print(crayons.magenta('Input was not recognized\n')) elif hasattr(self.player.room, self.dir[self.input.lower()]): self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) self.display_room() From 112649c617897abe06f348af414b3f3ff3987757 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 17:24:01 -0500 Subject: [PATCH 41/70] Refactor function name for main loop --- src/days-2-4-adv/game.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 2ec0297cf1..b41913955a 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -10,7 +10,7 @@ def run(self): self.display_room() self.display_items() self.get_input() - self.execute_loop() + self._loop() def get_input(self): self.input = input('Enter a direction: ') @@ -21,7 +21,7 @@ def display_room(self): def display_items(self): print(crayons.green("Items Available"), f": {self.player.room.items}\n") - def execute_loop(self): + def _loop(self): while self.input.lower() != 'q': if self.input.lower() not in self.dir.keys(): print(crayons.magenta('Input was not recognized\n')) From 97b230ec8b67f2d8dfd79a1cbf98ef8bb0e7d797 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 18:20:55 -0500 Subject: [PATCH 42/70] Encapsulate room setup inside generate_all_rooms function --- src/days-2-4-adv/adv.py | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index bdd44e81e2..a7af05c3b0 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,30 +1,29 @@ from room import Room from player import Player from game import Game -# Declare all the rooms - -room = {} -with open('rooms.txt', 'r') as file: - for line in file.readlines(): - name, description = line.split('|') - key = name.split()[0].lower() - room[key] = Room(name.rstrip(), description.rstrip()) -# Link rooms together - -room['outside'].n_to = room['foyer'] -room['foyer'].s_to = room['outside'] -room['foyer'].n_to = room['grand'] -room['foyer'].e_to = room['narrow'] -room['grand'].s_to = room['foyer'] -room['narrow'].w_to = room['foyer'] -room['narrow'].n_to = room['treasure'] -room['treasure'].s_to = room['narrow'] +def generate_all_rooms(): + rooms = {} + with open('rooms.txt', 'r') as file: + for line in file.readlines(): + name, description = line.split('|') + key = name.split()[0].lower() + rooms[key] = Room(name.rstrip(), description.rstrip()) + # Link rooms together + rooms['outside'].n_to = rooms['foyer'] + rooms['foyer'].s_to = rooms['outside'] + rooms['foyer'].n_to = rooms['grand'] + rooms['foyer'].e_to = rooms['narrow'] + rooms['grand'].s_to = rooms['foyer'] + rooms['narrow'].w_to = rooms['foyer'] + rooms['narrow'].n_to = rooms['treasure'] + rooms['treasure'].s_to = rooms['narrow'] + return rooms def start_game(): - """Starts the game""" + rooms = generate_all_rooms() name = input('Enter your name: ') - player = Player(name, room['outside']) + player = Player(name, rooms['outside']) game = Game(player) game.run() From 2ca8746ec82695dee0f401f1cfc57571116066a1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 18:36:11 -0500 Subject: [PATCH 43/70] Rearrange methods for class Game --- src/days-2-4-adv/game.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index b41913955a..a75932a754 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -12,15 +12,15 @@ def run(self): self.get_input() self._loop() - def get_input(self): - self.input = input('Enter a direction: ') - def display_room(self): print(f"\n{self.player.room}") def display_items(self): print(crayons.green("Items Available"), f": {self.player.room.items}\n") + def get_input(self): + self.input = input('Enter a direction: ') + def _loop(self): while self.input.lower() != 'q': if self.input.lower() not in self.dir.keys(): From b03840344cb7f9a7988301dc877f184989e800cb Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:17:49 -0500 Subject: [PATCH 44/70] Add items into rooms --- src/days-2-4-adv/adv.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index a7af05c3b0..295e1497e4 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -18,6 +18,12 @@ def generate_all_rooms(): rooms['narrow'].w_to = rooms['foyer'] rooms['narrow'].n_to = rooms['treasure'] rooms['treasure'].s_to = rooms['narrow'] + + rooms["outside"].items = ['broom', 'wand', 'cup', "hammer"] + rooms['foyer'].items = ['taco', 'pot', 'knife'] + rooms['grand'].items = ['dirt', 'kite'] + rooms['narrow'].items = ['rope', 'candy', 'wine'] + rooms['treasure'].items = ['egg'] return rooms def start_game(): From a3c0ac1f6ae6b8b24f327f3c98ad8d3651918c6f Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:19:21 -0500 Subject: [PATCH 45/70] Add take and drop methods --- src/days-2-4-adv/player.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index cf330a7572..567f8c64ed 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -1,5 +1,7 @@ # Write a class to hold player information, e.g. what room they are in # currently. +import crayons + class Player: def __init__(self, name, room): self._name = name @@ -19,8 +21,16 @@ def items(self): return self._inventory def take(self, item): - self._inventory.append(item) + if item in self.room.items: + self.room.items.remove(item) + self.items.append(item) + print(crayons.cyan(f"The {item} was taken from {self.room.name}.")) + def drop(self, item): + if item in self.items: + self.items.remove(item) + self.room.items.append(item) + print(crayons.magenta(f"The {item} was dropped in the {self.room.name}")) def __repr__(self): return f"Player: {self._name}" From c672893d58ad7b05dec15a5a900445b0179d8b1a Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:19:50 -0500 Subject: [PATCH 46/70] Modify items setter --- src/days-2-4-adv/room.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/room.py b/src/days-2-4-adv/room.py index b86ff1f9f4..845664f8b9 100644 --- a/src/days-2-4-adv/room.py +++ b/src/days-2-4-adv/room.py @@ -13,8 +13,9 @@ def items(self): return self._items if self._items else None @items.setter - def items(self, item): - self._items.append(item) + def items(self, items): + # self._items.append(item) + self._items = items def __repr__(self): return crayons.yellow(self.name, bold=True) + f": {self.desc}" From 2cc18a05b6214cdb7fdaf7aa73ccc326b5b5a859 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:40:50 -0500 Subject: [PATCH 47/70] Refactor take and drop methods with try/except --- src/days-2-4-adv/player.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index 567f8c64ed..ea8bcfc5fb 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -21,16 +21,20 @@ def items(self): return self._inventory def take(self, item): - if item in self.room.items: + try: self.room.items.remove(item) self.items.append(item) print(crayons.cyan(f"The {item} was taken from {self.room.name}.")) + except: + print(crayons.red(f"{item} was not found in {self.room.name}")) def drop(self, item): - if item in self.items: + try: self.items.remove(item) self.room.items.append(item) print(crayons.magenta(f"The {item} was dropped in the {self.room.name}")) + except: + print(crayons.red(f"{item} was not found in player inventory!")) def __repr__(self): return f"Player: {self._name}" From dcf5505ecf6168ece840d02ca943759db2161a92 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:41:28 -0500 Subject: [PATCH 48/70] Add action input functionality to Game class --- src/days-2-4-adv/game.py | 48 +++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index a75932a754..9130dc893a 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -5,33 +5,51 @@ def __init__(self, player): self.player = player self.dir = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} self.input = None + self.action = None + self.verbs = ['take', 'drop'] def run(self): - self.display_room() - self.display_items() - self.get_input() + self._current_status() + self._get_input() self._loop() - def display_room(self): + def _current_status(self): + self._display_room() + self._display_items() + + def _display_room(self): print(f"\n{self.player.room}") - def display_items(self): + def _display_items(self): print(crayons.green("Items Available"), f": {self.player.room.items}\n") - def get_input(self): - self.input = input('Enter a direction: ') + def _get_input(self): + self.action = None + self.input = input('Enter a command: ').split() + if len(self.input) <= 1: + self.input = self.input[0] + else: + self.action, self.input = self.input[0], self.input[1] + def _loop(self): while self.input.lower() != 'q': - if self.input.lower() not in self.dir.keys(): + try: + if self.action in self.verbs: + self._call_method(self.action) + self._current_status() + elif hasattr(self.player.room, self.dir[self.input.lower()]): + self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) + self._current_status() + except KeyError: print(crayons.magenta('Input was not recognized\n')) - elif hasattr(self.player.room, self.dir[self.input.lower()]): - self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) - self.display_room() - self.display_items() - else: - print(crayons.red('Cannot move in that direction. Try again!\n')) - self.input = input('Enter a direction: ') + self._current_status() + finally: + self._get_input() + + def _call_method(self, action): + func = getattr(self.player, action) + func(self.input.lower()) def __repr__(self): return f"Game: {self.player}" \ No newline at end of file From 17c9848d7063208ef9498c140f830fe696ad2a51 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:54:38 -0500 Subject: [PATCH 49/70] Add name property for Player --- src/days-2-4-adv/player.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index ea8bcfc5fb..dea68abecf 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -8,6 +8,10 @@ def __init__(self, name, room): self._room = room self._inventory = [] + @property + def name(self): + return self._name + @property def room(self): return self._room From 0684ef15a2e7f4ed38fc0a185eb27a394f3a0901 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 20:55:22 -0500 Subject: [PATCH 50/70] Rename dir dict to have a better name --- src/days-2-4-adv/game.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 9130dc893a..61a1ba440c 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -3,12 +3,14 @@ class Game: def __init__(self, player): self.player = player - self.dir = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} + self.directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} self.input = None self.action = None self.verbs = ['take', 'drop'] def run(self): + print(crayons.white(f'\nWelcome {self.player.name}!', bold=True)) + print('Use `take` or `drop` to interact with items') self._current_status() self._get_input() self._loop() @@ -31,15 +33,16 @@ def _get_input(self): else: self.action, self.input = self.input[0], self.input[1] - def _loop(self): while self.input.lower() != 'q': + input = self.input.lower() + room = self.player.room try: if self.action in self.verbs: self._call_method(self.action) self._current_status() - elif hasattr(self.player.room, self.dir[self.input.lower()]): - self.player.room = getattr(self.player.room, self.dir[self.input.lower()]) + elif hasattr(room, self.directions[input]): + self.player.room = getattr(room, self.directions[input]) self._current_status() except KeyError: print(crayons.magenta('Input was not recognized\n')) From f98938a23429ef454e5c9c091203193a68d01b6a Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 21:06:59 -0500 Subject: [PATCH 51/70] Add inventory command --- src/days-2-4-adv/game.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 61a1ba440c..9146805a18 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -38,7 +38,10 @@ def _loop(self): input = self.input.lower() room = self.player.room try: - if self.action in self.verbs: + if input == 'i': + print(crayons.blue(f"Current Inventory: {self.player.items}", bold=True)) + self._current_status() + elif self.action in self.verbs: self._call_method(self.action) self._current_status() elif hasattr(room, self.directions[input]): From 6609240a2a21ed3623d58197e59f981a99db1dc0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 21:07:34 -0500 Subject: [PATCH 52/70] Handle keyboardinterrupt exception when game closes --- src/days-2-4-adv/adv.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 295e1497e4..c0b4b00b9c 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,3 +1,5 @@ +import crayons + from room import Room from player import Player from game import Game @@ -35,4 +37,7 @@ def start_game(): if __name__ == "__main__": - start_game() + try: + start_game() + except KeyboardInterrupt: + print(crayons.green("\nGoodbye!!", bold=True)) From b9bcad0f24d45e0ade61a820739f3d681b177503 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Aug 2018 21:09:25 -0500 Subject: [PATCH 53/70] Add _greeting function --- src/days-2-4-adv/game.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 9146805a18..d45eb6b76e 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -9,12 +9,16 @@ def __init__(self, player): self.verbs = ['take', 'drop'] def run(self): - print(crayons.white(f'\nWelcome {self.player.name}!', bold=True)) - print('Use `take` or `drop` to interact with items') + self._greeting() self._current_status() self._get_input() self._loop() + def _greeting(self): + print(crayons.white(f'\nWelcome {self.player.name}!', bold=True)) + print('Use `take` or `drop` to interact with items') + print('Check inventory with command `i`') + def _current_status(self): self._display_room() self._display_items() From a622329bbe8a3866b125c552c07bd4ef3fd102be Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 21:20:28 -0500 Subject: [PATCH 54/70] Create generate_items function to randomly add items into rooms --- src/days-2-4-adv/adv.py | 24 +++++++++++++++++++----- src/days-2-4-adv/item.py | 3 +-- src/days-2-4-adv/items.txt | 13 +++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 src/days-2-4-adv/items.txt diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index c0b4b00b9c..7f5b38458f 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,8 +1,12 @@ +import random +from itertools import cycle + import crayons from room import Room from player import Player from game import Game +from item import Item def generate_all_rooms(): rooms = {} @@ -21,15 +25,25 @@ def generate_all_rooms(): rooms['narrow'].n_to = rooms['treasure'] rooms['treasure'].s_to = rooms['narrow'] - rooms["outside"].items = ['broom', 'wand', 'cup', "hammer"] - rooms['foyer'].items = ['taco', 'pot', 'knife'] - rooms['grand'].items = ['dirt', 'kite'] - rooms['narrow'].items = ['rope', 'candy', 'wine'] - rooms['treasure'].items = ['egg'] return rooms +def generate_items(rooms): + room_names = list(rooms.keys()) + with open('items.txt', 'r') as file: + items = [ + Item(item.rstrip()) + for item in file.readlines() + ] + for name in cycle(room_names): + rand = random.randint(0, len(items)) + try: + rooms[name].items = items.pop(rand) + except IndexError: + break + def start_game(): rooms = generate_all_rooms() + generate_items(rooms) name = input('Enter your name: ') player = Player(name, rooms['outside']) game = Game(player) diff --git a/src/days-2-4-adv/item.py b/src/days-2-4-adv/item.py index b842c63c68..dd1aee3c8f 100644 --- a/src/days-2-4-adv/item.py +++ b/src/days-2-4-adv/item.py @@ -1,7 +1,6 @@ class Item: - def __init__(self, name, description): + def __init__(self, name): self.name = name - self.desc = description def __repr__(self): return f'{self.name}' \ No newline at end of file diff --git a/src/days-2-4-adv/items.txt b/src/days-2-4-adv/items.txt new file mode 100644 index 0000000000..daa1d035f7 --- /dev/null +++ b/src/days-2-4-adv/items.txt @@ -0,0 +1,13 @@ +broom +wand +cup +hammer +taco +pot +knife +dirt +kite +rope +candy +wine +egg \ No newline at end of file From f252d8fc0da640b27209d17a34852bb66ea78289 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 21:24:06 -0500 Subject: [PATCH 55/70] Modify generate_items to exhaust all items --- src/days-2-4-adv/adv.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 7f5b38458f..44cd4531fd 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -37,9 +37,13 @@ def generate_items(rooms): for name in cycle(room_names): rand = random.randint(0, len(items)) try: - rooms[name].items = items.pop(rand) + if items: + rooms[name].items = items.pop(rand) + else: + print("Items", items) + break except IndexError: - break + continue def start_game(): rooms = generate_all_rooms() From dd6a590747e659e57ec4e17ca0dbd21aa84e133b Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 21:24:52 -0500 Subject: [PATCH 56/70] Remove debugging print statement --- src/days-2-4-adv/adv.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 44cd4531fd..4ba1563a7f 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -40,7 +40,6 @@ def generate_items(rooms): if items: rooms[name].items = items.pop(rand) else: - print("Items", items) break except IndexError: continue From b03446614badacaa02217a34e604d0f9dcc9eaa6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 21:27:14 -0500 Subject: [PATCH 57/70] Refactor call method and add else condition for wrong direction --- src/days-2-4-adv/game.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index d45eb6b76e..c345ba4d37 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -5,8 +5,8 @@ def __init__(self, player): self.player = player self.directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} self.input = None - self.action = None - self.verbs = ['take', 'drop'] + self.command = None + self.actions = ['take', 'drop'] def run(self): self._greeting() @@ -30,12 +30,12 @@ def _display_items(self): print(crayons.green("Items Available"), f": {self.player.room.items}\n") def _get_input(self): - self.action = None + self.command = None self.input = input('Enter a command: ').split() if len(self.input) <= 1: self.input = self.input[0] else: - self.action, self.input = self.input[0], self.input[1] + self.command, self.input = self.input[0], self.input[1] def _loop(self): while self.input.lower() != 'q': @@ -45,20 +45,22 @@ def _loop(self): if input == 'i': print(crayons.blue(f"Current Inventory: {self.player.items}", bold=True)) self._current_status() - elif self.action in self.verbs: - self._call_method(self.action) + elif self.command in self.actions: + self._call_command(self.command) self._current_status() elif hasattr(room, self.directions[input]): self.player.room = getattr(room, self.directions[input]) self._current_status() + else: + print(crayons.red("Unable to move in that direction!")) except KeyError: print(crayons.magenta('Input was not recognized\n')) self._current_status() finally: self._get_input() - def _call_method(self, action): - func = getattr(self.player, action) + def _call_command(self, command): + func = getattr(self.player, command) func(self.input.lower()) def __repr__(self): From 7c20323254a550d274466b21b17dc5e5f7c9f40f Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 21:28:03 -0500 Subject: [PATCH 58/70] Refactor items to set one item at a time --- src/days-2-4-adv/room.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/days-2-4-adv/room.py b/src/days-2-4-adv/room.py index 845664f8b9..b86ff1f9f4 100644 --- a/src/days-2-4-adv/room.py +++ b/src/days-2-4-adv/room.py @@ -13,9 +13,8 @@ def items(self): return self._items if self._items else None @items.setter - def items(self, items): - # self._items.append(item) - self._items = items + def items(self, item): + self._items.append(item) def __repr__(self): return crayons.yellow(self.name, bold=True) + f": {self.desc}" From cad3a806ff52ccca394fd414b4c79b4b0f632790 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 22:06:29 -0500 Subject: [PATCH 59/70] generate_map function now handles room linking --- src/days-2-4-adv/adv.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 4ba1563a7f..880bfc44db 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -8,14 +8,16 @@ from game import Game from item import Item -def generate_all_rooms(): +def generate_rooms(): rooms = {} with open('rooms.txt', 'r') as file: for line in file.readlines(): name, description = line.split('|') key = name.split()[0].lower() rooms[key] = Room(name.rstrip(), description.rstrip()) - # Link rooms together + return rooms + +def generate_map(rooms): rooms['outside'].n_to = rooms['foyer'] rooms['foyer'].s_to = rooms['outside'] rooms['foyer'].n_to = rooms['grand'] @@ -25,8 +27,6 @@ def generate_all_rooms(): rooms['narrow'].n_to = rooms['treasure'] rooms['treasure'].s_to = rooms['narrow'] - return rooms - def generate_items(rooms): room_names = list(rooms.keys()) with open('items.txt', 'r') as file: @@ -45,7 +45,8 @@ def generate_items(rooms): continue def start_game(): - rooms = generate_all_rooms() + rooms = generate_rooms() + generate_map(rooms) generate_items(rooms) name = input('Enter your name: ') player = Player(name, rooms['outside']) From 48e15bad7f474e12107b5ec2d02b03b66e0cafe8 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 22:19:47 -0500 Subject: [PATCH 60/70] Refactor take and drop methods to utilize Item class --- src/days-2-4-adv/player.py | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index dea68abecf..a71b65895f 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -8,6 +8,9 @@ def __init__(self, name, room): self._room = room self._inventory = [] + def __repr__(self): + return f"Player: {self._name}" + @property def name(self): return self._name @@ -24,21 +27,20 @@ def room(self, room): def items(self): return self._inventory - def take(self, item): - try: - self.room.items.remove(item) - self.items.append(item) - print(crayons.cyan(f"The {item} was taken from {self.room.name}.")) - except: - print(crayons.red(f"{item} was not found in {self.room.name}")) - - def drop(self, item): - try: - self.items.remove(item) - self.room.items.append(item) - print(crayons.magenta(f"The {item} was dropped in the {self.room.name}")) - except: - print(crayons.red(f"{item} was not found in player inventory!")) - - def __repr__(self): - return f"Player: {self._name}" + def take(self, object): + for item in self.room.items: + if item.name == object: + self.room.items.remove(item) + self.items.append(item) + print(crayons.cyan(f"The {item} was taken from {self.room.name}.")) + return + print(crayons.red(f"{object} was not found in {self.room.name}")) + + def drop(self, object): + for item in self.items: + if item.name == object: + self.items.remove(item) + self.room.items = item + print(crayons.magenta(f"The {item} was dropped in the {self.room.name}")) + return + print(crayons.red(f"{object} was not found in player inventory!")) From 0297f0a675e6e2402d4ebb1ee0eb88f142ff372f Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Aug 2018 22:28:12 -0500 Subject: [PATCH 61/70] Call setup functions inside generate_rooms --- src/days-2-4-adv/adv.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 880bfc44db..3ef536be02 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -15,6 +15,8 @@ def generate_rooms(): name, description = line.split('|') key = name.split()[0].lower() rooms[key] = Room(name.rstrip(), description.rstrip()) + generate_map(rooms) + generate_items(rooms) return rooms def generate_map(rooms): @@ -46,8 +48,6 @@ def generate_items(rooms): def start_game(): rooms = generate_rooms() - generate_map(rooms) - generate_items(rooms) name = input('Enter your name: ') player = Player(name, rooms['outside']) game = Game(player) From 8ca26d36ecebcdcf7988626e02c23462c107e560 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 17:38:45 -0500 Subject: [PATCH 62/70] Clean up some names to be more descriptive --- src/days-2-4-adv/game.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index c345ba4d37..2bcd1338cc 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -42,24 +42,22 @@ def _loop(self): input = self.input.lower() room = self.player.room try: + attribute = self.directions[input] if input == 'i': print(crayons.blue(f"Current Inventory: {self.player.items}", bold=True)) - self._current_status() elif self.command in self.actions: - self._call_command(self.command) - self._current_status() - elif hasattr(room, self.directions[input]): - self.player.room = getattr(room, self.directions[input]) - self._current_status() + self._use_command(self.command) + elif hasattr(room, attribute): + self.player.room = getattr(room, attribute) else: print(crayons.red("Unable to move in that direction!")) except KeyError: print(crayons.magenta('Input was not recognized\n')) - self._current_status() finally: + self._current_status() self._get_input() - def _call_command(self, command): + def _use_command(self, command): func = getattr(self.player, command) func(self.input.lower()) From b7ccd14547eec45e54d54d4a904ef7beee9bebe1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 18:02:24 -0500 Subject: [PATCH 63/70] Create functions for color printing --- src/days-2-4-adv/adv.py | 5 ++--- src/days-2-4-adv/game.py | 17 ++++++++--------- src/days-2-4-adv/player.py | 10 +++++----- src/days-2-4-adv/utils.py | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 src/days-2-4-adv/utils.py diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 3ef536be02..2a08687f2e 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,12 +1,11 @@ import random from itertools import cycle -import crayons - from room import Room from player import Player from game import Game from item import Item +from utils import print_green def generate_rooms(): rooms = {} @@ -58,4 +57,4 @@ def start_game(): try: start_game() except KeyboardInterrupt: - print(crayons.green("\nGoodbye!!", bold=True)) + print_green("\nGoodbye!!", bold=True) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 2bcd1338cc..3587b3cb77 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -1,4 +1,4 @@ -import crayons +from utils import print_blue, print_white, print_green, print_red, print_magenta class Game: def __init__(self, player): @@ -15,7 +15,7 @@ def run(self): self._loop() def _greeting(self): - print(crayons.white(f'\nWelcome {self.player.name}!', bold=True)) + print_white(f'\nWelcome {self.player.name}!', bold=True) print('Use `take` or `drop` to interact with items') print('Check inventory with command `i`') @@ -27,7 +27,7 @@ def _display_room(self): print(f"\n{self.player.room}") def _display_items(self): - print(crayons.green("Items Available"), f": {self.player.room.items}\n") + print_green("Items Available", f": {self.player.room.items}\n") def _get_input(self): self.command = None @@ -42,17 +42,16 @@ def _loop(self): input = self.input.lower() room = self.player.room try: - attribute = self.directions[input] if input == 'i': - print(crayons.blue(f"Current Inventory: {self.player.items}", bold=True)) + print_blue(f"Current Inventory: {self.player.items}", bold=True) elif self.command in self.actions: self._use_command(self.command) - elif hasattr(room, attribute): - self.player.room = getattr(room, attribute) + elif hasattr(room, self.directions[input]): + self.player.room = getattr(room, self.directions[input]) else: - print(crayons.red("Unable to move in that direction!")) + print_red("Unable to move in that direction!") except KeyError: - print(crayons.magenta('Input was not recognized\n')) + print_magenta('Input was not recognized\n') finally: self._current_status() self._get_input() diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index a71b65895f..957fc6c790 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -1,6 +1,6 @@ # Write a class to hold player information, e.g. what room they are in # currently. -import crayons +from utils import print_cyan, print_red, print_magenta class Player: def __init__(self, name, room): @@ -32,15 +32,15 @@ def take(self, object): if item.name == object: self.room.items.remove(item) self.items.append(item) - print(crayons.cyan(f"The {item} was taken from {self.room.name}.")) + print_cyan(f"The {item} was taken from {self.room.name}.") return - print(crayons.red(f"{object} was not found in {self.room.name}")) + print_red(f"{object} was not found in {self.room.name}") def drop(self, object): for item in self.items: if item.name == object: self.items.remove(item) self.room.items = item - print(crayons.magenta(f"The {item} was dropped in the {self.room.name}")) + print_magenta(f"The {item} was dropped in the {self.room.name}") return - print(crayons.red(f"{object} was not found in player inventory!")) + print_red(f"{object} was not found in player inventory!") diff --git a/src/days-2-4-adv/utils.py b/src/days-2-4-adv/utils.py new file mode 100644 index 0000000000..a1e9feaa58 --- /dev/null +++ b/src/days-2-4-adv/utils.py @@ -0,0 +1,19 @@ +import crayons + +def print_blue(string, *args, bold=False): + print(crayons.blue(string, bold=bold), *args) + +def print_green(string, *args, bold=False): + print(crayons.green(string, bold=bold), *args) + +def print_red(string, *args, bold=False): + print(crayons.red(string, bold=bold), *args) + +def print_magenta(string, *args, bold=False): + print(crayons.magenta(string, bold=bold), *args) + +def print_white(string, *args, bold=False): + print(crayons.white(string, bold=bold), *args) + +def print_cyan(string, *args, bold=False): + print(crayons.cyan(string, bold=bold), *args) From 9032e809a3b659a697ef420b3f46169dd4ea5403 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 18:02:55 -0500 Subject: [PATCH 64/70] Add Treasure class that inherits from Item --- src/days-2-4-adv/item.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/days-2-4-adv/item.py b/src/days-2-4-adv/item.py index dd1aee3c8f..0c4c8e2e54 100644 --- a/src/days-2-4-adv/item.py +++ b/src/days-2-4-adv/item.py @@ -3,4 +3,13 @@ def __init__(self, name): self.name = name def __repr__(self): - return f'{self.name}' \ No newline at end of file + return f'{self.name}' + +class Treasure(Item): + def __init__(self, name, description, value): + super().__init__(name) + self.desc = description + self.value = value + + def __repr__(self): + return f"Golden {self.name}" \ No newline at end of file From c87b8b6e768af6e9f8fed4791d581f5c22e70520 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 18:05:04 -0500 Subject: [PATCH 65/70] Refactor self.directions to self.attributes --- src/days-2-4-adv/game.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 3587b3cb77..ab0707c1ce 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -3,7 +3,7 @@ class Game: def __init__(self, player): self.player = player - self.directions = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} + self.attributes = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} self.input = None self.command = None self.actions = ['take', 'drop'] @@ -46,8 +46,8 @@ def _loop(self): print_blue(f"Current Inventory: {self.player.items}", bold=True) elif self.command in self.actions: self._use_command(self.command) - elif hasattr(room, self.directions[input]): - self.player.room = getattr(room, self.directions[input]) + elif hasattr(room, self.attributes[input]): + self.player.room = getattr(room, self.attributes[input]) else: print_red("Unable to move in that direction!") except KeyError: From 7d10443004e0499cecf4b67dcdaabdd066469f77 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 18:09:07 -0500 Subject: [PATCH 66/70] Refactor some names to make more descriptive --- src/days-2-4-adv/game.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index ab0707c1ce..671986c3f6 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -9,21 +9,21 @@ def __init__(self, player): self.actions = ['take', 'drop'] def run(self): - self._greeting() - self._current_status() + self._greet() + self._display_status() self._get_input() self._loop() - def _greeting(self): + def _greet(self): print_white(f'\nWelcome {self.player.name}!', bold=True) print('Use `take` or `drop` to interact with items') print('Check inventory with command `i`') - def _current_status(self): - self._display_room() + def _display_status(self): + self._display_current_room() self._display_items() - def _display_room(self): + def _display_current_room(self): print(f"\n{self.player.room}") def _display_items(self): @@ -53,7 +53,7 @@ def _loop(self): except KeyError: print_magenta('Input was not recognized\n') finally: - self._current_status() + self._display_status() self._get_input() def _use_command(self, command): From 3887f37e786b3b525e00ca71e040e0183af4cecd Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 19:27:54 -0500 Subject: [PATCH 67/70] Move start_game function to beginning of file --- src/days-2-4-adv/adv.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index 2a08687f2e..f7638c3a3d 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -7,6 +7,13 @@ from item import Item from utils import print_green +def start_game(): + rooms = generate_rooms() + name = input('Enter your name: ') + player = Player(name, rooms['outside']) + game = Game(player) + game.run() + def generate_rooms(): rooms = {} with open('rooms.txt', 'r') as file: @@ -45,13 +52,6 @@ def generate_items(rooms): except IndexError: continue -def start_game(): - rooms = generate_rooms() - name = input('Enter your name: ') - player = Player(name, rooms['outside']) - game = Game(player) - game.run() - if __name__ == "__main__": try: From 35eec4d5c8c46352dbc2fafa8cf977c48012f3a1 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 21:04:22 -0500 Subject: [PATCH 68/70] Add score command and display players score --- src/days-2-4-adv/game.py | 19 +++++++++++++------ src/days-2-4-adv/player.py | 6 +++++- src/days-2-4-adv/utils.py | 3 +++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/days-2-4-adv/game.py b/src/days-2-4-adv/game.py index 671986c3f6..0b542cd99f 100644 --- a/src/days-2-4-adv/game.py +++ b/src/days-2-4-adv/game.py @@ -6,7 +6,7 @@ def __init__(self, player): self.attributes = {'n': 'n_to', 'e': 'e_to', 's': 's_to', 'w': 'w_to'} self.input = None self.command = None - self.actions = ['take', 'drop'] + self.actions = ['take', 'drop', 'score'] def run(self): self._greet() @@ -32,10 +32,14 @@ def _display_items(self): def _get_input(self): self.command = None self.input = input('Enter a command: ').split() - if len(self.input) <= 1: - self.input = self.input[0] - else: - self.command, self.input = self.input[0], self.input[1] + try: + if len(self.input[0]) == 1: + self.input = self.input[0] + else: + self.command, self.input = self.input[0], self.input[1] + except IndexError: + self.command = self.input[0] + self.input = self.command def _loop(self): while self.input.lower() != 'q': @@ -58,7 +62,10 @@ def _loop(self): def _use_command(self, command): func = getattr(self.player, command) - func(self.input.lower()) + try: + func(self.input.lower()) + except TypeError: + func() def __repr__(self): return f"Game: {self.player}" \ No newline at end of file diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index 957fc6c790..64227bcdff 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -1,11 +1,12 @@ # Write a class to hold player information, e.g. what room they are in # currently. -from utils import print_cyan, print_red, print_magenta +from utils import print_cyan, print_red, print_magenta, print_yellow, print_white class Player: def __init__(self, name, room): self._name = name self._room = room + self._score = 0 self._inventory = [] def __repr__(self): @@ -27,6 +28,9 @@ def room(self, room): def items(self): return self._inventory + def score(self): + print_white(f"Player Score: {self._score}", bold=True) + def take(self, object): for item in self.room.items: if item.name == object: diff --git a/src/days-2-4-adv/utils.py b/src/days-2-4-adv/utils.py index a1e9feaa58..71de990009 100644 --- a/src/days-2-4-adv/utils.py +++ b/src/days-2-4-adv/utils.py @@ -17,3 +17,6 @@ def print_white(string, *args, bold=False): def print_cyan(string, *args, bold=False): print(crayons.cyan(string, bold=bold), *args) + +def print_yellow(string, *args, bold=False): + print(crayons.yellow(string, bold=bold), *args) From c5159ba0603f3e076e38626396b9910f4dec512c Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 21:35:30 -0500 Subject: [PATCH 69/70] Game now generates treasure --- src/days-2-4-adv/adv.py | 9 +++++++-- src/days-2-4-adv/treasure.txt | 3 +++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src/days-2-4-adv/treasure.txt diff --git a/src/days-2-4-adv/adv.py b/src/days-2-4-adv/adv.py index f7638c3a3d..d7251ac67f 100644 --- a/src/days-2-4-adv/adv.py +++ b/src/days-2-4-adv/adv.py @@ -1,10 +1,10 @@ import random -from itertools import cycle +from itertools import cycle, zip_longest from room import Room from player import Player from game import Game -from item import Item +from item import Item, Treasure from utils import print_green def start_game(): @@ -42,6 +42,11 @@ def generate_items(rooms): Item(item.rstrip()) for item in file.readlines() ] + with open('treasure.txt', 'r') as file: + for line in file.readlines(): + name, description, value = line.split('|') + treasure = Treasure(name, description, value) + items.append(treasure) for name in cycle(room_names): rand = random.randint(0, len(items)) try: diff --git a/src/days-2-4-adv/treasure.txt b/src/days-2-4-adv/treasure.txt new file mode 100644 index 0000000000..7a17cf728b --- /dev/null +++ b/src/days-2-4-adv/treasure.txt @@ -0,0 +1,3 @@ +crown|a sparkling, golden crown fit for a king|50 +bracelet|a braclet of immense value|30 +ring|a mighty ring of terrible power|100 \ No newline at end of file From cfba813e84f7a0e87b12b32489e74b1644cc2a75 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 9 Aug 2018 21:37:37 -0500 Subject: [PATCH 70/70] Picking up treasure now raises a players score --- src/days-2-4-adv/item.py | 17 ++++++++++++++--- src/days-2-4-adv/player.py | 7 +++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/days-2-4-adv/item.py b/src/days-2-4-adv/item.py index 0c4c8e2e54..3c4aa0747c 100644 --- a/src/days-2-4-adv/item.py +++ b/src/days-2-4-adv/item.py @@ -1,6 +1,13 @@ class Item: def __init__(self, name): self.name = name + self.used = False + + def on_take(self): + self.used = True + + def on_drop(self): + pass def __repr__(self): return f'{self.name}' @@ -8,8 +15,12 @@ def __repr__(self): class Treasure(Item): def __init__(self, name, description, value): super().__init__(name) - self.desc = description - self.value = value + self._desc = description + self._value = int(value) + + @property + def value(self): + return self._value def __repr__(self): - return f"Golden {self.name}" \ No newline at end of file + return f"golden {self.name}" \ No newline at end of file diff --git a/src/days-2-4-adv/player.py b/src/days-2-4-adv/player.py index 64227bcdff..305cb12b71 100644 --- a/src/days-2-4-adv/player.py +++ b/src/days-2-4-adv/player.py @@ -1,5 +1,6 @@ # Write a class to hold player information, e.g. what room they are in # currently. +from item import Treasure from utils import print_cyan, print_red, print_magenta, print_yellow, print_white class Player: @@ -31,9 +32,15 @@ def items(self): def score(self): print_white(f"Player Score: {self._score}", bold=True) + def increment_score(self, item): + self._score += item.value + def take(self, object): for item in self.room.items: if item.name == object: + if isinstance(item, Treasure) and not item.used: + item.on_take() + self.increment_score(item) self.room.items.remove(item) self.items.append(item) print_cyan(f"The {item} was taken from {self.room.name}.")