複数のゲームキャラクターのデータをmain関数内で定義された構造体変数に格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます

ソーラー

「main関数内で定義された構造体変数のメンバ変数に


格納された

一人の

キャラクターcaracter1のステータスデータ

HP=10

MP=8

AP=22

TP=18

2倍にするプログラムは


次のプログラムでOK!だったね。


#include <stdio.h>

typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData*pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


printf("%d\n" ,pta->HP);

printf("%d\n" ,pta->MP);

printf("%d\n" ,pta->AP);

printf("%d\n" ,pta->TP);

}


int main(void)

{


CharacterStatusData charcter1StatusData={10,8,22,18};


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);


CharacterStatusData2bai(&charcter1StatusData);


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);


return 0;

}


コンパイル結果


10

8

22

18

20

16

44

36

20

16

44

36


ソーラー「ここで


構造体CharcterStatusDataの構造体変数charcter1StatusData


のメンバ変数に格納されている


ゲームキャラクターcharcter1のステータスデータ


HP=10

MP=8

AP=22

TP=18



ゲームキャラクターcharcter2のステータスデータ


HP=7

MP=28

AP=12

TP=30


を構造体変数をつかって2倍に変更するには


キャラクターcaracter1のステータスデータを2倍にした手順を

同時に

キャラクターcaracter2にもおこなえばいいんだね


そのためには


まず


ゲームキャラクターcharcter1、charcter2


のステータスデータを


構造体変数charcter1StatusData

構造体変数charcter2StatusData


のメンバ変数

charcter1StatusData.HP

charcter1StatusData.MP

charcter1StatusData.AP

charcter1StatusData.TP

charcter2StatusData.HP

charcter2StatusData.MP

charcter2StatusData.AP

charcter2StatusData.TP

に格納します



そして

構造体変数charcter1StatusData

構造体変数charcter2StatusData

のアドレス

&charcter1StatusData

&charcter2StatusData


構造体変数charcter1StatusDataのメンバ変数のアドレス

&charcter1StatusData.HP

&charcter1StatusData.MP

&charcter1StatusData.AP

&charcter1StatusData.TP

構造体変数charcter2StatusDataのメンバ変数のアドレス

&charcter2StatusData.HP

&charcter2StatusData.MP

&charcter2StatusData.AP

&charcter2StatusData.TP


を代表して


自作関数の引数であるポインタ変数ptaに渡し


構造体変数charcter1StatusDataのメンバ変数のアドレス

&charcter1StatusData.HP

&charcter1StatusData.MP

&charcter1StatusData.AP

&charcter1StatusData.TP

構造体変数charcter2StatusDataのメンバ変数のアドレス

&charcter2StatusData.HP

&charcter2StatusData.MP

&charcter2StatusData.AP

&charcter2StatusData.TP

のメモリに格納されている数値データが


自作関数によって2倍になるよう


次のようにプログラムを作製すればいいわけなんだね。



#include <stdio.h>

typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData* pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


/* 

void CharacterStatusData2bai(CharacterStatusData* pta)

このような


自作関数(ポインタ変数宣言)


の表記方法はmain関数内で定義された変数のアドレスを


自作関数の引数に参照(ポインタ渡し)するのに必要な表記法でしたね。


後にmain関数内で定義される

構造体変数charcter1StatusDataのアドレス&charcter1StatusData

構造体変数charcter2StatusDataのアドレス&charcter2StatusData

を格納するために


ptaのCharacterStatusData*型のポインタ変数宣言


CharacterStatusData* pta


を自作関数の()内で


おこなっています


構造体変数charcter1StatusDataのアドレスをポインタ変数ptaに渡すことにより


構造体変数charcter1StatusDataのメンバ変数のアドレス情報が


ポインタ変数ptaに渡されることになります


このとき


構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリに


格納されている数値データは


ポインタ変数ptaを使って


pta->HP

pta->MP

pta->AP

pta->TP


と表されます


構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリ


に格納されている数値データは


pta->HP

pta->MP

pta->AP

pta->TP


であらわされ


pta->HP

pta->MP

pta->AP

pta->TP

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


構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリに


格納されている数値データを


変更することができるようになります


ここでは


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;


構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリに


格納されている数値データを


2倍になるよう自作関数を定義しています


*/



}


