質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

1884閲覧

c言語のライフゲームで法則通り表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/01/09 12:50

編集2017/01/09 13:24

C

1#include<stdio.h> 2#define M 9 3#define N 5 4int count_around(int a[][M+2],int i,int j) //ある細胞周辺の生きている細胞の数を返す// 5{ int count=0; 6 if(a[i-1][j-1]==1) count++; 7 if(a[i-1][j]==1) count++; 8 if(a[i-1][j+1]==1) count++; 9 if(a[i][j-1]==1) count++; 10 if(a[i][j+1]==1) count++; 11 if(a[i+1][j-1]==1) count++; 12 if(a[i+1][j]==1) count++; 13 if(a[i+1][j+1]==1) count++; 14 return count; 15} 16void print_life(int a [][M+2],int n,int m) //細胞の状態を表示する// 17{ int i,j; 18 for(i=1;i<n-1;i++){ 19 puts(""); 20 for(j=1;j<m-1;j++){ 21 if(a[i][j]==1) printf("*"); 22 else if(a[i][j]==0) printf(".");}} 23} 24void step(int a[][M+2],int n,int m) //細胞の次のステップに変化させ表示する// 25{ int i,j; 26 for(i=1;i<n-1;i++){ 27 for(j=1;j<m-1;j++){ 28 if(a[i][j]==1 && (count_around(a,i,j)==2||count_around(a,i,j)==3)) a[i][j]=1; 29 if(a[i][j]==1 && (count_around(a,i,j)<=1||count_around(a,i,j)>=4)) a[i][j]=0; 30 if(a[i][j]==0 && count_around(a,i,j)==3) a[i][j]=1; 31 if(a[i][j]==0 && count_around(a,i,j)!=3) a[i][j]=0; 32 } 33 } 34 print_life(a,N+2,M+2); 35} 36int main() 37{ 38 int a[N+2][M+2]={{0,0,0,0,0,0,0,0,0,0,0},{0,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,1,1,0,0,0},{},{},{}}; //初期値// 39 print_life(a,N+2,M+2); 40 puts(""); 41 step(a,N+2,M+2); 42 return 0; 43}

問題:ライフゲーム (Conway’s Game of Life) は,生命 (細胞) の誕生,生存,淘汰をシュミレー ションである。
各細胞は「生存」と「死亡」の 2 つの状態があり,M × N の格子状に並んでいる。細胞 (i, j) の状態は, 次世代に進むとき,周囲 8 つの細胞状態により,次のように決定される。
誕生 細胞 (i, j) が死亡状態の場合,周囲に生存細胞が 3 つあれば、誕生する。
生存 細胞 (i, j) が生存状態の場合,周囲に生存細胞が 2 つか 3 つならば、生存する。
死滅 細胞 (i, j) が生存状態の場合,周囲に生存細胞が 1 つ以下,もしくは 4 つ以上なら死滅する。
今,細胞の状態を配列 life[N+2][M+2] で表現することにする。適切な初期状態を与えたとき,「生存」
を*,「死亡」を. を表示し,各ステップごとの細胞の状態変化を表示するプログラムを作成せよ。

output
結果を表示したいのですが何故かドットがうまく表示されないので文章で書きます。
本来は真ん中に5個並んだ細胞あり、それが3*3の細胞に変化するはずなのですがこのプログラムだとまるで違う結果になってしまいました。どこの関数に異常があるのかprintfで書き出してみましたがcount_aroundは問題なく動いていたと思います。問題があるとしたらstep関数だと思いますが色々いじっても正されませんでした。どこに問題があるのか教えて欲しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

配列は、今の画面と、次の画面の2面必要です。
1面を更新しながらカウントすると、更新前と更新後の画面が混ざってしまいます。

投稿2017/01/09 13:01

otn

総合スコア84491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

左上から順番に死活調査していますが「その結果を調査元に上書き」しているので
今調査した領域(A)の右(B)を調査した時(Bの周りをカウントすると)Aの変化を反映した結果
での調査となり、盤面単位で見ると調査開始時の瞬間の盤面とは違う結果になりますので
周りを数えて死活判定した結果は調査のために参照した物とは別の配列に格納してやる必要がありませんか?
調査用の配列と結果格納用の配列を用意して結果が1面分全部出揃ったらその結果の配列を調査用の配列に
複製してからまた同じ調査をしなおすというのを繰り返す感じにしてみてはどうでしょうか。

投稿2017/01/10 04:24

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問