Witam mam do napisania gre karcianą - blackjacka. Zastanawia mnie jedna rzecz w tym programie (przynajmniej na razie), jak dokładnie zadeklarować zmienne (tablice?) w postaci 4x dwójki, 4x trójki, ... , 4x któl, 4x as. I jak później podczas odkrycia karty powiedzmy asa usunąć go z dostępnych 52 kart? Nie odsyłajcie mnie do googli tylko pomóżcie.
int karty[14][4];
i teraz w np. indeksie [0][1] tablicy mogą znajdować się informacje dotyczące dwójki czerwa, w [1][1] trójki czerwa, a w [2][2] czwórki dzwonka. I np. jeżeli karty[0][1] == 1; tzn. że tą kartę ma gracz, jak karty[0][1] == 2 tzn. że miał ją gracz ale już ją stracił itd. ;)
Dzięki ;) zobaczę co z tego wyjdzie i jeszcze jedno pytanie jak losować karty przed wybraniem??
Wyszukiwarka nie gryzie a wstawiałem ostatnimi czasy takie cos:
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
class Card
{
private:
int value;
string name;
string color;
public:
Card(int v, string n, string c):value(v),name(n),color(c) {}
int getValue()
{
return value;
}
string getName()
{
return name;
}
string getColor()
{
return color;
}
friend ostream& operator<<(ostream& strumien, Card c)
{
strumien<<c.getName()<<" "<<c.getColor();
return strumien;
}
};
class Talia
{
private:
vector<Card> talia;
public:
void add(Card c) //dodawania karty do talii
{
talia.push_back(c);
}
Card popCard() //wyciąganie karty z talii
{
srand(time(0));
int index = rand()%talia.size();
Card tmp = talia[index];
talia[index] = talia.back();
talia.pop_back();
return tmp;
}
void createFull()
{
string kolory[4]={"kier","karo","pik","trefl"};
string figury[13]={"2","3","4","5","6","7","8","9","10","Walet","Dama","Krol","As"}; //można by tu dla 2-10 użyć sstream, ale nie chce mieszać
for (int i=0;i<4;i++)
{
for (int j=0;j<9;j++) //2-10
{
Card tmp(j+2,figury[j],kolory[i]); //generujemy kartę
talia.push_back(tmp); //dodajemy do talii
}
for (int j=9;j<12;j++) //walet, dama, krol
{
Card tmp(j-7,figury[j],kolory[i]); //generujemy kartę
talia.push_back(tmp); //dodajemy do talii
}
Card tmp(11,figury[12],kolory[i]); //as
talia.push_back(tmp); //dodajemy do talii
}
}
int getValue() //funkcja zwraca wartość wszystkich kart w talii
{
int sum = 0;
for (int i =0; i<talia.size();i++)
sum+=talia[i].getValue();
return sum;
}
bool empty() const
{
return talia.empty();
}
};
int main()
{
Talia talia, gracz1, gracz2;
talia.createFull();
// i może robić na przykład
gracz1.add(talia.popCard());
return 0;
}
Oczywiście rozwiązanie Shaloma jest lepsze, ale losowanie moim sposobem wyglądało by następująco:
//Na początku gry cała tablica jest wypełniana zerami co oznacza że karty są nierozdane
for(int a=0;a<14;a++) for(int b=0;b<4;b++) karty[a][b] = 0;
//Następnie losujemy na zmiane karty gracza i komputera, nie wiem ile kart rozdaje się w blackjacku, więc przyjmijmy że rozdaje się x kart;
int x=1;
char decyzja;
int karta,kolor;
for(int a=0;a<x;a++){
do{
karta=rand()%14;
kolor=rand()%4;
}
while(karty[karta][kolor]!=0) //losuje tak długo aż nie trafi na kartę która jest w nierozdanej tali
karty[karta][kolor]=1; //znaleziona karta jest przypisana graczowi
cout<<"Czy chcesz następną kartę?? (t - tak, n - nie)";
cin>>decyzja;
if(decyzja == 't') x++;
}
//Teraz karty komputera
dolna_wartosc=14;
x=0;
for(int a=0;a<x;a++){
do{
karta=rand()%14;
kolor=rand()%4;
}
while(karty[karta][kolor]!=0)
karty[karta][kolor]=2;
if(suma_punktow(2) < dolna_wartosc) x++;
}
// funcja suma_punktow(2) zwraca nam ilosc punktow komputera dla parametru 2 i gracza dla parametru 1, chyba nie musze pisać jak wyglądała by ta funkcja bo miałbyś już gotowy prawie cały program ;p
//zmienna dolna_wartosc oznacza wartosc przy której komputer przestaje brać kolejne karty
Tam gdzie karty karty[a][b] == 0; tzn że karta jest nierozdana, karty[a][b] == 1; tzn. że karta jest w tali gracza, a tam gdzie karty[a][b] == 2; tzn, że karta należy do komputera.
Mój sposób jak już mówiłem jest gorszy niż sposób shaloma ale na pewno bardziej przejrzysty i prostszy w pojęciu dla kogoś początkującego :)
Do tego jeszcze piszesz funkcje suma_punktow(int gracz) która zlicza wartosc kart tablicy dla parametru gracz (jak damy 1 to zlicza dla jedynki czyli dla gracza, a jak 2 to dla dwójki czyli dla komputera) , pokazywanie jaką kartę wyciągną gracz oraz sprawdzanie kto był bliżej liczby 21 i gra gotowa :).