2015-12-25 15 views
5

Próbuję zakodować grę w blackjacka. Aż do ostatniej części było całkiem dobrze. Mój kod jest następujący:Suma elementów tablicy zwraca błędną wartość

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <algorithm> 
using namespace std; 

//Declarations 
void makedeck(int deck[]); 
int getTopCard(int deck[]); 
void addCardToHand(int hand[], int drewCard); 
void firstHand(int pHand[], int dHand[], int deck[]); 
void printHands(int pHand[], int dHand[]); 
void showCard(int card); 
int getHandValue(int hand[]); 


int main() 
{ 

    int pHand[10]= {0}; //Player's Hand 
    int dHand[10]= {0}; //Dealer's Hand 
    int deck[52];  //Deck 

    makedeck(deck); //Generating an ordered deck 
    random_shuffle(&deck[0],&deck[52]); //Shuffling the deck 
    firstHand(pHand,dHand,deck); //Dealing first hands. 
    printHands(pHand,dHand); // Printing hands 


    return 0; 
} 

/*Purpose of this function is to create 4 different suits with 14 different cards in all of them, a complete deck*/ 
void makedeck(int deck[]) 
{ 
    int a=0; 
    for(int x=101; x<114; x++) 
    { 
     deck[a]=x; 
     a++; 
    } 
    for(int x=201; x<214; x++) 
    { 
     deck[a]=x; 
     a++; 
    } 
    for(int x=301; x<314; x++) 
    { 
     deck[a]=x; 
     a++; 
    } 
    for(int x=401; x<414; x++) 
    { 
     deck[a]=x; 
     a++; 
    } 

} 

/*This function returns a topcard integer as value, that is the card at top of deck, then nullifies it from deck to prevent 
it from being drawn again.*/ 
int getTopCard(int deck[]) 
{ 

    int topcard; 
    for(int x=0; x<52; x++) 
    { 
     if(deck[x]!=0) 
     { 
      topcard=deck[x]; 
      deck[x]=0; 
      break; 
     } 
    } 
    return topcard; 
} 

/*This function draws four cards from top of deck and deals them respectively to the order of rules*/ 
void firstHand(int pHand[], int dHand[], int deck[]) 
{ 

    addCardToHand(pHand , getTopCard(deck)); 
    addCardToHand(dHand , getTopCard(deck)); 
    addCardToHand(pHand , getTopCard(deck)); 
    addCardToHand(dHand , getTopCard(deck)); 

} 

/*This function is for further Hit actions. Adds the drawnCard to the desired hand. The value of drawnCard is returned 
from the getTopCard() function*/ 
void addCardToHand(int hand[], int drawnCard) 
{ 

    for(int x=0; x<=10; x++) 
    { 
     if(hand[x]!=0) 
     { 
      continue; 
     } 
     if(hand[x]==0) 
     { 
      hand[x]=drawnCard; 
      break; 
     } 
    } 
} 

/*This function determines the values of cards. Since suits that reside in the 100s part are not relevant to the value 
of the cards and are only required for seperating two cards with same value, in order to remove them from the information 
that we'll print, we use % on card values*/ 
void showCard(int card) 
{ 
    if(card==0) cout << " "; 
    else 
     switch(card%100) 
     { 

     case 1: 
      cout << "A "; 
      break; 
     case 11: 
      cout << "J "; 
      break; 
     case 12: 
      cout << "Q "; 
      break; 
     case 13: 
      cout << "K "; 
      break; 
     default: 
      cout << card%100 << " "; 
     } 
} 

/*Prints both hands*/ 
void printHands(int pHand[],int dHand[]) 
{ 
    cout << "Dealer's hand: "; 
    for(int y=0; y<10; y++) 
    { 
     showCard(dHand[y]); 
    } 
    cout << getHandValue(dHand) << endl; 

    cout << endl << "Player's hand: "; 
    for(int x=0; x<10; x++) 
    { 
     showCard(pHand[x]); 
    } 
    cout << getHandValue(pHand) << endl; 
} 

/*Sums all the values of cards in the hand and returns it as an integer*/ 
int getHandValue(int hand[]) 
{ 
    int sum=0; 
    for(int x=0; x<10; x++) 
    { 
     if(hand[x]%100==11) sum+=10; 
     if(hand[x]%100==12) sum+=10; 
     if(hand[x]%100==13) sum+=10; 
     else sum+=hand[x]%100; 
    } 
    return sum%100; 
} 

Teraz kiedy go wykonać, mam następujące:

Dealer's hand: K 3   13 

Player's hand: 5 Q   27 

krupiera jest poprawne, jednak od 5 + Q powinno być 15, a nie 27, nie coś jest nie tak, co powoduje zły wydruk, ale nie udało mi się go znaleźć tak daleko. Czy ktoś może pomóc?

+0

Dlaczego istnieją 14 kart na garnitur? Standardowe talie mają 13 ... –

+0

@CanadianLuke W rzeczywistości jest 13 kart wygenerowanych na garnitur przez 'makedeck()'. To tylko literówka, w której stwierdza, że ​​generowane są 14 kart. – SarpSTA

+0

Ups, masz rację! Błędne odczytanie pętli –

Odpowiedz

5

Użyłeś if gdzie potrzebne else if

if(hand[x]%100==11) sum+=10; 
    if(hand[x]%100==12) sum+=10; 
    if(hand[x]%100==13) sum+=10; 
    else sum+=hand[x]%100; 

powinny być

if(hand[x]%100==11) sum+=10; 
    else if(hand[x]%100==12) sum+=10; 
    else if(hand[x]%100==13) sum+=10; 
    else sum+=hand[x]%100; 

Jeśli chcesz również obsługiwać asa poprawnie:

/*Sums all the values of cards in the hand and returns it as an integer*/ 
int getHandValue(int hand[]) 
{ 
    bool ace=false; 
    int sum=0; 
    for(int x=0; x<10; x++) 
    { 
     if(hand[x]%100==1) ace=true; 
     if(hand[x]%100>=11) sum+=10; 
     else sum+=hand[x]%100; 
    } 
    if (sum<12 && ace) sum+=10; 
    return sum; 
} 
+0

Kiedy jedna z instrukcji "if" się zdarza, inne nie, a "else" zawsze jest wywoływana. Jak to przegapiłem? Dziękuję Ci! – SarpSTA

4

W powyższym kodzie użyłeś 3 if oświadczenia z 1 else instrukcja, w której chciałbyś użyć instrukcji "else if" (Dla każdej wartości hand[x] możliwe jest tylko jedno z oświadczeń if).

if(hand[x]%100==11) sum+=10; 
if(hand[x]%100==12) sum+=10; 
if(hand[x]%100==13) sum+=10; 
else sum+=hand[x]%100; 

else if wypowiedzi jak to będzie działać:

if (hand[x]%100==11) 
    sum+=10; 
else if (hand[x]%100==12) 
    sum+=10; 
else if (hand[x]%100==13) 
    sum+=10; 
else sum+=hand[x]%100; 
Powiązane problemy