无法正确确定康威的"Game of life"(生者和死者的三个主要规则)

Cannot determine Conway's "Game of life" correctly(the three main rules for living and dead)

本文关键字:死者 规则 三个 Game 康威 of life      更新时间:2023-10-16
#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;
    }
}

康威人生游戏的三个主要规则是:

  1. 如果一个被占用的cell没有或只有一个邻居,它将死于孤独。
  2. 如果一个被占用的细胞有三个以上的邻居,它会因过度拥挤而死亡。
  3. 如果一个空单元格恰好有三个被占用的相邻单元格,则会生成一个新单元格来替换空单元格。

顺便说一句,相邻的单元格是正上方、正下方、正右侧、正左侧、正上方对角线上、正下方对角线上、正下方对角线上、正下方、正下方。

我不能正确打印"Game of life",我知道我的决定函数有一些问题;

首先,在使用变量countn之前必须初始化:

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并在它们之间切换来改进。