无法正确确定康威的"Game of life"(生者和死者的三个主要规则)
Cannot determine Conway's "Game of life" correctly(the three main rules for living and dead)
#include <iostream>
using namespace std;
char **create_2darray(int rows, int cols){
char **a;
a = new char *[rows];
for(int i = 0;i<rows;i++){
a[i]=new char[cols];
}
return a;
}
char **set_2darry(int rows, int cols, char** array){
char ** a = array;
for(int i = 0; i < rows; i++){
for(int x = 0; x < cols; x++){
a[i][x]= ' ';
}
}
return a;
}
char **locate_array(char ** a, int rows, int cols){
a[rows][cols] = '*';
return a;
}
char **determine(char ** a, int rows, int cols){
int counter;
int n[1000];
for(int i = 0; i< rows;i++){
for(int x = 0; x< cols; x++){
if(i == 0 && x == 0){
if(a[i][x] == '*'){
if(a[i+1][x] == '*'){
n[counter]++;
}
if(a[i][x+1] == '*'){
n[counter]++;
}
if(a[i+1][x+1] == '*'){
n[counter]++;
}
}
}
else if(i == 0 && x == cols-1){
if(a[i][x] == '*'){
if(a[i][x-1] == '*'){
n[counter]++;
}
if(a[i+1][x-1] == '*'){
n[counter]++;
}
if(a[i+1][x] == '*'){
n[counter]++;
}
}
}
else if(i == rows-1 && x == 0){
if(a[i][x] == '*'){
if(a[i-1][x] == '*'){
n[counter]++;
}
if(a[i-1][x+1] == '*'){
n[counter]++;
}
if(a[i][x+1] == '*'){
n[counter]++;
}
}
}
else if(i == rows-1 && x == cols-1){
if(a[i][x] == '*'){
if(a[i-1][x-1] == '*'){
n[counter]++;
}
if(a[i][x-1] == '*'){
n[counter]++;
}
if(a[i-1][x] == '*'){
n[counter]++;
}
}
}
else if(i == rows-1){
if(a[i][x] == '*'){
if(a[i-1][x-1] == '*'){
n[counter]++;
}
if(a[i][x-1] == '*'){
n[counter]++;
}
if(a[i-1][x] == '*'){
n[counter]++;
}
if(a[i-1][x+1] == '*'){
n[counter]++;
}
if(a[i][x+1] == '*'){
n[counter]++;
}
}
}
else if(i == 0){
if(a[i][x] == '*'){
if(a[i][x-1] == '*'){
n[counter]++;
}
if(a[i+1][x-1] == '*'){
n[counter]++;
}
if(a[i+1][x] == '*'){
n[counter]++;
}
if(a[i][x+1] == '*'){
n[counter]++;
}
if(a[i+1][x+1] == '*'){
n[counter]++;
}
}
}
else if(x == 0){
if(a[i][x] == '*'){
if(a[i-1][x] == '*'){
n[counter]++;
}
if(a[i+1][x] == '*'){
n[counter]++;
}
if(a[i-1][x+1] == '*'){
n[counter]++;
}
if(a[i][x+1] == '*'){
n[counter]++;
}
if(a[i+1][x+1] == '*'){
n[counter]++;
}
}
}
else if(x == cols-1){
if(a[i][x] == '*'){
if(a[i-1][x-1] == '*'){
n[counter]++;
}
if(a[i][x-1] == '*'){
n[counter]++;
}
if(a[i+1][x-1] == '*'){
n[counter]++;
}
if(a[i-1][x] == '*'){
n[counter]++;
}
if(a[i+1][x] == '*'){
n[counter]++;
}
}
}
else {
if(a[i][x] == '*'){
if(a[i-1][x-1] == '*'){
n[counter]++;
}
if(a[i][x-1] == '*'){
n[counter]++;
}
if(a[i+1][x-1] == '*'){
n[counter]++;
}
if(a[i-1][x] == '*'){
n[counter]++;
}
if(a[i+1][x] == '*'){
n[counter]++;
}
if(a[i-1][x+1] == '*'){
n[counter]++;
}
if(a[i][x+1] == '*'){
n[counter]++;
}
if(a[i+1][x+1] == '*'){
n[counter]++;
}
}
}
counter++;
}
}
counter = 0;
for(int i = 0; i< rows;i++){
for(int x = 0; x< cols; x++){
if(n[counter] > 3){
a[i][x] = ' ';
}
else if(n[counter] == 0 || n[counter] == 1){
a[i][x] = ' ';
}
else if(n[counter] == 3){
a[i][x] = '*';
}
counter++;
}
}
return a;
}
struct GOL{
char** table;
int gen;
int rows;
int cols;
};
void print_2darray(char** a, int rows, int cols){
for(int i = 0; i < rows; i++){
for(int x = 0; x < cols; x++){
cout << a[i][x];
}
cout << endl;
}
}
康威人生游戏的三个主要规则是:
- 如果一个被占用的cell没有或只有一个邻居,它将死于孤独。
- 如果一个被占用的细胞有三个以上的邻居,它会因过度拥挤而死亡。
- 如果一个空单元格恰好有三个被占用的相邻单元格,则会生成一个新单元格来替换空单元格。
顺便说一句,相邻的单元格是正上方、正下方、正右侧、正左侧、正上方对角线上、正下方对角线上、正下方对角线上、正下方、正下方。
我不能正确打印"Game of life",我知道我的决定函数有一些问题;
首先,在使用变量count
和n
之前必须初始化:
int counter = 0;
int n[1000] = {0};
其次,您只检查已占用的单元格(规则1和2),但没有代码检查空单元格(规则3)。
虽然有可能对现有代码进行更改,但我的建议是编写新代码,以便它采用完全不同的逻辑。与其检查相邻单元对当前单元的影响,不如计算当前单元对相邻单元的影响。(n
数组中与活细胞相邻的所有细胞加1)。代码将看起来更简单。
对现有代码的更改相当简单。去除所有if(a[i][x] == '*')
,以便对活电流和死电流细胞进行相邻活细胞的计数。
你可以让你自己的生活更容易,通过使游戏板无限-也就是说,它包装。
#include <vector>
#include <iostream>
struct Grid
{
std::vector< std::vector<char> > m_grid;
size_t m_width, m_height;
size_t m_turns;
Grid(size_t width_, size_t height_)
: m_width(width_), m_height(height_)
, m_turns(0)
{
m_grid.resize(m_width);
for (size_t x = 0; x < m_width; ++x) {
m_grid[x].resize(m_height);
std::fill(m_grid[x].begin(), m_grid[x].end(), ' ');
}
}
char& at(int w_, int h_)
{
size_t x = static_cast<size_t>((w_ + m_width) % m_width);
size_t y = static_cast<size_t>((h_ + m_height) % m_height);
return m_grid[x][y];
}
int count(int w_, int h_)
{
return (at(w_, h_) == ' ') ? 0 : 1;
}
void turn()
{
std::vector< std::vector< char > > newGrid;
newGrid.resize(m_width);
for (size_t x = 0; x < m_width; ++x) {
newGrid[x].resize(m_height);
for (size_t y = 0; y < m_height; ++y) {
int counter = count(x - 1, y - 1) + count(x - 1, y) + count(x - 1, y + 1) +
count(x, y - 1) + count(x, y + 1) +
count(x + 1, y - 1) + count(x + 1, y) + count(x + 1, y + 1);
if (m_grid[x][y] == '*')
newGrid[x][y] = (counter >= 2 && counter <= 3) ? '*' : ' ';
else
newGrid[x][y] = (counter == 3) ? '*' : ' ';
}
}
m_grid = newGrid;
++m_turns;
}
void paint()
{
std::cout << "Turns: " << m_turns << "n";
for (size_t x = 0; x < m_width; ++x) {
for (size_t y = 0; y < m_height; ++y) {
std::cout << at(x, y);
}
std::cout << "n";
}
std::cout << "n";
}
};
int main()
{
Grid g(8, 8);
g.at(3, 2) = '*';
g.at(3, 3) = '*';
g.at(3, 4) = '*';
g.at(2, 4) = '*';
g.at(1, 3) = '*';
for (size_t i = 0; i < 5; ++i) {
g.paint();
g.turn();
}
g.paint();
}
虽然这段代码可以工作,并产生了一个工作的生活游戏,但我避免了许多c++的习惯用法和工具,这使得代码非常低效。如果你把这个作为考试答案交上来,你可能会遇到一个非常多疑的讲师。希望它能给你提供一些材料,使你能够编写自己的实现。
例如:这段代码复制整个m_grid每次我们turn()
。这可以通过使用两个m_grid
并在它们之间切换来改进。
相关文章:
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 尽管遵循了规则,内存泄漏在哪里
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 为什么此指针值不能转换为整数的规则是什么?
- 传递通用函数,用于梯形规则的数值积分
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 模板如何影响C++中隐式声明的规则?
- antlr 规则上下文是否可以独立于目标
- Bison/flex 在识别规则后等待输入
- 生成文件中隐式规则中的 -c 标志出错
- 单链接列表实现,规则为 3
- 指针算术规则中的"possibly-hypothetical"是什么意思?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 无法正确确定康威的"Game of life"(生者和死者的三个主要规则)