質問編集履歴
4
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
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
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
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)
|