ページ 11

ライフゲームのプログラム

Posted: 2017年1月14日(土) 20:15
by milk
私は現在ライフゲームを作成しています。

下のプログラムのように作成したのですが、記号を使用するとなぜかセルの数が増えません。

プログラムをどのように変更したらきちんと動作するようになるでしょうか。

また、条件は以下のようになっています。
(ア)誕生
死んでいるセルに隣接する生きたセルがちょうど3つあれば、次の世代が誕生する。
(イ)生存
生きているセルに隣接する生きたセルが2つか3つならば、次の世代でも生存する。
(ウ)過疎
生きているセルに隣接する生きたセルが1つ以下ならば、過疎により死滅する。
(エ)過密
生きているセルに隣接する生きたセルが4つ以上ならば、過密により死滅する。

ご教授いただけると幸いです。
よろしくお願い致します。

コード:


#include<stdio.h>
#include<string.h>

#define number 3


int  main(void) {
	char cell[number][number] = {
		{'o','o',' '},
		{'o',' ',' '},
		{' ',' ',' '}
	};

	char temp[number][number];

	int count;
	int i, j;

		for (i = 0; i < number; i++) {
			for (j = 0; j < number; j++) {
				printf("%c", cell[i][j]);
			}

			printf("\n");
		}

		printf("\n");

		for (int k = 0; k < number; k++) {
			for (int l = 0; l < number; l++) {

				count = 0;

				if (k != 0) 
				{ count += cell[k - 1][l]; }
				
				if (k != 0 && l != number - 1) 
				{ count += cell[k - 1][l + 1]; }
				
				if (l != number - 1) 
				{ count += cell[k][l + 1]; }
				
				if (k != number - 1 && l != number - 1)
				{ count += cell[k + 1][l + 1]; }
				
				if (l != number - 1)
				{ count += cell[k + 1][l]; }
				
				if (k != number - 1 && l != 0) 
				{ count += cell[k + 1][l - 1]; }
				
				if (l != 0) 
				{ count += cell[k][l - 1]; }
				
				if (k != 0 && l != 0) 
				{ count += cell[k - 1][l - 1]; }

				if ((cell[k][l] && (count == 2 || count == 3)) || (!cell[k][l] && count == 3)) {
					temp[k][l] = 'o';
				}
				else {
					temp[k][l] = ' ';
				}
				
				printf("%c", temp[k][l]);

					}

					printf("\n");

		}

	return 0;
}

[\code]

Re: ライフゲームのプログラム

Posted: 2017年1月14日(土) 20:18
by milk
すみませんコードミスです
今度はできているでしょうか。

コード:

 
#include<stdio.h>
#include<string.h>

#define number 3


int  main(void) {
	char cell[number][number] = {
		{'o','o',' '},
		{'o',' ',' '},
		{' ',' ',' '}
	};

	char temp[number][number];

	int count;
	int i, j;

		for (i = 0; i < number; i++) {
			for (j = 0; j < number; j++) {
				printf("%c", cell[i][j]);
			}

			printf("\n");
		}

		printf("\n");

		for (int k = 0; k < number; k++) {
			for (int l = 0; l < number; l++) {

				count = 0;

				if (k != 0) 
				{ count += cell[k - 1][l]; }
				
				if (k != 0 && l != number - 1) 
				{ count += cell[k - 1][l + 1]; }
				
				if (l != number - 1) 
				{ count += cell[k][l + 1]; }
				
				if (k != number - 1 && l != number - 1)
				{ count += cell[k + 1][l + 1]; }
				
				if (l != number - 1)
				{ count += cell[k + 1][l]; }
				
				if (k != number - 1 && l != 0) 
				{ count += cell[k + 1][l - 1]; }
				
				if (l != 0) 
				{ count += cell[k][l - 1]; }
				
				if (k != 0 && l != 0) 
				{ count += cell[k - 1][l - 1]; }

				if ((cell[k][l] && (count == 2 || count == 3)) || (!cell[k][l] && count == 3)) {
					temp[k][l] = 'o';
				}
				else {
					temp[k][l] = ' ';
				}
				
				printf("%c", temp[k][l]);

					}

					printf("\n");

		}

	return 0;
}

Re: ライフゲームのプログラム

Posted: 2017年1月14日(土) 20:52
by みけCAT
言語が指定されていませんが、C言語と仮定します。
オフトピック
「C++」という表示はシステムが勝手に表示しているだけであり、質問者さんの指定ではないと解釈します。
例えばASCIIコードでは、'o'は111、' 'は32であるのに対し、milkさんのコードではこれらが1および0であると仮定したコードが書かれているように見えます。
'o'が1である文字コードは存在するかもしれませんが、C言語では0は文字列の終端を表すのに利用されるので、' 'は0にはならないはずです。
==演算子は両辺が等しければ1、等しくなければ0を返すので、後半の二重for文の中のcell[A]を全て(cell[A] == 'o')にするといい感じになるかもしれません。
(A、Bには具体的な式が入ります。例えばcell[k - 1][l] → (cell[k - 1][l] == 'o') )

milk さんが書きました:下のプログラムのように作成したのですが、記号を使用するとなぜかセルの数が増えません。

意味がわかりにくいので、詳しく説明していただけるとありがたいです。
  • 「記号」とは具体的に何のことですか?
  • 「セルの数」とは具体的に何のことですか?
  • 「記号」を使用しない場合、セルの数が増えるのですか?

Re: ライフゲームのプログラム

Posted: 2017年1月14日(土) 21:12
by milk
すみません言語はC言語になります。

説明不足で本当に申し訳ありません。

記号について:記号は数字ではなく文字という意味で言っていました。今回はoと空白を使用しています。
セルについて:生存セルをo、死亡セルを空白としたときのoの数のことを言っていました。 条件が満たされたときに' 'が'o'に代わるように作成したいと考えています。
記号以外の場合:生存セルを1、死亡セルを0として整数型の配列で同じように作成すると数が増えることは確認できています。

Re: ライフゲームのプログラム

Posted: 2017年1月14日(土) 21:30
by milk
何度もすみません。
みけCAT さんが書きました:後半の二重for文の中のcell[A]を全て(cell[A] == 'o')にするといい感じになるかもしれません。


教えて頂いたようにすべて変更したところ正しく動作しました!
本当にありがとうございました!

Re: ライフゲームのプログラム

Posted: 2017年1月14日(土) 21:33
by milk
解決しました。
本当に何度もすみませんでした。