2

だから、私は近接デスマッチビデオゲームの(一種の)シミュレーションを作成するプログラムを作成しています(現時点では実際にビデオゲームを作成するのではなく、お互いを殺すという目標を持つ単純なAIを作成するだけです)。これを行うために、私はタイルベースのターンベースのシステムを使用しています。

導入は邪魔になりません。ここに特定の問題があります。使用している配列の1つで、配列内の変数の数に関係なく、最後の値がRAMに誤って格納されます。関連するコードは次のとおりです。

(私が持っているすべてのコードをこれの最後に投稿しますが、問題はここにあります)

#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;


    int npcTileAttacker[] = { 0, 0, 0, 0, 0};

    int s = 0;
    while (s < 6)
    {
        cout << "The value that is being selected from the array is " << s << endl;
        cout << npcTileAttacker[s] << endl;
        s++;
        cout << "The value of s has now been set to " << s << endl;
    }

これは以下を出力します:

The value that is being selected from the array is 0
0
The value of s has now been set to 1
The value that is being selected from the array is 1
0
The value of s has now been set to 2
The value that is being selected from the array is 2
0
The value of s has now been set to 3
The value that is being selected from the array is 3
0
The value of s has now been set to 4
The value that is being selected from the array is 4
0
The value of s has now been set to 5
The value that is being selected from the array is 5
-858993640
The value of s has now been set to 6

明らかに、配列からのこの最後の値は正しくありません。私が知りたいのは、なぜこれが起こるのかということです。これに加えて、プログラムが終了すると、「ランタイムチェックの失敗#2-変数「npcTileAttacker」の周りのスタックが破損しました」というエラーメッセージが表示されます。

sの出力値とコードの配列をプログラム内の他の配列の周りに配置しようとしましたが、同じ問題が発生しました。

必要に応じて、これが私の完全なコードです。

#include "stdafx.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
    using namespace std;

int numberOfNPCs = 5;

//Remember whose alive (so we can skip the dead's turns)
int npcAlive[5] = { 1, 1, 1, 1, 1 };


/*This determines what action is going to be carried out on this square. For the moment:
if npcTileActivity[n] = 1;
the goals is death

WARNING! THIS WILL RESULT IN BUGS!!! I need to figure out a way that allows multiple activities on a tile 
(maybe apply actions onto NPCs directly, rather than onto their tiles)
*/
int npcTileActivity[] = { 0, 0, 0, 0, 0};



//This tells you who is doing the action on this tile
int npcTileAttacker[5] = { 1, 2, 3, 4, 0 };

    int s = 0;
while (s < 6)
{
    cout << "The value that is being selected from the array is " << s << endl;
    cout << npcTileAttacker[s] << endl;
    s++;
    cout << "The value of s has now been set to " << s << endl;
}
//This determines whether or not the NPC will fight back. Currently pointless, as this will just kill them.
int npcPacifism[5] = { 0 };



//This is their HP
int npcDefense[5] = {5, 5, 5, 5, 5};



//This is the default damage (presumably this is done with knives)
int npcOffense[5] = {1, 1, 1, 1, 1};



/*This determines what each NPC wants to do.
1   -   Kill Target
*/
int npcGoal[5] = {1, 1, 1, 1, 1};


//This is the NPC they are aiming at
int npcTarget[5] = {1, 2, 3, 4, 0};


/*The x coord for their target. In the future:
-I want this to be able to be changed during the sim
-This should be disabled until the NPC can find out where their target is
*/
int npcGoalLocationX[5] = {4, 1, 4, 3, 1};


/* The Y coord for their target
*/
int npcGoalLocationY[5] = {2, 3, 4, 2, 1};


/*Their x coord.
This will change, then the all npcGoalLocations need to be updated
*/
int npcLocationX[5] = {1, 4, 1, 4, 3};


/* Their y coord.
*/
int npcLocationY[5] = {1, 2, 3, 4, 2};

