好吧,不久之前,我被分配了一个实验室,在那里我们应该制作一个非常简化的康威生活游戏。
规则:贪婪粘液(由R指定)将食用与其相邻的任何慢速粘液(由S指定)(直接在上方,下方或旁边)。一旦贪婪的粘液吃了"吃掉了#34;缓慢的粘液,一个新的时间步骤发生在板上随机放置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步没有看到......
答案 0 :(得分:4)
快速浏览后,我会说问题就在这里:
fourNew(Sludge, water);
你想要的可能是:
fourNew(Sludge, slowSlime);
详细说明:你的功能
void fourNew(Creatures Sludge [10][10], Creatures slowSlime)
采用两个名为Sludge和slowSlime的参数。这是一个不幸的名称选择,因为内部编译器不使用这些名称来生成代码;它们完全是为了您的方便。您可能希望编译器自动检查是否将正确的参数传递给函数,但是C ++没有允许这样做的工具 - 不检查变量名,只检查类型。
函数参数充当局部变量。当您传递主要值中的值时:
fourNew(Sludge, water)
这是怎么回事:
fourNew()中的污泥变得等于main()
中的污泥fourNew()中的slowSlime变得等于main()
中的水所以实际上你要求创造四个水对象。
答案 1 :(得分: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提到了一件好事,但其他问题也需要关注。
答案 2 :(得分:0)
这不适用于您的问题,因为游戏规则非常简单,无法在单板上实现。但以防万一,如果您必须更改规则在未来:
我编程,因为每个新的电路板状态通常是从电路板的先前状态计算出来的。重要的是要注意,当您分析当前电路板状态并生成 future 电路板状态时,您对未来电路板状态所做的修改不应该是在当前的董事会状态中可见(尚未)。
换句话说,为了让所有事情在这样的游戏中经常正常工作,你必须维护两个板:当前的和未来的板。您可以通过将当前板复制到未来的板来开始每个时间步。然后分析当前板并修改 future 。一旦完成,未来的电路板将成为当前电路板,并且循环重复。