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;
}
[std :: srand] (http://www.cplusplus.com/reference/cstdlib/srand/)를 메인으로 이동해보십시오. "같은 시드로 두 가지 초기화를하면 이후에 rand를 호출 할 때 동일한 연속적인 결과가 생성됩니다." 즉, 당신의 씨앗은 다를 수 없습니다! – crashmstr
그게 전부 였어! 엄청 고마워. – user2941616
표준 라이브러리에는 [std :: random_shuffle'과'std :: shuffle'] (http://en.cppreference.com/w/cpp/algorithm/random_shuffle)이 있습니다 ... – dyp