недопустимые типы 'int [int]' для подстрочного массива в многомерном массиве c ++ - PullRequest
0 голосов
/ 26 октября 2018

При выполнении моего курсового проекта по карточной игре я получил эту ошибкуНедопустимые типы `int [int] 'для индекса массива'Вот код:

#include <iostream>
#include <stdlib.h>
#include <time.h>

int randomize(int, int);
int* generateCardNumber(int[5]);
int* generateCardLogo(int, int[13][4], int[5]);
int* compareCard(int[5], int[5], int[5], int[5], int[13][4]);
int printResult(int[5]);
void showCard(int, int[5], int[5], int[5], int[5]);
void printCard(int[5], int[5]);


using namespace std;

int main()
{
    srand(time(NULL));
    int player1Number[5], player1Logo[5];
    int *number1, *logo1;
    int player2Number[5], player2Logo[5];
    int *number2, *logo2;
    int cardInfo[13][4];
    int **card;
    char answer;

   do
   {
       int playerInput;
       int d, c, r;
       int player1Score, player2Score;
       cout<<"Welcome to the card game!"<<endl;
       cout<<" Choose player{1: Player 1; 2: Player 2} : ";
       cin>>playerInput;
       cout<<endl;

       do
       {
            cout<<"Press d to deal card :";
       }while(d != 'd');
       number1  = generateCardNumber(player1Number);
       logo1    = generateCardLogo(1,cardInfo, player1Number);
       for (int i = 0; i<5; i++)
       {
           cardInfo[player1Number[i]][player1Logo[i]] = 1;
       }
       number2  = generateCardNumber(player2Number);
       logo2        = generateCardLogo(2,cardInfo, player2Number);
       for (int i = 0; i<5; i++)
       {
           cardInfo[player2Number[i]][player2Logo[i]] = 1;
       }
       showCard(playerInput,player1Number,player1Logo,
       player2Number,player2Logo);

       do
       {
          cout<<"Press c to compare card :";
       }while(c != 'c');
       *card = compareCard(player1Number,player1Logo,
       player2Number,player2Logo,cardInfo);
       for (int i = 0; i<5; i++)
       {
           if(cardInfo[player1Number[i]][player1Logo[i]] = -1)
           {
               player1Number[i] = -1;
               player1Logo[i] = -1;
           }
           else if(cardInfo[player2Number[i]][player2Logo[i]] = -1)
           {
               player2Number[i] = -1;
               player2Logo[i] = -1;
           }
       }

       showCard(playerInput,player1Number,
       player1Logo,player2Number,player2Logo);

       do
       {
           cout<<"Press r to show result :";
       }while(r != 'r');
       if(playerInput == 1)
       {
           cout<<"Player1 (You):        ";
           player1Score = printResult(player1Number);
           cout<<"Player2 (Computer):   ";
           player2Score = printResult(player2Number);
           if(player1Score > player2Score) cout<<"You WIN!"<<endl;
           else cout<<"Computer WIN!"<<endl;
       }
       else if(playerInput == 2)
       {
           cout<<"Player1 (Computer):   ";
           player1Score = printResult(player1Number);
           cout<<"Player2 (You):        ";
           player2Score = printResult(player2Number);
           if(player2Score > player1Score) cout<<"You WIN!"<<endl;
           else cout<<"Computer WIN!"<<endl;
       }
       cout<<"Do you want to play again? (y/n)"<<endl;
       cin>>answer;     
   }while(answer == 'Y' || answer == 'y');
}

int randomize (int x, int y)
{
   return (rand()%y + x);
}

int* generateCardNumber (int numberArray[5])
{
    int arrayStoring[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
    for (int i = 0; i<5; i++)
    {
        do
        {
            numberArray[i] = randomize(1,13);   
        }while (arrayStoring[numberArray[i]] == 1);
        arrayStoring[numberArray[i]] = 1;
    }
    return numberArray;
}
int* generateCardLogo (int turn, int cardInfo[4][13], int player2Number[5])
{
    int logoArray[5];
    if(turn == 1)
    {
        for (int i = 0; i<5; i++)
        {
            logoArray[i] = randomize(1,4);
        }
        return logoArray;
    }
    else if(turn == 2)
    {
        for (int i = 0; i<5; i++)
        {
            do
            {
                logoArray[i] = randomize(1,4);  
            }while (cardInfo[player2Number[i]][logoArray[i]] == 1);         
        }
        return logoArray;
    }   
}

int** compareCard(int player1Number, int player1Logo, int player2Number, int player2Logo, int cardInfo)
{
    for(int i=0; i<5 ; i++)
    {
        for(int j=0; j<5 ; j++)
        {
            if(player1Number[i] == player2Number[j])
            {
                if(player1Logo[i] < player2Logo[j]) cardInfo[player1Number[i]][player1Logo[i]] = -1;
                else if(player1Logo[i] > player2Logo[j]) cardInfo[player2Number[i]][player2Logo[i]] = -1;
                break;
            }
        }
    }
    return cardInfo;
}

int printResult (int playerNumber)
{
    int playerScore = 0;
    for (int i = 0; i<5; i++)
    {
        if(playerNumber[i] == -1) break;
        else if(playerNumber[i] == 0)
        {
            playerScore += 15;  
            cout<<"15 ";
        }
        else if(playerNumber[i] > 0 && playerNumber[i] < 10 )
        {
            playerScore += (playerNumber[i] + 1);
            cout<< (playerNumber[i] + 1) <<" ";
        }
        else if(playerNumber[i] >= 10)
        {
            playerScore += 12;
            cout<<"12 ";
        }

        if(i<4) cout<<"+ ";
        else if(i==4)
        {
            cout<<"= "<<playerScore<<" points";
        }
    }
    return playerScore;
}

void printCard (int numberArray[5], int logoArray[5])
{
    for (int i = 0; i<5; i++)
    {
        switch(numberArray[i])
        {
            case -1 :
                cout<<"<fold> ";
                break;
            case 0 :
                cout<<"Ace ";
                break;
            case 1 :
                cout<<"2 ";
                break;
            case 2 :
                cout<<"3 ";
                break;
            case 3 :
                cout<<"4 ";
                break;
            case 4 :
                cout<<"5 ";
                break;
            case 5 :
                cout<<"6 ";
                break;
            case 6 :
                cout<<"7 ";
                break;
            case 7 :
                cout<<"8 ";
                break;
            case 8 :
                cout<<"9 ";
                break;
            case 9 :
                cout<<"10 ";
                break;
            case 10 :
                cout<<"Jack ";
                break;
            case 11 :
                cout<<"Queen ";
                break;
            case 12 :
                cout<<"King ";
                break;
        }
        switch(logoArray[i])
        {
            case -1:
                break;
            case 0:
                cout<<"Diamond  ";
                break;
            case 1:
                cout<<"Club     ";
                break;
            case 2:
                cout<<"Heart    ";
                break;
            case 3:
                cout<<"Spade    ";
                break;  
        }   
    }
}
void showCard (int playerInput, int player1Number, int player1Logo, int player2Number, int player2Logo)
{
    if(playerInput == 1)
    {
        cout<<"Player1 (You):"<<endl;
        printCard(player1Number, player1Logo);
        cout<<"Player2 (Computer):"<<endl;
        printCard(player2Number, player2Logo);
    }
    else if(playerInput == 2)
    {
        cout<<"Player1 (Computer):"<<endl;
        printCard(player1Number, player1Logo);
        cout<<"Player2 (You):"<<endl;
        printCard(player2Number, player2Logo);
    }
}

Честно говоря, я все еще новичок в программировании.Так что я не знал, что не могу вернуть целый массив из функции.После поиска подсказки я обнаружил, что могу использовать указатель для возврата массива из функции.Когда я пытаюсь исправить код, появляется эта ошибка, и я не знаю, что мне нужно исправить.Ошибка продолжает появляться, когда я пытаюсь использовать массив из параметра функции, такой как этот

if(player1Number[i] == player2Number[j])<br/>

от функции

int** compareCard(int player1Number, int player1Logo, int player2Number, int player2Logo, int cardInfo)

и далее.

Может кто-нибудь помочь мне разобраться?Исправление в коде будет очень цениться.Большое спасибо!(Извините, если мой английский плохой)

1 Ответ

0 голосов
/ 26 октября 2018

Вы объявляете compareCard с кучей массивов (например, указателей int) в качестве параметров:

int* compareCard(int[5], int[5], int[5], int[5], int[13][4]);

Затем вы реализуете его, используя целые числа (а не указатели) в качестве параметров:

int** compareCard(int player1Number, int player1Logo, int player2Number, int player2Logo, int cardInfo)
{
    for(int i=0; i<5 ; i++)

Вы также используете их как массивы:

if(player1Logo[i] < player2Logo[j]) cardInfo[player1Number[i]][player1Logo[i]] = -1;

Кроме того, тип возврата неправильный. Вы объявляете это как int*, но затем реализуете это как int**. Вы должны убедиться, что подпись вашей функции совпадает. Похоже, что взятие подписи декларации и ее применение к определению должно исправить эту ошибку времени компиляции.

Ваш компилятор выдает какие-либо предупреждения для этих объявлений функций? Если нет, посмотрите, можете ли вы установить более строгие предупреждения. Получение правильных предупреждений о возможных ошибках значительно повышает эффективность отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...