wvogel日記

自分用の技術備忘録が多めです.

Life Game

何か作らないと、と思いつつ、でもGUIはしんどい。
何かないかなあと思ったときに、ライフゲームを思いついた
Haskellでの多重配列の良い扱い方がわからないので、とりあえずC++で。
長くなってしまった。
オブジェクトにしてるけど、jの扱いなど、安全性もへったくれもない。
とりあえず動くものを作ろうという精神笑

Haskellで短く書いている例をブログなどでいくつか見かけたので、
次はそれを参考にしようと思います

#include<iostream>
#include<string>
#define N 10

using namespace std;

class LifeGame{
  int life[N][N],i,j;
private:
  int aroundLife(int l,int k){
    return (life[l-1][k-1] + life[l-1][k] + life[l-1][k+1]
             +life[l][k-1]  + life[l][k+1]
             +life[l+1][k-1] + life[l+1][k] + life[l+1][k+1]);
  }
public:
  void getData(){
    string str;
    i = 1;

    for(int k = 0; k < N ; k++)
      life[0][k] = 0;

      while(1){
	cin >> str;
	if(str == "0") break;

	j = str.length();

	for(int k = 0; k <= j+1 ; k++){
		if(k == 0 || k == j+1)
			life[i][k] = 0;
		else
			life[i][k] = str[k-1] - '0';
	}
	i++;
      }

	for(int k = 0; k <= j+1 ; k++)
		life[i][k] = 0;
  }

  void updataLife(){
    int nextLife[N][N];
    int sum;

    for(int l = 1 ; l < i ; l++){
	for(int k = 1 ; k <= j ; k++){
          sum = aroundLife(l,k);

          if(sum == 3)
            nextLife[l][k] = 1;
          else if(life[l][k] == 1 && sum == 2)
            nextLife[l][k] = 1;
          else
            nextLife[l][k] = 0;
	}
    }

    for(int l = 1 ; l < i ; l++){
	for(int k = 1 ; k <= j ; k++)
          life[l][k] = nextLife[l][k];
    }
  }

  void showLife(){
    for(int l = 1; l < i ; l++){
	for(int k = 1 ; k <= j ; k++){
          if(life[l][k]==1)
            cout << "*";
          else
            cout << "-";
	}
	cout << endl;
    }
  }
};