2014-04-17 3 views
-19

Mon jeu de blackjack fonctionne environ 95% du temps, mais parfois il me dira que j'ai un as quand je ne le fais pas, et il continuera à me dire que j'ai un as dans la prochaine boucle du jeu, même quand je ne fais pas ça. Aussi, de temps en temps, je vais avoir quelque chose comme un 8 et un 2 dans ma main et ça va me dire mon total est de 10, alors je vais tirer une autre carte et ça va me dire mon nouveau total est de 40. C'est juste un par exemple, mais je pense que les as et le total étant mauvais sont parfois les seuls problèmes qui doivent être abordés. Je m'excuse également si cela est mal envoyé, je viens de rejoindre ce site aujourd'hui. Voici le programme:Pourquoi mon programme de blackjack C++ ne fonctionne-t-il que la plupart du temps?

/** 
* File: blackjack blackjack.cpp 
* Author: Rory Hector 
* Date: 2014-04-15 
* Description: Text-based blackjack game. 
*/ 

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <string> 

using namespace std; 

struct CardInfo 
{ 
    string cardname; 
    int cardvalue; 
}; 

int main() 
{ 
    const int NUM_CARDS = 52;  // max size of the deck 
    CardInfo deck[NUM_CARDS];  // array of card structures 
    int i1, i2, oi1, oi2, g, og; // indexes 
    int total, oppTotal;   // total values in your hands 
    int aces=0;     // number of aces drawn by user 
    int maxcards = 2;    // number of cards drawn by user 
    char option;     // choice to hit or stay 
    char cont;      // choice to continue playing or quit 
    char add10;     // changes ace value from 1 to 11 
    g = 0;       // starting point for array 
    og = 0;      // starting point for opponent's array 
    int j[8];      // array for cards after hitting 
    int oj[8];      // opponent's array for cards after hitting 
    int intermediate1;    // intermediate between rand # and array 
    int intermediate2;    // intermediate between rand # and array 
    int wins=0, losses=0;   // times won and times lost with initialization 

srand(static_cast<unsigned int> (time(NULL))); // seed random number generator 

deck[0].cardname = "2 of Hearts"; 
deck[0].cardvalue = 2; 
deck[1].cardname = "2 of Diamonds"; 
deck[1].cardvalue = 2; 
deck[2].cardname = "2 of Spades"; 
deck[2].cardvalue = 2; 
deck[3].cardname = "2 of Clubs"; 
deck[3].cardvalue = 2; 
deck[4].cardname = "3 of Hearts"; 
deck[4].cardvalue = 3; 
deck[5].cardname = "3 of Diamonds"; 
deck[5].cardvalue = 3; 
deck[6].cardname = "3 of Spades"; 
deck[6].cardvalue = 3; 
deck[7].cardname = "3 of Clubs"; 
deck[7].cardvalue = 3; 
deck[8].cardname = "4 of Hearts"; 
deck[8].cardvalue = 4; 
deck[9].cardname = "4 of Diamonds"; 
deck[9].cardvalue = 4; 
deck[10].cardname = "4 of Spades"; 
deck[10].cardvalue = 4; 
deck[11].cardname = "4 of Clubs"; 
deck[11].cardvalue = 4; 
deck[12].cardname = "5 of Hearts"; 
deck[12].cardvalue = 5; 
deck[13].cardname = "5 of Diamonds"; 
deck[13].cardvalue = 5; 
deck[14].cardname = "5 of Spades"; 
deck[14].cardvalue = 5; 
deck[15].cardname = "5 of Clubs"; 
deck[15].cardvalue = 5; 
deck[16].cardname = "6 of Hearts"; 
deck[16].cardvalue = 6; 
deck[17].cardname = "6 of Diamonds"; 
deck[17].cardvalue = 6; 
deck[18].cardname = "6 of Spades"; 
deck[18].cardvalue = 6; 
deck[19].cardname = "6 of Clubs"; 
deck[19].cardvalue = 6; 
deck[20].cardname = "7 of Hearts"; 
deck[20].cardvalue = 7; 
deck[21].cardname = "7 of Diamonds"; 
deck[21].cardvalue = 7; 
deck[22].cardname = "7 of Spades"; 
deck[22].cardvalue = 7; 
deck[23].cardname = "7 of Clubs"; 
deck[23].cardvalue = 7; 
deck[24].cardname = "8 of Hearts"; 
deck[24].cardvalue = 8; 
deck[25].cardname = "8 of Diamonds"; 
deck[25].cardvalue = 8; 
deck[26].cardname = "8 of Spades"; 
deck[26].cardvalue = 8; 
deck[27].cardname = "8 of Clubs"; 
deck[27].cardvalue = 8; 
deck[28].cardname = "9 of Hearts"; 
deck[28].cardvalue = 9; 
deck[29].cardname = "9 of Diamonds"; 
deck[29].cardvalue = 9; 
deck[30].cardname = "9 of Spades"; 
deck[30].cardvalue = 9; 
deck[31].cardname = "9 of Clubs"; 
deck[31].cardvalue = 9; 
deck[32].cardname = "10 of Hearts"; 
deck[32].cardvalue = 10; 
deck[33].cardname = "10 of Diamonds"; 
deck[33].cardvalue = 10; 
deck[34].cardname = "10 of Spades"; 
deck[34].cardvalue = 10; 
deck[35].cardname = "10 of Clubs"; 
deck[35].cardvalue = 10; 
deck[36].cardname = "Jack of Hearts"; 
deck[36].cardvalue = 10; 
deck[37].cardname = "Jack of Diamonds"; 
deck[37].cardvalue = 10; 
deck[38].cardname = "Jack of Spades"; 
deck[38].cardvalue = 10; 
deck[39].cardname = "Jack of Clubs"; 
deck[39].cardvalue = 10; 
deck[40].cardname = "Queen of Hearts"; 
deck[40].cardvalue = 10; 
deck[41].cardname = "Queen of Diamonds"; 
deck[41].cardvalue = 10; 
deck[42].cardname = "Queen of Spades"; 
deck[42].cardvalue = 10; 
deck[43].cardname = "Queen of Clubs"; 
deck[43].cardvalue = 10; 
deck[44].cardname = "King of Hearts"; 
deck[44].cardvalue = 10; 
deck[45].cardname = "King of Diamonds"; 
deck[45].cardvalue = 10; 
deck[46].cardname = "King of Spades"; 
deck[46].cardvalue = 10; 
deck[47].cardname = "King of Clubs"; 
deck[47].cardvalue = 10; 
deck[48].cardname = "Ace of Hearts"; 
deck[48].cardvalue = 1; 
deck[49].cardname = "Ace of Diamonds"; 
deck[49].cardvalue = 1; 
deck[50].cardname = "Ace of Spades"; 
deck[50].cardvalue = 1; 
deck[51].cardname = "Ace of Clubs"; 
deck[51].cardvalue = 1; 

cout<<"BlackJack by Rory Hector"<<endl; 
cout<<"----------------------------------------------------------------------"<<endl; 
cout<<"RULES: "<<endl; 
cout<<"Aces have default values of 1."<<endl; 
cout<<"After choosing to stay, you have the "<<endl; 
cout<<"option of adding 10 to your hand value. "<<endl; 
cout<<"As usual, dealer has slight upper hand, but "<<endl; 
cout<<"the dealer loses part of his upper hand by losing"<<endl; 
cout<<"immediately when busting, instead of"<<endl; 
cout<<"waiting to see if you busted too."<<endl; 
cout<<"There is no immediate blackjack win."<<endl; 
cout<<"Even with a blackjack, the game still plays out."<<endl; 
cout<<"----------------------------------------------------------------------"<<endl; 
cout<<"Press Q after a game to quit playing. Press anything else to continue. "<<endl; 
cout<<"----------------------------------------------------------------------"<<endl; 
cout<<"Good luck! "<<endl; 
cout<<endl; 
while (cont != 'Q' || cont != 'q') 
{ 
    cin>>cont; 
    if (cont == 'Q' || cont == 'q') 
    { 
     cout<<endl<<"Thank you for playing. "<<endl; 
     cout<<"You won "<<wins<<" times and lost "<<losses<<" times."; 
     cout<<endl; 
     if (wins >= (losses*2)) 
      cout<<"Great Job!"; 
     else if (wins > losses) 
      cout<<"Good Job!"; 
     else if (wins == losses) 
      cout<<"Good enough."; 
     else if (wins <= (losses/2)) 
      cout<<"You're pretty terrible at this game."; 
     else 
      cout<<"Better luck next time."; 
     cout<<endl<<endl; 
     return 0; 
    } 
    cout<<endl; 
    cout<<"GAME START"<<endl<<endl; 
    cout<<"Your first card is: "; 
    i1 = rand() % 52; 
    cout<<deck[i1].cardname<<endl; 
    total = deck[i1].cardvalue; 
    cout<<"Your second card is: "; 
    i2 = rand() % 52; 
    cout<<deck[i2].cardname<<endl; 
    total += deck[i2].cardvalue; 
    cout<<"You have "<<total<<" in your hand. "<<endl; 
    cout<<endl; 
    oi1 = rand() % 52; 
    oi2 = rand() % 52; 
    oppTotal = deck[oi1].cardvalue + deck[oi2].cardvalue; 
    cout<<"Dealer has "<<deck[oi2].cardvalue<<" showing. "<<endl; 
    cout<<endl; 

    do 
    { 
     cout<<"Would you like to hit or stay? (H/S): "; 
     cin>> option; 
     if (option == 'h' || option == 'H') 
     { 

      cout<<"Your next card is: "; 
      intermediate1 = rand() % 52; 
      j[g] = intermediate1; 
      cout<<deck[j[g]].cardname<<endl; 
      total += deck[j[g]].cardvalue; 
      cout<<"Your new total is: "<<total<<endl; 
      cout<<endl; 
      g++; 
      maxcards = g+3; 
     } 
     else 
      total = total; 

     if (oppTotal<15) 
     { 
      intermediate2 = rand() % 52; 
      oj[og] = intermediate2; 
      cout<<"Dealer drew: "<<deck[oj[og]].cardname<<endl; 
      oppTotal += deck[oj[og]].cardvalue; 
      cout<<"Dealer has "<<(oppTotal - deck[oi1].cardvalue)<<" showing. "<<endl; 
      cout<<endl; 
      og++; 
     } 

    } while (option == 'h' || option == 'H'); 

    if (oppTotal<15) 
    { 
     cout<<"The dealer is continuing to draw."<<endl; 
     oj[og] = rand() % 52; 
     cout<<"Dealer drew: "<<deck[oj[og]].cardname<<endl; 
     oppTotal += deck[oj[og]].cardvalue; 
     cout<<"Dealer has "<<(oppTotal - deck[oi1].cardvalue)<<" showing. "<<endl; 
     cout<<endl; 
     og++; 
    } 
    else 
     oppTotal = oppTotal; 

    //aces section 
    aces=0; 
    if (i1==48||i1==49||i1==50||i1==51) 
     aces++; 
    if (i2==48||i2==49||i2==50||i2==51) 
     aces++; 
    for (g=0;g<maxcards;g++) 
    { 
     if (j[g]==48||j[g]==49||j[g]==50||j[g]==51) 
      aces++; 
    } 

    if (aces==1)   // was if (aces==1) 
    { 
     cout<<"You have an ace."<<endl; 
     cout<<"Would you like to add 10 to your hand value? (Y/N) "; 
     cin>>add10; 
     cout<<endl; 
     if (add10=='y'||add10=='Y') 
      total+=10; 

    } 
     else if (aces>1) 
     { 
      cout<<"You have "<<aces<<" aces."<<endl; 
      cout<<"Would you like to add 10 to your hand value? (Y/N) "; 
      cin>>add10; 
      cout<<endl; 
      if (add10=='y'||add10=='Y') 
       total+=10; 
      else if (add10!='n'||add10!='N') 
       cout<<"Value of aces left at 1. "<<endl; 
     } 
    //end of aces section 

    cout<<"You stayed at: "<<total<<endl; 
    cout<<"The dealer had: "<<oppTotal<<endl; 
    cout<< endl; 

    if (total > 21) 
    { 
     cout<<"You busted!"<<endl<<"You lose."<<endl; 
     losses++; 
    } 
    else if (oppTotal>21) 
    { 
     cout<<"The dealer busted. "<<endl; 
     cout<<"You win!"<<endl; 
     wins++; 
    } 
    else if (oppTotal<=21 && total<=21 && oppTotal==total) 
    { 
     cout<<"Push"<<endl; 
    } 
    else if (oppTotal<=21 && total<=21 && oppTotal > total) 
    { 
     cout<<"You lose. "<<endl; 
     losses++; 
    } 
    else 
    { 
     cout<<"You win!"<<endl; 
     wins++; 
    } 
    cout<<endl; 
} 

return 0; 
} 
+9

