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

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

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

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

Q&A

解決済

1回答

858閲覧

動く敵に攻撃を与える上でのパターンをコンパクトにかつ正しくしたい。

aqskr

総合スコア5

C

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

0グッド

0クリップ

投稿2023/03/10 16:26

編集2023/03/10 23:14

実現したいこと

画像のように右向きあるいは左方向(1〜11)にAが9マス上を動くBにビームで攻撃する際にCも9マスを動きます。

また、右向きあるいは左方向(12〜19)にAが9マス上を動くCにビームで攻撃する際にBも9マスを動きます。

そのパターンを地道にプログラムしたのですが、思うようにいきません。

よりコンパクトなプログラムに出来ないでしょうか?

編集
ちなみに私の書いたプログラムはAがBに対してビームを撃つときのプログラムなのですが、
BとCが動き回ってる特にBにビームを撃つのですがまったくBにダメージが入りません。
その理由も解説して頂けると助かります。

注意

画像に書いたパターンの①はBに対してのビーム攻撃でありCに攻撃をしていけません。
要は貫通してCに攻撃はしていけないということです。
画像に書いたパターンの⑧はCに対してのビーム攻撃でありBに攻撃をしていけません。
要は貫通してCに攻撃はしていけないということです。

⑧は

以下は画像です。
4枚の画像

前提

C言語とvisual studio2019を使いました。
環境はWindowsです。

発生している問題・エラーメッセージ

エラーメッセージ

ソースが長くなったので以下に張りました。編集いたしました。
https://xgf.nu/cUpg

編集
こちらは自分なりにコンパクトにしたものです。

ですが、まだ敵1と敵2が同じY軸に居る時に攻撃すると敵二人を攻撃してしまうため
else ifで分岐させました。敵二人同時に攻撃することはなくなりましたが、敵二人に同じ同じY座標でX座標で挟まれた時は分岐のせいで敵2に攻撃できないと言った問題が起きています。

if (pos[enemyY1][enemyX1][1] + 15 + playerattackhanndou3 >= pos[playerY][playerX][1] + nanameidouY + nanameidouY2 + nanameidouY3 && pos[enemyY1][enemyX1][1] - 15 + playerattackhanndou3 <= pos[playerY][playerX][1] + nanameidouY + nanameidouY2 + nanameidouY3 ) { tyokusennkougeki = 1; if (tyokusennkougeki == 1) { if (pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B or pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B or pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B or pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B ) { kougekiKANOU = 10; GenemysabunHP = 40; point = 123; } } } if (pos[enemyY2][enemyX2][1] + 15 + playerattackhanndou3B >= pos[playerY][playerX][1] + nanameidouY + nanameidouY2 + nanameidouY3 && pos[enemyY2][enemyX2][1] - 15 + playerattackhanndou3B <= pos[playerY][playerX][1] + nanameidouY + nanameidouY2 + nanameidouY3 ) { tyokusennkougeki = 2; if (tyokusennkougeki == 2) { if (pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B or pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 <= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B or pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 >= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B or pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 <= pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 - 15 && pos[enemyY1][enemyX1][0] + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3 <= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B && pos[playerY][playerX][0] + nanameidouX + migiidou + nanameidouX2 + nanameidouX3 >= pos[enemyY2][enemyX2][0] + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B ) { kougekiKANOU = 10; AGenemysabunHP = 40; point = 123; } } } else { tyokusennkougeki = 0; }

試したこと

ここに問題に対して試したことを記載してください。

<編集>
以下のように作り直したのですが問題が一つだけあります。
敵1と敵2が横に並んでいる場合、手前の敵1にだけビームを当てたいのですが、手前の敵1とその後ろの敵2にもビームが当たってしまいます。else ifを使えばこの問題は解決するのですが、else ifで組むと敵2にビームの攻撃が当たらなくなってしまうので、できればif文のみで作りたいです。
もしelse ifを使わないと難しい場合は載せましたプログラムにelse ifを組み込んでいただいて構いません。
どうか知恵を貸してください。

