sunriseは注文した。

GUNSLINGER GIRL 1 (電撃コミックス)

GUNSLINGER GIRL 1 (電撃コミックス)

古本だけど買った。面白い。古本は直に剥がしにくい値札張るからクソだと思った。
コンウェイライフゲームを作った。Wikipediaにのってる初期状態入れたら正しく動かないこともあったからどっか間違えた。過密のcaseをdefaultにまとめた時と動作が変わった気がしてもうだめだと思う。

#include<iostream>
#include<windows>
#define G_SIZE 9
/*
status見て回って変化するならChange=Trueに
最後にChage=TrueのGridのStatusを入れ替えて1ループ終わり
*/
///////////////////////////////////////////////////////
class grid{
	private:
		bool status;//True=live
		bool change;//True=状態変化
		void set_change(){
			change=true;
		}
	public:
		grid(){
			status=true;
			change=false;
		}
		grid(bool s){
			status=s;
			change=false;
		}
		bool get_status(){
			return status;
		}
		bool get_change(){
			return change;
		}
		void solve_status(int count);
		void change_grid();
};
void grid::solve_status(int count){
	
	switch(count){
		case 1:if(status==true)set_change();
				break;//過疎
		case 2:;break;							  //維持
		case 3:if(status==false)set_change();
				break;//誕生
		case 4:if(status==true)set_change();
				break;//過密
		case 5:if(status==true)set_change();
				break;//過密
		case 6:if(status==true)set_change();
				break;//過密
		case 7:if(status==true)set_change();
				break;//過密
		case 8:if(status==true)set_change();
				break;//過密
	}
}
void grid::change_grid(){//生死反転
	if(change==true){
		status=(!status);
		change=false;
	}
}
///////////////////////////////////////////////////////
class field{
	private:
		grid **a;
		int x,y;
		int counter(int x,int y);
		void update();
	public:
		field();
		void next();
		void print_field();//全体表示
};

field::field(){
        bool s[G_SIZE][G_SIZE];//初期状態用
	a=new grid*[G_SIZE];
	for(x=0;x<G_SIZE;x++){
		a[x]=new grid[G_SIZE];
	}
	for(x=0;x<G_SIZE;x++){
		for(y=0;y<G_SIZE;y++){
			a[x][y]=grid(s[x][y]);
		}
	}
}
int field::counter(int x,int y){
	int count=0;
	int i,j;
	for(i=x-1;i<x+2;i++){
		for(j=y-1;j<y+2;j++){
			if((i>=0&&j>=0)&&(i<G_SIZE&&j<G_SIZE)){
				if(a[i][j].get_status()==true)
					count++;
			}
		}
	}
	if(a[x][y].get_status()==true)
		count--;
	return count;
}
void field::update(){
	for(x=0;x<G_SIZE;x++){
		for(y=0;y<G_SIZE;y++){
			a[x][y].change_grid();
			
		}
	}
}
void field::next(){
	for(x=0;x<G_SIZE;x++){
		for(y=0;y<G_SIZE;y++){
			a[x][y].solve_status(counter(x,y));
		}
	}
	
	update();
}
void field::print_field(){
	for(x=0;x<G_SIZE;x++){
		for(y=0;y<G_SIZE;y++){
			if(a[x][y].get_status()==true)
				std::cout<<"*";
			else std::cout<<"+";
		}
		std::cout<<std::endl;
	}
}
//////////////////////////////////////////////////////
void main(){
	field a;
	int count=0;
	while(count<131){
		std::cout<<count<<"世代"<<std::endl;
		a.print_field();
		a.next();
		std::cout<<std::endl;
		count++;
	}
}