Nous n'allons pas déboguer votre vidage de code de ligne 1000 – CoryKramer

+4

Bienvenue dans StackOverflow. Ce n'est pas un site pour "Voici une décharge de quelques centaines de lignes de code, veuillez le déboguer pour moi, revenez plus tard pour le ramasser Merci." types de questions. Apprenez à utiliser le débogueur, ou insérez un code de débogage qui génère des variables dans différents endroits où vous pensez que le problème pourrait être dans le but de le réduire. Une fois que vous avez fait cela, et que vous n'arrivez pas à résoudre le problème, vous pouvez poster ici, expliquer le problème et inclure le code ** pertinent **, et poser une question spécifique que nous pouvons vous aider à obtenir une réponse. Bonne chance. –

+0

Vous pourriez aussi considérer comment vous distribuez les cartes. Vous pourriez facilement traiter la même carte plusieurs fois dans une main puisque vous choisissez un index aléatoire et que vous n'avez pas vérifié l'unicité. Mieux vaut mélanger le jeu et distribuer chaque carte du haut du pont. –

Répondre

2

Votre problème est plus probable que vous ne réinitialisez pas g, og et maxcards chaque fois autour de la boucle. Cela vous conduit à accéder (et à écrire) en dehors des limites des tableaux j et oj.

Vous devez exécuter le programme via un débogueur et consulter les variables à chaque point. Si vous n'avez pas encore appris à utiliser un débogueur, faites-le - c'est l'une des choses les plus importantes pour apprendre à programmer.

L'autre chose que vous devriez faire est de réorganiser votre programme en fonctions (et éventuellement les classes). Lorsque vous avez votre programme en plus petits morceaux, il est beaucoup plus facile de tester chaque morceau pour s'assurer qu'il fonctionne comme prévu.

Questions connexes