2016-11-24 2 views
1

を生成し、私はブラックジャックのゲームのためのコードをビルドしようとしている、と私は次のような問題が生じています:異なる乱数

私はそれが(すべての52をリロードreshufflesまで、何度も同じカードの詳細を使用しないようにコードたいですカードをもう一度)。

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

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h> 
using namespace std; 
class play_cards 

{ 
public: 
    play_cards::play_cards(); 
    void play_cards::load(); 
    void play_cards::printdeck(); 
    void play_cards::startGame(); 
    void play_cards::reshuffle(); 
    void play_cards::check(); 
private: 
struct deck 
{ 
    string card_name; 
    string card_type; 
    int card_value; 
    bool dealt; 
}; 
deck card[52]; 
int i,random, counter ; 
double Total; 
}; 
int main() 
{ string start=""; 

    cout<<endl<<endl; 
    cout<<"The Rules are as Following:"<<endl<<endl; 
    cout<<"1. The dealer gives one card face up to each player, "<<endl; 
    cout<<" and then one card face up to himself."<<endl; 
    cout<<"2. Another round of cards is then dealt face up to each player, "<<endl; 
    cout<<" but the dealer takes his second card face down. "<<endl; 
    cout<<"3. Each player must decide whether to "<<endl; 
    cout<<" stand (not ask for another card) "<<endl; 
    cout<<"     OR     "<<endl; 
    cout<<" hit (ask for another card) "<<endl; 
    cout<<"4. Each player attempts to beat the dealer by getting a count closer to 21, "<<endl; 


cout<<" without going over 21. "<<endl; 
    cout<<"5. When the dealer has served the player, his face-down card is turned up. "<<endl; 
    cout<<" If the total is 17 or more, he must stand. 16 or under, he takes a card. "<<endl; 
    cout<<"6. If the dealer has an ace, and counting it as 11 would bring his total to 17"<<endl; 
    cout<<" or more (but not over 21), he must count the ace as 11 and stand. "<<endl; 
    cout<<"7. The dealer's decisions, then, are automatic on all plays, "<<endl; 
    cout<<" whereas the player always has the option of taking one or more cards. "<<endl; 
    cout<<endl<<endl; 

    play_cards value; 
    cout<< "Do you want to Start Playing ? (yes/no)"<<endl<<endl; 
    cin>>start; 
    if(start=="yes"){ 
    value.startGame(); 
    } 
    //value.printdeck(); 
    system("pause"); 
    return 0; 
} 
play_cards::play_cards() 
{ 
    random=0; 
    counter=0; 
    Total=0; 
} 

