ゲームキャラクターが共同で使用する薬草などのアイテム(道具)の数を静的メンバ変数を用いることにより管理することができます

ゲームキャラクターが共同で使用する薬草などのアイテム(道具)の数を静的メンバ変数を用いることにより管理することができます

まずは 以下のプログラムをご覧ください

👇


#include <iostream>

#include <string>


using namespace std;


class GameCharacter{


public:

string name;

int HP;

int MP;

void statusDataDisplay();

GameCharacter();//ここに注目 コンストラクタを設定しました

};




void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


GameCharacter::GameCharacter() {


HP = 5;

MP = 7;


}


int main() {


GameCharacter Lyliane;

Lyliane.name = "リリアーネ";

Lyliane.statusDataDisplay();


return 0;

}


ビルド実行結果


リリアーネ

HP 5

MP 7



ソーラー「このプログラムではコンストラクタの設定により


リリアーネの


HP

MP


5

7


に設定されています」


マックス「HPもMPもまだまだのレベルだが・・


リリアーネ 成長が楽しみだなあ😊


お~、よ~し、よし」


ぶーにゃん「にゃ~ん」


てんC「🐈さんも寄ってきましたよ リリアーネさん😊」




         ・・・・・・・・



ソーラー「そうですね


リリアーネ


どんなキャラクターに育て上げようか


楽しみだね」


マックス「なんかこう リリアーネにできることをもっと増やしたいな」




(ただ このようなコンストラクタの設定はよろしくありません


この場合


LylianeのクラスGameCharacter型のオブジェクト宣言


GameCharacter Lyliane;


を実行した場合


コンストラクタの設定により


クラスGameCharacter型のオブジェクトLylianeのメンバ変数


Lyliane.HP

Lyliane.MP



5

7


に初期化されていますが


ElfineのクラスGameCharacter型のオブジェクト宣言


GameCharacter Elfine;


を実行した場合も


コンストラクタの設定により


クラスGameCharacter型のオブジェクトElfineのメンバ変数


Elfine.HP

Elfine.MP



5

7


に初期化されることになります


つまり


ゲームに登場するゲームキャラクター


リリアーネもエルフィンも


同じ

HP

MP


をもつことになってしまうというわけです


ですが


最初はどのキャラクターの


HP

MP



5

7


になるよう設定したいなら


このようにコンストラクタを設定しても構いません


                       solarplexussより)






ソーラー「できることですか?


ふ~ん


ふつう、ゲームキャラクターの設定といえば


HP

MP


をもっているというものですが・・・


ほかには・・・


そうだ


ゲームキャラクターは


アイテム(道具)を使うということができるんじゃないかな?」


マックス「アイテムを使う?


なんかの健康器具でも使えるのか?」


ソーラー「?!


そのアイデアもいいですね


ですが


ゲームキャラクターがアイテム(道具)をつかうといったら


たとえば


代表的なものに


薬草という回復系のアイテムを使えばHPが回復するというものがあります


たとえば


リリアーネの

HP(体力)


3

になっていた場合


HPが2回復する薬草をつかえば


リリアーネの

HP(体力)

5

に回復するって感じです」


マックス「じゃあ


リリアーネの

HP(体力)

が回復できるように


ゲームキャラクターの設定をおこなうのか?


どうやってそのようなプログラムを構成するかだよな?」


ソーラー「だいたい どのゲームキャラクターも


アイテムを使うことができるので


クラスGameCharacterに


アイテムを使ってHPを回復させるメンバ関数


を設定してもいいと思います


あるゲームキャラクターは


薬草をつかえて


あるゲームキャラクターは


薬草を使えないなんてことはないですからね


クラスGameCharacterに


すべてのキャラクターに共通する


アイテムを使ってHPを回復させるメンバ関数


を設定してもいいと思います


そこで


GameCharacterのクラス宣言

👇

class GameCharacter{


public:

string name;

int HP;

int MP;

void statusDataDisplay();

GameCharacter();

};

👆

に薬草の数を管理する


numberofMedicalHerbの静的メンバ変数宣言


static int numberofMedicalHerb;



薬草を指定したキャラクターに使用することのできる


メンバ関数宣言


void useMedicalHerb(GameCharacter& a);


を設定して以下のように変更してみたいと思います


するとGameCharacterのクラス宣言は以下のようになります


👇

class GameCharacter {


public:

string name;

int HP;

int MP;


static int numberofMedicalHerb;//ここに追加しました


void statusDataDisplay();

void useMedicalHerb(GameCharacter& a);//ここに追加しました



};


ソーラー「コンストラクタは諸処の理由により省きました


クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter& a)の定義は


void GameCharacter::useMedicalHerb(GameCharacter& a) {

cout << name << "は" << a.name << "に薬草をつかった" << "\n";

a.HP += 2;

cout << a.name << "のHPは" << "2回復した" << "\n";

numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";


}


とします


(クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter& a)の定義


の引数に     


GameCharacter& a


つまり


