キャラクターの複製をするときはご用心(*^▽^*) 代入演算子=のオーバーロードはどのようなときにおこなわれるのでしょうか?仕組みを学んでみましょう

Visual Studio2018版 ゲームキャラクターの複製をつくるときにはご用心 代入演算子=のオーバーロードはどのようなときにおこなわれるのでしょうか?

ご注意ください このエピソードの内容は一部


Visual Studio2018以前のヴァージョンだけに対応しています


Visual Studio2018以降のヴァージョンであるVisual Studio2019などでは


ビルド実行できないプログラムが含まれています







ソーラー「それでは


今日は


妖精さんタイプのゲームキャラクターのデータを


クラスを用いて取り扱ってみたいと思います」



マックス「ほほう?」



ソーラー「えへへ 今日はたくさん妖精さんに登場してもらおうと思うんだ~♪


妖精さんタイプの


同じステータスデータをもつ


ゲームキャラクターの複製をおこなっていくことになるんだけど


そのときに面白いことがおこることがあるんだよ」



マックス「同じステータスデータをもつ


ゲームキャラクターの複製??


ど~いうことぉ?」


ソーラー「例えばHP,MPも全く同じ妖精さん


FairyA

FairyB

FairyC


が生成される場合


なんかに


面白いことがおこることがあるんです」



マックス「面白いことって俺のことか😊?」


ソーラー「・・・ほかにも


原理的には同じですが


自分と同じステータスをもつキャラクター


を生成する場合も


面白いことがおこることがあるんです・・・」



マックス「どうやら キャラクターの複製の話が関係してくるようだが・・・


面白いことなんておこるのか?」



ソーラー「う~ん ちょくちょくみかけるかな?


それでは はじめてみようよ


まあ、まずは


妖精さんのステータスデータを取り扱うための


Fairyクラスの作製からはじめてみようかな


FairyAさんではさみしいから


サニーちゃん

リリーナちゃん

オデットちゃん


という名前の妖精さんに登場してもらおうかな


サニーちゃん

リリーナちゃん

オデットちゃん


という名前のゲームキャラクターは


妖精というカテゴリーに属しているので


クラス名は


Fairyに設定します


(クラス名は最初の1文字目は


Fairy👈最初の1文字目は大文字F


のように


最初の1 文字を大文字にするというのが慣例になっています)



そしてまず


サニーちゃん

という名前のゲームキャラクターは


サニーちゃんという名前

HP(体力)1

MP( 精霊エネルギー力)100

その他特徴 遊ぶの大好き


というデータをもっているとします」


マックス「おっ その他特徴か


新しい項目だな」



ソーラー「そうだね


そこで


サニーちゃんという名前

HP(体力)1

MP( 精霊エネルギー力)100

その他特徴 遊ぶの大好き 


のデータを取り扱うために


クラスFairyのクラス宣言にメンバ変数宣言


string name;

int HP;

int MP;

char* i;

を設定してみたいと思います


そうなると


Fairyのクラス宣言は


class Fairy{


string name;

int HP;

int MP;

char* i;


};


となります


そして今


サニーちゃんという名前

HP(体力)1

MP( 精霊エネルギー力)100

その他特徴 遊ぶの大好き 


というステータスデータを取り扱うための



クラスGameCharacterのメンバ変数


name

HP

MP

i


を設定したのに続いて


サニーちゃんという名前

HP(体力)1

MP( 精霊エネルギー力)100

その他特徴 遊ぶの大好き! 


をコマンドプロンプト画面に表示するための


クラスGameCharacterのメンバ関数を設定してみたいと思います


その関数の名前はstatusDataDisplayにしますね


