ビジュアルスタジオの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++; } } ここに言語を入力 コード
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/12/16 00:05
2020/12/16 01:41