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

質問編集履歴

4

2019/05/20 05:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -15,8 +15,8 @@
15
15
  down = abs(e.x - p.x) + abs(e.y + 1 - p.y);
16
16
  left = abs(e.x - p.x - 1) + abs(e.y - p.y);
17
17
  up = abs(e.x - p.x) + abs(e.y - p.y - 1);
18
+
18
19
  max = right;
19
-
20
20
  if (down > max) max = down;
21
21
  if (left > max) max = left;
22
22
  if (up > max) max = up;

3

2019/05/20 05:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -10,22 +10,25 @@
10
10
  {
11
11
  int len = abs(e.x - p.x) + abs(e.y - p.y);
12
12
  int right, down, left, up, max;
13
+
13
14
  right = abs(e.x - p.x + 1) + abs(e.y - p.y);
14
15
  down = abs(e.x - p.x) + abs(e.y + 1 - p.y);
15
16
  left = abs(e.x - p.x - 1) + abs(e.y - p.y);
16
17
  up = abs(e.x - p.x) + abs(e.y - p.y - 1);
17
18
  max = right;
19
+
18
20
  if (down > max) max = down;
19
21
  if (left > max) max = left;
20
22
  if (up > max) max = up;
23
+
21
- if (max = right && map[p.y][p.x + 1] == 1 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; }
24
+ if (max == right && map[p.y][p.x + 1] == 1 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; }
22
- else if (max = down && map[p.y + 1][p.x] == 1 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; }
25
+ else if (max == down && map[p.y + 1][p.x] == 1 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; }
23
- else if (max = left && map[p.y][p.x - 1] == 1 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; }
26
+ else if (max == left && map[p.y][p.x - 1] == 1 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; }
24
- else if (max = up && map[p.y - 1][p.x] == 1 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; }
27
+ else if (max == up && map[p.y - 1][p.x] == 1 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; }
25
- else if (max = right && map[p.y][p.x + 1] == 0 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; }
28
+ else if (max == right && map[p.y][p.x + 1] == 0 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; }
26
- else if (max = down && map[p.y + 1][p.x] == 0 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; }
29
+ else if (max == down && map[p.y + 1][p.x] == 0 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; }
27
- else if (max = left && map[p.y][p.x - 1] == 0 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; }
30
+ else if (max == left && map[p.y][p.x - 1] == 0 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; }
28
- else if (max = up && map[p.y - 1][p.x] == 0 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; }
31
+ else if (max == up && map[p.y - 1][p.x] == 0 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; }
29
32
  else if (map[p.y][p.x + 1] == 1 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; }
30
33
  else if (map[p.y + 1][p.x] == 1 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; }
31
34
  else if (map[p.y][p.x - 1] == 1 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; }

2

2019/05/20 05:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  敵に食べられる前に餌を食べ尽くすために自機を動かすプログラムを作っています。
2
2
 
3
+ ```
3
4
  プレイヤーのソースコード
4
5
  #include <stdio.h>
5
6
  #include <stdlib.h>
@@ -35,6 +36,7 @@
35
36
  else if (map[p.y - 1][p.x] == 0 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; }
36
37
  else { return STAY; }
37
38
  }
39
+ ```
38
40
 
39
41
  マンハッタン距離の最大値を求めて最大値の方向に進むプログラムを組んでいるのですが、同じ場所をぐるぐる逃げ回りループしてしまいます。
40
42
  ループを改善するにはどのようにすれば良いかアドバイスいただきたいです。
@@ -46,7 +48,7 @@
46
48
  ・1000ターン経過する
47
49
 
48
50
   ・返り値としてMOVEMENT型の値を返します。
49
-  ・引数として以下の変数が与えられます
51
+  ・引数として以下の変数が与えられ
50
52
     map(MAPDATA型):マップの情報(通路・エさ・壁の位置)
51
53
     p(POSITION型):プレイヤーの位置情報
52
54
     e(POSITION型):モンスターの位置情報
@@ -54,8 +56,8 @@
54
56
  ランダムを使う場合はrand関数のみ使用し,srand関数は使わないでください。
55
57
 
56
58
  *MOVEMENT型
57
-  プレイヤーやモンスターの移動方向を示す型です
59
+  プレイヤーやモンスターの移動方向を示す型。
58
-  STAY,UP,LEFT,RIGHT,DOWNの5種類の値があります
60
+  STAY,UP,LEFT,RIGHT,DOWNの5種類の値があ
59
61
  *MAPDATA型
60
62
   マップ上の通路・エサ・壁の位置の情報を示す型です。
61
63
   0~255の値を持つ,22×19の二次元配列として扱うことができます。
@@ -63,8 +65,8 @@
63
65
    1:エサ
64
66
    2:壁
65
67
  *POSITION型
66
-  プレイヤーやモンスターの位置情報を示す型です
68
+  プレイヤーやモンスターの位置情報を示す型。
67
-  x座標とy座標を取り出すことが出来ます
69
+  x座標とy座標を取り出すことが出来
68
70
    (例)プレイヤーのx座標:p.x,モンスターのy座標:e.y
69
71
  また,以下の値が定義されています。
70
72
   MAP_WIDTH:マップの横幅 (19)

1

2019/05/20 05:26

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -37,4 +37,35 @@
37
37
  }
38
38
 
39
39
  マンハッタン距離の最大値を求めて最大値の方向に進むプログラムを組んでいるのですが、同じ場所をぐるぐる逃げ回りループしてしまいます。
40
- ループを改善するにはどのようにすれば良いかアドバイスいただきたいです。
40
+ ループを改善するにはどのようにすれば良いかアドバイスいただきたいです。
41
+
42
+ モンスターはプレイヤーに向かって最短距離で移動しようとします。
43
+ いずれかの条件を満たすまでゲームが継続します。
44
+ ・プレイヤーがエサをすべて食べる
45
+ ・プレイヤーがモンスターに接触する
46
+ ・1000ターン経過する
47
+
48
+  ・返り値としてMOVEMENT型の値を返します。
49
+  ・引数として以下の変数が与えられます。
50
+    map(MAPDATA型):マップの情報(通路・エさ・壁の位置)
51
+    p(POSITION型):プレイヤーの位置情報
52
+    e(POSITION型):モンスターの位置情報
53
+    turn(int型):現在のターン数(最初は0)
54
+ ランダムを使う場合はrand関数のみ使用し,srand関数は使わないでください。
55
+
56
+ *MOVEMENT型
57
+  プレイヤーやモンスターの移動方向を示す型です。
58
+  STAY,UP,LEFT,RIGHT,DOWNの5種類の値があります。
59
+ *MAPDATA型
60
+  マップ上の通路・エサ・壁の位置の情報を示す型です。
61
+  0~255の値を持つ,22×19の二次元配列として扱うことができます。
62
+   0:通路
63
+   1:エサ
64
+   2:壁
65
+ *POSITION型
66
+  プレイヤーやモンスターの位置情報を示す型です。
67
+  x座標とy座標を取り出すことが出来ます。
68
+   (例)プレイヤーのx座標:p.x,モンスターのy座標:e.y
69
+ また,以下の値が定義されています。
70
+  MAP_WIDTH:マップの横幅 (19)
71
+  MAP_HEIGHT:マップの縦幅 (22)