生活游戏程序,需要用户输入的帮助
Game of Life program, help needed with user input
我有一个基本的"生命游戏"程序C++我需要更改以接受用户输入的网格大小和有多少邻居将使细胞存活或死亡的参数。目前,我专注于网格大小的用户输入,但是我在maxrow和maxcol变量的"未声明标识符"方面遇到了问题。这是代码,底部是我为接受用户输入而创建的函数。该程序按原样工作,但是当我尝试实现用户输入函数时,它会给我所有这些错误。我知道我必须删除头文件中的常量整数,但我认为我的错误来自某些不理解 maxrow 和 maxcol 是什么的函数,例如"指令"函数。我怎样才能在整个程序中识别变量的方式实现它?感谢您的任何帮助。
生活.h
#ifndef LIFE_H
#define LIFE_H
const int maxrow = 20, maxcol = 60;
class Life
{
public:
Life(void);
~Life(void);
void initialize();
void print();
void update();
int getNeighbor_count(int, int);
void instructions();
bool user_says_yes();
private:
int grid[maxrow+2][maxcol+2]; // allows for two extra rows and columns
int neighbor_count(int row, int col);
};
#endif
生活.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "life.h"
using namespace std;
Life::Life()
{
}
Life::~Life(void)
{
}
int Life::neighbor_count(int row, int col)
/* Pre: The Life object contains a configuration, and the coordinates row and col define a cell inside its hedge.
Returns: The number of living neighbors of the specified */
{
int i, j;
int count = 0;
for(i = row-1; i <= row+1; i++)
for(j = col-1; j <= col+1; j++)
count += grid[i][j]; // Increase if neighbor is alive.
count -= grid[row][col]; // Reduce count, cell is not its own neighbor.
return count;
}
void Life::update( )
/*Pre: The Life object contains a configuration.
Post: The Life object contains the next generation of configuration.*/
{
int row, col;
int new_grid[maxrow + 2][maxcol + 2];
for(row = 1; row <= maxrow; row++)
for(col = 1; col <= maxcol; col++)
switch (neighbor_count(row, col)) {
case 2: // Status stays the same.
new_grid[row][col] = grid[row][col];
break;
case 3: // Cell is now alive.
new_grid[row][col] = 1;
break;
default: // Cell is now dead
new_grid[row][col] = 0;
}
// Copy new configuration back to original
for(row = 1; row <= maxrow; row++)
for(col = 1; col <= maxcol; col++)
grid[row][col] = new_grid[row][col];
}
void Life::initialize( )
/* Pre: None.
Post: The Life object contains a configuration specified by the user.*/
{
int row, col;
for(row = 0; row <= maxrow+1; row++)
for(col = 0; col <= maxcol+1; col++)
grid[row][col] = 0;
cout <<"List the coordinates for living cells." << endl;
cout << "Terminate the list with the the special pair -1 -1"<< endl;
cin >> row >> col;
while (row != -1 || col != -1)
{
if(row >= 1 && row <= maxrow)
if(col >= 1 && col <= maxcol)
grid[row][col] = 1;
else
cout << "Column " << col << " is out of range." << endl;
else
cout << "Row " << row << " is out of range." << endl;
cin >> row >> col;
}
}
void Life::print( )
/* Pre: The Life object contains a configuration.
Post: The configuration is written for the user.
*/
{
int row, col;
cout << "nThe current Life configurations is: "<< endl;
for(row = 1; row <= maxrow; row++) {
for(col = 1; col <= maxcol; col++)
if(grid[row][col] == 1) cout << '*';
else cout << ' ';
cout << endl;
}
cout << endl;
}
主.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "life.h"
using namespace std;
void instructions();
bool user_says_yes();
void Life::instructions( )
/* Pre: None.
Post: Instructions for using the Life program have been printed.*/
{
cout << "Welcome to Conway's game of Life." << endl;
cout << "This game uses a grid of size "
<< maxrow << " by " << maxcol << " in which" << endl;
cout << "each cell can either be occupied by an organism or not." << endl;
cout << "The occupied cells change from generation to generation" << endl;
cout << "according to the number of neighboring cells ";
cout << "which are alive." << endl;
}
bool Life::user_says_yes()
{
int c;
bool initial_response = true;
do { // Loop until an appropriate input is received.
if(initial_response)
cout << "Would you like to see the next generation (y,n)? " << flush;
else
cout << "Respond with either y or n: " << flush;
do { // Ignore white space.
c = cin.get( );
} while (c == 'n' || c == ' ' || c == 't');
initial_response = false;
} while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
return (c == 'y' || c == 'Y');
}
int Life::getNeighbor_count(int row, int col)
{
return neighbor_count(row, col);
}
int main()// driver for neighbor_count( )
/* Pre: None.
Post: Verifies that the method neighbor_count( )returns the correct values.
Uses: The class Life and its method initialize( ).
*/
{
Life configuration;
configuration.instructions();
configuration.initialize();
do{
for(int row = 1; row <= maxrow; row++){
for(int col = 1; col <= maxrow; col++)
cout << configuration.getNeighbor_count(row,col) << " ";
cout << endl;
}
configuration.print();
configuration.update();
}while(configuration.user_says_yes());
}
最大列和最大行的用户输入功能
void getGridParameters(int& maxrow, int& maxcol)
{
cout << "Enter number of rows for the grid: ";
cin >> maxrow;
cout << "Enter number of columns for the grid ";
cin >> maxcol;
}
使任何其他函数看到的变量的旧方法是将它们声明为global
变量,这很糟糕。 对于instruction
函数understand
maxrow和maxcol,您可以将这些值传递给该功能,如下所示
void instructions(int maxrow, int maxcol );
如果要更改传入的值,可以通过引用传递
void instructions(int &maxrow, int& maxcol );
(尽管对于此函数,您可能不需要按引用传递。
问题是你的网格被声明为 int grid[maxrow+2][maxcol+2];
,这需要 maxrow
和 maxcol
是常量。
C++具有运行时大小数组的类型,std::vector< >
.由于您有一个 2D 网格,因此您需要一个矢量向量:std::vector<std::vector<int>>
.使用grid
保持不变:grid[i][j]
仍然有效。但是您必须设置初始大小:
void Life::setupGrid()
{
// I've got maxrow rows, and each row has maxcol columns.
grid.resize(maxrow, std::vector<int>(maxcol));
}
现在,maxrow和maxcol不再需要保持不变。作为一项好处,您现在可以说for (auto& row : grid) { for (auto& cell: row) { /** stuff **/ } }
对每个单元格执行某些操作。
maxrow
和maxcol
const
,它们在头文件中声明。正如您所说,归结为它们作为编译二进制文件中的变量消失。
要使它们成为变量,您应该将它们声明为 Life
类的成员变量:
class Life {
private:
int maxcol, maxrows;
..
}
由于它们会变得非常量,因此您无法直接在Life
类中声明二维数组,因此您需要动态分配它,例如:
int **grid = new int*[maxrows];
for (int i = 0; i < maxrows; ++i)
grid[i] = new int[maxcols];
这将要求您在析构函数中释放内存Life
。另一种解决方案是拥有一个单维数组,例如int **grid = new int[maxrows*maxcols]
以简化分配,但它需要更改索引功能。
关于如何存储它们,由于它们将成为 Life 类的一部分,因此您可以直接将输入值保存在其中:
void Life::getNeighbor_count() {
cin >> maxrows;
cin >> maxcols;
allocateGrid();
}
- C++如何通过用户输入删除列表元素
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 在C++中,我如何接受不同于同一行的用户输入
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 显示基于用户输入的整数的字符
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 打印时有二叉树问题.用户输入不打印任何内容
- C ++奇怪的数组由用户输入
- 如何允许大写和小写用户输入?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 如何使用用户输入变量制作二维数组?
- 用户输入字符串的文件附加问题..C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?