teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/09/06 06:50

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -18,4 +18,130 @@
18
18
 
19
19
  > それとも global ~ はある程度多く使うものでしょうか?
20
20
 
21
- バグが蔓延する要因になるので、むしろ一切使わない方法を検討すべきです。
21
+ バグが蔓延する要因になるので、むしろ一切使わない方法を検討すべきです。
22
+
23
+ 書いてみた
24
+ ---
25
+ 雑な作りですが、クラスを使った例です。
26
+
27
+ **main.py**
28
+ ```Python
29
+ from player import Player
30
+ from non_player import choose_event
31
+
32
+
33
+ hero = Player(money=1000)
34
+ for _ in range(5):
35
+ event = choose_event()
36
+
37
+ hero.print_status()
38
+ hero.process_event(
39
+ event()
40
+ )
41
+
42
+ print()
43
+ ```
44
+
45
+ **player.py**
46
+ ```Python
47
+ from event import EventType
48
+
49
+
50
+ class Player:
51
+ def __init__(self, money):
52
+ self._money = money
53
+ self._action_table = {
54
+ EventType.DO_NOTHING: lambda: None,
55
+ EventType.GET_MONEY: self._add_money,
56
+ }
57
+
58
+ def process_event(self, event):
59
+ self._action_table[event.event_type](*event.args)
60
+
61
+ def print_status(self):
62
+ print(f'現在の所持金{self._money}')
63
+
64
+ def _add_money(self, value):
65
+ print(f'{value}円を手に入れた!')
66
+ self._money += value
67
+ ```
68
+
69
+ **non_player.py**
70
+ ```Python
71
+ from event import Event, EventType
72
+
73
+
74
+ class _NonPlayer:
75
+ def __init__(self, name, event):
76
+ self.name = name
77
+ self.event = event
78
+
79
+
80
+ def _event_stub():
81
+ print('特に用はないよ')
82
+ return Event(EventType.DO_NOTHING)
83
+
84
+ def _banker_event():
85
+ print('ここは銀行です')
86
+ print('これをきみにあげよう')
87
+ return Event(EventType.GET_MONEY, 500)
88
+
89
+
90
+ npcs = [
91
+ _NonPlayer('村人', _event_stub),
92
+ _NonPlayer('武器屋', _event_stub),
93
+ _NonPlayer('銀行屋', _banker_event),
94
+ ]
95
+
96
+ def choose_event():
97
+ print('誰と話す?', end='')
98
+ for i, npc in enumerate(npcs, start=1):
99
+ print(f'[{i}]{npc.name}', end='')
100
+
101
+ num = int(input(' '))
102
+ return npcs[num-1].event
103
+ ```
104
+
105
+ **event.py**
106
+ ```Python
107
+ from enum import Enum, auto
108
+
109
+
110
+ class EventType(Enum):
111
+ DO_NOTHING = auto()
112
+ GET_MONEY = auto()
113
+
114
+
115
+ class Event:
116
+ def __init__(self, event_type, *args):
117
+ self.event_type = event_type
118
+ self.args = args
119
+ ```
120
+
121
+ **実行例**
122
+ ```plain
123
+ >python main.py
124
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 1
125
+ 現在の所持金1000
126
+ 特に用はないよ
127
+
128
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 2
129
+ 現在の所持金1000
130
+ 特に用はないよ
131
+
132
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 3
133
+ 現在の所持金1000
134
+ ここは銀行です
135
+ これをきみにあげよう
136
+ 500円を手に入れた!
137
+
138
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 2
139
+ 現在の所持金1500
140
+ 特に用はないよ
141
+
142
+ 誰と話す?[1]村人[2]武器屋[3]銀行屋 3
143
+ 現在の所持金1500
144
+ ここは銀行です
145
+ これをきみにあげよう
146
+ 500円を手に入れた!
147
+ ```