- ベストアンサー
パックマンプログラムの改良方法
- パックマンプログラムの壁にぶつかってゲームオーバーになる問題を解決する改良方法を教えてください。
- プレイヤーとモンスターの距離が2以下の場合は上に移動するようにする。
- プレイヤーの周囲のエサをチェックし、右、下、左の順でエサがあれば移動するようにする。エサがない場合は上に移動する。
- みんなの回答 (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; } これが、どんな意味だか理解できていますか? できていないなら、まずは、理解できるまで基本を勉強してください。 これを日本語訳すれば 右に餌があったら 右に行く そうではなく、 下に餌があったら 下に行く そうではなく、 左に餌があったら 左に行く そうではなく、 上に餌があったら 上に行く そうでなかったら 留まる です。 これをちょっと変えて 右に壁がなかったら 右に行く そうではなく、 下に壁がなかったら 下に行く そうではなく、 左に壁がなかったら 左に行く そうではなく、 上に壁がなかったら 上に行く そうでなかったら 留まる とすれば、とりあえずは壁を避けることができます。 元のプログラムがどうして「○○に餌があったら」になっているかをよく考えれば、 「壁でなかったら」とはどう書けるか、わかるはずです。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
> 壁で進めなくなるので敵を避けつつエサを食べれるように左、右に曲がるようにとか、プログラム打ちたいです では、そのようにプログラムを打ってください。 プログラムがわからないなら、まずは、日本語で書いてみてください。 > 壁で進めなくなる というのは、 「壁があるのに、そちらへ進もうとする」 から進めなんですよね? それなら (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) { /* 敵との距離が近い場合 */ 逃げられる方向を探してそっちへ }; とすれば、とりあえずは壁で進めなくなることがなくなるはずです。
補足
>逃げられる方向を探してそっちへ とはどのようにして打てばいいですか??
- kmee
- ベストアンサー率55% (1857/3366)
○このプログラムで、どんな思考パターンで動作させようとしているのですか? 説明してください。 ざっと眺めた感じ ・敵が近くにいたら、とにかく上へ逃げようとする(上が壁でも!) → 壁で進めない → そのまま「上へ逃げようとして進めない」を繰り返し、 1000ターン終了 となっているように見えます。
補足
壁で進めなくなるので敵を避けつつエサを食べれるように左、右に曲がるようにとか、プログラム打ちたいです
補足
何回も申し訳ないです。 壁がなかったらとは否定の!を使うんでしょうか?