gra w wojnę

0

No więc mam taki problem. Potrzebuje stworzyć program który będzie symulacją gry w wojnę. Program powinien działać w ten sposób że każda karta ma swoją wartość i wedle tej wartości są dokonywane porównania. Doszedłem do takiego momentu i nie wiem co z tym teraz zrobić ; (. A dokładniej dzieję się teraz tak że za każdym razem wygrywa gracz pierwszy bądź drugi, nie ma w ogóle takiej sytuacji że na przemian któryś z graczy zgarnia karty. Jestem początkujący wiec bądźcie wyrozumiali. Na początek wystarczy żeby wyświetlało tylko który aktualnie gracz wygrywa i program doszedł do samego końca. Z wyświetlaniem to już sobie później poradzę. Chodzi o fakt żeby program działał poprawnie. Przepraszam za mało czytelny kod.

#include <cstdlib>
#include <iostream>

using namespace std;

struct Karta
{
       char *figura;
       char *kolor;
       int war;
};


struct lista
{
       Karta karty;
       lista *nastepna;
};



void zlozTalie(Karta *wTalia, char *wFigura[],char *wKolor[])
{
     for(int i=0; i<52; i++)
     {
     wTalia[i].figura=wFigura[i%13];
     wTalia[i].war= i%13;
     wTalia[i].kolor=wKolor[i/13];
     }
}

void tasuj (Karta *wTalia)
{
     for(int i=0; i<52;i++) 
     {
     int j=rand()%52;
     Karta t=wTalia[i];
     wTalia[i]=wTalia[j];
     wTalia[j]=t;
     }
}


void wyswietl(Karta *wTalia)
{
     for(int i=0 ; i<52 ; i++)
     {
     cout<<wTalia[i].figura<<"\t"; 
     if(strcmp(wTalia[i].kolor,"trefl")==0) cout<<char(5);
     if(strcmp(wTalia[i].kolor,"karo")==0) cout<<char(4);
     if(strcmp(wTalia[i].kolor,"kier")==0) cout<<char(3);
     if(strcmp(wTalia[i].kolor,"pik")==0) cout<<char(6);
     cout<<endl;
     }
}

void wyswietl_karte(Karta do_wyswietlenia)
{
  cout <<do_wyswietlenia.figura;
  if(strcmp(do_wyswietlenia.kolor,"trefl")==0) cout<<char(5);
  if(strcmp(do_wyswietlenia.kolor,"karo")==0) cout<<char(4);
  if(strcmp(do_wyswietlenia.kolor,"kier")==0) cout<<char(3);
  if(strcmp(do_wyswietlenia.kolor,"pik")==0) cout<<char(6);
  cout<<endl;
}


void rozdaj (lista* gracz1, lista* gracz2, Karta talia[], lista* & koniec1, lista* & koniec2)
{
     lista* tmp1 = gracz1;
     lista* tmp2 = gracz2;
     tmp1 -> karty = talia[0];
     tmp2 -> karty = talia[1];
     for (int i = 2; i < 52; i++)
     {
         if (i%2 == 0)
         {
            tmp1 -> nastepna = new lista;
            tmp1 = tmp1 -> nastepna;
            tmp1 -> karty = talia[i];
         }
         else
         {
            tmp2 -> nastepna = new lista;
            tmp2 = tmp2 -> nastepna;
            tmp2 -> karty = talia[i];
         }
     }
     
  koniec1 = tmp1;
  koniec2 = tmp2;
  koniec1 -> nastepna = 0;
  koniec2 -> nastepna = 0;
}


void wyswietl_lista(lista* gracz)
{
     lista* tmp = gracz;
     while (tmp)
     {
     wyswietl_karte(tmp -> karty);
     tmp = tmp -> nastepna;
     }
}

void wojna (lista* & gracz1, lista* & gracz2, lista* & koniec1, lista* & koniec2)
{

       lista* tmp1 = gracz1;
       lista* tmp2 = gracz2;

       tmp1 = tmp1 -> nastepna -> nastepna;
       tmp2 = tmp2 -> nastepna -> nastepna;

  while(tmp1 -> karty.war == tmp2 -> karty.war)
       {
    tmp1 = tmp1 -> nastepna -> nastepna;
    tmp2 = tmp2 -> nastepna -> nastepna;
    cout << "wojna";
      }

  if((tmp1 -> karty.war) < (tmp2 -> karty.war))
  {
    koniec2 -> nastepna = gracz2;
    gracz2 = tmp2 -> nastepna;
    tmp2 -> nastepna = 0;
    koniec1 -> nastepna = gracz1;
    gracz1 = tmp1 -> nastepna;
    tmp1 -> nastepna = 0;
    cout << "gracz 2 wojna";
  }
  else
  {
    koniec1 -> nastepna = gracz1;
    gracz1 = tmp1 -> nastepna;
    tmp1 -> nastepna = 0;
    koniec2 -> nastepna = gracz2;
    gracz2 = tmp2 -> nastepna;
    tmp2 -> nastepna = 0;
    cout << "gracz 1 wojna";
  }

  while(koniec1 -> nastepna)
    koniec1 = koniec1 -> nastepna;
  while(koniec2 -> nastepna)
    koniec2 = koniec2 -> nastepna;

}
     
     

int main(int argc, char *argv[])
{
    
Karta talia[52];
char *figura[13]=
{"2","3","4","5","6","7","8","9","10","walet","dama","krol","as"};
char *kolor[4]={"trefl","karo","kier","pik"};

srand(time(0));

zlozTalie(talia, figura, kolor);

//cout<<"talia ulozona"<<endl;
//wyswietl(talia);

tasuj(talia);

//cout<<"talia potasowana"<<endl;

lista *gracz1 = new lista;
lista *gracz2 = new lista;
lista  *koniec1, *koniec2;

rozdaj (gracz1, gracz2, talia, koniec1, koniec2);

//wyswietl_lista(gracz1);

cout << endl << endl;

//wyswietl_lista(gracz2);

lista* tmp1 = gracz1;
lista* tmp2 = gracz2;

while(tmp1 !=0 && tmp2 !=0 )
{
         
    if((tmp1 -> karty.war) == (tmp2 -> karty.war))     
    wojna(gracz1, gracz2, koniec1, koniec2);    
    
    else if((tmp1 -> karty.war) < (tmp2 -> karty.war))
     {
       koniec2 -> nastepna = tmp1;
       
       koniec2 = koniec2 -> nastepna;
       
       koniec2 -> nastepna = tmp2;
       koniec2 = koniec2 -> nastepna;
       koniec2 -> nastepna = 0; 
       cout << "gracz 2" << endl;

     }
     else
     {
       koniec1 -> nastepna = tmp2;
       
       koniec1 = koniec1 -> nastepna;
       
       koniec1 -> nastepna = tmp1;
       koniec1 = koniec1 -> nastepna;
       koniec1 -> nastepna = 0; 
       cout << "gracz 1" << endl;
     }



    koniec1 -> nastepna = tmp2;
    koniec1 = koniec1 -> nastepna;
    koniec1 -> nastepna = tmp1;
    koniec1 = koniec1 -> nastepna;
    koniec1 -> nastepna = 0;

}
       
cout << endl << endl;

//wyswietl_lista(gracz1);

cout << endl << endl;
       
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
0
qba_wl napisał(a)

char *figura[13]=
{"2","3","4","5","6","7","8","9","10","walet","dama","krol","as"};
char *kolor[4]={"trefl","karo","kier","pik"};

Na cpp się nie znam, ale wydaje mi się, że do char[] można przypisać pojedynczy znaki: { '2' , '3' , ...}; a ty chcesz przypisać dalej całe słowa, gdzie to ma się zmieścić?

0
rand() napisał(a)
qba_wl napisał(a)

char *figura[13]=
{"2","3","4","5","6","7","8","9","10","walet","dama","krol","as"};
char *kolor[4]={"trefl","karo","kier","pik"};

Na cpp się nie znam, ale wydaje mi się, że do char[] można przypisać pojedynczy znaki: { '2' , '3' , ...}; a ty chcesz przypisać dalej całe słowa, gdzie to ma się zmieścić?

To akurat ma dobrze. char *cos[2] = {"asd", "sad"}; jest tablica pointerow, czyli moze jakis element wskazywac pierwszy znak slowa i jest ok, a w tym przypadku ma pointery na stale asd i sad, dla ktorych znajdzie sie pamiec automatycznie.
Co do tematu to nie wiem, bo nie umiem grac w wojne ;p

0

Tak więc mogę napisać na czym polega gra w wojnę:
Podziel potasowana talie kart miedzy dwóch graczy – karta jest obiekt pewnej struktury zawierajacej
informacje o kolorze karty i jej wysokosci – niech nasza talia składa sie z 52 kart.
W kazdej turze wez po jednej karcie od graczy, a nastepnie porównaj ich starszenstwo. Gracz
o wyższej wartości karty zgarnia je i kładzie na spód swojej talii. Jeżeli natomiast „spotkaja”
się karty o jednakowej sile, rozpoczyna sie wojna: aktualnie widoczne karty zostaja przykryte
(pobieramy od graczy po jednej karcie), a nastepnie pobieramy jeszcze po jednej karcie od graczy

  • te karty beda porównywane; analogicznie jak wcześniej: ture wygrywa gracz posiadajacy starsza
    karte, badz wojna trwa nadal, jesli „spotkaja” sie karty o jednakowej sile. Gracz wygrywajacy
    wojne, zbiera wszystie karty w niej uczestniczace.
    Gra konczy sie, gdy jednemu z graczy zabraknie kart. Pamietaj o wyswietleniu informacji, kto
    wygrał.
0

Moim zdaniem problem polega na tym, że za bardzo kombinuje.
Nie zapamiętuj karty jako napisu, ale jako zwykłą liczbę. Czyli struktura karta powinna wyglądać tak:

struct Karta
{
       int idFigury;
       char idKoloru;
};

Napis potrzebujesz tylko i wyłącznie do wydrukowania co to za karta.
Utwórz sobie metodę:

void drukujKartę(Karta* karta)
{ 
     static const char * const NazwyKart[] = {
          "2", "3", "4", "5", "6", "7", "8", "9", "10", "walet", "dama", "krol", "as"
     };

     static const char * const KoloryKart[] = {
          "trefl", "karo", "kier", "pik"
     };
     cout << NazwyKart[karta->idFigury] << " "<<KoloryKart[karta->idKoloru];
}
0

@MarekR22, wow, chyba pierwszy raz na 4p widzę stały wskaźnik na stałe dane w wydaniu kogoś innego niż ranides/quetzalcoatl.

0

Tyle że w przypadku drukowania to akurat nie jest problem. Chodzi o to że nie działa typowa wojna. W tym sensie że każdą poszczególną walkę wygrywa jeden gracz. Nie występuje na przemian typowa walka że raz jeden gracz wygra raz drugi, tylko od początku do końca jeden gracz ciągle wygrywa... A wiadomo że w wojnie taki przypadek jest bardzo rzadko spotykany. Zwłaszcza gdy karty są losowo rozdawane. Nie wiem czy wyraziłem się jasno ale o takie coś mi chodzi.

0

A nie jest tak, że algorytm po porównaniu pierwszej karty z wierzchu, dodaje ją drugi raz do końca listy, nie zdejmując jej... Czyli porównuje cały czas tą samą kartę. To by wyjaśniało dlaczego wynik cały czas jest ten sam.

0

Mógłbyś dać jakąś propozycję co w takim razie zmienić?

0
qba_wl napisał(a)

Mógłbyś dać jakąś propozycję co w takim razie zmienić?

Widzisz ty jesteś początkujący, a ja c++ w ogóle nie znam :P

while(tmp1 !=0 && tmp2 !=0 )
{
         ...
    koniec1 -> nastepna = tmp2;
    koniec1 = koniec1 -> nastepna;
    koniec1 -> nastepna = tmp1;
    koniec1 = koniec1 -> nastepna;
    koniec1 -> nastepna = 0;

// Tutaj byś musiał przypisać do tmp1 i tmp2 następną kartę. Nie wiem jak to wygląda w C++
// tmp1 = tmp1.nastepna; 
// tmp2 = tmp2 -> nastepna; ??

}

Chodzi o to że tmp1 i tmp2 cały czas wskazują na tą samą kartę (chyba), musisz do nich przypisać kolejną kartę w tali, a ty tylko dodajesz ją do końca listy, nie zdejmując jej z szczytu. Tylko teraz jest możliwe że musiał byś zmienić warunek while(), ale nie koniecznie...

0

Wiem już o co Ci chodzi próbowałem wcześniej dokładnie robić coś takiego ale to nie skutkowało. Znalazłem już odpowiedź co było nie tak. Ale z góry dziękuje za pomoc.

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