生命游戏C++,检查邻居
Game of Life C++, checking neighbors
我正在尝试编写康威的生命游戏。
不幸的是,当我去检查块的邻居时,我总是在数组中的某些元素上收到错误。具体来说,grid[0][11]
它给了我一个邻居,但是,我设置了它,以便我只在它周围的块不是空格或代码中没有' '
时向称为邻居的变量添加值。
我相信,if 语句中的条件也考虑到了它不会超出数组。
整个数组充满了' '
,尽管如此,我仍然得到一个邻居的值。
我已经在这里呆了几个小时,但没有找到解决方案。我的代码仍然充斥着测试的尝试,我为它缺乏整洁性而道歉。提前感谢大家在解决我的问题时可以提供的任何帮助。
int _tmain(int argc, _TCHAR* argv[])
{
bool infloop = true;
//Create the playing grid.
char grid[HEIGHT][WIDTH];
//Comment out later. Used for testing.
for(int i=0; i<75; i++)
for(int j=0; j<22; j++)
grid[i][j] = ' ';
//Create initial seed here. grid [x coordinate] [y coordinate].
//grid [1][1] = '+'; grid [2][1] = '+'; grid [3][1] = '+';
//Key. * is going to live. + is alive currently.
//- is going to die, and negative space is dead.
//As Conway's Game of Life runs infinitely, create an infinite loop.
while (infloop)
generation(grid);
cout << endl;
system("pause");
return 0;
}
void generation(char grid[][WIDTH]) {
int neighbors;
/*Check each point on the grid for alive or dead. If it is, check the
surrounding neighbors and apply the game's rules.*/
for(int x=0; x<75; x++) {
for(int y=0; y<22; y++)
{
neighbors = 0;
/*check all eight neighbors except for when outside of the
array.*/
if((grid[x+1][y] != ' ') && (grid[x+1][y] < grid[HEIGHT][y])){
neighbors++; cout << "A";
}
if((grid[x-1][y] != ' ') && (grid[x-1][y] > grid[-1][y])){
neighbors++; cout << "E";
}
if((grid[x][y+1] != ' ') && (grid[x][y+1] < grid[x][WIDTH])){
neighbors++; cout << "C";
}
if((grid[x][y-1] != ' ') && (grid[x][y-1] > grid[x][-1])){
neighbors++; cout << "G";
}
if((grid[x+1][y+1] != ' ') && (grid[x+1][y+1] < grid[HEIGHT][WIDTH])){
neighbors++; cout << "B";
}
grid[0][11] = ' '; grid[11][0] = ' ';
if((grid[x-1][y-1] != ' ') && (grid[x-1][y-1] > grid[-1][-1])){
neighbors++; cout << "F";
}
if((grid[x+1][y-1] != ' ') && (grid[x+1][y] < grid[HEIGHT][y]) &&
(grid[x][y-1] > grid[x][-1])){
neighbors++; cout << "H";
}
if((grid[x-1][y+1] != ' ') && (grid[x-1][y] > grid[-1][y])
&& (grid[x][y+1] < grid[x][WIDTH])){
neighbors++; cout << "D";
}
system("pause");
cout << neighbors;
//Set a marker for each point according to neighbor amounts and key.
if(grid[x][y] == '+' && neighbors < 2)
grid[x][y] = '-';
if(grid[x][y] == '+' && (neighbors == 2 || neighbors == 3))
grid[x][y] = '*';
if(grid[x][y] == '+' && neighbors > 3)
grid[x][y] = '-';
if(grid[x][y] == ' ' && (neighbors == 3))
grid[x][y] = '*';
}
}
for(int x=0; x<75; x++){
for(int y=0; y<22; y++)
{
if(grid[x][y] == '*')
grid[x][y] = '+';
if(grid[x][y] == '-')
grid[x][y] = ' ';
}
}
system("pause");
display(grid);
}
这是一种检查细胞邻居是否还活着的简单方法。将以下代码放在函数中,并传入要检查的单元格的行和列。
int live_cell_count = 0;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
//disregard grid[row][col]
if (!(i == 0 && j == 0) && inBounds(row+i,col+j)
&& grid[row+i][col+j] == '+')
live_cell_count++;
}
}
请注意,bool inBounds(int, int)
是一个函数,用于检查以确保您不会离开阵列。如果您使用的是 40 x 30 网格,inBounds()
就是这个简单的单行
return ((row >= 0 && row < 40) && (col >= 0 && col < 30));
我把它留给OP来应用基于live_cell_count
价值的生活规则
当您要检查索引时,邻居检查当前正在检查内容。 另外,请确保在检查内容之前检查索引,否则会出现数组越界问题。
这是第一个修复的:
if ((x+1 < HEIGHT) && (grid[x+1][y] != ' ')) { // Swap and index instead of contents.
neighbors++; cout << "A";
}
75
最好用HEIGHT
代替,22
用WIDTH
代替。
if((grid[x+1][y] != ' ') && (x+1 < HEIGHT)) {
neighbors++; cout<<"A";
}
应该是
if((x+1 < HEIGHT) && (grid[x+1][y] != ' ')) { // The range check should be done firstly
neighbors++; cout<<"A";
}
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 检查数组的邻居值
- 生活的游戏邻居检查(更简单的方法可能吗?)
- 生命游戏C++,检查邻居