特攻隊

RPGツクール、パズル、プログラミング等々。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
雑誌で見かけて面白そうだったので作ってみた。アプロダからどうぞ。
次回はDOS以外で動くの作ろう。

ライフゲームのルールはこちら。




#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int cell[30][38];/* セル。0は死滅(□)、1は生存(■) */
int field[31][39];/* 描画用。(セル+カーソル) */
int x, y;/* 生存セル選択時におけるカーソル座標(1<x<38,1<y<30) */
int time;/* 時間が経過する速さ(1~200) */
int generation;/* 世代。0からスタートし、1ずつ増えていく */
int end;/* 1ならばシミュレーション終了 */

/* 関数プロトタイプ宣言 */
void initialize(void);
void cellselect(void);
void drawcell(void);
void next(void);

/* メイン関数 */
int main(void) {

int i;/* forループ用変数。 */

/* まず変数を初期化し、さらに(generation = 0)における生存セルの配置を決める */
initialize();
/* end = 1になるまでシミュレーションを繰り返す */
while(!end) {
/* まずcellを描画 */
drawcell();
/* iを0からインクリメントし、(100 * time)になるまでcellの状態を表示 */
for(i = 0; i < 100 * time; i++) {
/* シミュレーション中にスペースを押すと、そのゲームを終了する */
if(kbhit()) {
if (getch() == ' ') {
/* さらにスペースを押すとプログラム終了。その他のキーを押すと新たなゲーム */
system("cls");
printf("終了しますか?(スペースで終了、他のキーで新たなゲーム)");
while (!kbhit());
if(getch() == ' ') {
end = 1;
}
else {
initialize();
}
}
}
}
/* i == (100 * time)になったら、関数next()を呼び出し、whileループの最初に戻る */
next();
}
return 0;
}

/* 関数initialize():変数を初期化&(generation = 0)における生存セル配置を選択 */
void initialize(void) {

int i, j;/* forループ用変数 */
int correct = 0;/* timeの値が1~200の間に入っているかどうかチェック。入っていれば1、そうでなければ0 */

/* まず、必要な数値(x, y, generation, end ,cell[][], field[][])を全て初期化 */
x = y = 1;
generation = 0;
end = 0;
for(i = 0; i < 31; i++) {
for(j = 0; j < 39; j++) {
if ((i != 30) && (j != 38)) {
field[i][j] = cell[i][j] = 0;
}
else {
field[i][j] = -1;
}
}
}
/* 画面を消去し、画面処理の速さを入力 */
system("cls");
while(!correct) {
printf("画面処理の速さを、1~200の半角数字で入力してください:");
scanf("%d", &time);
if((time < 1) || (200 < time)) {
printf("入力エラー:1~200の半角数字で入力して下さい\n");
}
else {
correct = 1;
}
}
/* 生存セル配置方法の説明 */
printf("生存セルを配置して下さい");
printf("\n(a,w,d,zでカーソル移動、lで配置or消去、スペースで配置完了)");
printf("\n push any key.");
while(!kbhit());
/* 関数cellselect()の呼び出し */
cellselect();
}

/* 関数cellselect():生存セルの配置。関数initialize()より呼び出される */
void cellselect(void) {

int start = 0;/* スペースキーが押されたら値を1にして、シミュレーションスタート */

/* まず画面を消去 */
system("cls");
/* start = 1になる(スペースキーが押される)までループ */
while(!start) {
/* ボタンが押されたら、押されたボタンに応じて処理 */
if(kbhit()) {
switch(getch()) {
case 'w':
if(y != 1) y--;
break;
case 'a':
if(x != 1) x--;
break;
case 'z':
if(y != 30) y++;
break;
case 'd':
if(x != 38) x++;
break;
case 'l':
if(!cell[y-1][x-1]) cell[y-1][x-1] = 1;
else cell[y-1][x-1] = 0;
break;
case ' ':
start = 1;
}
/* セルを描画 */
drawcell();
}
}
}