int m = 1;
while (m != 0)
{

    int i = 0;

    //Loop until every npc has had a turn
    while (i < (numberOfNPCs + 1))
    {
        /*npcGoalLocationY[i] = npcLocationY[npcTarget[i]];
        npcGoalLocationY[i] = npcLocationY[npcTarget[i]];*/
        if (npcAlive[i] = 1)
        {
            /* Tile activities:
            1 - Kill occupant
            */ 
            if (npcTileActivity[i] = 1)
            {
                cout << "This shouldn't be the first thing." << endl;

                //This gets the attack and defense values for the appropriate acting NPC
                int j = 0;
                while (j < (numberOfNPCs + 1))
                {

                    if (npcTileAttacker[i] = j)
                    {
                        //Defender's HP - Attacker's damage
                        int rollAttack1 = npcDefense[i] - npcOffense[j];
                        if (rollAttack1 > 0)
                            {
                            npcDefense[i] = rollAttack1;
                            cout << "NPC " << j << " attacks NPC " << i << endl;
                            if (npcPacifism[i] = 0)
                            {
                                //Defender retaliates
                                int rollAttack2 = npcDefense[j] - npcOffense[i];
                                if (rollAttack2 > 0)
                                {
                                    npcDefense[j] = rollAttack2;
                                    cout << "NPC " << i << " retaliates" << endl;
                                }else
                                {
                                    npcAlive[j] = 0;
                                    cout << "NPC " << j << " dies" << endl;
                                }
                            }
                        }else
                        {
                            npcAlive[i] = 0;
                            cout << "NPC " << i << " dies" << endl;
                        }
                    }
                    j++;
                }
            }else
            {
                cout << "This should be the first." << endl;
                if (npcGoal[i] != 0)
                {
                    if (npcGoalLocationX[i] = npcLocationX[i])
                    {
                        if (npcGoalLocationY[i] = npcLocationY[i])
                        {
                            //The Tile Activity of the current NPC's target is set to whatever the current NPC's goal is
                            npcTileActivity[npcTarget[i]] = npcGoal[i];
                        }
                    }
                    if (npcGoalLocationX[i] > npcLocationX[i])
                    {
                        npcLocationX[i]++;
                    }
                    if (npcGoalLocationX[i] < npcLocationX[i])
                    {
                        npcLocationX[i]--;
                    }
                    if (npcGoalLocationY[i] > npcLocationY[i])
                    {
                        npcLocationY[i]++;
                    }
                    if (npcGoalLocationY[i] < npcLocationY[i])
                    {
                        npcLocationY[i]--;
                    }
                }
            }
        }
        i++;
    }
    cin >> m;
}
return 0;
}

また、問題が発生します(「これが最初である必要があります」と「これが最初である必要がありません」という行の周り):最初であってはならないものが最初であり、最初であるべきではないものは決して均等ではありません実行します。ただし、これはおそらく配列エラーに関連しています。

ご協力いただきありがとうございます。

4

4 に答える 4

3

あなたの状態は1つずれています:

while (s < 6)  

する必要があります

while (s < 5)

配列{ 0, 0, 0, 0, 0}には5つの要素があるため、有効なインデックスは0,1,2,3,4です。

がになると条件が停止するため、s < 6false引き続き当てはまりますs == 5

于 2012-10-26T08:41:54.457 に答える
1

配列には5つのセルしかありません。

int npcTileAttacker[] = { 0, 0, 0, 0, 0};

つまりs、0から5ではなく0から4に変更する必要があります。

表示されている「ランダム」値は、実際には、npcTileAttacker配列をオーバーフローしているため、配列の後にスタックにあった値です。

于 2012-10-26T08:42:22.610 に答える
1

配列のサイズは5です。したがって、有効なインデックスは0〜4です。したがって、npcTileAttacker[5]は常にガベージを投稿します。

于 2012-10-26T08:44:40.317 に答える
1

whileループ式で1つ外れています。

また、配列の長さをハードコーディングするのではなく、forループを使用することをお勧めします。次のようなものを試してください。

int npcTileAttacker[] = { 0, 0, 0, 0, 0};
int npcTileAttackerLength = sizeof(npcTileAttacker)/sizeof(npcTileAttacker[0]);

for(int s=0; s<npcTileAttackerLength; s++)
{
    cout << "The value that is being selected from the array is " << s << endl;
    cout << npcTileAttacker[s] << endl;
}

このように、長さ変数は常に配列内のアイテムの数を保持します。

于 2012-10-26T08:46:51.430 に答える