第19回

構造体

98/11/06 IE4.xに対応させた
98/04/29メールアドレス訂正

あるロールプレイングゲームに、マイキャラ、友人A、中ボス、ボスの4人のキャラクターが登場するとします。そして、それらのキャラクターの能力は、レベル、HP、MPの3つの要素からなるとします。
当然、それらの値は、何らかの変数によって管理することになります。というわけで、まずは、それらの変数の宣言部分を記述してみることにしましょう。以下のような感じになると思います。
#include<stdio.h>
main(){
    int mycharlv,mycharhp,mycharmp;          /* マイキャラのLV,HP,MP  */
    int alv,ahp,amp;                         /*  友人AのLV,HP,MP      */
    int tyubosslv,tyubosshp,tyubossmp;       /*  中ボスのLV,HP,MP     */
    int bosslv,bosshp,bossmp;                /*  ボスのLV,HP,MP       */
(以下省略)
見ての通り、ここでは「キャラクター数*能力の要素数」分の変数を宣言しています。まぁ、ここでは登場人物が4人だけなので、こういった記述の仕方でもそれほど支障は無いのかもしれません。しかし、もしこれが、パーティのメンバー5人と、敵の四天王、真のボスにマスコット的援助キャラ、隠れキャライーザーカー(ってどさくさに紛れるな)など、登場人物がかなり多い場合はどうでしょう。しかも、能力の要素の方も、攻撃力や必殺率、防御率、すばやさ、回避率等、いろいろと細分化されているとしたらどうでしょう。少なくとも、こういった記述の仕方では、かなり見辛いプログラムになってしまうことは間違いありません。
配列を使って、mychar[0]はマイキャラのLV、mychar[1]はマイキャラのHP・・・とする手もあります。しかしこの方法でも、後になって見た時に、ちょっと訳が分からなくなる可能性大です(し、実際には変数の型がどれも同じとは限りません)。
こういった時に、非常に便利なのが構造体です。
構造体を用いて「人物」という型を作ってしまい、変数の型を宣言するかのように、

struct 人物 マイキャラ,友人A,中ボス,ボス;

としてしまえばいいのです。

#include<stdio.h>
struct zinbutsu{    /*    人物     */ 
    int lv;         /*         LV  */
    int hp;         /*         HP  */
    int mp;         /*         MP  */
};
main(){
    struct zinbutsu mychar,a,tyuboss,boss; /*  マイキャラと友人A、中ボス、ボスの宣言  */
(以下省略)
といった感じです。
それでもって、例えば、マイキャラのLVを7、HPを50、MPを25にしたい時は、
    /*  マイキャラのLVとHP、MP設定  */
    mychar.lv=7;
    mychar.hp=50;
    mychar.mp=25;
と書けばいいのです。

また、以下のプログラムのように、zinbutsu構造体の宣言と共に、マイキャラとボスを宣言することも可能です。
#include<stdio.h>
struct zinbutsu{ int lv,hp,mp; }mychar,boss;

main(){

    /*  マイキャラのLVとHP、MP   */
    mychar.lv=7;
    mychar.hp=50;
    mychar.mp=25;

    /*  ボスのLVとHP、MP        */
    boss.lv=30;
    boss.hp=500;
    boss.mp=100;
(以下省略)

さらに、構造体の名前(つまりzinbutsu)を宣言しない方法もあります。

struct{ int lv,hp,mp; }mychar,boss;

typedefを使って、以下のように書く方法もあります。mychar、bossをzinbutsu型として宣言しているところに注目して下さい。

#include<stdio.h>
typedef struct{ int lv,hp,mp; }zinbutsu;

main(){
    zinbutsu mychar,boss; /*  マイキャラとボスの宣言  */
    /*  structが無い...zinbutsu型として宣言している */  

    /*  マイキャラのLVとHP、MP   */
    mychar.lv=7;
    mychar.hp=50;
    mychar.mp=25;

    /*  ボスのLVとHP、MP        */
    boss.lv=30;
    boss.hp=500;
    boss.mp=100;
(以下省略)

つづく。


[メニュー][第18回][第19.5回]

いーざ
email:CQP00202@nifty.ne.jp