ページ 11

ライフゲームのアルゴリズム

Posted: 2010年9月05日(日) 11:48
by tune
はじめまして。tuneです。

僕はc言語を始めたばかりです。
ライフゲームを作りたくてソースを書いているのですが、実行結果がうまくいきません。

コンパイルはきちんとできるのですが、実行するとセルの反映がうまくいかないのです。
マップを2次元配列でつくり、1つのセルの周りを調べていって維持、誕生の条件にそうならばもう一つのパマップに反映させるというものです。
ソースのどこが間違っているのかわかりません。

OSはvisitaです。
環境はBCCで作っていて、コンパイラはBorand c++です。

#include<stdio.h>

int main()
{
int k,l,i,j;
int sum,count=0,flag=0;

int map[10][20]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0},
{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };

int map2[10][20]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, };
do{

if(flag==0){

sum=0;

printf("%s\n",map);

//マップの表示
for(k=0;k<10;k++){
for(l=0;l<20;l++){
printf("%d",map[k][[/url]);

if(k==9 && l==19)
printf("\n");
}
printf("\n");

}

//セルの周りの状態を調べる

for(i=0;i<10;i++){
for(j=0;j<20;j++){

if(i>=1 && i<=8 && j>=1 && j<=18){
if(map[i-1][j-1]==1)
sum+=1;
if(map[i-1][j]==1)
sum+=1;
if(map[i-1][j+1]==1)
sum+=1;

if(map[j-1]==1)
sum+=1;
if(map[j+1]==1)
sum+=1;

if(map[i+1][j-1]==1)
sum+=1;
if(map[i+1][j]==1)
sum+=1;
if(map[i+1][j+1]==1)
sum+=1;
}

if(sum==3)//状態に合わせてmap2に反映
map2[j]=1;
else if((sum==2 || sum==3) && map[j]==1)
map2[j]=1;
else
map2[j]=0;

}
}
flag=1;
}
count++;


if(flag==1){

sum=0;
printf("%s\n",map2);

for(k=0;k<10;k++){
for(l=0;l<20;l++){
printf("%d",map2[k][[/url]);

if(k==9 && l==19)
printf("\n");
}
printf("\n");

}

for(i=0;i<10;i++){
for(j=0;j<20;j++){

if(i>=1 && i<=8 && j>=1 && j<=18){
if(map2[i-1][j-1]==1)
sum+=1;
if(map2[i-1][j]==1)
sum+=1;
if(map2[i-1][j+1]==1)
sum+=1;

if(map2[j-1]==1)
sum+=1;
if(map2[j+1]==1)
sum+=1;

if(map2[i+1][j-1]==1)
sum+=1;
if(map2[i+1][j]==1)
sum+=1;
if(map2[i+1][j+1]==1)
sum+=1;
}

if(sum==3)
map[j]=1;
else if((sum==2 || sum==3) && map2[j]==1)
map[i][j]=1;
else
map[i][j]=0;

}
}
flag=0;
}



count++;


}while(count<=10);
return 0;
}

Re:ライフゲームのアルゴリズム

Posted: 2010年9月05日(日) 12:04
by パコネコ
とりあえずできない理由とは別ですけど…
printf("%s\n",map2);
これ機能してないですよ…
printf("map2\n");
でいいと思う…
=========
私が前作ったときはmap2のデータをmapに返してたんですが…これはどうしたいんでしょうか?
//↑これは別にいいです。書いてましたから…すいません
交互に描写されるにしても、初期化しないと前のデータが残る気がします。
=========
ついでにこちらも…
printf("%s\n",map);
機能してないと思います。
printf("%s\n","map");
とかにするのもありですね…。
画像

Re:ライフゲームのアルゴリズム

Posted: 2010年9月05日(日) 12:15
by パコネコ
連続すいません
失敗の理由わかりました。
ヒントは(sumの初期化)が足りてないです。
あと、マップの初期化

Re:ライフゲームのアルゴリズム

Posted: 2010年9月05日(日) 13:08
by tune
ありがとうございました!!

無事にライフゲームを作ることができました。
初期化が足らず、前世紀のデータが残っていたのでうまくできなかったようです。