EQQ.jp

Index


 

MinGW 2Dグラフィックス

 

2Dグラフィックス

MinGW で2次元グラフィックスを出力する方法は、いろいろありますが、ここでは、WinBGIm (Borland BGI Graphics emulation) をソースからコンパイルして、導入します。そして、ライフゲームの結果をグラフィックスで表示します。

 

WinBGIm のインストール

WinBGIm のソースプログラムは、インターネット上の、http://www.codecutter.net/tools/winbgim/ から、Download The WinBGIm 6.0 (Nov 2005) source code にある、”here” をクリックして、WinBGIm6_0_Nov2005_src.zip をダウンロードします。

ZIP ファイルを解凍し、winbgim.h, graphics.h の302行目にある、int right=0, int right=INT_MAX を int top=0, int right=INT_MAX に変更します。そして、make コマンドによりコンパイルを実行します。

以下のファイルを MinGW のインストールディレクトリにコピーします。

 

ライフゲームプログラム

ライフゲームの結果をグラフィック出力するソースプログラムを以下に示します。

#include        <stdio.h>
#include        <windows.h>
#include        <graphics.h>    // g++ life2g.c -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

#define MAXSTEP 600     // Step
#define BMX     79      // Max x size of board
#define BMY     48      // Max y size of board

int     b[BMX+2][BMY+2];        // Board Empty:0 Marked:3

void inputboard() {
        int     x;
        int     y;

        for(y = 0; y < BMY+2; y++) {
                for(x = 0; x < BMX+2; x++) {
                        b[x][y] = 0;
                }
        }

        b[40][14] = 3;
        b[40][15] = 3;
        b[40][16] = 3;
        b[41][14] = 3;
        b[39][15] = 3;
}

void outputboard(int i) {
        int     x;
        int     y;
        char    buf[128];

        sprintf(buf, "Step : %5d", i);
        setcolor(15);
        outtextxy(7, BMY * 7 + 10, buf);
}

void initscreen() {
        initwindow(600, 400, "Life game");
}

int countalive(int x, int y) {
        int cal = 0;

        if(b[x-1][y-1] > 1) cal ++;
        if(b[x-1][y] > 1) cal ++;
        if(b[x-1][y+1] > 1) cal ++;
        if(b[x][y-1] > 1) cal ++;
        if(b[x][y+1] > 1) cal ++;
        if(b[x+1][y-1] > 1) cal ++;
        if(b[x+1][y] > 1) cal ++;
        if(b[x+1][y+1] > 1) cal ++;
        return cal;
}

void nextstep() {
        int x;
        int y;
        int cal;

        for(y = 1; y <= BMY; y++) {
                for(x = 1; x <= BMX; x++) {
                        cal = countalive(x, y);
                        if(b[x][y] == 0) {
                                if(cal == 3) b[x][y] = 1;
                        } else if(b[x][y] == 3) {
                                if(cal < 2) b[x][y] = 2;
                                if(cal > 3) b[x][y] = 2;
                        } else {
                                printf("Unknown code of board[%d][%d]\n", x, y);
                        }
                }
        }
        for(y = 1; y <= BMY; y++) {
                for(x = 1; x <= BMX; x++) {
                        if(b[x][y] == 1) {
                                b[x][y] = 3;
                                setfillstyle(SOLID_FILL, 14);
                                setcolor(14);
                                fillellipse(x*7, y*7, 3, 3);
                        }
                        if(b[x][y] == 2) {
                                b[x][y] = 0;
                                setfillstyle(SOLID_FILL, 0);
                                setcolor(0);
                                fillellipse(x*7, y*7, 3, 3);
                        }
                }
        }
}

int main() {
        int i = 0;

        inputboard();
        initscreen();
        for(i = 1; i <= MAXSTEP; i++) {
                outputboard(i);
                nextstep();
        }
        return 0;
}

 

 

ソースプログラムを life2g.c とした場合、コンパイルは以下のように実行してください。

> g++ life2g.c -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

 

 

MinGW LifeGame 2D Graphics