敵に食べられる前に餌を食べ尽くすために自機を動かすプログラムを作っています。
プレイヤーのソースコード #include <stdio.h> #include <stdlib.h> #include "Info.h" MOVEMENT playerAI(MAPDATA map, POSITION p, POSITION e, int turn) { int len = abs(e.x - p.x) + abs(e.y - p.y); int right, down, left, up, max; right = abs(e.x - p.x + 1) + abs(e.y - p.y); down = abs(e.x - p.x) + abs(e.y + 1 - p.y); left = abs(e.x - p.x - 1) + abs(e.y - p.y); up = abs(e.x - p.x) + abs(e.y - p.y - 1); max = right; if (down > max) max = down; if (left > max) max = left; if (up > max) max = up; if (max == right && map[p.y][p.x + 1] == 1 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; } else if (max == down && map[p.y + 1][p.x] == 1 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; } else if (max == left && map[p.y][p.x - 1] == 1 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; } else if (max == up && map[p.y - 1][p.x] == 1 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; } else if (max == right && map[p.y][p.x + 1] == 0 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; } else if (max == down && map[p.y + 1][p.x] == 0 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; } else if (max == left && map[p.y][p.x - 1] == 0 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; } else if (max == up && map[p.y - 1][p.x] == 0 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; } else if (map[p.y][p.x + 1] == 1 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; } else if (map[p.y + 1][p.x] == 1 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; } else if (map[p.y][p.x - 1] == 1 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; } else if (map[p.y - 1][p.x] == 1 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; } else if (map[p.y][p.x + 1] == 0 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; } else if (map[p.y + 1][p.x] == 0 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; } else if (map[p.y][p.x - 1] == 0 && !(e.y == p.y && e.x == p.x - 1)) { return LEFT; } else if (map[p.y - 1][p.x] == 0 && !(e.y == p.y - 1 && e.x == p.x)) { return UP; } else { return STAY; } }
マンハッタン距離の最大値を求めて最大値の方向に進むプログラムを組んでいるのですが、同じ場所をぐるぐる逃げ回りループしてしまいます。
ループを改善するにはどのようにすれば良いかアドバイスいただきたいです。
モンスターはプレイヤーに向かって最短距離で移動しようとします。
いずれかの条件を満たすまでゲームが継続します。
・プレイヤーがエサをすべて食べる
・プレイヤーがモンスターに接触する
・1000ターン経過する
・返り値としてMOVEMENT型の値を返します。
・引数として以下の変数が与えられる。
map(MAPDATA型):マップの情報(通路・エさ・壁の位置)
p(POSITION型):プレイヤーの位置情報
e(POSITION型):モンスターの位置情報
turn(int型):現在のターン数(最初は0)
ランダムを使う場合はrand関数のみ使用し,srand関数は使わないでください。
*MOVEMENT型
プレイヤーやモンスターの移動方向を示す型。
STAY,UP,LEFT,RIGHT,DOWNの5種類の値がある。
*MAPDATA型
マップ上の通路・エサ・壁の位置の情報を示す型です。
0~255の値を持つ,22×19の二次元配列として扱うことができます。
0:通路
1:エサ
2:壁
*POSITION型
プレイヤーやモンスターの位置情報を示す型。
x座標とy座標を取り出すことが出来る。
(例)プレイヤーのx座標:p.x,モンスターのy座標:e.y
また,以下の値が定義されています。
MAP_WIDTH:マップの横幅 (19)
MAP_HEIGHT:マップの縦幅 (22)
回答4件
あなたの回答
tips
プレビュー