int main(void)

{


CharacterStatusData charcter1StatusData={10,8,22,18};

CharacterStatusData charcter2StatusData={7,28,12,30};


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


CharacterStatusData2bai(&charcter1StatusData);

CharacterStatusData2bai(&charcter2StatusData);


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


return 0;

}


コンパイル結果


10

8

22

18

7

28

12

30

20

16

44

36

14

56

24

60



🌞

みなさん、このプログラムでは


すこしだけ


おもしろいことが行われています


どこだかお気付きになられましたか?


                 solarplexussより


🌞


ソーラー

「構造体CharcterStatusDataの構造体変数charcter1StatusData


のメンバ変数に格納されている


ゲームキャラクターcharcter1のステータスデータ


HP=7

MP=28

AP=12

TP=30


構造体CharcterStatusDataの構造体変数charcter2StatusData


のメンバ変数に格納されている


ゲームキャラクターcharcter2のステータスデータ


HP=7

MP=28

AP=12

TP=30


を2倍にすることができたね。


これでゲーム内でも


ゲームキャラクターcharcter1,charcter2のステータスデータ


は2倍になるってわけだ」


アレサ「はいっ


ここでは構造体を使って


ゲームキャラクター

charcter1

charcter2


の4つのステータスデータ


を2倍にすることができました。


同時に何人もの

ゲームキャラクター

charcter1

charcter2

charcter3

charcter4

charcter5

の4つのステータスデータ

を2倍にするのに


          構造体型の配列


がつかえるかどうかですね」


ソーラー「できるかどうかな?」


アレサ「はい🌞、


構造体型の配列のアドレスを


自作関数の引数であるポインタ変数に参照渡し(ポインタ渡し)を行い


その後


自作関数をつかって


構造体型の配列のアドレスのメモリに格納されている数値データに


変更を加えれば


構造体型の配列に


格納されている数値データに変更を加えることができる


つまり


同時に何人もの

ゲームキャラクター

charcter1

charcter2

charcter3

charcter4

charcter5

の4つのステータスデータ

を2倍にすることができます


そして


このことは


シューティングゲームにおいては


複数のシューティングの弾の位置を


同時に変更できるということをあらわしているのですの」


ソーラー「構造体型の配列を使ってそんなことができるかどうか検証してみるかな?」


アレサ「はい、ですの


ですが その前に・・・


ソーラー


「ははっ🌞 そうだね


実は先程のプログラムは


別に普通なんだけど


面白い構造になっているんだ・・・・


#include <stdio.h>

typedef struct CharacterStatusData

{

int HP;

int MP;

int AP;

int TP;

}CharacterStatusData;


void CharacterStatusData2bai(CharacterStatusData*pta){


pta->HP=2*pta->HP;

pta->MP=2*pta->MP;

pta->AP=2*pta->AP;

pta->TP=2*pta->TP;



}


int main(void)

{


CharacterStatusData charcter1StatusData={10,8,22,18};

CharacterStatusData charcter2StatusData={7,28,12,30};


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


CharacterStatusData2bai(&charcter1StatusData);

CharacterStatusData2bai(&charcter2StatusData);


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);

printf("%d\n" ,charcter2StatusData.HP);

printf("%d\n" ,charcter2StatusData.MP);

printf("%d\n" ,charcter2StatusData.AP);

printf("%d\n" ,charcter2StatusData.TP);


return 0;

}


コンパイル結果


コンパイル結果


10

8

22

18

7

28

12

30

20

16

44

36

14

56

24

60


どこだと思う?」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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