ライフゲームのアルゴリズム
Posted: 2010年9月05日(日) 11:48
はじめまして。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;
}
僕は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;
}