我在用 C++ 编写康威的生命游戏时遇到了一些问题。我觉得我有一个好的开始,我只是需要一些方向。首先,当我尝试运行程序时,我总是得到一个空白的控制台。而且我也不确定为董事会上没有完整八个邻居的地方编码的最佳方式。任何帮助,将不胜感激。
规则:
您将“硬编码”一个起始配置。用户不需要能够提供不同的启动配置(这只会使您的程序复杂化)。
建议:寻找稳定的配置。也就是说,寻找不断重复模式的社区。重复中的配置数称为周期。有一些配置是固定的,它们会继续不变。一个可能的项目是找到这样的配置。
提示:定义一个名为 generation 的 void 函数,它接受我们称为 world 的向量(通过引用调用或使用指针),其中包含当前(或初始)配置。该函数扫描向量并修改单元格,按照前面列出的规则标记单元格的出生和死亡。这涉及依次检查每个细胞,要么杀死细胞,让它存活,要么如果细胞是空的,则决定是否应该出生一个细胞。请注意,如果您的代码在它正在修改的同一向量中计算邻居,则游戏将无法运行。在修改之前必须创建世界向量的副本,并且该副本用于计算邻居,同时在原始向量中打开或关闭单元格。
应该有一个函数 display 接受向量世界并在屏幕上显示网格。在调用生成和显示之间存在某种时间延迟是合适的。为此,您的程序应在您按下 Return/Enter 时生成并显示下一代。您可以自由地自动执行此操作(设置实时延迟,而不是等待用户按键),但程序不需要自动化。
如果您想“延迟”网格的显示,而不是等待用户键入内容并在显示下一个网格之前按 Enter,那么您将需要以某种方式暂停或“休眠”您的程序。如果您使用的是 Microsoft Windows,请执行以下操作:
我们将每个小区定义为有八个相邻小区。单元格的邻居是直接在上方、下方、右侧、左侧、左右斜上方和左右斜下方的单元。检查边缘的邻居时要小心;您可以决定边缘单元是否在边缘之外有活的或死的邻居。
如果一个被占用的细胞有零个或一个邻居,它就会死于孤独。如果一个被占用的小区有超过三个邻居,它就会死于过度拥挤。
如果一个空单元格恰好有三个被占用的相邻单元格,则会生成一个新单元格来替换该空单元格。
出生和死亡是瞬时的,发生在世代的变化中。一个因任何原因而死亡的细胞可能有助于出生,但一个新生的细胞不能使一个正在死亡的细胞复活,一个细胞的死亡也不会阻止另一个细胞的死亡,例如,通过减少当地人口。
到目前为止我的代码:
/*
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 循环中显示”。