rozłożenie 52 kart na 2 graczy po 26, gra karciana w wojnę.

0

Witam,
Mam problem przy kompresji programu z macOS do Windows 10. Gra karciana w wojnę.
Otóż napisałem program na laptopie i wszystko działa program rozdaje karty między graczem a komputerem po 26 kart. Przy skopiowaniu kodu i kilku małych zmianach bibliotek oraz poprawieniu funkcji Sleep na windows program rozdaje nie równo karty, tj. 34 dla gracza reszta dla komputera. Szukam rozwiązania już dobre pare dni i nie potrafię zaradzić problemowi.
Kod z macOS wrzucam poniżej, proszę o pomoc w znalezieniu problemu gdyż jest to mój projekt na zaliczenie 1 semestru z C++

=============

#include <iostream>
#include <cstdlib> //losowanie
#include <ctime> //losowanie
#include <unistd.h> //zasypianie na jakis czas komputera
using namespace std;

int gracz[4][13];
int komputer[4][13];
int licznik;        //liczy ile Ci jeszcze zostalo kart

int x;          //do caseow
int y;          //case
int k;          //losowanie kart
string imie;    //imie gracza

int main()
{
    cout<<"###############################################################"<<endl;
    cout<<"W pierwszej kolejnosci prosze podac twoje imie: ";
    cin>>imie;
    cout<<"###############################################################"<<endl<<endl<<endl;
    
    cout<<"GRA KARCIANA WOJNA"<<endl;
    cout<<"Autor: Adrian Adamus"<<endl<<endl;
    
    start:          //punkt powrotu po zakonczonym casie
    
    cout<<"    MENU GLOWNE"<<endl;
    cout<<"####################"<<endl;
    cout<<"1. Graj vs komputer"<<endl;
    cout<<"    2. Jak grac"<<endl;
    cout<<"  3. Wyjdz z gry"<<endl;
    cout<<"####################"<<endl<<endl;
    cout<<"Wybierz opcje: ";
    
    cin>>x;
    
    switch(x)
    {
        case 2:cout<<endl<<"Przetasowaną talię kart dzieli się na dwie części, rozdaje graczom i kładzie koszulkami do góry. Pierwszy i drugi zawodnik równocześnie wykładają po jednej karcie i porównują ich wartości. Gracz mający kartę o wyższej wartości odbiera karty i kładzie je pod spodem swojej talii. Jeśli karty mają taką samą siłę (as na asa, król na króla, itp.), rozpętuje się wojna, należy odkryć po jednej karcie, położyć je koszulkami do góry na swoich kartach odkrytych, a następnie wyciągnąć następną kartę, położyć odkryte na zakrytych kartach i wówczas są one porównywane. Karta o wyższej wartości wygrywa, a zwycięzca wojny odbiera wszystkie karty wykorzystane w wojnie. Proces jest powtarzany, jeśli w okresie wojny znowu nie można wyłonić zwycięzcy. Wygrywa ten, kto pierwszy zabierze wszystkie karty przeciwnikowi. Gra potrafi być bardzo długa, gdyż zebrane karty są przekładane pod spód talii i mogą one później zostać wykorzystane wielokrotnie; partia może trwać nawet ponad kilka godzin, jednak zwykle znudzeni monotonią gracze rezygnują dużo wcześniej. Z tego względu zyskuje popularność głównie u najmłodszych, niezdolnych do zapamiętania reguł bardziej skomplikowanych rozgrywek."<<endl<<endl;
            
            cout<<"1. cofnij do glownego menu"<<endl;
            cout<<"Wybierz opcje: ";
            cin>>x;
            while(x!=1)
                {
                    cout<<"Prosze podac odpowiednia opcje!"<<endl;
                    cout<<"Wybierz opcje: ";
                    cin>>x;
                    cout<<endl;
                }
            goto start;
            break; //konczy on case 2
            
        case 3:cout<<endl<<"Do widzenia!"<<endl<<endl; return 0; break;
            
        default:cout<<endl<<"Wybierz opcje z podanych trzech!"<<endl<<endl; goto start; break;
            
        case 1:cout<<endl<< "W puli sa 52 karty"<<endl;
            cout<<"Trwa losowanie kart..."<<endl<<endl;
            
           
            int h=26;
            for(int e=1;e<=h;e++)      //losowanie 26 kart dla komputera
            {
                
                losowanie:
            int o;
            srand((unsigned int)time(NULL));
            o=rand()%13;
                
            int p;
            srand((unsigned int)time(NULL));
            p=rand()%4;
            
                komputer[p][o]=+1;                      //gdy karta sie powtorzy to losuje od nowa
                if(komputer[p][o]==2)
                {
                    komputer[p][o]=-1;
                    h--;
                    goto losowanie;
                }
                
                
                sleep(1);
                
            }
            
            for(int i=0;i<=3;i++)                       //dawanie reszty kart graczowi
                for(int j=0;j<=12;j++)
                    if(komputer[i][j]==0)
                        gracz[i][j]=1;
                        
        
        h:
            
            cout<<endl<<endl;
            
            powojnie:
            
            licznik=0;                    //RESETOWANIE licznika

            for(int i=0;i<=3;i++)                       //licznik kart gracza
            for(int j=0;j<=12;j++)
                if(gracz[i][j]==1)
                    licznik=licznik+1;
            
            
            
            if(licznik==52)
            {
                cout<<endl<<endl;
                cout<<"#############################"<<endl;
                cout<<imie<<" wygrywa gre wojna!"<<endl;
                cout<<"#############################"<<endl;
                goto start;
            }
            
            if(licznik==0)
                {
                cout<<endl<<endl;
                cout<<"###########################"<<endl;
                cout<<"Komputer wygrywa gre wojna!"<<endl;
                cout<<"###########################"<<endl;
                goto start;
                }
            
            for(int h=0;h<=0;h++)
            {
            
                
                
            cout<<"############################"<<endl;
            cout<<"Posiadasz "<<licznik<<" Kart"<<endl;
            cout<<"----------------------------"<<endl;
            cout<<"Wcisnij 1 aby rzucic karte"<<endl;
            cout<<"Wcisnij 2 aby wrocic do menu"<<endl;
            cout<<"----------------------------"<<endl;
            cout<<"Wybierz opcje z podanych dwoch: ";
            cin>>y;
            cout<<"############################"<<endl<<endl;
           
                //gdy nie bedzie z zakresu to wyskakuje blad i masz podac jeszcze raz
                while(y!=1 && y!=2)
                {
                    cout<<"Prosze podac odpowiednia opcje!"<<endl;
                    cout<<"Wybierz opcje z podanych dwoch: ";
                    cin>>y;
                }
                
                //opuszczenie gry
                if(y==2)
                {
                    cout<<"Gracz opuszcza gre"<<endl;
                    cout<<"Wygrywa komputer!"<<endl<<endl;
                    goto start;
                }
                
                //gra
                if(y==1)
                {
                    
                    //losowanie karty ktora wyklada gracz
                    r:
                    int q;
                    srand((unsigned int)time(NULL));
                    q=rand()%13;
                        
                    int w;
                    srand((unsigned int)time(NULL));
                    w=rand()%4;
                    
                    if(gracz[w][q]==0)
                        goto r;
                    else
                    
                    if(q==0)
                        cout<<imie<<" wylozyl na stol 2";
                            else if(q==1)
                                cout<<imie<<" wylozyl na stol 3";
                                else if(q==2)
                                    cout<<imie<<" wylozyl na stol 4";
                                    else if(q==3)
                                        cout<<imie<<" wylozyl na stol 5";
                                        else if(q==4)
                                            cout<<imie<<" wylozyl na stol 6";
                                            else if(q==5)
                                                cout<<imie<<" wylozyl na stol 7";
                                                else if(q==6)
                                                    cout<<imie<<" wylozyl na stol 8";
                                                    else if(q==7)
                                                        cout<<imie<<" wylozyl na stol 9";
                                                        else if(q==8)
                                                            cout<<imie<<" wylozyl na stol 10";
                                                            else if(q==9)
                                                                cout<<imie<<" wylozyl na stol walet";
                                                                else if(q==10)
                                                                    cout<<imie<<" wylozyl na stol dama";
                                                                    else if(q==11)
                                                                        cout<<imie<<" wylozyl na stol krol";
                                                                        else if(q==12)
                                                                            cout<<imie<<" wylozyl na stol As";
                                                                          
                                                                            
                    cout<<endl<<endl<<"Czekanie na ruch komputera..."<<endl<<endl;
                    
                    t:
                    int n;
                    srand((unsigned int)time(NULL));
                    n=rand()%13;
                        
                    int m;
                    srand((unsigned int)time(NULL));
                    m=rand()%4;
                    
                    if(komputer[m][n]==0)
                        goto t;
                    else
                    
                    if(n==0)
                    cout<<"Komputer wylozyl na stol 2";
                        else if(n==1)
                            cout<<"Komputer wylozyl na stol 3";
                            else if(n==2)
                                cout<<"Komputer wylozyl na stol 4";
                                else if(n==3)
                                    cout<<"Komputer wylozyl na stol 5";
                                    else if(n==4)
                                        cout<<"Komputer wylozyl na stol 6";
                                        else if(n==5)
                                            cout<<"Komputer wylozyl na stol 7";
                                            else if(n==6)
                                                cout<<"Komputer wylozyl na stol 8";
                                                else if(n==7)
                                                    cout<<"Komputer wylozyl na stol 9";
                                                    else if(n==8)
                                                        cout<<"Komputer wylozyl na stol 10";
                                                        else if(n==9)
                                                            cout<<"Komputer wylozyl na stol walet";
                                                            else if(n==10)
                                                                cout<<"Komputer wylozyl na stol dama";
                                                                else if(n==11)
                                                                    cout<<"Komputer wylozyl na stol krol";
                                                                    else if(n==12)
                                                                        cout<<"Komputer wylozyl na stol As";
                    cout<<endl<<endl;
                    
                    if(q>n)//wygrywa gracz
                    {
                        cout<<"wygrywa "<<imie<<"!"<<endl;
                        komputer[m][n]=0;
                        gracz[m][n]=1;
                        
                        //sprawdzanie wygranej gracza
                        if(licznik==52)
                        {
                            cout<<endl<<endl;
                            cout<<"#############################"<<endl;
                            cout<<imie<<" wygrywa gre wojna!"<<endl;
                            cout<<"#############################"<<endl;
                            goto start;
                        }
                        
                        goto h;
                    }
                    
                    
                    
                    
                    if(q<n)//wygrywa komputer
                    {
                        cout<<"wygrywa komputer!"<<endl;
                        gracz[w][q]=0;
                        komputer[w][q]=1;
                        
                        //sprawdzanie wygranej komputera
                        if(licznik==0)
                        {
                            cout<<endl<<endl;
                            cout<<"###########################"<<endl;
                            cout<<"Komputer wygrywa gre wojna!"<<endl;
                            cout<<"###########################"<<endl;
                            goto start;
                        }
                         
                        goto h;
                    }
                    
                    
                    if(q==n)                //wojna
                    {
                        cout<<"\t \t \t \t \t WOJNA!"<<endl<<"Trwa wystawianie zakrytych 2 kart oraz 3 odkrytej..."<<endl<<endl;
                        
                    
                        for(int q=0;q<=2;q++)
                        {
                            gracz:
                            //losowanie kart gracza
                            xd:
                            int v;
                            srand((unsigned int)time(NULL));
                            v=rand()%13;
                                
                            int b;
                            srand((unsigned int)time(NULL));
                            b=rand()%4;
                            
                            //jesli nie ma karty to losuje jeszcze raz
                            if(gracz[b][v]==0 || gracz[b][v]==2)
                                goto xd;
                            
                            gracz[b][v]=2;
                            
                            
                            sleep(0.3);
                            
                            komp:
                            //losowanie kart komputera
                            il:
                            int k;
                            srand((unsigned int)time(NULL));
                            k=rand()%13;
                                
                            int l;
                            srand((unsigned int)time(NULL));
                            l=rand()%4;
                            
                            //jesli nie ma karty to losuje jeszcze raz
                            if(komputer[l][k]==0 || komputer[l][k]==2)
                                goto il;
                            
                            komputer[l][k]=2;
                            
                            //sprawdzanie czy kazdy wylosowal po 3 karty
                            if(q==2)
                            {
                                int sprawdzaniekomp=0;          //licznik komputera ile ma kart wojennych
                                int sprawdzaniegra=0;           //licznik gracza ile ma kart wojennych
                                
                                
                                for(int i=0;i<=3;i++)                       //sprawdzanie komputera
                                for(int j=0;j<=12;j++)
                                    if(komputer[i][j]==2)
                                        sprawdzaniekomp++;
                                
                                
                                for(int i=0;i<=3;i++)                       //sprawdzanie gracza
                                for(int j=0;j<=12;j++)
                                    if(komputer[i][j]==2)
                                        sprawdzaniegra++;
                                
                                
                                if(sprawdzaniekomp!=3)                  //jezeli nie ma komputer do losuje jeszcze raz
                                    goto komp;
                                    
                                
                                if(sprawdzaniegra!=3)                   //jezeli nie ma gracz to losuje jeszcze raz
                                    goto gracz;
                                
                                
                            }
                            //zakonczenie sprawdzania czy kazy wylosowal po 3 karty
                            
                                    //zapobieganie kolejnej wojny
                            if(q==2)
                            {
                                if(k==v)
                                {
                                    komputer[l][k]-=2;
                                    gracz[b][v]-=2;
                                    goto il;
                                }
                            }
                                    //koniec zapobiegania wojny
                            
                            
                                if(q==2)
                                {
                                    if(v==0)
                                    cout<<imie<<" wylozyl na stol 2";
                                        else if(v==1)
                                            cout<<imie<<" wylozyl na stol 3";
                                            else if(v==2)
                                                cout<<imie<<" wylozyl na stol 4";
                                                else if(v==3)
                                                    cout<<imie<<" wylozyl na stol 5";
                                                    else if(v==4)
                                                        cout<<imie<<" wylozyl na stol 6";
                                                        else if(v==5)
                                                            cout<<imie<<" wylozyl na stol 7";
                                                            else if(v==6)
                                                                cout<<imie<<" wylozyl na stol 8";
                                                                else if(v==7)
                                                                    cout<<imie<<" wylozyl na stol 9";
                                                                    else if(v==8)
                                                                        cout<<imie<<" wylozyl na stol 10";
                                                                        else if(v==9)
                                                                            cout<<imie<<" wylozyl na stol walet";
                                                                            else if(v==10)
                                                                                cout<<imie<<" wylozyl na stol dama";
                                                                                else if(v==11)
                                                                                    cout<<imie<<" wylozyl na stol krol";
                                                                                    else if(v==12)
                                                                                        cout<<imie<<" wylozyl na stol As";
                                    cout<<endl<<endl;
                                    
                                  if(k==0)
                                  cout<<"Komputer wylozyl na stol 2";
                                      else if(k==1)
                                          cout<<"Komputer wylozyl na stol 3";
                                          else if(k==2)
                                              cout<<"Komputer wylozyl na stol 4";
                                              else if(k==3)
                                                  cout<<"Komputer wylozyl na stol 5";
                                                  else if(k==4)
                                                      cout<<"Komputer wylozyl na stol 6";
                                                      else if(k==5)
                                                          cout<<"Komputer wylozyl na stol 7";
                                                          else if(k==6)
                                                              cout<<"Komputer wylozyl na stol 8";
                                                              else if(k==7)
                                                                  cout<<"Komputer wylozyl na stol 9";
                                                                  else if(k==8)
                                                                      cout<<"Komputer wylozyl na stol 10";
                                                                      else if(k==9)
                                                                          cout<<"Komputer wylozyl na stol walet";
                                                                          else if(k==10)
                                                                              cout<<"Komputer wylozyl na stol dama";
                                                                              else if(k==11)
                                                                                  cout<<"Komputer wylozyl na stol krol";
                                                                                  else if(k==12)
                                                                                      cout<<"Komputer wylozyl na stol As";
                                    cout<<endl<<endl;
                            //wygrywa komputer
                                               if(k>v)
                                               {
                                                   cout<<"Wojne wygrywa komputer!"<<endl;
                                                   
                                                   
                                                   for(int i=0;i<=3;i++)                       //zamiana z 2 na 1
                                                   for(int j=0;j<=12;j++)
                                                       if(komputer[i][j]==2)
                                                           komputer[i][j]=1;
                                                   
                                                   for(int i=0;i<=3;i++)                       //zamiana z 2 na 1
                                                   for(int j=0;j<=12;j++)
                                                       if(gracz[i][j]==2)
                                                       {
                                                           komputer[i][j]=1;
                                                           gracz[i][j]=0;
                                                       }
                                                   
                                                   goto powojnie;
                                               }//zakonczenie if(k>v)
                            //wygrywa gracz
                                               if(k<v)
                                               {
                                               cout<<"Wojne wygrywa "<<imie<<"!"<<endl;
                                               
                                                   
                                                   for(int i=0;i<=3;i++)                       //zamiana z 2 na 1
                                                   for(int j=0;j<=12;j++)
                                                       if(gracz[i][j]==2)
                                                           gracz[i][j]=1;
                                                   
                                                   for(int i=0;i<=3;i++)                       //zamiana z 2 na 1
                                                   for(int j=0;j<=12;j++)
                                                       if(komputer[i][j]==2)
                                                       {
                                                           gracz[i][j]=1;
                                                           komputer[i][j]=0;
                                                       }
                                                   
                                                   
                                                   goto powojnie;
                                               }//zakonczenie if(k<v)
                            
                                }//zakonczenie if==2
                           
                            
                        }//zakonczenie for (313 linijka)
                    
                    
                }//zakonczenie wojny
                }//zakonczenie gry
    }//zakonczenie petli for (145 linijka)
            
                        
        
            break;
        }//zakonczenie switcha
    
    
    
    return 0;
}


