Таким образом, в основном у меня есть колода из 10 карт, которую я перемешиваю в начале игры, и каждый ход я выбираю карту без повторов, пока у меня нет карт. В этот момент я переставил массив и повторял этот процесс, пока игра не закончилась.
void play(int &size, int &player1, int &player2, int cardPile[], int board[]);
void displayRules();
int takeTurn(int &size, int &player, int cardPile[], int board[], int &opposingPlayer);
int shuffleDeck(int &size, int cardPile[]);
int drawCard(int &size, int cardPile[]);int main()
{
int size;
int board[] = {0, 1, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0};
int cardPile[10] = {1, 1, 2, 2, 3, 3, 4, 4, 0, 5};
int player1 = 0;
int player2 = 0;
play(size, player1, player2, cardPile, board);
return 0;
}
//This is the function that plays the entire game
void play(int &size, int &player1, int &player2, int cardPile[], int board[]){
displayRules();
shuffleDeck(size, cardPile);
while(player1 < 25 && player2 < 25){
cout << "\nPlayer 1's turn!" << endl;
takeTurn(size, player1, cardPile, board, player2);
drawCard(size, cardPile);
size++;
showState(player1, player2);
if(player1 >= 25)
break;
else
cout << "\nPlayer 2's turn!" << endl,
takeTurn(size, player2, cardPile, board, player1),
drawCard(size, cardPile),
size++,
showState(player1, player2);
}
youWin(player1, player2);
}
//This function does a single turn for each player
int takeTurn(int &size, int &player, int cardPile[], int board[],int &opposingPlayer){
if(cardPile[size] == 0)
cout << "You drew a Lose a turn card! You lose a turn!" << endl;
else if(cardPile[size] == 5)
cout << "You drew a Switch Places card! You must switch places with the other player!" << endl,
switchPlaces(player, opposingPlayer);
else
cout << "You drew a " << cardPile[size] << "!";
switch(cardPile[size]){
case 1:
cout << " Move forward " << cardPile[size] << " space on the board!" << endl;
player += cardPile[size];
obstacles(player, board);
break;
case 2:
cout << " Move forward " << cardPile[size] << " spaces on the board!" << endl;
player += cardPile[size];
obstacles(player, board);
break;
case 3:
cout << " Move forward " << cardPile[size] << " spaces on the board!" << endl;
player += cardPile[size];
obstacles(player, board);
break;
case 4:
cout << " Move forward " << cardPile[size] << " spaces on the board!" << endl;
player += cardPile[size];
obstacles(player, board);
break;
}
}
//This function shuffles the deck of cards
int shuffleDeck(int &size, int cardPile[]){
srand(time(0));
for(int i = 0; i < 10; i++){
int size = rand() % 10;
int temp = cardPile[i];
cardPile[i] = cardPile[size];
cardPile[size] = temp;
}
}int drawCard(int &size, int cardPile[]){
size++;
if(size == 10)
shuffleDeck(size, cardPile);
else
;
}
У меня есть переменная с именем size, которую я объявил в main и в функции shuffleDeck после перетасовки колоды. Я пытаюсь сохранить номер элемента в переменной размера и оттуда поместить его в функцию takeTurn, чтобы каждый раз, когда игрок берет карту они получат случайное число от элемента. Затем функция drawCard будет увеличивать переменную размера на 1, а если она достигнет 10-го элемента, то она вызовет функцию shuffleDeck, чтобы перетасовать колоду.
Теперь я попытался проверить это в другой программе, и мне удалось перетасовать массивы, это оказалось бесконечным циклом.
#include <iostream>
using namespace std;
int shuffle(int &n, int deck[]);
void display(int &n, int deck[]);int main()
{
int deck[10] = {2, 4, 6, 8, 12, 14, 16, 18, 20, 22};
int n;
shuffle(n, deck);
display(n, deck);
return 0;
}
int shuffle(int &n, int deck[]){
srand(time(0));
for(int i = 0; i < 10; i++){
int n = rand() % 10;
int temp = deck[i];
deck[i] = deck[n];
deck[n] = temp;
}
}
void display(int &n, int deck[]){
while(n < 10){
cout << n << " " << deck[n] << endl;
n++;
if(n == 10)
shuffle(n, deck),
n = 0;
else
;
}
}
Когда я компилирую и запускаю мою оригинальную программу, игроки вытягивают карты тысячами, и это в конечном итоге заканчивается бесконечным циклом.
Вы можете создать класс для обработки колоды, например:
template <typename T, typename Rnd>
class Deck
{
public:
Deck(const std::vector<T>& cards, Rnd& rnd) : cards(cards), rnd(rnd)
{
shuffle();
}
T draw() {
++index;
if (index == cards.size())
{
shuffle();
index = 0;
}
return cards[index];
}
private:
void shuffle()
{
std::cout << "shuffle\n";
std::shuffle(this->cards.begin(), this->cards.end(), rnd);
}
private:
std::vector<T> cards;
std::size_t index = -1;
Rnd& rnd;
};
использование:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::mt19937 rnd(seed);
Deck<int, std::mt19937> deck({1, 1, 2, 2, 3, 3, 4, 4, 0, 5}, rnd);
Других решений пока нет …