🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

961閲覧

構造体ポインタにしたもののメインループの関数化

退会済みユーザー

退会済みユーザー

総合スコア0

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/12/15 16:17

ビジュアルスタジオのC++を使ってます。
独学で勉強をしてなんとか構造体ポインタを使ってキャラクターのステータスの入出力までををポインター化、関数化はできたのですがキャラクター同士の戦闘となるメインループをどのようにポインターを使って関数化すればいいのかわかりません。

#include<stdio.h> #include<windows.h> #include<stdlib.h> //乱数を使うために必要 #include<time.h> //時間を取得するために必要 //プレイヤー構造体 typedef struct { char name[16]; int hp; int atk; int dfe; int spd = 30; int point; }PLAYER; void title(void); void Input(PLAYER* pPlayer); void output(PLAYER* pPlayer); int main(void) { //変数宣言 PLAYER Player[2] = {}; bool BatteleEnd = false; int random; //乱数の初期化 srand((unsigned int)time(NULL)); title(); Input(&Player[0]); output(&Player[0]); //バトル処理 printf("バトル開始!!\n"); do {//BattleEndがfalseの間は、do~whileの中が繰り返される //プレイヤー1の攻撃 printf("+++%sのターン+++\n", Player[0].name); random = rand() % 4 + 1; switch (random) { case 1://攻撃パターン1 random = rand() % 100; if (Player[1].spd < random) { Player[0].point = Player[0].atk + rand() % 5; Player[1].hp = Player[1].hp + Player[1].dfe - Player[0].point; printf("+------------------------+\n"); printf("|%sの攻撃 |\n", Player[0].name); printf("|%sに%dのダメージ |\n", Player[1].name, Player[0].point); printf("+------------------------+\n\n"); } else { printf("+------------------------+\n"); printf("|%sの攻撃は外れた |\n", Player[0].name); printf("+------------------------+\n"); } break; case 2://攻撃パターン2 random = rand() % 100; if (Player[1].spd < random) { Player[0].point = Player[0].atk * 3 + rand() % 5; Player[1].hp = Player[1].hp + Player[1].dfe - Player[0].point; printf("+------------------------+\n"); printf("|%sは『a』を放った |\n", Player[0].name); printf("|%sに%dのダメージ |\n", Player[1].name, Player[0].point); printf("+------------------------+\n\n"); } else { printf("+------------------------+\n"); printf("|%sの攻撃は外れた |\n", Player[0].name); printf("+------------------------+\n"); } break; case 3://攻撃パターン3 random = rand() % 100; if (Player[1].spd < random) { Player[0].point = Player[0].atk * 2 + rand() % 5; Player[1].hp = Player[1].hp + Player[1].dfe - Player[0].point; printf("+------------------------+\n"); printf("| %sは『b』を放った |\n", Player[0].name); printf("| %sに%dのダメージ |\n", Player[1].name, Player[0].point); printf("+------------------------+\n\n"); } else { printf("+------------------------+\n"); printf("|%sの攻撃は外れた |\n", Player[0].name); printf("+------------------------+\n"); } break; } //バトル終了処理 if (Player[1].hp >= 1) { printf("+----------------+\n"); printf("| %sの残りHPは%d |\n\n", Player[1].name, Player[1].hp); printf("+----------------+\n\n"); } else { printf("+----------------+\n"); printf("|%sは息絶えた |\n", Player[1].name); printf("+----------------+\n"); BatteleEnd = true; break; //BattleEndがtureになることで、do~whileの無限ループの条件を満たさなくなり //ループが終了 } //プレイヤー2の攻撃 printf("+++%sのターン+++\n", Player[1].name); random = rand() % 4 + 1; switch (random) { case 1://攻撃パターン1 random = rand() % 100; if (Player[0].spd < random) { Player[1].point = Player[1].atk + rand() % 5; Player[0].hp = Player[0].hp + Player[0].dfe - Player[1].point; printf("+------------------------+\n"); printf("|%sの攻撃 |\n", Player[1].name); printf("|%sに%dのダメージ |\n", Player[0].name, Player[1].point); printf("+------------------------+\n"); } else { printf("+------------------------+\n"); printf("|%sの攻撃は外れた |\n", Player[1].name); printf("+------------------------+\n"); } break; case 2://攻撃パターン2 random = rand() % 100; if (Player[0].spd < random) { Player[1].point = Player[1].atk * 2 + rand() % 5; Player[0].hp = Player[0].hp + Player[0].dfe - Player[1].point; printf("+------------------------+\n"); printf("|%sは『c』を放った |\n", Player[1].name); printf("|%sに%dのダメージ   |\n", Player[0].name, Player[1].point); printf("+------------------------+\n"); } else { printf("+------------------------+\n"); printf("|%sの攻撃は外れた |\n", Player[1].name); printf("+------------------------+\n"); } break; case 3://攻撃パターン3 random = rand() % 100; if (Player[0].spd < random) { Player[1].point = Player[1].atk * 3 + rand() % 5; Player[0].hp = Player[0].hp + Player[0].dfe - Player[1].point; printf("+-------------------------------+\n"); printf("|%sは『d』を唱えた |\n", Player[1].name); printf("|%sに%dのダメージ       |\n", Player[0].name, Player[1].point); printf("+-------------------------------+\n"); } else { printf("+------------------------+\n"); printf("|%sの攻撃は外れた |\n", Player[1].name); printf("+------------------------+\n"); } break; } //バトル終了処理 if (Player[0].hp >= 1) { printf("+----------------+\n"); printf("|%sの残りHPは%d |\n", Player[0].name, Player[0].hp); printf("+----------------+\n\n"); } else { printf("+----------------+\n"); printf("|%sは息絶えた |\n", Player[0].name); printf("+----------------+\n"); BatteleEnd = true; break; //BattleEndがtureになることで、do~whileの無限ループの条件を満たさなくなり //ループが終了 } } while (BatteleEnd == false); getchar(); system("cls"); printf("+++バトル終了+++\n\n"); if (Player[1].hp >= 1) { printf("+++%sの勝利+++\n", Player[1].name); } else { printf("+++%sの勝利+++\n", Player[0].name); } getchar(); return 0; } void title(void) { printf("+--------------------+\n"); printf("|   バトル  |\n"); printf("+--------------------+\n"); getchar(); system("cls"); } void Input(PLAYER* pPlayer) { //ステータス作成 printf("+++ステータスの作成+++\n"); for (int i = 0; i < 2; i++) { printf("PLAYER_%d\n", i + 1); printf("NAME>"); scanf("%s", pPlayer->name); rewind(stdin); printf("HP>"); scanf("%d", &pPlayer->hp); rewind(stdin); printf("ATK>"); scanf("%d", &pPlayer->atk); rewind(stdin); printf("DFE>"); scanf("%d", &pPlayer->dfe); rewind(stdin); //画面のクリア処理 getchar(); system("cls"); pPlayer++; } } void output(PLAYER* pPlayer) { //ステータス表示 printf("+++ステータスの表示+++\n"); for (int i = 0; i < 2; i++) { printf("PLAYER_%d\n", i + 1); printf("NAME>%s\n", pPlayer->name); printf("HP>%d\n", pPlayer->hp); printf("ATK>%d\n", pPlayer->atk); printf("DFE>%d\n", pPlayer->dfe); printf("SPD>%d\n\n", pPlayer->spd); pPlayer++; } } ここに言語を入力 コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

プレーヤと敵を引数にして攻撃関数を作りましょう
そして、それを使って、バトル関数を作ります

投稿2020/12/15 20:22

編集2020/12/15 20:48
y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2020/12/16 00:05

回答ありがとうございます。なんとなくその二つを引数に持っていくのはわかるのですが、表現の仕方がいまいちわからなくて戦闘処理の序盤だけでも良いのでポインタを使って関数化したものを書いていただけないでしょうか
y_waiwai

2020/12/16 01:41

やるなら、攻撃キャラと被攻撃キャラ、そして攻撃パターンを引数にとって処理する攻撃関数を作りましょう void Kogeki(PLAYER* yaru,PLAYER* yarare,int patern) { switch(patern){ case KOGEKI1: なんやかや; case KOGEKI2: そんなこんな; case KOGEKI3:てんやわんや; } } これをつかって、バトル関数を作り、それを使って、ターン関数をつくり、、とかとかになりますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問