/*


//wyswietlanie kart

cout<<"Karty komputera"<<endl;
for(int i=0;i<=3;i++)                       //wyswietlenie kart komputera
{
    for(int j=0;j<=12;j++)
        cout<<komputer[i][j]<<"\t";
        cout<<endl;
}

cout<<"Karty gracza"<<endl;
for(int i=0;i<=3;i++)                       //wyswietlenie kart gracza
{
    for(int j=0;j<=12;j++)
        cout<<gracz[i][j]<<"\t";
        cout<<endl;
}
*/
6

Rozwiązanie jest proste:
Usuń cały kod i napisz go od początku, tylko tym razem użyj bibliotek czysto C++ i pisz kod podzielony na funkcje.
W aktualnej formie analiza tego to SADOMASO.
Od razu też polecam ten link https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

Edit:
Spróbuj zapisać kod bez użycia goto

1

Po pierwsze to spróbuj ogarnąć swój kod, tak aby nie tworzyć kilometrowych struktur typu else if.
Pomyśl o wykorzystaniu enum class z map

    enum class Card { AS , KING , QUEEN };
    map<Card,string> cardname { {Card::AS,"As"} , {Card::KING,"krol"} , {Card::QUEEN,"dama"} };
    Card card;
    .....  
    cout << imie << " wylozyl na stol " << cardname[card];
