Zadeklarowanie kart do gry karcianej

0

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.

0

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. ;)

0

Dzięki ;) zobaczę co z tego wyjdzie i jeszcze jedno pytanie jak losować karty przed wybraniem??

0

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;
}
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 :).

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