//*****************************//
//* *//
//* メイン処理 [main.cpp] *//
//* *//
//*****************************//
//**********************//
//* ヘッダファイル *//
//**********************//
#include <stdio.h>
#include <string.h>
#include "main.h"
#include "player.h"
/******************/
/* マクロ定義 */
/******************/
#define MIN_NUM ( 1 ) // 入力最小人数
#define MAX_NUM ( 3 ) // 入力最大人数
/************************/
/* プロトタイプ宣言 */
/************************/
void Init ( void ); // 初期化関数
void Uninit ( void ); // 終了関数
int Input ( void ); // 入力関数
void Output ( int nNumPlayer ); // 出力関数
int Load ( int nNumPlayer );
int Save ( int nNumPlayer );
void SelectMode ( void );
//********************//
//* 構造体の定義 *//
//********************//
typedef enum
{
MODE_FINISH = 0 , // 終了
MODE_INPUT , // 入力
MODE_OUTPUT , // 出力
MODE_SAVE , // セーブ
MODE_LOAD , // ロード
MODE_MAX , // 最大数
}MODE;
//**********************//
//* グローバル変数 *//
//**********************//
CPlayer g_aPlayer [ MAX_NUM ];
//******************//
//* メイン処理 *//
//******************//
void main ( void )
{
// 初期化処理
Init ();
// モード選択
SelectMode ();
// 終了処理
Uninit();
return;
}
void SelectMode ( void )
{
int nNumPlayer = 0;
MODE mode;
memset ( g_aPlayer , 0 , sizeof ( g_aPlayer ) );
do
{
// 番号入力
printf ( "\nMENU\n" );
printf ( "以下の番号から処理を選んでください\n" );
printf ( "1. 入力\n" );
printf ( "2. 出力\n" );
printf ( "3. セーブ\n" );
printf ( "4. ロード\n" );
printf ( "0. 終了\n" );
printf ( "> " );
scanf ( "%d" , &mode );
// 各番号の処理
switch ( mode )
{
// 終了処理
case MODE_FINISH:
printf ( "プログラムを終了します\n" );
break;
// 入力処理
case MODE_INPUT:
nNumPlayer = Input ();
break;
// 出力処理
case MODE_OUTPUT:
Output ( nNumPlayer );
break;
// セーブ処理
case MODE_SAVE:
Save ( nNumPlayer );
break;
// ロード処理
case MODE_LOAD:
Load ( nNumPlayer );
break;
}
}while ( mode != MODE_FINISH ); // 終了処理が呼ばれるまでループ
}
//******************//
//* 初期化関数 *//
//******************//
void Init ( void )
{
for ( int i = 0; i < MAX_NUM; i++ )
{
// プレイヤーの初期化処理
g_aPlayer[i].Init();
}
}
//****************//
//* 終了関数 *//
//****************//
void Uninit ( void )
{
for ( int i = 0; i < MAX_NUM; i++ )
{
// プレイヤーの終了処理
g_aPlayer[i].Uninit();
}
}
//****************//
//* 入力関数 *//
//****************//
int Input ( void )
{
int nCntPlayer = 0; // 入力人数保存変数
// 入力人数指定
do
{
printf ( "何人分のデータを入力しますか?(%d~%d人まで) > " , MIN_NUM , MAX_NUM );
scanf ( "%d" , &nCntPlayer );
}while ( nCntPlayer < MIN_NUM | nCntPlayer > MAX_NUM );
// 入力人数分ループ
for ( int i = 0; i < nCntPlayer; i++ )
{
printf ( "\n~ %d人目のデータ ~\n" , i + 1 );
// プレイヤー入力処理
g_aPlayer[i].Input();
}
return nCntPlayer;
}
//****************//
//* 出力関数 *//
//****************//
void Output ( int nNumPlayer )
{
if ( nNumPlayer != NULL )
{
printf ( "\nデータを出力します\n" );
// 入力人数分ループ
for ( int i = 0; i < nNumPlayer; i++ )
{
printf ( "\n~ %d人目のデータ ~\n" , i + 1 );
// プレイヤー出力処理
g_aPlayer[i].Output ();
}
}
else
{
printf ( "データがありません\n" );
}
}
int Save ( int nNumPlayer )
{
FILE* fp;
int nData;
if ( nNumPlayer < MIN_NUM | nNumPlayer > MAX_NUM )
{
printf ( "データがありません\n" );
return 0;
}
else
{
// ファイルを開く
fp = fopen ( "savedata.bin" , "wb" );
fwrite ( &nNumPlayer , sizeof ( int ) , 1 , fp );
for ( int i = 0; i < nNumPlayer; i++ )
{
nData = g_aPlayer[i].GetLife ();
fwrite ( &nData , 4 , 1 , fp );
nData = g_aPlayer[i].GetAttack ();
fwrite ( &nData , 4 , 1 , fp );
nData = g_aPlayer[i].GetSpeed ();
fwrite ( &nData , 4 , 1 , fp );
}
// ファイルを閉じる
fclose ( fp );
printf ( "セーブしました\n" );
}
return nNumPlayer;
}
int Load ( int nNumPlayer )
{
FILE* fp;
int nData;
if ( nNumPlayer == NULL )
{
printf ( "データがありません\n" );
return 0;
}
else
{
// ファイルを開く
fp = fopen ( "savedata.bin", "rb" );
fread ( &nNumPlayer , sizeof (int) , 1 , fp );
for ( int i = 0; i < nNumPlayer; i++ )
{
fread ( &nData , 4 , 1 , fp );
g_aPlayer[i].SetLife ( nData );
fread ( &nData , 4 , 1 , fp );
g_aPlayer[i].SetAttack ( nData );
fread ( &nData , 4 , 1 , fp );
g_aPlayer[i].SetSpeed ( nData );
}
// ファイルを閉じる
fclose ( fp );
printf ( "ロードしました\n" );
}
return nNumPlayer;
}
/////////////// EOF ///////////////
以下、player.hとplayer.cppです。
/********************/
/* 構造体の定義 */
/********************/
class CPlayer
{
public:
CPlayer (); // コンストラクタ
~CPlayer (); // デストラクタ
void Init (); // 初期化処理
void Uninit (); // 終了処理
void Input (); // 入力処理
void Output (); // 出力処理
void SetLife ( int nLife );
int GetLife ( void );
void SetAttack ( int nLife );
int GetAttack ( void );
void SetSpeed ( int nLife );
int GetSpeed ( void );
private:
int m_nLife; // プレイヤーのライフ
int m_nAttack; // プレイヤーの攻撃力
int m_nSpeed; // プレイヤーのスピード
};
//**********************//
//* コンストラクタ *//
//**********************//
CPlayer::CPlayer ()
{
m_nLife = 0;
m_nAttack = 0;
m_nSpeed = 0;
}
//********************//
//* デストラクタ *//
//********************//
CPlayer::~CPlayer ()
{
}
//******************************//
//* プレイヤーの初期化処理 *//
//******************************//
void CPlayer::Init ( void )
{
m_nLife = 0;
m_nAttack = 0;
m_nSpeed = 0;
}
//****************************//
//* プレイヤーの終了処理 *//
//****************************//
void CPlayer::Uninit ( void )
{
m_nLife = 0;
m_nAttack = 0;
m_nSpeed = 0;
}
//****************************//
//* プレイヤーの入力処理 *//
//****************************//
void CPlayer::Input ( void )
{
printf ( "ライフは? > " );
scanf ( "%d" , &m_nLife );
printf ( "攻撃力は? > " );
scanf ( "%d" , &m_nAttack );
printf ( "スピードは? > " );
scanf ( "%d" , &m_nSpeed );
}
//****************************//
//* プレイヤーの出力処理 *//
//****************************//
void CPlayer::Output ()
{
printf ( "ライフは%d\n" , m_nLife );
printf ( "攻撃力は%d\n" , m_nAttack );
printf ( "スピードは%d\n" , m_nSpeed );
}
void CPlayer::SetLife ( int nLife )
{
m_nLife = nLife;
}
int CPlayer::GetLife ( void )
{
return m_nLife;
}
void CPlayer::SetAttack ( int nAttack )
{
m_nAttack = nAttack;
}
int CPlayer::GetAttack ( void )
{
return m_nAttack;
}
void CPlayer::SetSpeed ( int nSpeed )
{
m_nSpeed = nSpeed;
}
int CPlayer::GetSpeed ( void )
{
return m_nSpeed;
}
/////////////// EOF ///////////////
ところが、セーブしてからウィンドウを閉じ、再びプログラムを実行してロードするとデータが出力されませんでした。
SelectMode関数内で、nNumPlayer = 0としているところがダメだと思うのですが、どのように書き直せばよいか分かりません。
教えてください。お願いします。