1

Nie będę się zagłębiał w to spagheti, ale być może zainteresuje Cie jak rozwiązałem ten sam problem gdy robiłem znajomemu pokera na zaliczene gdy sam byłem na studiach https://github.com/pdy/PrimitivePoker/blob/master/Deck.cpp#L60 Metoda Shuffle i Distribute.

3

Szczerze, to jak ktoś u mnie, na kierunku, oddał podobnie jakościowy kod. Brak funkcji o klasach nie mówiąc, GOTO. Musiał jeszcze raz napisać, ale za rok

te wszystkie if

if(n==0)
     cout<<"Komputer wylozyl na stol 2";

i tak dalej

można było zastąpić funkcją

void showCard(std::string who, int number){
    std::cout<< who<<  " wylozyl na stol  << number;
}

Obczaić jak zmienić number na Króla, Dame itp. Odpadnie ci duża część kodu.

Do tego główna pętla gry. Opcje switch do osobnych funkcji.

3

Dziel kod na bardzo małe funkcje, wtedy takie komentarze:


                                               }//zakonczenie if(k<v)

                                }//zakonczenie if==2

                        }//zakonczenie for (313 linijka)

                }//zakonczenie wojny
                }//zakonczenie gry
    }//zakonczenie petli for (145 linijka)

            break;
        }//zakonczenie switcha

Będą zupełnie zbędne.

Tak się zastanawiam, ja poprawiasz kod to za każdym razem aktualizujesz numery tych linii?

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