C++でのConwayのGameofLifeのコーディングでいくつか問題が発生しています。私は良いスタートを切ったように感じます、私はただいくつかの方向性が必要です。まず、プログラムを実行しようとすると、空白のコンソールが表示され続けます。また、8つのネイバーが完全に存在しないボード上の場所をコーディングするための最良の方法もよくわかりません。どんな助けでもいただければ幸いです。
ルール:
開始構成を「ハードコーディング」します。ユーザーは、別の開始構成を提供できる必要はありません(プログラムが複雑になるだけです)。
提案:安定した構成を探してください。つまり、パターンを継続的に繰り返すコミュニティを探します。繰り返しの構成の数は期間と呼ばれます。修正された構成があり、変更なしで続行されます。考えられるプロジェクトは、そのような構成を見つけることです。
ヒント:現在の(または初期の)構成を含む、worldと呼ばれるベクトル(参照による呼び出しまたはポインターの使用)をとるgenerationという名前のvoid関数を定義します。この関数は、ベクトルをスキャンしてセルを変更し、前述のルールに従ってセルに出生と死亡のマークを付けます。これには、各セルを順番に調べて、セルを殺すか生きさせるか、セルが空の場合はセルを作成するかどうかを決定することが含まれます。コードが変更しているのと同じベクトル内のネイバーをカウントする場合、ゲームは機能しないことに注意してください。ワールドベクトルのコピーは、変更する前に作成する必要があります。このコピーは、元のベクトルでセルがオンまたはオフになっているときに、ネイバーをカウントするために使用されます。
ベクトルの世界を受け入れ、画面にグリッドを表示する関数表示が必要です。生成と表示の呼び出しの間には、ある種の時間遅延が適切です。これを行うには、Return / Enterキーを押したときに、プログラムが次世代を生成して表示する必要があります。これを自動化するのは自由です(リアルタイムの遅延を入れ、ユーザーがキーを押すのを待たないでください)が、プログラムに自動化は必要ありません。
ユーザーが何かを入力してEnterキーを押してから次のグリッドを表示するのを待つのではなく、グリッドの表示を「遅らせる」場合は、プログラムを一時停止または「スリープ」する必要があります。Microsoft Windowsを使用している場合は、次のようにします。
各セルを8つの隣接セルを持つように定義します。セルの隣接セルは、真上、真下、右、左、対角線上で右と左、斜め下で右と左のセルです。エッジのネイバーをチェックするときは注意してください。エッジセルに、エッジを超えて生存している隣接セルがあるか、死んでいる隣接セルがあるかを判断できます。
占有されたセルに0個または1個の隣接セルがある場合、それは孤独で死にます。占有されているセルに3つ以上の隣接セルがある場合、過密状態で停止します。
空のセルにちょうど3つの隣接セルが占有されている場合、空のセルを置き換える新しいセルが誕生します。
誕生と死は瞬間的であり、世代交代で発生します。何らかの理由で細胞が死ぬと出産に役立つ可能性がありますが、生まれたばかりの細胞は死んでいる細胞を復活させることはできません。
これまでの私のコード:
/*
Filename: main.cpp
Author:
Version: 20120920
Description:
*/
#include<iostream>
#include<vector>
#include<unistd.h>
#include<cstdlib>
using namespace std;
/*Change the values of your world matrix*/
#define ROWS 21
#define COLS 80
/*Change the values for dead or alive*/
#define DEAD ' '
#define ALIVE '*'
/*Function Prototype for generation*/
void generation (vector< vector<char> > &world, vector< vector<char> > &world_copy);
/*Function Prototype for display*/
void display(vector< vector<char> >);
int main()
{
vector< vector<char> > world(ROWS, vector<char>(COLS, DEAD));
vector< vector<char> > world_copy(ROWS, vector<char>(COLS, DEAD));
/*Set ALIVE cells*/
world[1][1] = world[1][2] = world[1][3] = ALIVE;
while(true);
{
/*Clear screen and display world*/
system("cls");
display(world);
/*Wait*/
usleep(8000);
/*Update World*/
generation(world, world_copy);
}
return 0;
}
/*Copy the contents of world into world_copy*/
void generation (vector< vector<char> > &world, vector< vector<char> > &world_copy)
{
int ALIVE_count = 0;
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
/*Checks neighbors for life*/
if(world_copy[i-1][j+1] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i][j+1] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i+1][j+1] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i-1][j] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i+1][j] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i-1][j-1] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i][j-1] == ALIVE)
{
ALIVE_count++;
}
if(world_copy[i+1][j-1])
{
ALIVE_count++;
}
/*Rule Section*/
/*Death by loneliness. 0 or 1 neighbors.*/
if (world_copy[i][j] == ALIVE && (ALIVE_count == 0 || ALIVE_count == 1))
{
world[i][j] = world_copy[i][j];
world[i][j] == DEAD;
}
/*Live to next generation. 2 or 3 neighbors.*/
else if(world_copy[i][j] == ALIVE && (ALIVE_count == 2 || ALIVE_count == 3))
{
world[i][j] = world_copy[i][j];
world[i][j] == ALIVE;
}
/*Death by overcrowding. More than 3 neighbors.*/
else if (world_copy[i][j] == ALIVE && ALIVE_count > 3)
{
world[i][j] = world_copy[i][j];
world[i][j] == DEAD;
}
/*Birth. Exactly 3 neighbors.*/
else if (world_copy[i][j] == ALIVE && ALIVE_count ==3)
{
world[i][j] = world_copy[i][j];
world[i][j] == ALIVE;
}
}
}
}
/*Display the world*/
void display(vector< vector<char> > &world)
{
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; i < COLS; j++)
{
cout << world[i][j];
}
cout << endl;
}
}
アップデート:
mainのwhileステートメントで問題が見つかりました。持っていた ; しばらくすると:
while(true);
{
/*Clear screen and display world*/
system("cls");
display(world);
/*Wait*/
Sleep(800);
/*Update World*/
generation(world, world_copy);
}
私は先に進んでそれを取り出しましたが、今はwhileループで'displayへの未定義の参照を取得しています。