什么导致我的二十一点程序在做任何事情之前崩溃?

时间:2014-11-17 01:54:57

标签: c

当我运行我的程序时,它将打印"欢迎来到二十一点!规则:"然后会出现一个错误窗口说" Blackjack.exe已经停止工作,我必须关闭程序。在编译器窗口中,它表示"流程终止"。我如何阻止这种情况发生? 其中一个循环不能正常工作吗?

我的代码:

#include <stdio.h>
#include <stdlib.h>

void Initializedeck(int[]);
void Shuffledeck(int[]);
void displayscore(int, int);
int hdrawcards(int[], int[]);
char getsuit(int);
int cdrawcards(int[], int[]);

int main()
{
    int deck[52];
    char cont;
    int hcherries=10;
    int ccherries=10;
    int hcards[10];
    int ccards[10];
    int htotal;
    int ctotal;

    printf("Welcome to Blackjack!\n");
    printf("Rules: \n ");

    Initializedeck(deck);
    cont='y';
    while(cont=='y')
    {
        Shuffledeck(deck);
        system("cls");
        displayscore(hcherries, ccherries);
        htotal=hdrawcards(hcards, deck);
        ctotal=cdrawcards(ccards, deck);
        if(htotal>ctotal)
        {
            printf("You Win!");
        }
        else
        {
            printf("Computer Wins. :( ");
        }
        printf("Do you want to continue?(y/n)");
        scanf("%c", &cont);
    }

return 0;
}

void Initializedeck(int deck[])
{
    int i=0;
    while(i<52)
    {
        deck[i]=i;
        i++;
    }

}

void Shuffledeck(int deck[])
{
    int hold;
    int max=51;
    int random;

    while(max>=0)
    {
      random=rand()%(max)+1;

      hold=deck[max];
      deck[max]=random;
      random=hold;
      max--;
    }
}

void displayscore(int hcherries, int ccherries)
{
    printf("Human: %i(cherries)   Computer: %i(cherries)", hcherries, ccherries);
}

int hdrawcards(int hcards[], int deck[])
{

     char answer;
     int i=0;
     int score=0;
     int total=0;
     char rank;
     int worth;
     char suit;
     int card;

     printf("Do you want to draw a card? (y/n)");
     scanf("%c", &answer);
     while(answer=='y' && total<21)
     {
         score=score+deck[i];
         hcards[i]=deck[i];
         card=hcards[i];
         worth=hcards[i]%13;
         if(worth==10)
         {
             rank='T';
         }
         else if (worth==11)
         {
             rank='J';
         }
         else if (worth==12)
         {
             rank='Q';
         }
         else if (worth==13)
         {
             rank='K';
         }
         else if(worth==1)
         {
             rank='A';
         }
         else
         {
             rank=worth;
         }

         if(worth>10)
         {
             worth=10;
         }

         total=total+worth;
         suit=getsuit(card);
         printf("%c%c\n", rank, suit);
         printf("Total: %i", total);
         i++;
         scanf("%c", &answer);

     }
return total;
}

int cdrawcards(int ccards[], int deck[])
{
    int i=26;
    int total;
    int score;
    int worth;
    char rank;
    char suit;
    int card;

    while(total<18)
    {
         score=score+deck[i];
         ccards[i]=deck[i];
         card=ccards[i];
         worth=ccards[i]%13;
         if(worth==10)
         {
             rank='T';
         }
         else if (worth==11)
         {
             rank='J';
         }
         else if (worth==12)
         {
             rank='Q';
         }
         else if (worth==13)
         {
             rank='K';
         }
         else if(worth==1)
         {
             rank='A';
         }
         else
         {
             rank=worth;
         }

         if(worth>10)
         {
             worth=10;
         }

         total=total+worth;
         suit=getsuit(card);
         printf("             %c%c\n", rank, suit);
         printf("              Total: %i", total);
         i++;
    }
    return total;
}

char getsuit(int card)
{
    char suit;

    if(card<13)
    {
        suit='S';
    }
    else if(card>=13 && card<26)
    {
        suit='H';
    }
    else if(card>=26 && card<39)
    {
        suit='D';
    }
    else if(card>=39 && card<52)
    {
        suit='C';
    }

    return suit;
}

1 个答案:

答案 0 :(得分:0)

cdrawcards()中有一个数组溢出:

int ccards[10];
...
ctotal = cdrawcards(ccards, deck);
...

int cdrawcards(int ccards[], int deck[])
{
    int i = 26;
    ...
        ccards[i] = deck[i]; //Overflow, ccards[] only has 10 elements

更改i的初始值或使数组更大int ccards[52]。我还会在cdrawcards()hdrawcards()中添加一个明确的检查,以确保您不会溢出数组,例如:

while (total < 18 && i < 10)

例如,在hdrawcards()中,如果你连续获得一堆低价值牌,你可以溢出数组(例如:1,1,1,2,2,2,2,3, 3,3(溢出),3,...)。