回答編集履歴

1

追記

2018/09/06 06:50

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -39,3 +39,255 @@
39
39
 
40
40
 
41
41
  バグが蔓延する要因になるので、むしろ一切使わない方法を検討すべきです。
42
+
43
+
44
+
45
+ 書いてみた
46
+
47
+ ---
48
+
49
+ 雑な作りですが、クラスを使った例です。
50
+
51
+
52
+
53
+ **main.py**
54
+
55
+ ```Python
56
+
57
+ from player import Player
58
+
59
+ from non_player import choose_event
60
+
61
+
62
+
63
+
64
+
65
+ hero = Player(money=1000)
66
+
67
+ for _ in range(5):
68
+
69
+ event = choose_event()
70
+
71
+
72
+
73
+ hero.print_status()
74
+
75
+ hero.process_event(
76
+
77
+ event()
78
+
79
+ )
80
+
81
+
82
+
83
+ print()
84
+
85
+ ```
86
+
87
+
88
+
89
+ **player.py**
90
+
91
+ ```Python
92
+
93
+ from event import EventType
94
+
95
+
96
+
97
+
98
+
99
+ class Player:
100
+
101
+ def __init__(self, money):
102
+
103
+ self._money = money
104
+
105
+ self._action_table = {
106
+
107
+ EventType.DO_NOTHING: lambda: None,
108
+
109
+ EventType.GET_MONEY: self._add_money,
110
+
111
+ }
112
+
113
+
114
+
115
+ def process_event(self, event):
116
+
117
+ self._action_table[event.event_type](*event.args)
118
+
119
+
120
+
121
+ def print_status(self):
122
+
123
+ print(f'現在の所持金{self._money}')
124
+
125
+
126
+
127
+ def _add_money(self, value):
128
+
129
+ print(f'{value}円を手に入れた!')
130
+
131
+ self._money += value
132
+
133
+ ```
134
+
135
+
136
+
137
+ **non_player.py**
138
+
139
+ ```Python
140
+
141
+ from event import Event, EventType
142
+
143
+
144
+
145
+
146
+
147
+ class _NonPlayer:
148
+
149
+ def __init__(self, name, event):
150
+
151
+ self.name = name
152
+
153
+ self.event = event
154
+
155
+
156
+
157
+
158
+
159
+ def _event_stub():
160
+
161
+ print('特に用はないよ')
162
+
163
+ return Event(EventType.DO_NOTHING)
164
+
165
+
166
+
167
+ def _banker_event():
168
+
169
+ print('ここは銀行です')
170
+
171
+ print('これをきみにあげよう')
172
+
173
+ return Event(EventType.GET_MONEY, 500)
174
+
175
+
176
+
177
+
178
+
179
+ npcs = [
180
+
181
+ _NonPlayer('村人', _event_stub),
182
+
183
+ _NonPlayer('武器屋', _event_stub),
184
+
185
+ _NonPlayer('銀行屋', _banker_event),
186
+
187
+ ]
188
+
189
+
190
+
191
+ def choose_event():
192
+
193
+ print('誰と話す?', end='')
194
+
195
+ for i, npc in enumerate(npcs, start=1):
196
+
197
+ print(f'[{i}]{npc.name}', end='')
198
+
199
+
200
+
201
+ num = int(input(' '))
202
+
203
+ return npcs[num-1].event
204
+
205
+ ```
206
+
207
+
208
+
209
+ **event.py**
210
+
211
+ ```Python
212
+
213
+ from enum import Enum, auto
214
+
215
+
216
+
217
+
218
+
219
+ class EventType(Enum):
220
+
221
+ DO_NOTHING = auto()
222
+
223
+ GET_MONEY = auto()
224
+
225
+
226
+
227
+
228
+
229
+ class Event:
230
+
231
+ def __init__(self, event_type, *args):
232
+
233
+ self.event_type = event_type
234
+
235
+ self.args = args
236
+
237
+ ```
238
+
239
+
240
+
241
+ **実行例**
242
+
243
+ ```plain
244
+
245
+ >python main.py
246
+
247
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 1
248
+
249
+ 現在の所持金1000
250
+
251
+ 特に用はないよ
252
+
253
+
254
+
255
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 2
256
+
257
+ 現在の所持金1000
258
+
259
+ 特に用はないよ
260
+
261
+
262
+
263
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 3
264
+
265
+ 現在の所持金1000
266
+
267
+ ここは銀行です
268
+
269
+ これをきみにあげよう
270
+
271
+ 500円を手に入れた!
272
+
273
+
274
+
275
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 2
276
+
277
+ 現在の所持金1500
278
+
279
+ 特に用はないよ
280
+
281
+
282
+
283
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 3
284
+
285
+ 現在の所持金1500
286
+
287
+ ここは銀行です
288
+
289
+ これをきみにあげよう
290
+
291
+ 500円を手に入れた!
292
+
293
+ ```