続・c言語入門の記事です。ファイル処理と簡易ゲーム

記事
IT・テクノロジー
最初のファイル処理としてテキストファイルが適しています。
続けてバイナリファイルです。

まず、以下のプログラムを入力してください。
#include<stdio.h>
int main()
{
    FILE *fp;
    int i,num;
    fp=fopen("inputdata.txt","w");
    for(i=0;i<5;i++)
    {
        printf("input data?\n->");
        scanf("%d",&num);
        fprintf(fp,"%d\n",num);
    }
    fclose(fp);
}
DOS画面のプログラムが終了した後に
DOS画面でそのプログラムのあるディレクトリ内で
inputdata.txtと入力してエンターを押すと
入力された値がメモ帳などのtxtファイルの拡張子に対応したアプリが
立ち上がるはずです。

面白い実験をWINAPIと行うことができます。
マウスの座標を動かす実験です。


#include<stdio.h>
#include<windows.h>

#define INPUT 0
#define OUTPUT 1
int main()
{
    FILE *fp;
    int i,num;
    POINT PT;
    int Mode=OUTPUT;//ココをINPUTかOUTPUTかに書き換える
    if(Mode==INPUT)
        fp=fopen("mouse.txt","w");
    if(Mode==OUTPUT)
        fp=fopen("mouse.txt","r");
    i=0;
    if(Mode==INPUT)
    {
        while(1)
        {
            GetCursorPos(&PT);
            if(GetAsyncKeyState(VK_ESCAPE)<0)
            {
                //ESCで脱出
                fprintf(fp,"%d,%d\n",99999,99999);
                break;
            }
            Sleep(1000/60);
            i++;
            if(i<60*7)
            {
                fprintf(fp,"%d,%d\n",PT.x,PT.y);
            }else{
                break;
            }
        }
        printf("プログラムは終了しました。\n");
    }
    if(Mode==OUTPUT)
    {
        int MouseX,MouseY;
        while(1)
        {
            if(GetAsyncKeyState(VK_ESCAPE)<0)
            {
                //ESCで脱出
                break;
            }
            Sleep(1000/60);
            i++;
            if(i<60*7)
            {
                fscanf(fp,"%d,%d",&PT.x,&PT.y);
            }else{
                break;
            }
            if(PT.x==99999 || PT.y==99999)
                break;
            //GetCursorPos(&PT);
            SetCursorPos(PT.x,PT.y);
            ShowCursor(TRUE);
        }
        printf("プログラムは終了しました。\n");
    }
    fclose(fp);
}



このプログラムだけでマウスの動きをスクリーン座標で取得して再現しているので作者の自分も少し驚きました。
ここで、やっていることはif文でテキストデータの書き込みの時に
fp=fopen(ファイル名,"w");
...
テキストデータの書き込みに
fprintf(fp,"%d,%d\n",PT.x,PT.y);

テキストデータの読み込みに
fp=fopen(ファイル名,"r");
...と
fscanf(fp,"%d,%d",&PT.x,&PT.y);
とやってます。

マウスの座標の取得は
POINT PT;
GetCursorPos(&PT);
です。

マウスの座標を与えるのが
SetCursorPos(PT.x,PT.y);
です。

ESCAPEキーを押すと
番兵の99999,99999の座標が与えられて
終了です。
ここで注意すべきことは、マウス座標を99999,99999
してはいけないということです。
なのでif文で99999になったらbreakでループを抜けています。


テキストファイルの処理が大体分かっていただけたと思うので
バイナリファイルを入出力します。

まず、メッセージボックスのアドベンチャーゲームです。


#include<stdio.h>
#include<windows.h>
typedef struct{
    char INST;
    char DATA[256];
    char YES;
    char NO;
}MEIREI;
#define INPUT 0
#define OUTPUT 1
void main()
{
 char PRINT=0;
 char IF=1;
 char END=2;
    FILE *fp;
    int Mode=OUTPUT;
    int LineNumber=0;
    MEIREI b[10];
    if(Mode==INPUT)
    {
        fp=fopen("meirei.bin","wb");
        MEIREI a[]={
      {PRINT,"ボクは、誰だ!?記憶がない",0,0},
      {PRINT,"どうして、こんな事になったのだろうか?",0,0},
      {IF,"上を見る",3,0},
            {PRINT,"何か書いてある。宝を探せ",0,0},
            {IF,"左を見る",5,0},
            {PRINT,"宝を見つけました。ゲームクリアおめでとう!!",0,0},
   {END,"終了します。",0,0},
        };
        fwrite(a,sizeof(a),1,fp);
        printf("命令を書き込みました。\n");
    }
    if(Mode==OUTPUT)
    {
        int id;
        fp=fopen("meirei.bin","rb");
        fread(b,sizeof(b),1,fp);
        while(1){
            //Sleep(10000);
            if(b[LineNumber].INST==PRINT){
                id=MessageBox(NULL,b[LineNumber].DATA,"HenaHenaNovel",MB_OK);
                if(id==IDOK)
                    LineNumber++;
   }else if(b[LineNumber].INST==IF){
                id=MessageBox(NULL,b[LineNumber].DATA,"HenaHenaNovel",MB_YESNO);
                if(id==IDYES)
                    LineNumber=b[LineNumber].YES;
                else if(id==IDNO)
                    LineNumber=b[LineNumber].NO;
   }else if(b[LineNumber].INST==END){
    break;
   }
        }
    }
    printf("プログラム終了です。");
    fclose(fp);
}

意外とすんなり動きました。バイナリファイルじゃなくてテキストファイルでもいけそうでしたが、今回はバイナリファイルにしてみました。

さて、テキストファイルもバイナリファイルもやったので
お楽しみのゲームプログラムにとりかかりましょう。


〇ンバーマンにチャレンジです。

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す