ライフゲームという課題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ガブリチュウ

ライフゲームという課題について

#1

投稿記事 by ガブリチュウ » 18年前

今学校の課題でライフゲームというものがあります
ライフゲームとは・・・そのままコピペします

ライフと呼ばれるゲームがあります.1970年に英国の数学者コンウェイが考案
したもので,碁盤状の升目に初期パターンを作り,時刻とともにそれが変化する様
子を見て楽しむゲームです.
 このゲームで,パターンの現れる宇宙は縦横ともにサイズNの碁盤目状であり,時刻
t で位置(i, j)のセルは, on または off のいずれかの値を取ります.時刻 t+1 で
の位置 (i, j) にあるセルの値は,現在のセルの値およびその周囲の8セルの値によ
り,次の規則により決定されます.
(A)もし,onの値を持つ周囲のセル数が0または1なら,過疎状態のためセルの値は
off となる.
(B)もし,on の値を持つ周囲のセル数が2なら,セルの値は現在の値のままとなる
(C)もし,on の値を持つ周囲のセル数が3なら,適度の密度であるためセルの値は
on となる.
(D)もし,on の値を持つ周囲のセル数が4以上なら,過密状態のためセルの値は
off となる.
 なお規則の適用に当たっては,時刻tでのセルの値を保持したままで,すべてのセル
 の t+1時点での値を一挙に計算するものとします.
 盤のサイズを 5*5 とし,セルが off の状態を"."で, on の状態を"o"で表すと,
 例えば以下のようなパターンの変化が観察される.

..... ..... .....
..... ..o.. .....
.ooo. => ..o.. => .ooo. 周期2で振動
..... ..o.. ..... (ブリンカー)
..... ..... .....

..... ..... .....
.oo.. .oo.. .oo..
.oo.. => .o... => .oo.. 周期2で振動
...oo ....o ...oo
...oo ...oo ...oo

...o. ..... ..... ..... .....
..o.. ..o.o ..o.. ...o. ..o..
..ooo => ..oo. => ..o.o => .oo.. => .o... 周期4で左下へ移動
..... ...o. ..oo. ..oo. .ooo. (グライダー)
..... ..... ..... ..... .....

こんなゲームなんですがこの課題において
「enter キーを押す度に時刻t とその時点での盤面を表示せよ.」
とあるのですがC言語でプログラムが実行中にいつでもenterキーを押すと反応してtや盤面の表示をするにはどうすればいいですか?

scanfを使ってもscanfでプログラムの進行がいったん止まるので使えないんです

どなたかアドバイスお願いします

ガブリチュウ

Re:ライフゲームという課題について

#2

投稿記事 by ガブリチュウ » 18年前

書き忘れていたことがひとつ
課題は初期盤面を適当にファイルから入力してその初期盤面を表示したあとはenterキーを押すたびにプログラム実行からの時間tとその時点での盤面を表示するというものです

バグ

Re:ライフゲームという課題について

#3

投稿記事 by バグ » 18年前

環境はWindowsですか?

ガブリチュウ

Re:ライフゲームという課題について

#4

投稿記事 by ガブリチュウ » 18年前

環境はWindowsのCygwinで動かしています

バグ

Re:ライフゲームという課題について

#5

投稿記事 by バグ » 18年前

ごめんなさい、cygwinは分かりませんm(__)m
VisualStudioならば、conio.hの_kbhit関数でいけると思いますが…

ガブリチュウ

Re:ライフゲームという課題について

#6

投稿記事 by ガブリチュウ » 18年前

バグさん>>これも一旦とまりそうな感じですね・・・

んー難しいみたいですね・・・
色々試してみます

バグ

Re:ライフゲームという課題について

#7

投稿記事 by バグ » 18年前

試してみました?この関数だと止まりませんよ。
もし、WindowsとVisualStudioがあるならば、下記のソースを実行してみてください。

ちなみに、ここのサイトのダウンロードコーナーのカラードロップというゲームとライフゲームは私が作った物ですが、落ち物パズルのカラードロップには_kbhit関数を使用していますから、間違いありません。
#include	<stdio.h>
#include	<conio.h>
#include	<windows.h>

void main(void)
{
	char key;
	while (1)
	{
		// 何も押されていなければ
		if (_kbhit() == 0)
		{
			printf("何か押してや~♪\r");
		}
		else
		{
			// キーバッファの中から押されたキー情報を取り出す
			key = (char)getch();
			printf("ズバリ! [%c] を押しましたね!\n", key);		
		}

		// CPUに負担を掛けない為のWAIT
		Sleep(100);
	}
}

toyo

Re:ライフゲームという課題について

#8

投稿記事 by toyo » 18年前

enterキーを押すたびに時間が1個進むという意味じゃないのかな
ライフゲームは途中経過を見るのが楽しいのであってenterキー押したら何もなかったじゃつまらないです

ガブリチュウ

Re:ライフゲームという課題について

#9

投稿記事 by ガブリチュウ » 18年前

バグさん>>>Visual Studioは持ってないですね・・・ためしにCygwinでやってみてもはじかれました

toyoさん>>>どうもそれみたいですね。ネット上のライフゲームをためしてみたら絶えず変化しているので途中経過がわからないと課題にならないですね。

なんかものすごい勘違いをしていたみたいです(´Д`;)
バグさん勘違いに付き合ってもらってすいません
そのkbhit関数は何かに使えそうなので保存して使わせてもらいます(Visual Studioをゲットしてから)
みなさんありがとうございました

バグ

Re:ライフゲームという課題について

#10

投稿記事 by バグ » 18年前

解決はしたみたいですが、簡単なサンプルを作ってみましたので、よかったら参考にしてください(^_^;)
操作方法は…

Enter … 世代を進める
S   … 現状を保存する
L   … ファイルから読み込む
E   … 終了

となっています。

ガブリチュウ

Re:ライフゲームという課題について

#11

投稿記事 by ガブリチュウ » 18年前

バグさん>>>なんかすごい機能ついてるΣ(゚Д゚
参考にさせてもらいますm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る