質問: 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)
回答: 回答ではないですが、 > > 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; } > > > if文でreturnしてしまうのなら、以降のelseは削除できますね if (max == right && map[p.y][p.x + 1] == 1 && !(e.y == p.y && e.x == p.x + 1)) { return RIGHT; } if (max == down && map[p.y + 1][p.x] == 1 && !(e.y == p.y + 1 && e.x == p.x)) { return DOWN; } ~~~ return STAY;