🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
ゲームキャラクターが共同で使用する薬草などのアイテム(道具)の数を静的メンバ変数を用いることにより管理することができます
ゲームキャラクターが共同で使用する薬草などのアイテム(道具)の数を静的メンバ変数を用いることにより管理することができます
ゲームキャラクターが共同で使用する薬草などのアイテム(道具)の数を静的メンバ変数を用いることにより管理することができます
まずは 以下のプログラムをご覧ください
👇
#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個になった
が
プログラムの実行結果として
コマンドプロンプト画面に表示されることになります」
マックス「リリアーネが薬草を使うことを
プログラム上で表現できるようになったわけだ」
ソーラー「面白くなるのはここからなんだよ~😊」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます