2014-01-16 3 views
0

데크에있는 카드와 플레이어 핸드에있는 카드에 대해 두 개의 벡터가있는 플레이어 등급이 있습니다. 나는 XML 파일에서 카드를로드하고, 여기에 게시 할 int를로드하는 것으로 모든 것을 대체했습니다. 웬일인지 각 플레이어가 별도의 오브젝트이고 각각 ​​덱을 따로 섞어서 사용하더라도 둘 다 같은 손을 얻습니다. 당신이 그것을 실행할 때마다, 당신은 다른 손을 얻지 만 그들은 항상 같은 손을가집니다. 나는 이유를 알 수 없다. 코드에는 C++ 11이 필요합니다.데크 셔플 링은 2 개의 동등한 결과가됩니다.

#include <iostream> 
#include <vector> 
#include <random> 
#include <time.h> 

// **Player.hpp** 

class Player 
{ 
public: 
    Player(std::string name); 
    std::string name; 
    std::vector<int> hand; 
    std::vector<int> deck; 

    void draw(int numberOfCards); 
    void loadDeck(); 
    void shuffleDeck(); 
}; 

// **Player.cpp** 

Player::Player(std::string playerName) 
{ 
    name = playerName; 
    loadDeck(); 
    shuffleDeck(); 
} 

void Player::draw(int numberOfCards) 
{ 
    for(int i = 0; i < numberOfCards; i++) 
    { 
     if(!deck.empty() && hand.size() < 10) 
     { 
      hand.push_back(deck.front()); 
      deck.erase(deck.begin()); 
     } 
    } 
} 

void Player::loadDeck() 
{ 
    for(int i = 1; i < 30; i++) 
    { 
     deck.push_back(i); 
    } 
} 

void Player::shuffleDeck() 
{ 
    std::srand(time(0)); 
    for(int i = 1; i != 15; i++) 
    { 
     std::srand(static_cast<double>(std::rand())/RAND_MAX * 4294967295); 
     for(int i = 1; i < deck.size(); i++) 
     { 
      std::swap(deck[i], deck[static_cast<double>(std::rand())/RAND_MAX * i]); 
     } 
    } 
} 

// **Main.cpp** 

int main() 
{ 
    Player* player1 = new Player("Player1"); 
    Player* player2 = new Player("Player2"); 

    player1->draw(7); 
    player2->draw(7); 

    std::vector<int>::iterator itr; 

    std::cout << player1->name << "'s Hand:\n"; 
    for(itr = player1->hand.begin(); itr != player1->hand.end(); itr++) 
    { 
     std::cout << (*itr) << ", "; 
    } 

    std::cout << "\n\n\n" << player2->name << "'s Hand:\n"; 
    for(itr = player2->hand.begin(); itr != player2->hand.end(); itr++) 
    { 
     std::cout << (*itr) << ", "; 
    } 

    return 0; 
} 
+0

[std :: srand] (http://www.cplusplus.com/reference/cstdlib/srand/)를 메인으로 이동해보십시오. "같은 시드로 두 가지 초기화를하면 이후에 rand를 호출 할 때 동일한 연속적인 결과가 생성됩니다." 즉, 당신의 씨앗은 다를 수 없습니다! – crashmstr

+0

그게 전부 였어! 엄청 고마워. – user2941616

+1

표준 라이브러리에는 [std :: random_shuffle'과'std :: shuffle'] (http://en.cppreference.com/w/cpp/algorithm/random_shuffle)이 있습니다 ... – dyp

답변

4

당신부터 srand를 호출하고 같은 "임의"값을 shuffleDeck를 통해 각 시간을주기까지 의사 난수 발생기를 설정하는 상수 값의 모양을 제공합니다.

shuffleDeck()이 아닌 main에서 시딩을 시도하고 pid 또는 시간의 일부와 같이 변경되는 내용을 사용하여 게임이 매번 같은 결과를 나타내지 않도록하십시오.

관련 문제