0

さて、私はしばらく前にラボを割り当てられました。そこでは、コンウェイのライフゲームの非常に単純化されたバージョンを作成することになっています。

ルール:貪欲なスライム(Rで指定)は、それに隣接する(Sで指定)遅いスライム(真上、真下、または横)を食べます。貪欲なスライムが遅いスライムを「食べた」と、4つの新しい遅いスライムがボード上にランダムに配置される新しいタイムステップが発生します。私は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と呼ばれる2つのパラメーターを取ります。内部的にコンパイラはコードを生成するためにそれらの名前を使用しないため、これは残念な名前の選択です。それらは厳密にあなたの便宜のためです。コンパイラが正しいパラメータが関数に渡されることを自動的にチェックすることを期待したかもしれませんが、C ++にはそれを許可する機能がありません-変数名はチェックされず、型のみです。

関数パラメーターはローカル変数として機能します。メインに値を渡す場合:

fourNew(Sludge, water)

何が起こるかこれは:

fourNew()のスラッジはmain()のスラッジと等しくなります

fourNew()のslowSlimeは、main()の水と等しくなります。

つまり、実際には、4つの水オブジェクトの作成を求めています。

于 2012-11-27T23:12:50.247 に答える
3

いくつかの問題があります。


srand()一度だけ、そして一度だけ電話してください。複数回呼び出すと、ランダムシードがリセットされます。同じ値で呼び出すと、rand()呼び出しが繰り返されます。結果が同じ値になる場合time(0)(プログラムが非常に高速に実行される可能性があるため)、作成しようとするとfourNew()、同じスポットが繰り返され、ランダムにはなりません。


あなたのdispatch()関数で、もしSludge[0][0]持っているとしたらtype == 2Sludge[row][col-1]範囲外になりますSludge[row-1][col]。範囲が正しいことを確認する必要があります。row+1/を実行すると、最後の行/列もオーバーフローしますcolumn+1


AndreyTは良いことを述べていますが、これらの他の問題も検討する必要があります。

于 2012-11-27T23:16:31.603 に答える
0

ゲームのルールは単一のボードに実装できるほど単純なので、これは問題には当てはまりません。ただし、念のため、将来ルールを変更する必要がある場合は、次のようにします。

私は、ボードの新しい状態は通常、ボードの前の状態から計算されるようにプログラムします。現在のボード状態を分析して将来のボード状態を生成するときに、将来のボード状態に加えた変更は、現在のボード状態では(まだ)表示されないようにする必要があることに注意してください

言い換えれば、このようなゲームですべてが正しく機能するためには、現在のボードと将来のボードの2つのボードを維持する必要があります。現在のボードを将来のボードにコピーすることから、各タイムステップを開始します。次に、現在のボードを分析し、将来のボードを変更します。完了すると、将来のボードが現在のボードになり、このサイクルが繰り返されます。

于 2012-11-27T23:09:00.930 に答える