/* 関数drawcell():セルとカーソルを描画。 */
void drawcell(void) {

int i, j;/* forループ用変数 */

system("cls");
for(i = 0; i < 31; i++) {
for (j = 0; j < 39; j++) {
/* まず、カーソルの位置を2にする */
if(!i) {
if(j == x) {
field[i][j] = 2;
}
else {
field[i][j] = -1;
}
}
else if(!j) {
if(i == y) {
field[i][j] = 2;
}
else {
field[i][j] = -1;
}
}
/* 次に、field[][]にcell[][]の数値を移す */
else {
field[i][j] = cell[i-1][j-1];
}
/* 最後にセルを描画(-1:" " 0:"□" 1:"■" 2:"◇") */
switch(field[i][j]) {
case -1:
printf(" ");
break;
case 0:
printf("□");
break;
case 1:
printf("■");
break;
case 2:
printf("◇");
}
}
printf("\n");
}
printf("\ngeneration:%d", generation);
}

/* 関数next():セルの生存、死滅、誕生を処理し、次の世代を作る */
void next(void) {

int i, j, k, l;/* forループ用変数 */
int sum = 0;/* あるセルの周りの生存セルの個数 */
int temp[30][38];/* 次世代のセルを一時保存する配列 */

/* generationをインクリメントする */
generation++;
/* cell[0][0]からcell[29][37]まで、次世代の生存セルを決定 */
for(i = 0; i < 30; i++) {
for(j = 0; j < 38; j++) {
/* まずtemp[][]にcell[][]の値を代入 */
temp[i][j] = cell[i][j];
/* セルの端ではない場所において、生存、死滅、誕生の処理を開始 */
if((i != 0)&&(j != 0)&&(i != 29)&&(j != 37)) {
/* cell[i][j]の周りの生存セルの個数sumを計算 */
for(k = -1; k < 2; k++) {
for(l = -1; l < 2; l++) {
if((k!=0) || (l!=0)) {
sum += cell[i+k][j+l];
}
}
}
/* cell[i][j] = 1 のとき、sumが2または3ならば次の世代も生存、そうでなければ死滅 */
if(cell[i][j]) {
if((sum != 2) && (sum != 3)) {
temp[i][j] = 0;
}
}
/* cell[i][j] = 0のとき、sumが3ならば次の世代にセルが誕生 */
else {
if(sum == 3) {
temp[i][j] = 1;
}
}
}
/* 端のセルは全て死滅 */
else {
temp[i][j] = 0;
}
sum = 0;
}
}
/* 次世代セルの決定が終わったら、temp[][]をcell[][]に代入する */
for(i = 0; i < 30; i++) {
for(j = 0; j < 38; j++) {
cell[i][j] = temp[i][j];
}
}
}
コメント
この記事へのコメント
どうも、パルソニックです。
いつも遊ばせて貰っています。
日に日にレベルの上がるもずくさんテラスゴス。

ライフゲーム懐かしいですね。
面白い組み合わせが見つかると楽しいですよねw

とりあえず、

===============
int x, y;/* 生存セル選択時におけるカーソル座標(1int time;/* 時間が経過する速さ(1~200) */
===============

ここはたぶんコピペミスですよね?

===============
int x, y;/* 生存セル選択時におけるカーソル座標 */
int time;/* 時間が経過する速さ(1~200) */
===============

たぶんこうだと思います。
あと、自分の間違えでなければ、
>system("cls");
これはstdlib.hをインクルードしないと使えなかった気がするのですが、
実行ファイルではちゃんと実行できているので勘違いでしょうか?

>次回はDOS以外で動くの作ろう。
実行ファイルで十分動作確認できたので、
DOSでも問題なさそうです。

グラフィックなどを使用したり、
ウィンドウ生成して滑らかな処理を行いたいのなら、
C++ではDirectXかOpenGLが最も手軽に作れると思います。
自分も詳しくないので、もっと色々ありそうです。

新作いつも楽しみにしています。
次の作品も頑張ってください!
2010/12/21(火) 20:05:14 | パルソニック | #D2xI14F.[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://mozuku88.blog134.fc2.com/tb.php/154-9b16a7b8
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。