(関数の名前の付け方は


最初の1文字目は

statusのsのように小文字

それ以降は

Data

Display

のように

単語ごとに


最初の1 文字を大文字にするというのが慣例になっています


status👈最初の1文字目は小文字s

Data👈最初の1文字目は大文字D

Display👈最初の1文字目は大文字D


このように設定することで


statusDataDisplay



クラス名でなく関数名であることを分かりやすくしているというわけです



そして


statusDataDisplayのクラスFairyのメンバ関数宣言は


void statusDataDisplay();


とし


クラスFairyのメンバ関数statusDataDisplay()


の定義は


void Fairy::statusDataDisplay(){


cout << name << "\n";

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

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

cout << "その他特徴 " << i<<"\n";

}


とします


さっそく

この

クラスFairy

メンバ関数statusDataDisplay()の定義が

もちいられたプログラムを実行してみましょう


楽しみですね」


#include <iostream>

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

using namespace std;


class Fairy{


public:

string name;

int HP;

int MP;

char* i;

void statusDataDisplay();


};




void Fairy::statusDataDisplay(){


cout << name << "\n";

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

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

cout << "その他特徴 " << i<<"\n";

}


int main() {


Fairy Sunny;


//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞


Sunny.name = "サニーちゃん";

Sunny.HP = 1;

Sunny.MP = 100;

Sunny.i="遊ぶの大好き!";//👈🌞このポインタ変数を用いて文字列データをメモリに格納する部分がVisual Studio2019以降のバージョンでは実行できません



Sunny.statusDataDisplay();


return 0;

}


ビルド実行結果


Visual Studio2018の場合


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!


Visual Studio2019以降のヴァージョンでは実行できません


Visual Studio2019以降のヴァージョンの場合


ビルド実行結果


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

エラー C2440 '=': 'const char [14]' から 'char *' に変換できません。

エラー (アクティブ) E0513 型 "const char *" の値を型 "char *" のエンティティに割り当てることはできません


が表示されます



マックス「な、なんか


キャラクターデータを取り扱ってる感がでてるじゃないか!


HPと1

MPと100

の間に空白部分が設置されているじゃないか


ゲーム画面ぽくなってきた!」


てんC「


サニーちゃんという名前のゲームキャラクターのデータ

👇

サニーちゃんという名前

HP(体力)1

MP( 精霊エネルギー力)100

その他特徴 遊ぶの大好き! 


クラスFairy型のオブジェクトSunnyを用いて取り扱うことができていますね


サニーちゃんのデータをとりあつかうので


クラスFairy型のオブジェクトの名前をSunnyに設定しているのですね」



ソーラー「ここで


今度は


リリーナという名前の妖精のデータを


クラスFairyを用いて取り扱ってみたいと思います


リリーナという名前のゲームキャラクターは


リリーナという名前

HP(体力)1

MP( 精霊エネルギー力)100

その他特徴 遊ぶの大好き! 


というデータをもっているとします」


マックス「なんか サニーちゃんとリリーナちゃんで


名前以外はステータスデータが一緒じゃないか」


ソーラー「そうなんです


そこで


クラスFairy型のオブジェクトLillynaを用いて


リリーナという名前の妖精のデータを取り扱って行きたいと思います


サニーちゃんとリリーナちゃんはほぼデータ内容が一緒なので



クラスFairy型のオブジェクトSunnyを生成した後

クラスFairy型のオブジェクトLillynaに

クラスFairy型のオブジェクトSunny


を代入して


クラスFairy型のオブジェクトLillynaに

クラスFairy型のオブジェクトSunny

の持っているデータを代入してみたいと思います


#include <iostream>

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

using namespace std;


class Fairy{


public:

string name;

int HP;

int MP;

char* i;

void statusDataDisplay();


};




void Fairy::statusDataDisplay(){


cout << name << "\n";

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

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

cout << "その他特徴 " << i<<"\n";

}


int main() {


Fairy Sunny;


//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞


Sunny.name = "サニーちゃん";

Sunny.HP = 1;

Sunny.MP = 100;

Sunny.i="遊ぶの大好き!";

Sunny.statusDataDisplay();


Fairy Lillyna;


Lillyna=Sunny;


Sunny.statusDataDisplay();

return 0;

}


ビルド実行結果


Visual Studio2018の場合


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!


注意 上記のプログラムはVisual Studio2019以降のヴァージョンでは実行できません





マックス「折角クラスFairy型のオブジェクトLillynaをもちいているのに


クラスFairy型のオブジェクトLillyna

クラスFairy型のオブジェクトSunnyが代入される


Lillyna=Sunny;


が実行されているので


Lillyna.name =Sunny.name


が実行され


Lillyna.nameに "サニーちゃん"が代入されているじゃないか


なので


リリーナの名前までがサニーちゃんになっているぞ」


ソーラー「あ、そうですね


Lillyna=Sunny;

Lillyna.name = "リリーナちゃん";


を実行して




名前はリリーナちゃんにしないとね


そのプログラムはこちらです


👇

#include <iostream>

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

using namespace std;


class Fairy{


public:

string name;

int HP;

int MP;

char* i;

void statusDataDisplay();


};




void Fairy::statusDataDisplay(){


cout << name << "\n";

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

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

cout << "その他特徴 " << i<<"\n";

}


int main() {


Fairy Sunny;


//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞


Sunny.name = "サニーちゃん";

Sunny.HP = 1;

Sunny.MP = 100;

Sunny.i="遊ぶの大好き!";

Sunny.statusDataDisplay();


Fairy Lillyna;


Lillyna=Sunny;

Lillyna.name = "リリーナちゃん";

Lillyna.statusDataDisplay();

return 0;

}


ビルド実行結果


Visual Studio2018の場合


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

リリーナちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 


Visual Studio2019以降のヴァージョンでは実行できません



マックス「ほほう


遊ぶの大好き! 


な妖精が増えたってわけだ」


ソーラー「今度はオデットという妖精に登場してもらいましょう


そのプログラムはこちらです


👇

#include <iostream>

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

using namespace std;


class Fairy{


public:

string name;

int HP;

int MP;

char* i;

void statusDataDisplay();


};




void Fairy::statusDataDisplay(){


cout << name << "\n";

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

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

cout << "その他特徴 " << i<<"\n";

}


int main() {


Fairy Sunny;


//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞


Sunny.name = "サニーちゃん";

Sunny.HP = 1;

Sunny.MP = 100;

Sunny.i="遊ぶの大好き!";

Sunny.statusDataDisplay();


Fairy Lillyna;


Lillyna=Sunny;

Lillyna.name = "リリーナちゃん";


Lillyna.statusDataDisplay();


Fairy Odette;


Odette=Sunny;

Odette.name = "オデットちゃん";

Odette.statusDataDisplay();




return 0;

}


ビルド実行結果


Visual Studio2018の場合


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

リリーナちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

オデットちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!


Visual Studio2019以降のヴァージョンでは実行できません




マックス「おおう、どんどん遊ぶの大好き!な


妖精がふえているな」


ソーラー「


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

リリーナちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

オデットちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!


仲良し妖精ってわけだね(*^▽^*)


ここで


サニーちゃんの


              💖その他特徴💖を


おっとり


に変更したいと思います


どうしたらいいと思うかな?」


マックス「にゃははは 


サニーちゃんの



              💖その他特徴💖


をか?


そんなんでいいのか?


そんなの簡単だろう


クラスFairy型のオブジェクトSunnyのメンバ変数


Sunny.i


を用いて


Sunny.i="遊ぶの大好き!";


を実行し


文字列データ "遊ぶの大好き!"


をメモリ領域に格納しているわけだ


そのとき


文字列データ "遊ぶの大好き!"


を格納しているメモリ領域の先頭のメモリのアドレスが


クラスFairy型のオブジェクトLillynaのメンバ変数


Sunny.i


に格納されているんだろう



そのメモリ領域に


"おっとり"


という文字列データを代入するには


strcpy_s関数を用いて


strcpy_s(Sunny.i, 50, "おっとり");


を実行すればいいってわけだ


フハハ 簡単だな」


ソーラー「よく


strcpy_s関数の使い方を覚えていたね


そう


strcpy_s関数をもちいれば


strcpy_s関数の


第1引数のポインタ変数の格納しているアドレスのメモリを先頭とするメモリ領域にあてて


第3引数に記述されている文字列データを


格納することができましたね


それでは


strcpy_s関数を用いて


strcpy_s(Sunny.i, 50, "おっとり");


を実行し


サニーちゃんの


              💖その他特徴💖を


おっとり


に変更したいと思います


そのプログラムはこちらです」


👇

#include <iostream>

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

using namespace std;


class Fairy{


public:

string name;

int HP;

int MP;

char* i;

void statusDataDisplay();


};




void Fairy::statusDataDisplay(){


cout << name << "\n";

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

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

cout << "その他特徴 " << i<<"\n";

}


int main() {


Fairy Sunny;


//🌞SunnyのFairy型のオブジェクト宣言を実行しています🌞


Sunny.name = "サニーちゃん";

Sunny.HP = 1;

Sunny.MP = 100;

Sunny.i="遊ぶの大好き!";





Sunny.statusDataDisplay();


Fairy Lillyna;


Lillyna=Sunny;

Lillyna.name = "リリーナちゃん";


Lillyna.statusDataDisplay();


Fairy Odette;


Odette=Sunny;

Odette.name = "オデットちゃん";

Odette.statusDataDisplay();



strcpy_s(Sunny.i, 50, "おっとり");//👈🌞ここです


Sunny.statusDataDisplay();

Lillyna.statusDataDisplay();

Odette.statusDataDisplay();



return 0;


}


ビルド実行結果


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

リリーナちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

オデットちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!

サニーちゃん

HP 1

MP 100

その他特徴 おっとり

リリーナちゃん

HP 1

MP 100

その他特徴 おっとり

オデットちゃん

HP 1

MP 100

その他特徴 おっとり



マックス「どうだあ


余裕だろう


みろ


ビルド実行結果


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!


だったのが


ビルド実行結果


サニーちゃん

その他特徴 おっとり


に見事に変更されているだろう


めでたし めでたし」


ソーラー「といいたいところなんだけど・・・」


マックス「ははは


完璧過ぎてほめたりないってわけか


それも仕方がないこと・・・だな


そうか


完璧な知性を前に畏敬の念を抱くのも無理はない


いいだろう いいだろう


どんどん称賛していいぞ」


ソーラー「い、いや


ビルド実行結果を


もう一度ご覧ください」

👇


マックス「芸術的な結果をもう一度鑑賞したいのか


いいことだ」

👇

ビルド実行結果


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

リリーナちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

オデットちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!

サニーちゃん

HP 1

MP 100

その他特徴 おっとり

リリーナちゃん

HP 1

MP 100

その他特徴 おっとり

オデットちゃん

HP 1

MP 100

その他特徴 おっとり



マックス「うむうむ いいなあ これ・・・


うむうむ


・・


・・・て・・・

おや・・・


・・


サニーちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

リリーナちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き! 

オデットちゃん

HP 1

MP 100

その他特徴 遊ぶの大好き!

👇

サニーちゃん

HP 1

MP 100

その他特徴 おっとり

リリーナちゃん

HP 1

MP 100

その他特徴 おっとり

オデットちゃん

HP 1

MP 100

その他特徴 おっとり

👆



👇この部分


サニーちゃん

HP 1

MP 100

その他特徴 おっとり

リリーナちゃん

HP 1

MP 100

その他特徴 おっとり

オデットちゃん

HP 1

MP 100

その他特徴 おっとり

👆



・・・


!?


なんだ!?


サニーちゃん

その他特徴 おっとり


はいいんだが


リリーナちゃん

その他特徴も


 おっとり


オデットちゃん

その他特徴も


 おっとり


になっているぞ


             なぁんでだ


ぐぬ


ぐぬぬぅぅ


そんなにおっとりになりたいのか」


ソーラー「


strcpy_s関数をもちいれば


strcpy_s関数の


第1引数のポインタ変数の格納しているアドレスのメモリを先頭とするメモリ領域にあてて


第3引数に記述されている文字列データを


格納することができましたね」



マックス「


そう だからこそ



strcpy_s関数を用いて


strcpy_s(Sunny.i, 50, "おっとり");


を実行し


サニーちゃんの


              💖その他特徴💖を


おっとり


に変更したんだろう」


ソーラー「この


strcpy_s関数の


第1引数のポインタ変数の格納しているアドレスのメモリを先頭とするメモリ領域にあてて


第3引数に記述されている文字列データを


格納することができるというところがポイントなんです」


マックス「なんで~」


ソーラー「先ほどのプログラムでは


クラスFairy型のオブジェクトSunnyのメンバ変数


Sunny.i


を用いて


Sunny.i="遊ぶの大好き!";


を実行し


文字列データ "遊ぶの大好き!"


をメモリ領域に格納しました


そのとき


文字列データ "遊ぶの大好き!"


を格納しているメモリ領域の先頭のメモリのアドレスが


クラスFairy型のオブジェクトLillynaのメンバ変数


Sunny.i


に格納されていますね



その後


Lillyna=Sunny;


Odette=Sunny;


を実行しているので


Lillyna.i=Sunny.i;


Odette.i=Sunny.i;


が実行されています


となると


文字列データ "遊ぶの大好き!"


を格納しているメモリ領域の先頭のメモリのアドレスが


クラスFairy型のオブジェクトLillynaのメンバ変数


Lillyna.i


クラスFairy型のオブジェクトOdetteのメンバ変数


Odette.i


に格納されていることになります


そのため


Sunny.statusDataDisplay();


が実行されると


cout << Sunny.name << "\n";

cout << "HP " << Sunny.HP << "\n";

cout << "MP " <<Sunny.MP<<"\n";

cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです


が実行されて


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


その他特徴 遊ぶの大好き!


が表示されることになります」


マックス「おお いいじゃないか」


ソーラー「で 


Lillyna.statusDataDisplay();


が実行されると


cout << Lillyna.name << "\n";

cout << "HP " << Lillyna.HP << "\n";

cout << "MP " << Lillyna.MP<<"\n";

cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです


が実行されるのですが


Lillyna.i=Sunny.i;


が実行されているので


cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです


が実行されることに等しくなり


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


その他特徴 遊ぶの大好き!


が表示されることになります」


マックス「いいじゃないか」


ソーラー「で 


Odette.statusDataDisplay();


が実行されると


cout << Odette.name << "\n";

cout << "HP " << Odette.HP << "\n";

cout << "MP " << Odette.MP<<"\n";

cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです


が実行されるのですが


Odette.i=Sunny.i;


が実行されているので


cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです


が実行されることに等しくなり


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


その他特徴 遊ぶの大好き!


が表示されることになります」


マックス「おおう いいじゃないか」


ソーラー「さあて 準備完了ってところだね」


マックス「ほええ?」


ソーラー「


この状態で


文字列データ "遊ぶの大好き!"


を格納しているメモリ領域に


"おっとり"


という文字列データを代入するのに


strcpy_s関数を用いて


strcpy_s(Sunny.i, 50, "おっとり");


を実行すると


クラスFairy型のオブジェクトSunnyのメンバ変数


Sunny.i


が格納しているアドレスのメモリを先頭とするメモリ領域


に文字列データ"おっとり"


が格納されます


そのため


Sunny.statusDataDisplay();


が実行されると


cout << Sunny.name << "\n";

cout << "HP " << Sunny.HP << "\n";

cout << "MP " <<Sunny.MP<<"\n";

cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです


が実行されて


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


その他特徴 おっとり


が表示されることになります」


マックス「おお いいじゃないか」


ソーラー「で 



Sunny.statusDataDisplay();

の次に

Lillyna.statusDataDisplay();


が実行されると


cout << Lillyna.name << "\n";

cout << "HP " << Lillyna.HP << "\n";

cout << "MP " << Lillyna.MP<<"\n";

cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです


が実行されるのですが


Lillyna.i=Sunny.i;


が実行されているので


cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです


が実行されることに等しくなり


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


その他特徴 おっとり


が表示されることになります」


マックス「な、なにぃ!


strcpy_s(Sunny.i, 50, "おっとり");


を実行しているだけなのにぃ」


ソーラー「で 


Odette.statusDataDisplay();


が実行されると


cout << Odette.name << "\n";

cout << "HP " << Odette.HP << "\n";

cout << "MP " << Odette.MP<<"\n";

cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです


が実行されるのですが


Odette.i=Sunny.i;


が実行されているので


cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです


が実行されることに等しくなり


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


その他特徴 おっとり


が表示されることになります」


マックス「


そんなことになっているのか



どうやら

Sunny.i

Lillyna.i

Odette.i


の格納しているアドレスが同じなため


strcpy_s(Sunny.i, 50, "おっとり");


を実行して


Sunny.iの格納しているアドレスのメモリを先頭とするメモリ領域に


文字列データ"おっとり"を格納して



Sunny.statusDataDisplay();

Lillyna.statusDataDisplay();

Odette.statusDataDisplay();


を実行した場合


すなわち


cout << Sunny.name << "\n";

cout << "HP " << Sunny.HP << "\n";

cout << "MP " <<Sunny.MP<<"\n";

cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです


cout << Lillyna.name << "\n";

cout << "HP " << Lillyna.HP << "\n";

cout << "MP " << Lillyna.MP<<"\n";

cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです


cout << Odette.name << "\n";

cout << "HP " << Odette.HP << "\n";

cout << "MP " << Odette.MP<<"\n";

cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです


を実行した場合


(注目ポイントは

👇

cout << "その他特徴 " << Sunny.i<<"\n";//👈🌞ここです

cout << "その他特徴 " << Lillyna.i<<"\n";//👈🌞ここです

cout << "その他特徴 " << Odette.i<<"\n";//👈🌞ここです

👆

の部分です





ビルド実行結果


サニーちゃん

HP 1

MP 100

その他特徴 おっとり

リリーナちゃん

HP 1

MP 100

その他特徴 おっとり

オデットちゃん

HP 1

MP 100

その他特徴 おっとり


が表示される・・・って




      🌞🌞🌞そんなことあたりまえのことか~い🌞🌞🌞



ソーラー「そう


      🌞🌞🌞あたりまえのことなんです🌞🌞🌞



これにてお話は終了かな?」




            🌞はい 終了です🌞




マックス「


じゃあ


サニーちゃん

その他特徴だけを


 おっとり


にして


リリーナちゃん

その他特徴は


遊ぶの大好き! 


オデットちゃん

その他特徴は


遊ぶの大好き! 



のままにするようにするにはどうしたらいいんだ?」




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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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