天国にいけるC言語入門 ヘキサ構造体 ver5.2130
複数のゲームキャラクターのデータをmain関数内で定義された構造体変数に格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます
複数のゲームキャラクターのデータを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
どこだと思う?」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます