回答編集履歴

10

追記

2018/05/05 17:55

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -235,3 +235,63 @@
235
235
  最後に変数名mapとクラス名Mapは標準の命名とかぶるため、list/mapなどは避けて
236
236
 
237
237
  BoardやFieldかMapDataなどの名前に変更することをオススメいたします。
238
+
239
+
240
+
241
+ ---
242
+
243
+ 解決してよかったです。
244
+
245
+ 最初は誰でもそーいうものなのです。
246
+
247
+ あんまりデバックしていないですが、コードを置いておきます
248
+
249
+ ご参考まで。
250
+
251
+ ```Python
252
+
253
+ from itertools import product
254
+
255
+ DIRECTIONS = {LEFT: (0, -1), DOWN: (1, 0), RIGHT: (0, +1), UP: (-1, 0)}
256
+
257
+ # ↑Game_Titleの前に宣言
258
+
259
+ def generate_map(self): # マップ生成
260
+
261
+ from pprint import PrettyPrinter
262
+
263
+ pp = PrettyPrinter()
264
+
265
+ pp.pprint(Map.map)
266
+
267
+ # まず棒倒し法で迷路生成
268
+
269
+ START_ROW = 2
270
+
271
+ for i, j in product(range(START_ROW, self.row - 2, 2), range(2, self.col - 2, 2)):
272
+
273
+ data = [LEFT, DOWN, RIGHT]
274
+
275
+ # 最初の行は上にも倒せる。
276
+
277
+ if i == START_ROW:
278
+
279
+ data.append(UP)
280
+
281
+ random.shuffle(data)
282
+
283
+ while len(data) > 0:
284
+
285
+ direction = data.pop(0)
286
+
287
+ px, py = [x + y for (x, y) in zip([i, j], DIRECTIONS[direction])]
288
+
289
+ if self.map[px][py] == 0:
290
+
291
+ self.map[px][py] = 1
292
+
293
+ break
294
+
295
+
296
+
297
+ ```

9

QED

2018/05/05 17:55

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -168,24 +168,16 @@
168
168
 
169
169
 
170
170
 
171
- で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・
172
-
173
-
174
-
175
171
  ---
176
172
 
177
173
 
178
174
 
179
175
  `generate_map`関数の
180
176
 
181
-
182
-
183
177
  1,`direction = random.randint(0, 100) % 4`の方の
184
178
 
185
179
  `if direction == UP:`で`wall_flag = False`の設定がないです。
186
180
 
187
-
188
-
189
181
  2,`direction = random.randint(0, 100) % 3`で生成される値は0~2ですが、
190
182
 
191
183
  `LEFT, DOWN, RIGHT, UP = 3, 2, 1, 0`で定義されているので。
@@ -202,4 +194,44 @@
202
194
 
203
195
 
204
196
 
197
+ ---
198
+
199
+
200
+
205
- 3,**Mapの変数:map,orb_map,orb_map_checkがクラス変数になっています**
201
+ 原因:`map`、`orb_map`、`orb_map`_`check`、`row` 、`col`の変数がクラス変数で宣言されていたため
202
+
203
+ MAP情報が2回目以降初期化されていなかった。以下のコードで前回のMAPデータが表示されるのが分かると思います。
204
+
205
+ ```Python
206
+
207
+ def generate_map(self):
208
+
209
+ from pprint import PrettyPrinter
210
+
211
+ pp = PrettyPrinter()
212
+
213
+ pp.pprint(Map.map)
214
+
215
+
216
+
217
+ ```
218
+
219
+ そのため2回目以降の`generate_map`関数が条件によって無限ループになった。
220
+
221
+ ◇条件
222
+
223
+ 行が4以上で2の倍数かつ2の倍数列で周りの4マスが全部オーブを取得した(Map情報を1にした)。
224
+
225
+ この時、`wall_flag`が`False`にならず無限ループとなる。
226
+
227
+ ◇対策方法
228
+
229
+ インスタンス変数にしてくださいな。あと以下の行も忘れずに
230
+
231
+ self.row = len(self.map)
232
+
233
+ self.col = len(self.map[0])
234
+
235
+ 最後に変数名mapとクラス名Mapは標準の命名とかぶるため、list/mapなどは避けて
236
+
237
+ BoardやFieldかMapDataなどの名前に変更することをオススメいたします。

8

追記

2018/05/05 16:36

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -169,3 +169,37 @@
169
169
 
170
170
 
171
171
  で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・
