0

好的,不久前我被分配了一个实验室,我们应该在其中制作一个非常简化版的康威人生游戏。

规则:贪婪的史莱姆(由 R 表示)会吃掉任何与其相邻(正上方、下方或旁边)的慢速史莱姆(由 S 表示)。一旦贪婪的史莱姆“吃掉”了缓慢的史莱姆,就会出现一个新的时间步,其中 4 个新的缓慢史莱姆随机放置在板上。我必须代表 4 个时间步长。

不幸的是,我的代码不能正常工作。无论出于何种原因,我的四个慢史莱姆都不会在每个时间步之后生成。我已经为代码苦苦挣扎,但我无法资助这个错误。请帮忙。

代码:

#include "stdafx.h"
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

//Struct
struct Creatures
{
    public: int type;
    public: int age;
    public: double weight;
    private: double length;

};

//Prototypes
void printLake(Creatures Sludge[10][10]);
void fourNew(Creatures Sludge [10][10], Creatures slowSlime);
void dispatch(Creatures Sludge[10][10], Creatures water);

int main()
{
    //creating the slimes, the water, and the grid (called sludge)
    Creatures Sludge[10][10];
    Creatures slowSlime;
    slowSlime.type = 1;
    Creatures ravenousSlime;
    ravenousSlime.type = 2;
    Creatures water;
    water.type = 3;

    //Initialize Lake
    for (int row = 0; row<10; row++)
    {
        for (int col = 0; col<10; col++)
        {
            Sludge[row][col] = water;
        }
    }

    //Random Distribution of Slow Slimes
    srand(time(0));
    int high = 10;               
    int low = 0;                     
    int i = 0;
    while(i<15)
    {
        int row = rand()% (high - low + 1) + low;
        int col = rand()% (high - low + 1) + low;
        if (Sludge[row][col].type == 3)
        {
            Sludge[row][col] = slowSlime;
            i++;
        }
    }

    //Random Distribution of Ravenouse Slimes
    int c = 0;
    while (c<5)
    {
        int row = rand()% (high - low + 1) + low;
        int col = rand()% (high - low + 1) + low;
        if (Sludge[row][col].type ==3)
        {
            Sludge[row][col] = ravenousSlime;
            c++;
        }
    }

    //Time steps
    cout<<"Step 1"<<endl;
    printLake(Sludge);
    dispatch(Sludge, water);
    fourNew(Sludge, water);
    cout<<endl;
    cout<<"Step 2"<<endl;
    printLake(Sludge);
    dispatch(Sludge, water);
    cout<<endl;
    fourNew(Sludge, water);
    cout<<"Step 3"<<endl;
    printLake(Sludge);
    dispatch(Sludge, water);
    cout<<endl;
    fourNew(Sludge, water);
    cout<<"Step 4"<<endl;
    printLake(Sludge);
    dispatch(Sludge, water);
    fourNew(Sludge, water);
    cout<<endl;
    int j;
    cin>>j;
    return 0;
}

void printLake(Creatures Sludge[10][10])
{
    for (int row = 0; row<10; row++)
    {
        for (int col = 0; col<10; col++)
        {
            if (Sludge[row][col].type == 1)
            {
                cout<<"S ";
            }
            if (Sludge[row][col].type == 2)
            {
                cout<<"R ";
            }
            if (Sludge[row][col].type == 3)
            {
                cout<<"_ ";
            }
        }
        cout<<endl;
    }
}

void fourNew(Creatures Sludge [10][10], Creatures slowSlime)
{
    srand(time(0));
    int high = 10;               
    int low = 0;                     
    int i = 0;
    while(i<4)
    {
        int row = rand()% (high - low + 1) + low;
        int col = rand()% (high - low + 1) + low;
        if (Sludge[row][col].type == 3)
        {
            Sludge[row][col] = slowSlime;
            i++;
        }
    }
}

void dispatch(Creatures Sludge[10][10], Creatures water)
{
  for (int row = 0; row<10; row++)
  {
        for(int col = 0; col<10; col++)
        {
              if(Sludge[row][col].type == 2)
              {
                    if(Sludge[row][col-1].type == 1)
                    {
                          Sludge[row][col-1] = water;
                    }
                    if(Sludge[row][col+1].type == 1)
                    {
                          Sludge[row][col+1] = water;
                    }
                    if(Sludge[row-1][col].type == 1)
                    {
                          Sludge[row-1][col] = water;
                    }
                    if(Sludge[row+1][col].type == 1)
                    {
                          Sludge[row+1][col] = water;
                    }
              }
        }
  }
}

输出:

更新的输出: 在此处输入图像描述 在此处输入图像描述

我在第 4 步看到了几个新的慢史莱姆,但在第 2 步没有看到...

4

3 回答 3

4

快速浏览后,我会说问题出在这里:

fourNew(Sludge, water);

你想要的可能是:

fourNew(Sludge, slowSlime);

详细说明:你的功能

void fourNew(Creatures Sludge [10][10], Creatures slowSlime)

接受两个参数,称为 Sludge 和 slowSlime。这是一个不幸的名称选择,因为在内部编译器不使用这些名称来生成代码。它们完全是为了您的方便。您可能希望编译器自动检查是否将正确的参数传递给函数,但 C++ 没有允许这样做的工具 - 不检查变量名,只检查类型。

函数参数充当局部变量。当您在 main 中传递值时:

fourNew(Sludge, water)

会发生什么:

fourNew() 中的 Sludge 等于 main() 中的 Sludge

fourNew() 中的 slowSlime 变得等于 main() 中的水

所以实际上你要求创建四个水对象。

于 2012-11-27T23:12:50.247 回答
3

有几个问题。


调用srand()一次,而且调用一次。多次调用它会重置随机种子。使用相同的值调用它会使rand()调用重复。如果time(0)结果相同(因为您的程序可能执行得非常快),那么当您尝试创建时fourNew(),它会重复相同的点并且不会很随机。


在您的dispatch()功能中,如果Sludge[0][0]type == 2怎么办?Sludge[row][col-1]将超出范围,也会Sludge[row-1][col]!你需要确保你的范围是正确的。row+1执行/时,最后一行/列也会溢出column+1


AndreyT 提到了一件好事,但这些其他问题也需要考虑。

于 2012-11-27T23:16:31.603 回答
0

这不适用于您的问题,因为游戏规则非常简单,可以在单个板上实现。但以防万一,如果您将来必须更改规则:

我的程序是这样的,电路板的每个新状态通常都是从电路板的先前状态计算出来的。重要的是要观察到,当您分析当前的板状态并生成未来的板状态时,您对未来的板状态所做的修改在当前的板状态中(还)不应该是可见的

换句话说,要在这样的游戏中正常运行,您必须维护两个板:当前板和未来板。您通过将当前板复制到未来板开始每个时间步。然后你分析当前的板并修改未来的板。完成后,未来的棋盘将成为当前棋盘,并重复循环。

于 2012-11-27T23:09:00.930 回答