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

回答編集履歴

10

追記

2018/05/05 17:55

投稿

umyu
umyu

スコア5846

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

2018/05/05 17:55

投稿

umyu
umyu

スコア5846

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
- 3,**Mapの変数:map,orb_map,orb_map_checkがクラス変数になっています**
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

追記

2018/05/05 16:36

投稿

umyu
umyu

スコア5846

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

追記

2018/05/05 15:26

投稿

umyu
umyu

スコア5846

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

追記

2018/05/05 14:23

投稿

umyu
umyu

スコア5846

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

追記

2018/05/05 14:13

投稿

umyu
umyu

スコア5846

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() の後の行にprint('generate_map')を追加して確認してみましたが、
55
+ `map.generate_map()`行に`print('generate_map')`を追加して確認してみましたが、
54
- 表示されないことからmap.generate_map()の処理で無限ループになってますね。
56
+ 表示されないことから`map.generate_map()`の処理で無限ループになってますね。
57
+ キーボードが反応しない原因はこれですね。

4

追記

2018/05/05 13:55

投稿

umyu
umyu

スコア5846

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

追記

2018/05/05 13:54

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -45,9 +45,7 @@
45
45
  画像で見ていただいた方が分かりやすいと思うので、これだとPlayer2が動けないMAPを生成してます。
46
46
  ![イメージ説明](4dae39991843659a0f48820533932d59.jpeg)
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

追記

2018/05/05 12:49

投稿

umyu
umyu

スコア5846

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
+ ![イメージ説明](4dae39991843659a0f48820533932d59.jpeg)
47
+
48
+ main関数 -> title関数 -> main関数この時
49
+ map.generate_map() # ランダムマップ生成
50
+ map.generate_orb_map() # 生成したマップをもとにオーブを配置
51
+ が呼ばれるのでは?
52
+
53
+ まず、Sceneという概念をint型かenum型で導入して、main処理内のwhileループでどの画面かの判断をしたほうがこの2重初期化を防げます。

1

追記

2018/05/05 12:22

投稿

umyu
umyu

スコア5846

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: (-1, 0), RIGHT: (0, +1), UP: (-1, 0)}
29
+ directions = {LEFT: (0, -1), DOWN: (1, 0), RIGHT: (0, +1), UP: (-1, 0)}
30
30
  print(directions)
31
31
 
32
32
  ```