![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
パックマンプログラムを作っているんですが以下のように壁にぶつかってゲームオーバーになります。すべてのエサを食べさせたいんですがどのように以下のプログラムを改良すればいいですか?
map(MAPDATA型):マップの情報(通路・エさ・壁の位置)
p(POSITION型):プレイヤーの位置情報
e(POSITION型):モンスターの位置情報
0:通路
1:エサ
2:壁
プレイヤーのx座標:p.x,モンスターのy座標:e.y
MAP_WIDTH:マップの横幅 (19)
MAP_HEIGHT:マップの縦幅 (22)
NUM_FOOD:エサの最大数 (156)
#include <stdio.h>
#include "Info.h"
#include "math.h"
MOVEMENT playerAI(MAPDATA map, POSITION p, POSITION e)
{
if (abs(p.x - e.x) + abs(p.y - e.y) <= 2) { return UP; };
if (map[p.y][p.x + 1] == 1) { return RIGHT; }
else if (map[p.y + 1][p.x] == 1) { return DOWN; }
else if (map[p.y][p.x - 1] == 1) { return LEFT; }
else if (map[p.y - 1][p.x] == 1) { return UP; }
else { return STAY; }
Game.cpp
http://codepad.org/C2opgSUX
Red AI.cpp
http://codepad.org/zlwvnPTX
![「パックマンプログラム」の質問画像](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/b/509919597_5497d529baab1/M.jpg)
No.3ベストアンサー
- 回答日時:
あなたは
「プログラムを作りたい」のですか?
「プログラムを作ってもらいたい」のですか?
「作ってもらいたい」のなら、ここではなく、依頼サイトへ行った方がいいです。
自分で作りたいのなら、もうちょっと自分でいろいろとやってみましょう。
書いてある通りに入力するだけでは、プログラミングは上達しません。
f (map[p.y][p.x + 1] == 1) { return RIGHT; }
else if (map[p.y + 1][p.x] == 1) { return DOWN; }
else if (map[p.y][p.x - 1] == 1) { return LEFT; }
else if (map[p.y - 1][p.x] == 1) { return UP; }
else { return STAY; }
これが、どんな意味だか理解できていますか?
できていないなら、まずは、理解できるまで基本を勉強してください。
これを日本語訳すれば
右に餌があったら 右に行く
そうではなく、 下に餌があったら 下に行く
そうではなく、 左に餌があったら 左に行く
そうではなく、 上に餌があったら 上に行く
そうでなかったら 留まる
です。
これをちょっと変えて
右に壁がなかったら 右に行く
そうではなく、 下に壁がなかったら 下に行く
そうではなく、 左に壁がなかったら 左に行く
そうではなく、 上に壁がなかったら 上に行く
そうでなかったら 留まる
とすれば、とりあえずは壁を避けることができます。
元のプログラムがどうして「○○に餌があったら」になっているかをよく考えれば、
「壁でなかったら」とはどう書けるか、わかるはずです。
No.2
- 回答日時:
> 壁で進めなくなるので敵を避けつつエサを食べれるように左、右に曲がるようにとか、プログラム打ちたいです
では、そのようにプログラムを打ってください。
プログラムがわからないなら、まずは、日本語で書いてみてください。
> 壁で進めなくなる
というのは、
「壁があるのに、そちらへ進もうとする」
から進めなんですよね?
それなら
(1)[進む方向]を決める
(2) [進む方向]が壁ではないなら、[進む方向]へ進む
そうで無いなら、[進む方向]を別の方法で決める
みたいな処理をすればいいのです。
> 敵を避けつつ
とありますが、今は「敵が来たら上」です。
if (abs(p.x - e.x) + abs(p.y - e.y) <= 2) { /* 敵との距離が近い場合 */
return UP; /* とにかく上 */
};
ならば、
if (abs(p.x - e.x) + abs(p.y - e.y) <= 2) { /* 敵との距離が近い場合 */
逃げられる方向を探してそっちへ
};
とすれば、とりあえずは壁で進めなくなることがなくなるはずです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
XnViewにwebpを「いつも開く」...
-
読み込み中にアクセス違反が発...
-
VBAでユーザーフォームが自動的...
-
VC++でプログラムの多言語化を...
-
少ない順 昇順 降順
-
エクセルとワードをデスクトッ...
-
PICマイコンのコピー(クローン...
-
基本的なC言語のプログラム
-
VBAにてメール作成した際、一部...
-
1. 仮想CPU「exmini」を使用し...
-
C#での台形の面積を求めるプロ...
-
閉じるを押してもデバッグが終...
-
Excelに埋め込んだVBAのプログ...
-
NC旋盤の原点設定
-
テキストファイルを間違えて保...
-
VB.netで自作プログラムがウイ...
-
エクセルVBA 検索時に除外を設...
-
TK-85においてプログラム作成に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで4096点以上のFFTの方法
-
あるプログラムのコマンドライ...
-
VBAにてメール作成した際、一部...
-
PICマイコンのコピー(クローン...
-
長距離・マラソンをやりながら...
-
Excelに埋め込んだVBAのプログ...
-
「Outlookが他のプログラムによ...
-
自動クエリとはどういうもので...
-
未使用の変数を一括検索する方法
-
読み込み中にアクセス違反が発...
-
VBAでユーザーフォームが自動的...
-
エクセルとワードをデスクトッ...
-
モジュール、アプリケーション...
-
テキストボックスのエンターキ...
-
画像を読み込むのと取り込むの...
-
Vba 実数および実数タイプの変...
-
インクリメント演算子のみを用...
-
main関数を先頭に置くデメリット
-
C言語でのaccess violationに...
-
Application.ScreenUpdatingが...
おすすめ情報