void play_cards::load() 
    { 
    card[0].card_name="TWO"; 
    card[0].card_type="heart"; 
    card[0].card_value=2; 
    card[0].dealt=false; 
    card[1].card_name="THREE"; 
    card[1].card_type="heart"; 
    card[1].card_value=3; 
    card[1].dealt=false; 
    card[2].card_name="FOUR"; 
    card[2].card_type="heart"; 
    card[2].card_value=4; 
    card[2].dealt=false; 
    card[3].card_name="FIVE"; 
    card[3].card_type="heart"; 
    card[3].card_value=5; 
    card[3].dealt=false; 
    card[4].card_name="SIX"; 
    card[4].card_type="heart"; 
    card[4].card_value=6; 
    card[4].dealt=false; 
    card[5].card_name="SEVEN"; 
    card[5].card_type="heart"; 
    card[5].card_value=7; 
    card[5].dealt=false; 
    card[6].card_name="EIGHT"; 
    card[6].card_type="heart"; 
    card[6].card_value=8; 
    card[6].dealt=false; 
    card[7].card_name="NINE"; 
    card[7].card_type="heart"; 
    card[7].card_value=9; 
    card[7].dealt=false; 
    card[8].card_name="TEN"; 
    card[8].card_type="heart"; 
    card[8].card_value=10; 
    card[8].dealt=false; 
    card[9].card_name="ACE"; 
    card[9].card_type="heart"; 
    card[9].card_value=1; 
    card[9].dealt=false; 
    card[10].card_name="JACK"; 
    card[10].card_type="heart"; 
    card[10].card_value=10; 
    card[10].dealt=false; 
    card[11].card_name="QUEEN"; 
    card[11].card_type="heart"; 
    card[11].card_value=10; 
    card[11].dealt=false; 
    card[12].card_name="KING"; 
    card[12].card_type="heart"; 
    card[12].card_value=10; 
    card[12].dealt=false; 

    card[13].card_name="TWO"; 
    card[13].card_type="diamond"; 
    card[13].card_value=2; 
    card[13].dealt=false; 
    card[14].card_name="THREE"; 
    card[14].card_type="diamond"; 
    card[14].card_value=3; 
    card[14].dealt=false; 
    card[15].card_name="FOUR"; 
    card[15].card_type="diamond"; 
    card[15].card_value=4; 
    card[15].dealt=false; 
    card[16].card_name="FIVE"; 
    card[16].card_type="diamond"; 
    card[16].card_value=5; 
    card[16].dealt=false; 
    card[17].card_name="SIX"; 
    card[17].card_type="diamond"; 
    card[17].card_value=6; 
    card[17].dealt=false; 
    card[18].card_name="SEVEN"; 
    card[18].card_type="diamond"; 
    card[18].card_value=7; 
    card[18].dealt=false; 
    card[19].card_name="EIGHT"; 
    card[19].card_type="diamond"; 
    card[19].card_value=8; 
    card[19].dealt=false; 
    card[20].card_name="NINE"; 
    card[20].card_type="diamond"; 
    card[20].card_value=9; 
    card[20].dealt=false; 
    card[21].card_name="TEN"; 
    card[21].card_type="diamond"; 
    card[21].card_value=10; 
    card[21].dealt=false; 
    card[22].card_name="ACE"; 
    card[22].card_type="diamond"; 
    card[22].card_value=1; 
    card[22].dealt=false; 
    card[23].card_name="JACK"; 
    card[23].card_type="diamond"; 
    card[23].card_value=10; 
    card[23].dealt=false; 
    card[24].card_name="QUEEN"; 
    card[24].card_type="diamond"; 
    card[24].card_value=10; 
    card[24].dealt=false; 
    card[25].card_name="KING"; 
    card[25].card_type="diamond"; 
    card[25].card_value=10; 
    card[25].dealt=false; 

    card[26].card_name="TWO"; 
    card[26].card_type="spade"; 
    card[26].card_value=2; 
    card[26].dealt=false; 
    card[27].card_name="THREE"; 
    card[27].card_type="spade"; 
    card[27].card_value=3; 
    card[27].dealt=false; 
    card[28].card_name="FOUR"; 
    card[28].card_type="spade"; 
    card[28].card_value=4; 
    card[28].dealt=false; 
    card[29].card_name="FIVE"; 
    card[29].card_type="spade"; 
    card[29].card_value=5; 
    card[29].dealt=false; 
    card[30].card_name="SIX"; 
    card[30].card_type="spade"; 
    card[30].card_value=6; 
    card[30].dealt=false; 
    card[31].card_name="SEVEN"; 
    card[31].card_type="spade"; 
    card[31].card_value=7; 
    card[31].dealt=false; 
    card[32].card_name="EIGHT"; 
    card[32].card_type="spade"; 
    card[32].card_value=8; 
    card[32].dealt=false; 
    card[33].card_name="NINE"; 
    card[33].card_type="spade"; 
    card[33].card_value=9; 
    card[33].dealt=false; 
    card[34].card_name="TEN"; 
    card[34].card_type="spade"; 
    card[34].card_value=10; 
    card[34].dealt=false; 
    card[35].card_name="ACE"; 
    card[35].card_type="spade"; 
    card[35].card_value=1; 
    card[35].dealt=false; 
    card[36].card_name="JACK"; 
    card[36].card_type="spade"; 
    card[36].card_value=10; 
    card[36].dealt=false; 
    card[37].card_name="QUEEN"; 
    card[37].card_type="spade"; 
    card[37].card_value=10; 
    card[37].dealt=false; 
    card[38].card_name="KING"; 
    card[38].card_type="spade"; 
    card[38].card_value=10; 
    card[38].dealt=false; 

    card[39].card_name="TWO"; 
    card[39].card_type="club"; 
    card[39].card_value=2; 
    card[39].dealt=false; 
    card[40].card_name="THREE"; 
    card[40].card_type="club"; 
    card[40].card_value=3; 
    card[40].dealt=false; 
    card[41].card_name="FOUR"; 
    card[41].card_type="club"; 
    card[41].card_value=4; 
    card[41].dealt=false; 
    card[42].card_name="FIVE"; 
    card[42].card_type="club"; 
    card[42].card_value=5; 
    card[42].dealt=false; 
    card[43].card_name="SIX"; 
    card[43].card_type="club"; 
    card[43].card_value=6; 
    card[43].dealt=false; 
    card[44].card_name="SEVEN"; 
    card[44].card_type="club"; 
    card[44].card_value=7; 
    card[44].dealt=false; 
    card[45].card_name="EIGHT"; 
    card[45].card_type="club"; 
    card[45].card_value=8; 
    card[45].dealt=false; 
    card[46].card_name="NINE"; 
    card[46].card_type="club"; 
    card[46].card_value=9; 
    card[46].dealt=false; 
    card[47].card_name="TEN"; 
    card[47].card_type="club"; 
    card[47].card_value=10; 
    card[47].dealt=false; 
    card[48].card_name="ACE"; 
    card[48].card_type="club"; 
    card[48].card_value=1; 
    card[48].dealt=false; 
    card[49].card_name="JACK"; 
    card[49].card_type="club"; 
    card[49].card_value=10; 
    card[49].dealt=false; 
    card[50].card_name="QUEEN"; 
    card[50].card_type="club"; 
    card[50].card_value=10; 
    card[50].dealt=false; 
    card[51].card_name="KING"; 
    card[51].card_type="club"; 
    card[51].card_value=10; 
    card[51].dealt=false; 
    } 
