私は1Dゲームオブライフ(ここに記載されたルールに基づいてMathworldに基づいています)に取り組んでいます。本質的に、各世代は0または1の行(死んでいるか生きているか)で表され、次の世代は「ルール」コマンドライン引数のバイナリ表現に基づいて作成されます。2D C配列の前の「行」から値を取得する
たとえば、ルール30は00011110(30の場合は2進数)に変わり、これを使用して、次の世代で新しいセルを生成するかどうかを決定します。
これをプログラムするには、前の行から(ルールを適用するために)3つのグループのビットにアクセスできる必要があります。次のサンプル画像(開始行が常に0の中央1であることに注意)である:
00000100000 #seed row
11001011001 #generated from seed row
...........
11110010101 #n-th row, generated from n-1 row
行を生成するために、私は、次の3つのグループに上記行からのビットを見て、必要がありますルールを1/0、生/死の決定として適用する。
基本的に3ビットのパターンとルールを一致させ、それを使って子孫に0または1のいずれかを印刷します。これは一般的なアルゴリズムです。
if three_bit_pattern == 'xxx' && rule[x] == 0/1 {print 0/1} else {print 1/0}
私が問題を抱えている部分は、前の行の内容にアクセスすることです。私の試みはすべてゴミや不正なデータをもたらす。
要するに、前の行の値に3ビットのグループでアクセスするにはどうすればよいですか?
行が次のように作成されますので、私はずっと簡単で、ちょうど2つのアレイ(以前のコラムを保持する1とのものを持っているつもりですこれを作った
int i, j, k;
int row = atoi(argv[1]) + 1;
int col = 2 * atoi(argv[1]) + 1;
int arr[col];
int output[col];
char rule[9]; //binary representation of rule (2^8 stores up to 255 + null term)
int2binary(atoi(argv[2]), &rule, 10);
for(i = 0; i < row; i++){
for(j = 0; j < col; j++){
if(i == 0){
if(j == col/2) //print 1 in center of first row
arr[i] = 1;
else
arr[i] = 0;
printf("%d", arr[i]);
}
else{
//output[i] = arr[i-1];
output[i+1] = arr[i];
output[i+2] = arr[i+1];
output[i+3] = arr[i+2];
printf("%s", output);
}
}//end inner for_loop
printf("\n");
}//end outer for_loop
}
[OK]を現在)。なぜ私は理解していないのは、出力配列を印刷するとゴミが出るのですか? output [i] = arr [i]は有効な式ではありませんか?
動作しないコードは表示されません。目に見えないコードがなぜ機能しないのかを神に徹底的に伝えることは不可能です。すべてのコードを表示します。 –
したがって、行インデックスは「行」または「i」と呼ばれますか?最初の行については、おそらく0を使用します。値が変化するまで変数を導入するのを待っています。 –
それは本当です。現在、私はコードを持っていません(私は非作業試行をしています)が、試行のいくつかを反映するために投稿を編集します。 –