/
Adventura.py
138 lines (104 loc) · 4.56 KB
/
Adventura.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
class Item:
def __init__(self, name: str):
self.name = name
class Inventory:
def __init__(self):
self.items = set()
def add_item(self, item: Item):
self.items.add(item)
def remove_item(self, item: Item):
self.items.remove(item)
class Location:
def __init__(self, name: str, description: str):
self.name = name
self.description = description
self.items = []
self.actions = []
def add_item(self, item: Item):
self.items.append(item)
def add_activity(self, action):
self.actions.append(action)
class Transition:
def __init__(self, old_location: Location, new_location: Location):
self.old_location = old_location
self.new_location = new_location
class Action:
def __init__(self, name: str, required_items: set = None):
self.name = name
if required_items is None:
required_items = []
self.required_items = required_items
def run(self, location: Location, inventory: Inventory) -> Transition:
pass
class ItemAction(Action):
def __init__(self, name: str, target_item: Item = None):
super().__init__(name, None)
self.target_item = target_item
def run(self, location: Location, inventory: Inventory):
print(f"You've chosen to {self.name}")
location.items.remove(self.target_item)
inventory.add_item(self.target_item)
return None
class DropItem(Action):
def __init__(self, name: str, target_item: Item = None):
super().__init__(name, None)
self.target_item = target_item
def run(self, location: Location, inventory: Inventory):
print(f"You've chosen to {self.name}")
location.items.append(self.target_item)
inventory.remove_item(self.target_item)
return None
class TransitionAction(Action):
def __init__(self, name: str, target_location: Location, required_items: set = None):
super().__init__(name, required_items)
self.target_location = target_location
def run(self, location: Location, inventory: Inventory):
print(f"You left {location.name} and went to {self.target_location.name}")
return Transition(location, self.target_location)
class Game:
def __init__(self, name: str):
self.name = name
self.locations = []
self.inventory = Inventory()
def add_location(self, location):
self.locations.append(location)
def start(self):
print(self.name)
current_location = self.locations[0]
while True:
print(f"You are in {current_location.name}")
print(current_location.description)
transition = self.handle_actions(current_location, self.inventory)
if transition is not None:
current_location = transition.new_location
if current_location == self.locations[-1]:
exit()
def handle_actions(self, location: Location, inventory: Inventory) -> Transition:
print("What do you want to do?")
available_actions = self.get_available_actions(location)
for idx, activity in enumerate(available_actions):
if set(self.inventory.items).issuperset(activity.required_items):
print(f"{idx + 1}) {activity.name}")
player_choice = self.prompt_action_choice(available_actions)
chosen_action = available_actions[player_choice - 1]
return chosen_action.run(location, inventory)
def get_available_actions(self, location):
available_actions = []
for action in location.actions:
if isinstance(action, TransitionAction) and self.inventory.items.issuperset(action.required_items):
available_actions.append(action)
if isinstance(action, ItemAction) and action.target_item in location.items:
available_actions.append(action)
if isinstance(action, DropItem) and action.target_item in self.inventory.items:
available_actions.append(action)
return available_actions
def prompt_action_choice(self, available_actions):
while True:
user_input = input()
try:
choice = int(user_input)
if choice <= 0 or choice > len(available_actions):
raise ValueError
return choice
except ValueError:
print("Enter a valid choice number")