https://xgf.nu/fwSM

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2023/03/10 18:26 編集

質問内容が要領を得ない上に、ソースのリンクが出来ていないようです。 C++ とか mathematica のタグになんの意味があるのでしょうか。
aqskr

2023/03/10 18:43

すいません、ただいま編集いたしました。 >>C++ とか mathematica うまく伝えられないのですが、数学的なこととC言語に多少C++が関わるためタグに追加させていただきました。
jimbe

2023/03/10 20:21

Mathematica は特定の数学処理システムのタグです。数学的という意味のモノではありません。 タグは、問題がそのタグの示すものの中で発生している等を示すものです。 c++ が分からないとこの問題は解決しないだろうということでしょうか。
aqskr

2023/03/10 21:01 編集

ご親切にありがとうございます。 タグは変えました。 できれば問題を編集いたしましたので知恵を貸していただけるとありがたいです。
episteme

2023/03/10 23:03

> そのパターンを地道にプログラムしたのですが、思うようにいきません。 > よりコンパクトなプログラムに出来ないでしょうか? 意味が分からん。コンパクトに記述したら思うようにいくんですか?
aqskr

2023/03/10 23:10 編集

コンパクトというか、else ifとかで分岐をうまく活用できれば思うように動くと思います。
episteme

2023/03/10 23:17

「弾の射線上に複数の敵がいるときは、最も弾に近い敵"だけ"に当たり判定がある」とすれば後ろの敵には当たらんのでは?
aqskr

2023/03/11 00:53

当たり判定は作っています。 しかし、うまく伝えにくいのですがマス目上に並ぶ事などがありまして...。 何とか自己解決してみます。 ありがとうございます。
kazuma-s

2023/03/11 01:04

論理和演算子に || ではなく or を使っているので、これは Cプログラムではなく、C++ ですね。 でも、なぜ and を使わずに && を使っているんでしょうか?
aqskr

2023/03/11 07:17

単純にキーボードで打ちやすいためです。
aqskr

2023/03/11 09:10 編集

あの今更ですが、エピステーメーさんとはC++の有名なあのエピステーメーさんですか? あるいは彼に対して憧れて同名を名乗っているのでしょうか? もしご本人様でしたらご無礼をお許しください。
Zuishin

2023/04/25 09:19

過去に episteme さんの根も葉もない噂を流したり暴言を吐いたりものすごい無礼を働いたのをいまさら後悔して名前を変えたわけか。
guest

回答1

0

ベストアンサー

コンパクトにしてみました。

C

1int a = pos[enemyY1][enemyX1][1] + playerattackhanndou3; 2int b = pos[playerY][playerX][1] + nanameidouY + nanameidouY2 + nanameidouY3; 3 4int c = pos[enemyY1][enemyX1][0] 5 + playerattackhanndou + playerattackhanndou2 + playerattackhanndou3; 6int d = pos[playerY][playerX][0] 7 + nanameidouX + migiidou + nanameidouX2 + nanameidouX3; 8int e = pos[enemyY2][enemyX2][0] 9 + playerattackhanndouB + playerattackhanndou2B + playerattackhanndou3B; 10 11if (a + 15 >= b && a - 15 <= b) { 12 tyokusennkougeki = 1; 13 if (tyokusennkougeki == 1) { 14 if (c >= d - 15 && c <= e && d <= e || 15 c >= d - 15 && c >= e && d >= e || 16 c >= d - 15 && c >= e && d <= e || 17 c >= d - 15 && c >= e && d >= e) { 18 19 kougekiKANOU = 10; 20 GesabunHP = 40; 21 point = 123; 22 } 23 } 24} 25a = pos[enemyY2][enemyX2][1] + playerattackhanndou3B; 26if (a + 15 >= b && a - 15 <= b) { 27 tyokusennkougeki = 2; 28 if (tyokusennkougeki == 2) { 29 if (c >= d - 15 && c >= e && d <= e || 30 c <= d - 15 && c <= e && d <= e || 31 c >= d - 15 && c <= e && d <= e || 32 c <= d - 15 && c <= e && d >= e) { 33 34 kougekiKANOU = 10; 35 AGesabunHP = 40; 36 point = 123; 37 } 38 } 39} else { 40 tyokusennkougeki = 0; 41}