GameCharacter&型の参照変数aが用いられているのがポイントです


GameCharacter型のオブジェクトが引数であるGameCharacter& aに代入された場合


aは


そのGameCharacter型のオブジェクトそのものをあらわすことになり


aに操作を加えることにより


GameCharacter型のオブジェクトに直接操作を加えることができるようになります



もし


クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter a)の定義において


useMedicalHerb(GameCharacter a)


のように


引数に     


GameCharacter a


が用いられている場合は


GameCharacter型のオブジェクトが


引数であるGameCharacter aに代入された場合


そのGameCharacter型のオブジェクトのデータだけが


aにわたされる


           💖値渡しが行われることになり💖



GameCharacter型のオブジェクトそのものに操作を加えることはできません)



例えば


LylianeのクラスGameCharacter型のオブジェクト宣言


GameCharacter Lyliane;


ElfineのクラスGameCharacter型のオブジェクト宣言


GameCharacter Elfine;


が実行され


プロトタイプオブジェクトである


リリアーネのデータを取り扱うオブジェクトLyliane

エルフィンのデータを取り扱うオブジェクトElfine


が作製されたとします


Lyliane.name = "リリアーネ";

Lyliane.HP=10;

Lyliane.MP=8;


Elfine.name = "エルフィン";

Elfine.HP = 15;

Elfine.MP = 5;


を実行し



リリアーネのデータをオブジェクトLylianeのメンバ変数

Lyliane.name

Lyliane.HP

Lyliane.MP


に代入し


エルフィンのデータをオブジェクトElfineのメンバ変数


Elfine.name

Elfine.HP

Elfine.MP



に代入した後



useMedicalHerb(GameCharacter& a)の


GameCharacter& a



Elfineが代入された


クラスGameCharacter型のオブジェクトLylianeのメンバ関数



Lyliane.useMedicalHerb(Elfine);


が実行されると


クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter& a)の定義は

👇以下のように設定されているので


void GameCharacter::useMedicalHerb(GameCharacter& a) {

cout << name << "は" << a.name << "に薬草をつかった" << "\n";

a.HP += 2;

cout << a.name << "のHPは" << "2回復した" << "\n";

numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";


}

👆


GameCharacter& a


Elfine


が代入されることになります


すると



cout << name << "は" << a.name << "に薬草をつかった" << "\n";

a.HP += 2;

cout << a.name << "のHPは" << "2回復した" << "\n";

numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";



nameにはLyliane.name


a.nameにはElfine.name


a.HPにはElfine.HP


numberofMedicalHerbにLyliane.numberofMedicalHerb


が代入された


cout << Lyliane.name << "は" << Elfine.name << "に薬草をつかった" << "\n";

Elfine.HP += 2;

cout << Elfine.name << "のHPは" << "2回復した" << "\n";

numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";


が実行されることになります


ですので



コマンドプロンプト画面に


リリアーネはエルフィンに薬草をつかった


が表示され


useMedicalHerb(GameCharacter& a)



引数GameCharacter& aに代入された


クラスGameCharacter型のオブジェクトElfineのメンバ変数


Elfine.HPの値が2回復するというわけです


そのとき薬草の数は1つ減ることになります


早速


そのプログラムを実行してみましょう


その際


GameCharacterのクラス宣言の後


main関数の前で


静的メンバ変数numberofMedicalHerbのクラスGameCharacterのメンバ変数宣言


int GameCharacter::numberofMedicalHerb;


を記述するのを


わすれたらいけないんだな これが😊」



(もう それさんざんやってきたような・・・


                  solarplexussより)




👇

#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;


static int numberofMedicalHerb;//numberofMedicalHerbの静的メンバ変数宣言を実行しています


void statusDataDisplay();

void useMedicalHerb(GameCharacter& a);//ここに追加しました



};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


void GameCharacter::useMedicalHerb(GameCharacter& a) {

cout << name << "は" << a.name << "に薬草をつかった" << "\n";

a.HP += 2;

cout << a.name << "のHPは" << "2回復した" << "\n";

numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";


}


int GameCharacter::numberofMedicalHerb = 18;

//🌞薬草の数を18個に初期化しています

int main() {


GameCharacter Lyliane;

GameCharacter Elfine;

Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;



Elfine.name = "エルフィン";

Elfine.HP = 15;

Elfine.MP = 5;


Lyliane.statusDataDisplay();

Elfine.statusDataDisplay();


Lyliane.useMedicalHerb(Elfine);


Lyliane.statusDataDisplay();

Elfine.statusDataDisplay();

return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

エルフィン

HP 15

MP 5

リリアーネはエルフィンに薬草をつかった

エルフィンのHPは2回復した

薬草の数は17個になった

リリアーネ

HP 10

MP 8

エルフィン

HP 17

MP 5


ソーラー「


GameCharacterのクラス宣言の後


main関数の前で


静的メンバ変数numberofMedicalHerbのクラスGameCharacterのメンバ変数宣言


int GameCharacter::numberofMedicalHerb;


を記述するのをわすれたらいけないんだよ


そうしなければ


静的メンバ変数numberofMedicalHerbは機能しません


このプログラムの場合では


静的メンバ変数numberofMedicalHerbのクラスGameCharacter型のメンバ変数宣言、初期化の


int GameCharacter::numberofMedicalHerb=18;


が実行されていますが


静的メンバ変数numberofMedicalHerbのクラスGameCharacter型のメンバ変数宣言


int GameCharacter::numberofMedicalHerb;


だけ記述することもできます



この場合


int GameCharacter::numberofMedicalHerb=0;


が実行されたことになります


この


int GameCharacter::numberofMedicalHerb;


が何を意味するかはじっくりと考察していきましょうね


クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter& a)の定義は


