Co zrobić żeby karty losowane w dwóch różnych voidach nie powtarzały się?

0

Siemka! Jestem początkującym programistOM programistĄ. Próbuję właśnie zrobić grę karcianą, ale nie wiem co trzeba zrobić, żeby nie powtarzały się karty, które miałby stawiać bot. Pomógłby mi to ktoś ogarnąć? Z góry dzięki!
Oto część kodu, który już napisałem:

#include <iostream>
#include <math.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <string>
using namespace std;
static const char *Karta[] =
{
"As", "Dziewiatka", "Dziesiatka", "Jopek", "Krol", "Krolowa"

};
static const char *Rodzaj[] =
{
"Pik", "Karo", "Trefl", "Kier"
};
void nazwy_kart(int n)
{
cout << Karta[n % 6] << " z " << Rodzaj[n / 4] << endl;
}
static const char *KartaBOT[] =
{
"As", "Dziewiatka", "Dziesiatka", "Jopek", "Krol", "Krolowa"

};
static const char *RodzajBOT[] =
{
"Pik", "Karo", "Trefl", "Kier"
};
void nazwy_kartBOT(int n)
{
cout << Karta[n % 6] << " z " << Rodzaj[n / 4] << endl;
}
int main()
{
powrot:
powrot2:
int Wroc;
int PunktyGRA;
int PunktyOGOLNE;
int START;
int Ilosc = 0;
string Rodzaj;
string Karta;
HANDLE h= GetStdHandle(STD_OUTPUT_HANDLE);
cout<<"\n\n";
SetConsoleTextAttribute(h,9);
cout<<" "<<endl;
cout<<" | | "<<endl;
cout<<" | ZMODYFIKOWANA GRA KARCIANA W TYSIACA |"<<endl;
cout<<" ||"<<endl;
SetConsoleTextAttribute(h,6);
cout<<" ---> ";
SetConsoleTextAttribute(h,12);
cout<<"1.GRAJ"<<endl;
SetConsoleTextAttribute(h,6);
cout<<" ---> ";
SetConsoleTextAttribute(h,5);
cout<<"2.JAK GRAC?"<<endl;
SetConsoleTextAttribute(h,6);
cout<<" ---> ";
SetConsoleTextAttribute(h,8);
cout<<"3.O TWORCY"<<endl;

int wybor;

cin>>wybor;
if(wybor==1){
cout<<"Twoje Karty to: "<<endl;
srand( time( NULL ) );int talia[12];
for (int i=0;i<12;talia[i++]=i);
random_shuffle(talia, talia+12);
for_each(talia, talia+12, nazwy_kart);
cout<<"Karty przeciwnika"<<endl;
srand( time( NULL ) );int talia2[12];
for (int i=0;i<12;talia2[i++]=i);
random_shuffle(talia2, talia2+12);
for_each(talia2, talia2+12, nazwy_kartBOT);

cout<<"Wystaw swoja pierwsza karte"<<endl;
do{
cout<<Ilosc<<"\n";
Ilosc++;
cin>>Karta;
cin>>Rodzaj;
cout<<"Bot stawia "<<Karta<<" z "<<Rodzaj<<endl;
}while(Ilosc<=12);
0

Nie idealnym, ale prostym w implementacji jest posiadanie tymczasowego bufora ze wszystkimi kartami, z którego będzie usuwać "zabrane" karty i przesuwać je do polosowej listy. Wtedy będziemy mieli osobny, "losowy" bufor z którego wystarczy pobierać karty po kolei.

std::vector<const Card*> tmpList(cardsList);
std::vector<const Card*> shuffled; shuffled.reserve(tmpList.size());
for(int i=0;i<cardsList.size();i++)
{
  const size_t x = rand() % tmpList.size();
  auto iterator = tmpList.begin() + x;

  shuffledList.push_back(*iterator);
  tmpList.erase(iterator);
}

erase zinwaliduje iterator i wylosowanie drugi raz tej samej liczby wskaże. Puryści będą narzekać, że sporo tu kopiowania i inicjalizacji i będą mieli rację, ale rozwiązanie w założeniu ma być proste do zrozumienia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1