同じ式を何度も繰り返し書くのはばかげています。
一度だけ計算して結果を変数に入れておけば、簡潔になります。

次のような無意味な if 文があります。

C

1 tyokusennkougeki = 1; 2 if (tyokusennkougeki == 1) {

|| で結んだ式の中に c >= d - 15 && c >= e && d >= e などの同じ式があります。
条件判定を間違っていませんか?

投稿2023/03/11 06:02

kazuma-s

総合スコア8224

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

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

aqskr

2023/03/11 07:22 編集

kazuma-s様、ありがとうございます。 大変コンパクトで綺麗なプログラムです! もしかしたら。二度書きやミスがあったかも知れません。 申し訳ありませんでした。 主人公が二人の敵と同じY軸で並ぶ場合で、 敵1を攻撃する際に敵2に攻撃が当たらない、または敵2を攻撃する際に敵1に攻撃が当たらないなどを考慮してtyokusennkougekiと言った変数を作りましたが、 やはりtyokusennkougekiと言った変数を使わないと同じY軸で並ぶ場合の敵1と敵2を位置づけるのは難しいのでしょうか?
aqskr

2023/03/11 07:22

もしお時間のある時で構いませんので 「3体のキャラクターが重なったときの長いプログラムをコンパクトにしたいです。」の質問にも答えて頂けるとありがたいです。
aqskr

2023/03/11 09:07 編集

kazuma-s様から頂いたプログラムを貼り付けてビルドした結果、足りない部分というか少し足りない部分があり思うように動きませんでした。 こんなことをいうのもなんですが、お金をお支払いするので私のゲームのプログラムを見て問題を解決する手助けをして頂けないでしょうか?
aqskr

2023/04/30 11:06

すいませんkazuma-s様、頂いたコードでは思うような攻撃が出来ませんでした。 敵1と敵2が同じY座標にいたちして、前から銃攻撃すると本来は敵1だけに銃攻撃が当たるのですが、頂いたプログラムは敵1と敵2の二人に攻撃が当たってしまいます。 また敵1と敵2の位置が逆でも同じ現象が起きます。 他には敵が主人公の右にいるとして主人公が左向きの状態で銃を撃つと敵の方向に撃っていないのに敵に銃攻撃のダメージが入ります。 また、敵が主人公の左側に居るのに左向きの主人公が敵に銃攻撃をしても敵にダメージが入りません。 せっかく書いて頂いたのに私の書いたコードが汚いばかりにかつ、説明が下手なためにお時間を無駄にしてしまい申し訳ありません。 ちなみに以下は今現在のif文で分岐させた敵1と敵2と主人公の向きを考慮したうえでの銃攻撃のプログラムです。 https://pastebin.com/gM6Hv22q
aqskr

2023/04/30 11:43

ただ、出来ればどうやってkazuma-sさんは長いコードをコンパクトにしていくかの過程の思考というか、長いコードをコンパクトにするまでの手順を具体的に教えて欲しいです。 どうかよろしくお願い致します。
aqskr

2023/05/11 22:02

今更で申し訳ないのですが、 載せていただいたコードに関して質問があります。 int a = pos[enemyY1][enemyX1][1] + playerattackhanndou3;と定義しましたが、 a = pos[enemyY2][enemyX2][1] + playerattackhanndou3B;のように 同じ変数aで異なるものを定義していますが正しいのでしょうか。 どうかよろしくお願い致します。
kazuma-s

2023/05/12 04:48

int a = 3; printf("%d\n", a); a = 5; printf("%d\n", a); int a = 3; と定義しましたが、a = 5; のように 同じ変数 a で異なるものを定義していますが正しいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問