前提
このソースコードからどこを変えれば全項目実行されるか教えてください。
実現したいこと
・プレイヤーのターン毎の選択コマンドにオリジナルコマンドを追加する
・プレーヤーの魔法攻撃の種類を3種類以上に増やす
・プレーヤーの「にげる」コマンドは現在確実に成功しますが、
一定確率で失敗するようにする(確率は任意)
また、逃げれたかどうかを示すメッセージを表示する
・敵に魔法タイプの敵を作成し、魔法タイプの敵は魔法で攻撃するようにする
・敵のパラメータの合計を敵のレベルと同じになるように調整する
・プレーヤーの武器パラメータにAgilityを追加し、戦闘時装備していたら
そのパラメータを戦闘に反映させる
・敵が落とす武器をランダムで決めること
・敵が落とすお金をランダムで決めること
・プレーヤーの武器の種類を現在の2種類から5種類以上に増やす
・アイテムの種類を3種類以上つくること(ただし、使うアイテムのみでも可)
発生している問題・エラーメッセージ
#include "all.h"
CREATURE_DATA::CREATURE_DATA() {
PARAM_DATA data; data.hp = 0; data.mp = 0; data.atk = 0; data.def = 0; data.agi = 0; SetParam(data);
}
CREATURE_DATA::CREATURE_DATA(PARAM_DATA data) {
SetParam(data);
}
CREATURE_DATA::~CREATURE_DATA() {
}
void CREATURE_DATA::SetParam(PARAM_DATA data) {
param.hp = data.hp; param.mp = data.mp; param.atk = data.atk; param.def = data.def; param.agi = data.agi; max_hp = data.hp; max_mp = data.mp;
}
void CREATURE_DATA::PrintParam() {
printf("hp = %d mp = %d atk = %d def = %d agi = %d\n", param.hp, param.mp, param.atk, param.def, param.agi);
}
void CREATURE_DATA::CalcDam(int dam) {
dam += GetRand(-2, 2); if (dam <= 0) dam = 1; //5分の1の確率でダメージが1.2倍 int tmp = GetRand(1, 5); if (tmp == 1) { dam = (int)((float)dam * 1.2f); } else { //5%の確率で攻撃をミスする tmp = GetRand(1, 20); if (tmp == 1) dam = 0; } printf("%dのダメージ\n",dam); param.hp -= dam;
}
void CREATURE_DATA::UseMp(int data) {
param.mp -= data;
}
#include "all.h"
enum GAME_COMMAND_TYPE {
GAME_END,
GAME_INN,
GAME_BUYITEM,
GAME_GOTO_BATTLE,
GAME_COMMAND_ALL,
};
int main() {
PARAM_DATA pl_data; pl_data.hp = 100; pl_data.mp = 0; pl_data.atk = 40; pl_data.def = 20; pl_data.agi = 10; PLAYER_DATA player(pl_data); PARAM_DATA en_data; ENEMY_DATA* p_enemy; // CREATURE_DATA enemy2; int enemy_lv = 30; bool battle_flag; bool game_flag; InitRand(); player.PrintParam(); game_flag = true; while (game_flag) { int tmp = (int)GetRand(0, 1); if (tmp == 0) { en_data.hp = 200; en_data.mp = 0; } else { en_data.hp = 80; en_data.mp = 100; } en_data.atk = (int)GetRand(1, enemy_lv); en_data.def = (int)GetRand(1, enemy_lv - en_data.atk); en_data.agi = (int)GetRand(1, enemy_lv - en_data.atk - en_data.def);
#if 1
p_enemy = new ENEMY_DATA(en_data);
p_enemy->SetType(tmp);
#else
p_enemy = new ENEMY_DATA(en_data, tmp);
#endif
enemy_lv++;
p_enemy->PrintParam(); battle_flag = true; while (battle_flag) { // コマンドを入れるタイミング player.InputCommand(); switch (player.GetCommand()) { case (int)COMMAND_TYPE::ATTACK: if (player.GetAgi() >= p_enemy->GetAgi()) { printf("プレーヤーの攻撃:"); p_enemy->CalcDam(player.GetAtk() - p_enemy->GetDef()); player.CalcDam(p_enemy->GetAtk() - player.GetDef()); } else { player.CalcDam(p_enemy->GetAtk() - player.GetDef()); p_enemy->CalcDam(player.GetAtk() - p_enemy->GetDef()); } break; case (int)COMMAND_TYPE::DEFENSE: player.SetHp(player.GetHp() + player.GetMaxHp() * 0.1f ); player.CalcDam(p_enemy->GetAtk() - player.GetDef()); break; case (int)COMMAND_TYPE::MAGIC: p_enemy->CalcDam(30); player.CalcDam(p_enemy->GetAtk() - player.GetDef()); break; case (int)COMMAND_TYPE::ESCAPE: battle_flag = false; break;
#if 0
case アイテムの使用
アイテムを使う関数コールし、どのアイテムを使ったかアイテム番号を返す
switch アイテム番号
(それぞれの効果)
case やくそう
HPの回復
case MP回復剤
MPの回復
case 安全に逃げる
戦闘の強制終了
#endif
}
if (player.GetHp() <= 0 || p_enemy->GetHp() <= 0) battle_flag = false; } if (player.GetHp() <= 0) { printf("プレイヤーは倒された\n"); game_flag = false; } if (p_enemy->GetHp() <= 0) { printf("エネミーは倒された\n"); player.SetMoney( p_enemy->GetMoney() ); player.SetWeaponNo( p_enemy->GetDropWeapon()); } delete p_enemy; { int tmp = 0; bool flag = true; int item_kakaku; while (flag) { printf("1:ゲーム終了\n"); printf("2:宿屋で休む\n"); printf("3:アイテムの購入\n"); printf("4:バトルに戻る\n"); while (tmp <= 0 || tmp > (int)GAME_COMMAND_TYPE::GAME_COMMAND_ALL) { printf("なにをする?(1 - 4):"); scanf_s("%d", &tmp); } tmp--; switch (tmp) { case GAME_COMMAND_TYPE::GAME_END: game_flag = false; break; case GAME_COMMAND_TYPE::GAME_INN: if (player.GetMoney() >= 100) { player.SetMoney(-100); player.SetHp(player.GetMaxHp()); } else { printf("お金が足りません\n"); } break; case GAME_COMMAND_TYPE::GAME_GOTO_BATTLE: flag = false; break; case GAME_COMMAND_TYPE::GAME_BUYITEM: item_kakaku = player.item_data.Item_Buy_func(); if (item_kakaku >= 0) { if (player.GetMoney() < item_kakaku) { printf("お金が足りません\n"); } else { if (player.item_data.Check_Item_No()) { // アイテム購入の処理 player.SetMoney(item_kakaku * -1); player.item_data.Set_Item_no(); } else { printf("かばんに空きがありません\n"); } } } break; } } } } return 0;
}
#include "all.h"
int ENEMY_DATA::appear_num = 0;
int ENEMY_DATA::dead_num = 0;
ENEMY_DATA::ENEMY_DATA(PARAM_DATA data) : CREATURE_DATA(data) {
appear_num++;
money = 100;
type = 0;
drop_weapon_no = 0;
}
ENEMY_DATA::ENEMY_DATA(PARAM_DATA data, int type_data) :
CREATURE_DATA(data) {
appear_num++;
money = 100;
type = type_data;
drop_weapon_no = 0;
}
#include "all.h"
enum IT_ITEM_NO {
NONE = -1,
YAKUSOU = 0,
ITEM_NO_ALL,
};
enum IT_ITEM_TYPE {
USE,
};
typedef struct {
int kakaku;
int type;
char name[33];
} IT_ITEM_DATA;
IT_ITEM_DATA item_info[ITEM_NO_ALL] = {
{ 10, IT_ITEM_TYPE::USE, "やくそう", },
};
ITEM_DATA::ITEM_DATA() {
for (int i = 0; i < ITEM_MAX_NUM; i++) {
item_no[i] = -1;
}
}
int ITEM_DATA::Item_Buy_func() {
int tmp = -1; bool flag = true; int ret = -1; for (int i = 0; i < ITEM_MAX_NUM; i++) buy_item_list[i]; printf("0:何も買わない\n"); for (int i = 0; i < ITEM_NO_ALL; i++) { printf("%d:%s\n", i + 1, item_info[i].name ); } while (tmp < 0 || tmp > (int)IT_ITEM_NO::ITEM_NO_ALL) { printf("なにをする?(0 - %d):", (int)IT_ITEM_NO::ITEM_NO_ALL); scanf_s("%d", &tmp); } tmp--; if(tmp < IT_ITEM_NO::NONE) buy_item_list[0] = tmp; switch (tmp) { case IT_ITEM_NO::NONE: ret = -1; break; case IT_ITEM_NO::YAKUSOU: ret = item_info[tmp].kakaku; break; } return ret;
}
bool ITEM_DATA::Check_Item_No() {
bool ret = false; for (int i = 0; i < ITEM_MAX_NUM; i++) { if (item_no[i] == -1) { ret = true; break; } } return ret;
}
void ITEM_DATA::Set_Item_no() {
for (int i = 0; i < ITEM_MAX_NUM; i++) { if (item_no[i] == -1) { item_no[i] = buy_item_list[0]; break; } }
}
int ITEM_DATA::Use_Item() {
int tmp = 0;
printf("0:キャンセル\n"); printf("1:%s\n", item_info[0].name); while (tmp < 0 || tmp > (int)COMMAND_TYPE::COMMAND_ALL) { printf("なにをする?(1 - 4):"); scanf_s("%d", &tmp); } return tmp - 1;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "mylib.h"
/*
関数名 GetRand
返り値 short型 算出した乱数を返す
引数 short型 乱数の下限
short型 乱数の上限
内容 rand関数を使用し下限から上限の範囲の乱数を発生させる
(上限 (四則演算) 下限 + 1 )+(ある値)
*/
short GetRand(short min, short max) {
if (max < min) max = min + 1;
return (short)(rand() % (max - min + 1) + min);
}
void InitRand() {
srand(time(NULL));
}
#include "all.h"
PL_WEAPON_DATA weapon_data[] = {{10},
{20},
{30} };
PLAYER_DATA::PLAYER_DATA(PARAM_DATA data) : CREATURE_DATA(data) {
weapon_atk = 0; money = 0; weapon_no = -1;
}
void PLAYER_DATA::InputCommand() {
int tmp = 0; printf("1:たたかう\n"); printf("2:まほう\n"); printf("3:ぼうぎょ\n"); printf("4:にげる\n"); while (tmp <= 0 || tmp > (int)COMMAND_TYPE::COMMAND_ALL) { printf("なにをする?(1 - 4):"); scanf_s("%d", &tmp); if (tmp == 2) { if (GetMp() < 3) tmp = 0; } } command_no = tmp - 1;
}
int PLAYER_DATA::GetDef() {
int tmp = 1; switch(command_no) { case (int)COMMAND_TYPE::DEFENSE: tmp = 2; break; } return param.def * tmp;
}
int PLAYER_DATA::GetAtk() {
if (weapon_no == -1) { weapon_atk = 0; } else { weapon_atk = weapon_data[weapon_no].atk; } return (weapon_atk + param.atk);
}
void PLAYER_DATA::SetWeaponNo(int no) {
printf("現在の武器は 攻撃力=%d\n", weapon_data[weapon_no].atk);
printf("新しい武器は 攻撃力=%d\n", weapon_data[no].atk);
printf("入れ替えますか?(0-1 0:はい それ以外:いいえ)\n");
int tmp;
scanf_s("%d", &tmp);
if (tmp == 0) weapon_no = no;
}
あなたの回答
tips
プレビュー