回答編集履歴
10
追記
answer
CHANGED
|
@@ -116,4 +116,34 @@
|
|
|
116
116
|
self.row = len(self.map)
|
|
117
117
|
self.col = len(self.map[0])
|
|
118
118
|
最後に変数名mapとクラス名Mapは標準の命名とかぶるため、list/mapなどは避けて
|
|
119
|
-
BoardやFieldかMapDataなどの名前に変更することをオススメいたします。
|
|
119
|
+
BoardやFieldかMapDataなどの名前に変更することをオススメいたします。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
解決してよかったです。
|
|
123
|
+
最初は誰でもそーいうものなのです。
|
|
124
|
+
あんまりデバックしていないですが、コードを置いておきます
|
|
125
|
+
ご参考まで。
|
|
126
|
+
```Python
|
|
127
|
+
from itertools import product
|
|
128
|
+
DIRECTIONS = {LEFT: (0, -1), DOWN: (1, 0), RIGHT: (0, +1), UP: (-1, 0)}
|
|
129
|
+
# ↑Game_Titleの前に宣言
|
|
130
|
+
def generate_map(self): # マップ生成
|
|
131
|
+
from pprint import PrettyPrinter
|
|
132
|
+
pp = PrettyPrinter()
|
|
133
|
+
pp.pprint(Map.map)
|
|
134
|
+
# まず棒倒し法で迷路生成
|
|
135
|
+
START_ROW = 2
|
|
136
|
+
for i, j in product(range(START_ROW, self.row - 2, 2), range(2, self.col - 2, 2)):
|
|
137
|
+
data = [LEFT, DOWN, RIGHT]
|
|
138
|
+
# 最初の行は上にも倒せる。
|
|
139
|
+
if i == START_ROW:
|
|
140
|
+
data.append(UP)
|
|
141
|
+
random.shuffle(data)
|
|
142
|
+
while len(data) > 0:
|
|
143
|
+
direction = data.pop(0)
|
|
144
|
+
px, py = [x + y for (x, y) in zip([i, j], DIRECTIONS[direction])]
|
|
145
|
+
if self.map[px][py] == 0:
|
|
146
|
+
self.map[px][py] = 1
|
|
147
|
+
break
|
|
148
|
+
|
|
149
|
+
```
|
9
QED
answer
CHANGED
|
@@ -83,15 +83,11 @@
|
|
|
83
83
|
原因:無限ループによってキーボードの入力を受付なかった。
|
|
84
84
|
発生条件:map.generate_map関数のwall_flagがFalseにならない。
|
|
85
85
|
|
|
86
|
-
で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・
|
|
87
|
-
|
|
88
86
|
---
|
|
89
87
|
|
|
90
88
|
`generate_map`関数の
|
|
91
|
-
|
|
92
89
|
1,`direction = random.randint(0, 100) % 4`の方の
|
|
93
90
|
`if direction == UP:`で`wall_flag = False`の設定がないです。
|
|
94
|
-
|
|
95
91
|
2,`direction = random.randint(0, 100) % 3`で生成される値は0~2ですが、
|
|
96
92
|
`LEFT, DOWN, RIGHT, UP = 3, 2, 1, 0`で定義されているので。
|
|
97
93
|
`IF`文で判定しているのは`RIGHT:1`,`DOWN:2`,`LEFT:3`です。
|
|
@@ -100,4 +96,24 @@
|
|
|
100
96
|
そもそも論としてこの`while wall_flag`は不要なのでは?
|
|
101
97
|
[迷路生成(棒倒し法)](http://algoful.com/Archive/Algorithm/MazeBar)でググって出てきたページを見る限りでもiとjだけで実装できると思いますが。
|
|
102
98
|
|
|
99
|
+
---
|
|
100
|
+
|
|
103
|
-
|
|
101
|
+
原因:`map`、`orb_map`、`orb_map`_`check`、`row` 、`col`の変数がクラス変数で宣言されていたため。
|
|
102
|
+
MAP情報が2回目以降初期化されていなかった。以下のコードで前回のMAPデータが表示されるのが分かると思います。
|
|
103
|
+
```Python
|
|
104
|
+
def generate_map(self):
|
|
105
|
+
from pprint import PrettyPrinter
|
|
106
|
+
pp = PrettyPrinter()
|
|
107
|
+
pp.pprint(Map.map)
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
そのため2回目以降の`generate_map`関数が条件によって無限ループになった。
|
|
111
|
+
◇条件
|
|
112
|
+
行が4以上で2の倍数かつ2の倍数列で周りの4マスが全部オーブを取得した(Map情報を1にした)。
|
|
113
|
+
この時、`wall_flag`が`False`にならず無限ループとなる。
|
|
114
|
+
◇対策方法
|
|
115
|
+
インスタンス変数にしてくださいな。あと以下の行も忘れずに
|
|
116
|
+
self.row = len(self.map)
|
|
117
|
+
self.col = len(self.map[0])
|
|
118
|
+
最後に変数名mapとクラス名Mapは標準の命名とかぶるため、list/mapなどは避けて
|
|
119
|
+
BoardやFieldかMapDataなどの名前に変更することをオススメいたします。
|
8
追記
answer
CHANGED
|
@@ -83,4 +83,21 @@
|
|
|
83
83
|
原因:無限ループによってキーボードの入力を受付なかった。
|
|
84
84
|
発生条件:map.generate_map関数のwall_flagがFalseにならない。
|
|
85
85
|
|
|
86
|
-
で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・
|
|
86
|
+
で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
`generate_map`関数の
|
|
91
|
+
|
|
92
|
+
1,`direction = random.randint(0, 100) % 4`の方の
|
|
93
|
+
`if direction == UP:`で`wall_flag = False`の設定がないです。
|
|
94
|
+
|
|
95
|
+
2,`direction = random.randint(0, 100) % 3`で生成される値は0~2ですが、
|
|
96
|
+
`LEFT, DOWN, RIGHT, UP = 3, 2, 1, 0`で定義されているので。
|
|
97
|
+
`IF`文で判定しているのは`RIGHT:1`,`DOWN:2`,`LEFT:3`です。
|
|
98
|
+
生成している乱数源が正しくないかと。
|
|
99
|
+
|
|
100
|
+
そもそも論としてこの`while wall_flag`は不要なのでは?
|
|
101
|
+
[迷路生成(棒倒し法)](http://algoful.com/Archive/Algorithm/MazeBar)でググって出てきたページを見る限りでもiとjだけで実装できると思いますが。
|
|
102
|
+
|
|
103
|
+
3,**Mapの変数:map,orb_map,orb_map_checkがクラス変数になっています。**
|
7
追記
answer
CHANGED
|
@@ -66,10 +66,21 @@
|
|
|
66
66
|
次に`continue`文を使う事で、ネストを一段へらします。
|
|
67
67
|
```Python
|
|
68
68
|
for i, j in product(range(self.row), range(self.col)):
|
|
69
|
+
print(i, j) # printでiとjの値を表示する。(デバック用)
|
|
69
70
|
wall_flag = True
|
|
70
71
|
if i == 0 or i == self.row - 1 or j == 0 or j == self.col - 1 or self.map[i][j] == 0:
|
|
71
72
|
continue
|
|
72
73
|
if i == 2 and j % 2 == 0 and self.map[i][j] == 1:
|
|
73
74
|
while (wall_flag):
|
|
74
75
|
direction = random.randint(0, 100) % 4
|
|
75
|
-
```
|
|
76
|
+
```
|
|
77
|
+
でこれで実行してみると
|
|
78
|
+
`4 12`の出力で止まるので、5行目13列で問題が発生して無限ループになったことが分かります。
|
|
79
|
+
止まる出力メッセージは質問者様の環境で違うはずです。
|
|
80
|
+
ポイントは`print`の出力が`MAP`の最後の行と列まで出力されていないので、**無限ループになっているという事が確定したことです。**
|
|
81
|
+
|
|
82
|
+
< まとめ >
|
|
83
|
+
原因:無限ループによってキーボードの入力を受付なかった。
|
|
84
|
+
発生条件:map.generate_map関数のwall_flagがFalseにならない。
|
|
85
|
+
|
|
86
|
+
で、質問者様にお願いしたいのはこのコードはどういう目的でどのような処理を行っているのか記述して頂きたいのですが・・・・
|
6
追記
answer
CHANGED
|
@@ -54,4 +54,22 @@
|
|
|
54
54
|
|
|
55
55
|
`map.generate_map()` の次行に`print('generate_map')`を追加して確認してみましたが、
|
|
56
56
|
表示されないことから`map.generate_map()`の処理で無限ループになってますね。
|
|
57
|
-
キーボードが反応しない原因はこれですね。
|
|
57
|
+
キーボードが反応しない原因はこれですね。
|
|
58
|
+
まず2重ループはやめて、`itertools#product`を使ったループにしてください。
|
|
59
|
+
|
|
60
|
+
```Python
|
|
61
|
+
from itertools import product
|
|
62
|
+
for i, j in product(range(self.row), range(self.col)):
|
|
63
|
+
```
|
|
64
|
+
こうすることでループのネストが1段減ります。
|
|
65
|
+
|
|
66
|
+
次に`continue`文を使う事で、ネストを一段へらします。
|
|
67
|
+
```Python
|
|
68
|
+
for i, j in product(range(self.row), range(self.col)):
|
|
69
|
+
wall_flag = True
|
|
70
|
+
if i == 0 or i == self.row - 1 or j == 0 or j == self.col - 1 or self.map[i][j] == 0:
|
|
71
|
+
continue
|
|
72
|
+
if i == 2 and j % 2 == 0 and self.map[i][j] == 1:
|
|
73
|
+
while (wall_flag):
|
|
74
|
+
direction = random.randint(0, 100) % 4
|
|
75
|
+
```
|
5
追記
answer
CHANGED
|
@@ -49,6 +49,9 @@
|
|
|
49
49
|
map.generate_map() # ランダムマップ生成
|
|
50
50
|
map.generate_orb_map() # 生成したマップをもとにオーブを配置
|
|
51
51
|
が呼ばれるのでは?
|
|
52
|
+
|
|
52
53
|
---
|
|
54
|
+
|
|
53
|
-
map.generate_map() の
|
|
55
|
+
`map.generate_map()` の次行に`print('generate_map')`を追加して確認してみましたが、
|
|
54
|
-
表示されないことからmap.generate_map()の処理で無限ループになってますね。
|
|
56
|
+
表示されないことから`map.generate_map()`の処理で無限ループになってますね。
|
|
57
|
+
キーボードが反応しない原因はこれですね。
|
4
追記
answer
CHANGED
|
@@ -48,4 +48,7 @@
|
|
|
48
48
|
title関数 -> main関数 -> (2回目のプレイ)title関数 -> main関数この時
|
|
49
49
|
map.generate_map() # ランダムマップ生成
|
|
50
50
|
map.generate_orb_map() # 生成したマップをもとにオーブを配置
|
|
51
|
-
が呼ばれるのでは?
|
|
51
|
+
が呼ばれるのでは?
|
|
52
|
+
---
|
|
53
|
+
map.generate_map() の後の行にprint('generate_map')を追加して確認してみましたが、
|
|
54
|
+
表示されないことからmap.generate_map()の処理で無限ループになってますね。
|
3
追記
answer
CHANGED
|
@@ -45,9 +45,7 @@
|
|
|
45
45
|
画像で見ていただいた方が分かりやすいと思うので、これだとPlayer2が動けないMAPを生成してます。
|
|
46
46
|

|
|
47
47
|
|
|
48
|
-
main関数 -> title関数 -> main関数この時
|
|
48
|
+
title関数 -> main関数 -> (2回目のプレイ)title関数 -> main関数この時
|
|
49
49
|
map.generate_map() # ランダムマップ生成
|
|
50
50
|
map.generate_orb_map() # 生成したマップをもとにオーブを配置
|
|
51
|
-
が呼ばれるのでは?
|
|
51
|
+
が呼ばれるのでは?
|
|
52
|
-
|
|
53
|
-
まず、Sceneという概念をint型かenum型で導入して、main処理内のwhileループでどの画面かの判断をしたほうがこの2重初期化を防げます。
|
2
追記
answer
CHANGED
|
@@ -40,4 +40,14 @@
|
|
|
40
40
|
作成されたゲームで、無限ループになりそうな箇所のは`Map`クラスの`generate_map`の
|
|
41
41
|
`while (wall_flag)`の判定と`while(plus_land_yet)`の判定です。
|
|
42
42
|
1,whileが確実に抜ける事を確認してくださいな。
|
|
43
|
-
2,オーブを全部取得したら、次のMAP生成のために`generate_map`が呼ばれますが、プレイヤーがいる位置を生成時に考慮していないように見受けられます。
|
|
43
|
+
2,オーブを全部取得したら、次のMAP生成のために`generate_map`が呼ばれますが、プレイヤーがいる位置を生成時に考慮していないように見受けられます。
|
|
44
|
+
|
|
45
|
+
画像で見ていただいた方が分かりやすいと思うので、これだとPlayer2が動けないMAPを生成してます。
|
|
46
|
+

|
|
47
|
+
|
|
48
|
+
main関数 -> title関数 -> main関数この時
|
|
49
|
+
map.generate_map() # ランダムマップ生成
|
|
50
|
+
map.generate_orb_map() # 生成したマップをもとにオーブを配置
|
|
51
|
+
が呼ばれるのでは?
|
|
52
|
+
|
|
53
|
+
まず、Sceneという概念をint型かenum型で導入して、main処理内のwhileループでどの画面かの判断をしたほうがこの2重初期化を防げます。
|
1
追記
answer
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
b,2重ループの処理は[itertools.product](https://docs.python.jp/3/library/itertools.html#itertools.product)が使えます。
|
|
27
27
|
c,コード内に移動方向に対応する加減算処理が多いので、移動方向(ベクトル)を表すdirectionsを作成してみてはー。
|
|
28
28
|
```Python
|
|
29
|
-
directions = {LEFT: (0, -1), DOWN: (
|
|
29
|
+
directions = {LEFT: (0, -1), DOWN: (1, 0), RIGHT: (0, +1), UP: (-1, 0)}
|
|
30
30
|
print(directions)
|
|
31
31
|
|
|
32
32
|
```
|