void GameCharacter::useMedicalHerb(GameCharacter& a) {

cout << name << "は" << a.name << "に薬草をつかった" << "\n";

a.HP += 2;

cout << a.name << "のHPは" << "2回復した" << "\n";

numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";


}


となっています


このとき


クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter& a)


の引数は


GameCharacter& a


と記述してあることに御注意ください


Lyliane.useMedicalHerb(Elfine);


が実行されて


このGameCharacter&型の参照変数


a



クラスGameCharacter型のオブジェクトElfineが代入されると


aはクラスGameCharacter型のオブジェクトElfineそのものをあらわすことになります


つまり


GameCharacter&型の参照変数


a

クラスGameCharacter型のオブジェクトElfineは


同じメモリにアクセスする変数になるというわけです


もちろん

GameCharacter&型の参照変数aのメンバ変数

a.name

a.HP

a.MP


クラスGameCharacter型のオブジェクトElfineのメンバ変数

Elfine.name

Elfine.HP

Elfine.MP

同じメモリにアクセスし


同じメモリに格納されているデータをあらわすことになります



Lyliane.useMedicalHerb(Elfine);

が実行されると


クラスGameCharacterのメンバ関数useMedicalHerb(GameCharacter& a)の定義

👇


void GameCharacter::useMedicalHerb(GameCharacter& a) {

cout << name << "は" << a.name << "に薬草をつかった" << "\n";

a.HP += 2;

cout << a.name << "のHPは" << "2回復した" << "\n";


numberofMedicalHerb = numberofMedicalHerb - 1;

cout << "薬草の数は" << numberofMedicalHerb << "個になった" << "\n";


}



nameにLyliane.name


a.nameにElfine.name

a.HPにElfine.HP


そして


numberofMedicalHerbにLyliane.numberofMedicalHerb



が代入された

👇

cout << Lyliane.name << "は" << Elfine.name << "に薬草をつかった" << "\n";

Elfine.HP += 2;

cout << Elfine.name << "のHPは" << "2回復した" << "\n";


Lyliane.numberofMedicalHerb=Lyliane.numberofMedicalHerb - 1;

cout << "薬草の数は" << Lyliane.numberofMedicalHerb << "個になった" << "\n";

👆

が実行されることになります



Elfine.HP += 2;


が実行されると


Elfine.HPの格納しているデータは2増加し


cout << Elfine.name << "のHPは" << "2回復した" << "\n";


の実行により


エルフィンのHPは2回復した


がコマンドプロンプト画面に表示されることになります



numberofMedicalHerbにクラスGameCharacter型のオブジェクトLylianeのメンバ変数


Lyliane.numberofMedicalHerb


が代入されることになるのがポイントです


つまり


GameCharacter Lyliane;


が実行された際に

クラスGameCharacter型のオブジェクトLylianeのメンバ変数

Lyliane.name

Lyliane.HP

Lyliane.MP

クラスGameCharacter型のオブジェクトLylianeの静的メンバ変数

Lyliane.numberofMedicalHerb

が生成されていたというわけです


そして


GameCharacterのクラス宣言の後


main関数の前で


numberofMedicalHerbのクラスGameCharacterのメンバ変数宣言、初期化



     int GameCharacter::numberofMedicalHerb=18;



が実行されていることにより


クラスGameCharacter型のオブジェクトLylianeの静的メンバ変数


Lyliane.numberofMedicalHerbは


Lyliane.numberofMedicalHerb=18;


と初期化されているんです



    int GameCharacter::numberofMedicalHerb=18;



クラスGameCharacter型のオブジェクトLylianeの静的メンバ変数


Lyliane.numberofMedicalHerb


を初期化する働きがあるのです


ですので


Lyliane.numberofMedicalHerb=Lyliane.numberofMedicalHerb - 1;

cout << "薬草の数は" << Lyliane.numberofMedicalHerb << "個になった" << "\n";


が実行されると

Lyliane.numberofMedicalHerbは17 の値をもつことになるので


薬草の数は17個になった



プログラムの実行結果として


コマンドプロンプト画面に表示されることになります」


マックス「リリアーネが薬草を使うことを


プログラム上で表現できるようになったわけだ」


ソーラー「面白くなるのはここからなんだよ~😊」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る