172
+
173
+
174
+
175
+ ---
176
+
177
+
178
+
179
+ `generate_map`関数の
180
+
181
+
182
+
183
+ 1,`direction = random.randint(0, 100) % 4`の方の
184
+
185
+ `if direction == UP:`で`wall_flag = False`の設定がないです。
186
+
187
+
188
+
189
+ 2,`direction = random.randint(0, 100) % 3`で生成される値は0~2ですが、
190
+
191
+ `LEFT, DOWN, RIGHT, UP = 3, 2, 1, 0`で定義されているので。
192
+
193
+ `IF`文で判定しているのは`RIGHT:1`,`DOWN:2`,`LEFT:3`です。
194
+
195
+ 生成している乱数源が正しくないかと。
196
+
197
+
198
+
199
+ そもそも論としてこの`while wall_flag`は不要なのでは?
200
+
201
+ [迷路生成(棒倒し法)](http://algoful.com/Archive/Algorithm/MazeBar)でググって出てきたページを見る限りでもiとjだけで実装できると思いますが。
202
+
203
+
204
+
205
+ 3,**Mapの変数:map,orb_map,orb_map_checkがクラス変数になっています。**

7

追記

2018/05/05 15:26

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -134,6 +134,8 @@
134
134
 
135
135
  for i, j in product(range(self.row), range(self.col)):
136
136
 
137
+ print(i, j) # printでiとjの値を表示する。(デバック用)
138
+
137
139
  wall_flag = True
138
140
 
139
141
  if i == 0 or i == self.row - 1 or j == 0 or j == self.col - 1 or self.map[i][j] == 0:
@@ -147,3 +149,23 @@
147
149
  direction = random.randint(0, 100) % 4
148
150
 
149
151
  ```
152
+
153
+ でこれで実行してみると
154
+
155
+ `4 12`の出力で止まるので、5行目13列で問題が発生して無限ループになったことが分かります。
156
+
157
+ 止まる出力メッセージは質問者様の環境で違うはずです。
158
+
159
+ ポイントは`print`の出力が`MAP`の最後の行と列まで出力されていないので、**無限ループになっているという事が確定したことです。**
160
+
161
+
162
+
163
+ < まとめ >
164
+
165
+ 原因:無限ループによってキーボードの入力を受付なかった。
166
+
167
+ 発生条件:map.generate_map関数のwall_flagがFalseにならない。
168
+
169
+
170
+
171
+ で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・

6

追記

2018/05/05 14:23

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -111,3 +111,39 @@
111
111
  表示されないことから`map.generate_map()`の処理で無限ループになってますね。
112
112
 
113
113
  キーボードが反応しない原因はこれですね。
114
+
115
+ まず2重ループはやめて、`itertools#product`を使ったループにしてください。
116
+
117
+
118
+
119
+ ```Python
120
+
121
+ from itertools import product
122
+
123
+ for i, j in product(range(self.row), range(self.col)):
124
+
125
+ ```
126
+
127
+ こうすることでループのネストが1段減ります。
128
+
129
+
130
+
131
+ 次に`continue`文を使う事で、ネストを一段へらします。
132
+
133
+ ```Python
134
+
135
+ for i, j in product(range(self.row), range(self.col)):
136
+
137
+ wall_flag = True
138
+
139
+ if i == 0 or i == self.row - 1 or j == 0 or j == self.col - 1 or self.map[i][j] == 0:
140
+
141
+ continue
142
+
143
+ if i == 2 and j % 2 == 0 and self.map[i][j] == 1:
144
+
145
+ while (wall_flag):
146
+
147
+ direction = random.randint(0, 100) % 4
148
+
149
+ ```

5

追記

2018/05/05 14:13

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -100,8 +100,14 @@
100
100
 
101
101
  が呼ばれるのでは?
102
102
 
103
+
104
+
103
105
  ---
104
106
 
105
- map.generate_map() の後の行にprint('generate_map')を追加して確認してみましたが、
106
107
 
108
+
109
+ `map.generate_map()` の次行に`print('generate_map')`を追加して確認してみましたが、
110
+
107
- 表示されないことからmap.generate_map()の処理で無限ループになってますね。
111
+ 表示されないことから`map.generate_map()`の処理で無限ループになってますね。
112
+
113
+ キーボードが反応しない原因はこれですね。

4

追記

2018/05/05 13:55

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -99,3 +99,9 @@
99
99
  map.generate_orb_map() # 生成したマップをもとにオーブを配置
100
100
 
101
101
  が呼ばれるのでは?
102
+
103
+ ---
104
+
105
+ map.generate_map() の後の行にprint('generate_map')を追加して確認してみましたが、
106
+
107
+ 表示されないことからmap.generate_map()の処理で無限ループになってますね。

3

追記

2018/05/05 13:54

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -92,14 +92,10 @@
92
92
 
93
93
 
94
94
 
95
- main関数 -> title関数 -> main関数この時
95
+ title関数 -> main関数 -> (2回目のプレイ)title関数 -> main関数この時
96
96
 
97
97
  map.generate_map() # ランダムマップ生成
98
98
 
99
99
  map.generate_orb_map() # 生成したマップをもとにオーブを配置
100
100
 
101
101
  が呼ばれるのでは?
102
-
103
-
104
-
105
- まず、Sceneという概念をint型かenum型で導入して、main処理内のwhileループでどの画面かの判断をしたほうがこの2重初期化を防げます。

2

追記

2018/05/05 12:49

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -83,3 +83,23 @@
83
83
  1,whileが確実に抜ける事を確認してくださいな。
84
84
 
85
85
  2,オーブを全部取得したら、次のMAP生成のために`generate_map`が呼ばれますが、プレイヤーがいる位置を生成時に考慮していないように見受けられます。
86
+
87
+
88
+
89
+ 画像で見ていただいた方が分かりやすいと思うので、これだとPlayer2が動けないMAPを生成してます。
90
+
91
+ ![イメージ説明](4dae39991843659a0f48820533932d59.jpeg)
92
+
93
+
94
+
95
+ main関数 -> title関数 -> main関数この時
96
+
97
+ map.generate_map() # ランダムマップ生成
98
+
99
+ map.generate_orb_map() # 生成したマップをもとにオーブを配置
100
+
101
+ が呼ばれるのでは?
102
+
103
+
104
+
105
+ まず、Sceneという概念をint型かenum型で導入して、main処理内のwhileループでどの画面かの判断をしたほうがこの2重初期化を防げます。

1

追記

2018/05/05 12:22

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  ```Python
56
56
 
57
- directions = {LEFT: (0, -1), DOWN: (-1, 0), RIGHT: (0, +1), UP: (-1, 0)}
57
+ directions = {LEFT: (0, -1), DOWN: (1, 0), RIGHT: (0, +1), UP: (-1, 0)}
58
58
 
59
59
  print(directions)
60
60