void play_cards::printdeck() 
    { 
     //loop to print all cards 
      for (i=0; i<=51; ++i) 
      { 
      if((i==13)||(i==26)||(i==39)) 
       cout<<endl; 
       cout<<card[i].card_name<<" "<<card[i].card_type<<" " <<card[i].card_value<<" " +card[i].dealt<<endl; 
      }//for loop 
    } 

void play_cards::reshuffle() 
{ 
    cout<<"**********"<<endl<< 
    "The Cards has been reshuffled"<<endl<< 
    "**********"<<endl; 

    for (i=0; i<=51; ++i) 
    { 
     card[i].dealt=false; 
    } 
    counter =0; 
} 

あなたはあなたがここに確率でビットをめちゃくちゃにしているこの機能を

void play_cards::check() 
{ 

srand(time(NULL)); 
    random= rand() %53; //number between 0 and 53 



    while(card[random].dealt!=0) 
    { 
     srand(time(NULL)); 
     random= rand() %53; 
    } 

    if(!card[random].dealt) 
    { 
     counter =counter+1; 
    } 

    if(counter==37) 
    { 
     reshuffle(); 
    } 


} 

void play_cards::startGame() 
{ 


     cout<<endl<<endl; 
      int player_wins = 0; 
      int computer_wins = 0; 
      string choice = ""; 
      string playerOption = ""; 
      while(choice!="No") 
      { 
      bool player_flag = false; 
      int player_score = 0; 
      int computer_score = 0; 
      load(); 


      check(); 
      player_score = player_score + card[random].card_value; 
      cout<<"Player draws: "<< card[random].card_name<<" "<<card[random].card_type <<endl<<"Score becomes: "<<player_score<<endl<<endl; 
      card[random].dealt=1; 


      check(); 
      computer_score = computer_score + card[random].card_value; 
      cout<<"Dealer draws: "<< card[random].card_name<<" "<<card[random].card_type<<endl<< "Score becomes: "<<computer_score<<endl<<endl; 
      card[random].dealt=1; 


      check(); 
      player_score = player_score + card[random].card_value; 
      cout<<"Player draws: "<< card[random].card_name<<" "<<card[random].card_type <<endl<<"Score becomes: "<<player_score<<endl<<endl; 
      card[random].dealt=1; 


      check(); 
      computer_score = computer_score + card[random].card_value; 
      int hidden = random; 
      cout<<"Dealer draws but the value will be shown later " <<endl<<endl; 
      card[random].dealt=1; 

      cout<<"You want to hit or stand? "<<endl<<endl; 
      cin>>playerOption; 
      while(playerOption!="stand") 
      { 
       if(playerOption=="hit") 
       { 

        check(); 
        player_score = player_score + card[random].card_value; 
        cout<<"Player draws: "<< card[random].card_name<<" "<<card[random].card_type <<endl<<" Score becomes: "<<player_score<<endl<<endl; 
        card[random].dealt=1; 
        if(player_score>21) 
        { 
         cout<<"Player Loses"<<endl; 
         computer_wins=computer_wins+1; 
         player_flag = true; 
         break; 

        } 
        if(player_score==21) 
        { 
         cout<<"Player Wins!!"<<endl; 
         player_wins=player_wins+1; 
         player_flag=true; 
         break; 
        } 
       } 
       cout<<"You want to hit or stand? "<<endl; 
      cin>>playerOption; 
      } 
       if(!player_flag) 
      { 
       cout<<"Dealer hidden card is: "<< card[hidden].card_name<<" "<<card[hidden].card_type<< "\nScore becomes: "<<computer_score<<endl<<endl; 
       bool computer_flag = false; 
        while(computer_score<17) 
        { 


         check(); 
         if(card[random].card_name=="ACE") 
         { 
          if(((computer_score+11) >= 17) && ((computer_score+11)<=21)) 
          { 
           computer_score = computer_score+11; 
           break; 
          } 
          else 
          { 
           computer_score= computer_score+1; 
          } 
         } 
         else 
         { 
          computer_score = computer_score+card[random].card_value; 
         } 
         cout<<"Dealer draws: "<< card[random].card_name<<" "<<card[random].card_type <<endl<<"Score becomes: "<<computer_score<<endl<<endl; 
         card[random].dealt=1; 
         if(computer_score>21) 
         { 
          cout<<"Dealer loses!!"<<endl; 
          player_wins=player_wins+1; 
          computer_flag= true; 
          break; 
         } 
         if(computer_score==21) 
         { 
          cout<<"Dealer Wins!!"<<endl; 
          computer_wins=computer_wins+1; 
          computer_flag = true; 
          break; 
         } 
         } 
        if(!computer_flag) 
        { 
        if(computer_score>player_score) 
        { 
         cout<<"Dealer Wins!!"<<endl; 
         computer_wins=computer_wins+1; 
        } 
        else 
        { 
         if(computer_score<player_score) 
         { 
          cout<<"Player Wins!!"<<endl; 
          player_wins=player_wins+1; 
         } 
         else 
         { 
          cout<<"Nobody wins or loses"<<endl; 
         } 
        } 
        } 
      } 
       Total=Total+1; 
       cout<<"counter ="<<counter<<endl; 
       cout<<" Do you want to play again? (Yes/No)"<<endl; 
       cin>>choice; 

    } 
    cout<<endl<<endl; 
    cout<<"Final Summary:"<<endl<<endl; 
    cout<<"Total Number of played games: "<<Total<<endl; 
    cout<<"Player Wins: "<<player_wins<<endl; 
    cout<<"Computer Wins: "<<computer_wins<<endl; 
    cout<<"The percentage of wins for the playes: "<<(player_wins/Total)*100<<"%"<<endl; 

    } 
+3

ランダムジェネレータ* once *は、プログラムの最初にシードします。 –

+0

''ヘッダを見てください。 – George

+2

すべてのカードを配列またはベクトルにロードし、ランダム化するために['std :: shuffle'](http://en.cppreference.com/w/cpp/algorithm/random_shuffle)を使用してから、カードを前面から取り出し始めるまたは戻る。コンテナの反対側に来たら、コンテナを再シャッフルして、もう一度始めます。 – NathanOliver

答えて

1

をチェックすることができます。最初は52枚のカードがあるので、rand()%52を使って0から51までの数字を得ます(http://www.cplusplus.com/reference/cstdlib/rand/)。これは、各カードが抽出される確率が1/52であるため正しい。

しかし、カードがますます少なくなるにつれて、単一のカードが抽出される確率はそれに応じて上昇しなければならない。さらに、あなたの解決策は、1枚のカードだけが残っていると、あなたが時間を浪費するその値を正確に得られなくなるまで、引き出しを続けるので、非効率的です。

あなたはクヌースが実装するのは非常に簡単ですを、シャッフルと、有限集合のランダム置換などの問題で解けるを再考することができます。 wikipediaへのリンク:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

+0

ありがとうございました! –