複数のゲームキャラクターのデータを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};


CharacterStatusData2bai(&charcter1StatusData);


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

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

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

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


return 0;

}


コンパイル結果


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.HP

&charcter1StatusData.MP

&charcter1StatusData.AP

&charcter1StatusData.TP

&charcter2StatusData.HP

&charcter2StatusData.MP

&charcter2StatusData.AP

&charcter2StatusData.TP


を代表して


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


アドレスに格納されている数値が


自作関数によって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のアドレスを格納するために


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};


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;

}


コンパイル結果

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};


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;

}


コンパイル結果

20

16

44

36

14

56

24

60

どこだと思う?」

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

作者を応援しよう!

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

応援したユーザー

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