質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

907閲覧

追尾エネミーの作成方法

sanosyouya

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/07/03 05:50

``C言語`ここに言語を入力
コード
enemi.cpp

for (int i = 0; i < ENEMY_MAX; i++)
{
// 動く前の座標を保存しておく(移動してぶつかった時はこの座標へ戻す為)
g_enemy[i].old_x = g_enemy[i].x;
g_enemy[i].old_y = g_enemy[i].y;

int dir = rand() % 8; switch (dir) { case 0:// ← g_enemy[i].x--; break; case 1:// → g_enemy[i].x++; break; case 2:// ↑ g_enemy[i].y--; break; case 3:// ↓ g_enemy[i].y++; break; default: break; }

プレイヤー.cpp
// 動く前の座標を保存しておく(移動してぶつかった時はこの座標へ戻す為)
g_Player.old_x = g_Player.x;
g_Player.old_y = g_Player.y;

// キー入力処理 int key = _getch(); if ((key == 0) || (key == 224)) // 特殊Keyならもう1度取得する { key = _getch(); } // 押されたkeyの方向へ移動させる switch (key) { case 'a': case 0x4b: // ← g_Player.x--; break; case 'd': case 0x4d: // → g_Player.x++; break; case 'w': case 0x48: // ↑ g_Player.y--; break; case 's': case 0x50: // ↓ g_Player.y++; break; default: break; }

今こんな感じで、フィールド上でプレイヤーが一歩動くと、エネミーも自動でランダムに一歩動くようにしているのですが、これをsin,cosの関数を使ってプレイヤーに近ずいてくるようにしたいですけどわかりませんわかる方がいたら、教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/07/03 08:05

近づく、とはプログラム上ではどうなることかはわかっていますか? なぜ「sin,cosの関数を使おう」と思ったのですか? 読みにくいので、マークダウンがちゃんと働くようにソースコードの部分全体を ``` C ソースコード部分 ``` となるように独立した行の「``` C」~「```」で囲ってください。 日本語では、「近ずく」->「近づく」です。
jimbe

2022/07/03 08:36

拡張子 cpp は c++ かと思うのですが、言語は c なのでしょうか。
sanosyouya

2022/07/03 13:26

すみません、近づくというより、プレイヤーを追尾するって意味です
thkana

2022/07/03 14:45 編集

> プレイヤーを追尾する 例えば、プレイヤーがX=5,y=5にいたとして、敵がx=10,y=5にいたとしたら、どうなったら「近づく」ことになるんですか? プレイヤーがX=5,y=5にいたとして、敵がx=1,y=5にいたとしたら、 プレイヤーがX=5,y=5にいたとして、敵がx=5,y=10にいたとしたら、 プレイヤーがX=5,y=5にいたとして、敵がx=5,y=1にいたとしたら、 プレイヤーがX=5,y=5にいたとして、敵がx=1,y=1にいたとしたら、 プレイヤーがX=5,y=5にいたとして、敵がx=1,y=3にいたとしたら、 一歩近づくってどうなることですか?
sanosyouya

2022/07/04 01:41

プレイヤーを追いかけてくるといえばわかりやすいでしょうか
fana

2022/07/04 04:32

いや,だから 「追尾」とか「追いかけてくる」って何だよ? っていう. 何かしら「プレイヤー」が辿った軌跡をトレースするような動きが必要だと言っているのか,それとも単に毎度「近くなる」方向に移動すればよいだけなのか,その他なのか? ものっすごく簡単な話をすれば,移動可能な方向の候補(4方向か?)全てに関して何かしらの評価を行い,あなたが最も「挙動としてよい」と考えるやつを選べばよい.
sanosyouya

2022/07/04 04:34

毎度ちかずいてくる方向に移動って感じで移動方向は四方向です
fana

2022/07/04 04:43 編集

そしたら,4方向に関して,そっちに移動したら「近づく」ことになるのかどうかを判断すればいいよね. 近い/遠い という話が距離に関するのか道のりに関するのか知らんけど,判断はできるよね? で,それに基づいて全4方向の中から移動先候補を絞り込んだら,その中で(最も「近づく」方向から順に実際に動ける方向なのかどうかを調べて)動けるやつを選べばいい.
fana

2022/07/04 07:21

…っていうのを回答として書いておいた. (移動可否の側を先に判定する形になっているが話の意味は同じ)
guest

回答1

0

g_Playerg_enemy の型が不明なので,ここでは仮に POS という struct なのだとしよう.
typedef struct POS{ int x; int y; } POS; みたいな.

で,2つの座標の間の「距離」を評価する関数があるとする.
int EvaluateDistanceBetween( POS p1, POS p2 ){ return 何か; }

以上を用いた敵の簡素な移動処理の疑似コードを示す.

C

1// 2//敵の移動(g_enemy[i]の更新) 3// 4 5const int dx[4] = { -1, 1, 0, 0 }; 6const int dy[4] = { 0, 0,-1, 1 }; 7 8//現在の(移動前の)距離評価値 9int CurrDistance = EvaluateDistanceBeteween( g_enemy[i], g_Player ); 10 11//4方向の移動先に関する距離評価を行い,移動先を決定する 12POS BestDestination = { 0,0 }; //移動先 13int BestDistance = CurrDistance; 14for( int dir=0; dir<4; ++dir ) 15{ 16 //dir 方向の移動先座標 17 POS Destination = { g_enemy[i].x + dx[dir], g_enemy[i].y + dy[i] }; 18 19 //距離の評価. 20 //ただし障害物か何かで移動できない場所に関しては無視. 21 if( Destination は移動できない場所である ) 22 { continue; } 23 24 int Distance = EvaluateDistanceBeteen( Destination, g_Player ); 25 if( Distance < BestDistance ) //※値が小さい方が「近い」 26 { 27 BestDistance = Distance; 28 BestDestination = Destination; 29 } 30} 31 32//移動する 33g_enemy[i] = BestDestination;

投稿2022/07/04 07:13

fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/07/04 07:19

「複数の方向が同じ距離評価値になる場合にはその中から適当にランダムに決めたい」とかいう場合には, 距離評価結果をてきとーに int Distance = EvaluateDistanceBeteen( Destination, g_Player ) * 10 + (1桁の乱数); とか何とか加工すればよいか. (その場合にはもちろん BestDistance の初期値側も相応に加工する)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問