-1

Game Of Life の割り当てに問題があります。正しく動作しないことが 2 つあります。

  1. ゲームの実行世代数が多すぎます (入力された数の 2 倍)
  2. 世代が適切に更新されない: 所定の状態 2 は静的な状態です。しかし、これも死ぬ。

私は自分の生死の状態をチェックして再チェックし、それらをインターネットで見つかった多数の例と比較しましたが、何も見つかりません. コメントやポインタは大歓迎です!:)

コードは次のとおりです。

関数.cpp:

#include <iostream>
#include <ctime>
#include "functions.h"

using namespace std;

void dspIntroMenu()
{
    cout << "Welcome to the Game Of Life! Please make a choice below" << endl << endl;
    cout << "Press \"P\" to play!" << endl;
    cout << "Press \"R\" to read more about the Game Of Life." << endl;
    cout << "Press \"Q\" to quit." << endl;
    cout << endl << "Choice: ";
}


void whatIs()
{
    cout << "The game of life ........";
}

void playMenu()
{
    cout << "Press \"P\" to choose from predetermined initial states." << endl;
    cout << "Press \"R\" to randomize." << endl;
    cout << endl << "Choice: ";
}

void dispPredStates()
{
    cout << "Please choose between the following states" << endl << endl;
    cout << "    State 1" << endl << "--------------" << endl;
    cout << "   1 0 1 1" << endl << "   0 0 0 0" << endl << "   1 0 1 0" << endl << "   0 1 1 1" << endl << endl;

    cout << "    State 2" << endl << "--------------" << endl;
    cout << "   1 1 1 0" << endl << "   0 1 1 1" << endl << endl;

    cout << "    State 3" << endl << "--------------" << endl;
    cout << "   0 1 0 1" << endl << "   1 1 0 0" << endl << "   0 1 0 1" << endl << "   1 1 1 0" << endl << endl;
}

関数.h:

#ifndef HEADER_H
#define HEADER_H

void dspIntroMenu();
void whatIs();
void playMenu();
void dispPredStates();
int neighbours(int i, int j, int (*game)[21], int x, int y);


#endif

in4.cpp、「メイン」

#include <iostream>
#include <ctime>
#include <cstdlib>
//#include <windows.h>
#include "functions.h"

using namespace std;

int main()
{
    static int size = 22;
    int neighAlive, go=0, gen;
    int game[size][size];
    int gameTemp[size][size];
    char mChoice;


    //Fyll matriserna med nollor:
    for (int i=0; i<=size-1; i++)
    {
        for (int j=0; j<=size-1; j++)
        {
            game[i][j] = 0;
            gameTemp[i][j] = 0;
        }
    }
    //%-----------------------------%

    dspIntroMenu();
    cin >> mChoice;

    while (go==0)
    {
        char pMenuChoice;
        int psChoice, help;

        switch (mChoice)
        {
            case 'p':
            case 'P':
                cout << "How many generations do you wish to view?: ";
                cin >> gen;
                cout << endl << endl;
                playMenu();
                cin >> pMenuChoice;

                switch (pMenuChoice)
                {
                    case 'p':
                    case 'P':
                        dispPredStates();
                        cout << "Choice: ";
                        cin >> psChoice;
                        if (psChoice == 1)
                        {
                            game[9][9] = 1; game[9][10] = 0; game[9][11] = 1; game[9][12] = 1;
                            game[10][9] = 0; game[10][10] = 0; game[10][11] = 0; game[10][12] = 0;
                            game[11][9] = 1; game[11][10] = 0; game[11][11] = 1; game[11][12] = 0;
                            game[12][9] = 0; game[12][10] = 1; game[12][11] = 1; game[12][12] = 1;
                        }
                        else if (psChoice == 2)
                        {
                            game[10][9] = 1; game[10][10] = 1; game[10][11] = 1; game[10][12] = 0;
                            game[11][9] = 0; game[11][10] = 1; game[11][11] = 1; game[11][12] = 1;
                        }
                        else
                        {
                            game[9][9] = 0; game[9][10] = 1; game[9][11] = 0; game[9][12] = 1;
                            game[10][9] = 1; game[10][10] = 1; game[10][11] = 0; game[10][12] = 0;
                            game[11][9] = 0; game[11][10] = 1; game[11][11] = 0; game[11][12] = 1;
                            game[12][9] = 1; game[12][10] = 1; game[12][11] = 0; game[12][12] = 0;;
                        }
                        break;
                        go=1;
                    case 'r':
                    case 'R':
                        srand(time(0));
                        for(int i=9; i<=12; i++)
                        {
                            cout << endl;
                            for (int j=9; j<=12; j++)
                            {
                                help = rand() % 3;
                                if (help == 2)
                                {
                                    game[i][j] = 0;
                                }
                                else {game[i][j] = 1;}

                                //cout << game[i][j] << " " << endl;
                            }
                        }
                        break;
                }
                go=1;
                break;

            case 'r':
            case 'R':
                whatIs();
                break;

            case 'q':
            case 'Q':
                return 0;

            default:
                cout << "Please press \"P\", \"R\" or \"Q\": ";
                break;
        }
        break;
    }

    //The real game starts here!
    for (int k=0; k<=size-1; k++)
        {
            for (int l=0; l<=size-1; l++)
            {
                cout << game[k][l] << " ";
            }
            cout << endl;
        }
        cin.ignore(1024, '\n');
        cout << "Press enter to continue...";
        cin.get();
        //system("pause");
        //system("cls");

    for (int tid=1; tid<=gen; tid++)
    {
        for (int i=1; i<=size-2; i++)
        {
            for (int j=1; j<=size-2; j++)
            {
                neighAlive = game[i-1][j] + game[i+1][j] + game[i][j-1] + game[i][j+1] + game[i-1][j-1] + game[i+1][j-1] + game[i-1][j+1] + game[i+1][j+1];
                if ((game[i][j] == 1 && neighAlive < 2) || (game[i][j] == 1 && neighAlive > 3))
                {
                    gameTemp[i][j] = 0;
                }
                else if (game[i][j] == 0 && neighAlive == 3)
                {
                    gameTemp[i][j] = 1;
                }

            }
            //cout << endl;
        }
        for (int k=0; k<=size-1; k++)
        {
            for (int l=0; l<=size-1; l++)
            {
                game[k][l] = gameTemp[k][l];
                cout << game[k][l] << " ";
            }
            cout << endl;
        }
        //Sleep(1000);
        //system("pause");
        //system("CLS");
        cin.ignore(1024, '\n');
        cout << "Press enter to continue...";
        cin.get();
    }



    return 0;
}
4

2 に答える 2

4
                    break;
                     go=1;

あなたの行き先は決して到達できず、永遠にループします。休憩前に置きます。

于 2012-08-22T12:18:46.650 に答える
3

ここに論理的な欠陥があります

        if ((game[i][j] == 1 && neighAlive < 2) || (game[i][j] == 1 && neighAlive > 3))
        {
            gameTemp[i][j] = 0;
        }
        else if (game[i][j] == 0 && neighAlive == 3)
        {
            gameTemp[i][j] = 1;
        }

ステートメントgameTemp[i][j]の条件がどれも満たされない場合、何に初期化されますか?if

于 2012-08-22T12:38:56.687 に答える