[Java]Program zaliczeniowy. Pomoc przy kilku błędach

Witam.

Mam do zrobienia taki projekt. Jak na razie zrobiłem tyle. Mógłby mi ktoś wytłumaczyć dlaczego przez tą linijkę po naciśnięciu przycisku program “zamarza”?

for(j=0;j<=51;j++)

        {

            miejsce2=obiekt.nextInt(51);

            talia_po[miejsce2]=talia_przed[j];

            bla=0;

            for(k=0;k<=j;k++)

            {

                if(talia_przed[k].equals(talia_po[miejsce2]))

                {

                    [u][b]bla=1;[/b][/u]

                    break;

                }

                if(bla==1)

                {

                    break;

                }

            }

            if(bla==1)

            {

                j--;

            }

        }

Zawieszenie się programu raczej nie w tym fragmencie.

Wg mnie źle do tego podchodzisz.

Najpierw wylosuj talie, oznaczasz karty numerkami 0…51

NrKarty/13 - to kolor np: 0-kier, 1-karo, 2-trefle, 3-piki

NrKarty%13 - to karta np: 0-2, 1-3, … 8-10, 9-J, 10-Q, 11-K, 12-A

wypełniasz Talia[52] liczbami 0…51 po kolei.

Losujesz liczbę X - 0…51 i wymieniasz wartości Talia[X] z Talia[0]

Potem losujesz liczbę X - 0…50 i wymieniasz wartości Talia[X] z Talia[1]

itd.

Jak masz wylosowaną talie to pierwsze 13 kart dajesz pierwszemu graczowi, kolejne 13 następnemu itd.

if(j==0)

                        {

                            pom2=piki[i][k];

                            if(pom2%13)

                            {


                            }

                        }

Dlaczego przy

pom2%13

wyświetla mi się:

incopatibile types

found: int

required: boolean

O co tu chodzi? :confused:

Całość: tutaj.

if(pom2%13!=0) // w javie brak automatycznej konwersji int -> boolean

Ale głupi błąd. :oops:

Tylko teraz mam jakiś inny. Już wcześniej miałem tego typu i obszedłem go po prostu nie używając pętli ale wydaje mi się, że jak się tą pętle poprawi to będzie działać poprawnie.

Projekt do ściągnięcia

Wklej kod, to się popatrzy. Ale prościej wkleić treść błędu oraz fragment kodu wokół miejsca wystąpienia.

Z rapiadshare nie łatwo się ściąga, właściwie mi nigdy się to nie udało, możliwe że u innych ten sam problem.

Sądziłem, że z rs’em nie będzie problemu. :stuck_out_tongue:

//Tasowanie kart

        Random obiekt=new Random();

        int i,j,k,pom2,miejsce;

        boolean jest=false;

        double pom=0.0;



    //Przypisywanie wartości


        for(i=0;i<=51;i++)

        {

            talia_przed[i]=i;

        }

        for(i=0;i<=51;i++)

        {

            miejsce=obiekt.nextInt(51);

            talia_po[i]=talia_przed[miejsce];

            jest=false;

            for(j=0;j<=51;j++)

            {               

                if(talia_przed[miejsce]==talia_po[j])

                {

                    jest=true;

                    break;

                }

            }



        }


        //Rozdawanie kart

        for(i=0;i<=3;i++)

        {

            for(j=0;j<=12;j++)

            {

                pom=i+1/13;

                if(pom==0.0)

                {

                    piki[i][j]=talia_po[i*j];

                }

                if(pom==1.0)

                {

                    trefle[i][j]=talia_po[i*j];

                }

                if(pom==2.0)

                {

                    kiery[i][j]=talia_po[i*j];

                }

                if(pom==3.0)

                {

                    kara[i][j]=talia_po[i*j];

                }

            }

        }

        west_1=" "; west_2=" "; west_3=" "; west_4=" ";

        south_1=" "; south_2=" "; south_3=" "; south_4=" ";

        north_1=" "; north_2=" "; north_3=" "; north_4=" ";

        east_1=" "; east_2=" "; east_3=" "; east_4=" ";

        for(i=0;i<=3;i++)//gracze

        {

            for(j=0;j<=3;j++)//kolory

            {

                for(k=0;k<=12;k++)//wartości kart

                {

                    if(i==0)//gracz 1

                    {

                        if(j==0)//pierwszy kolor

                        {

                            pom2=piki[i][k];

                            if(pom2%13==0) west_1=west_1+" "+"A";

                            if(pom2%13==1) west_1=west_1+" "+"K";

                            if(pom2%13==2) west_1=west_1+" "+"D";

                            if(pom2%13==3) west_1=west_1+" "+"W";

                            if(pom2%13==4) west_1=west_1+" "+"10";

                            if(pom2%13==5) west_1=west_1+" "+"9";

                            if(pom2%13==6) west_1=west_1+" "+"8";

                            if(pom2%13==7) west_1=west_1+" "+"7";

                            if(pom2%13==8) west_1=west_1+" "+"6";                            

                            if(pom2%13==9) west_1=west_1+" "+"5";                            

                            if(pom2%13==10) west_1=west_1+" "+"4";                            

                            if(pom2%13==11) west_1=west_1+" "+"3";

                            if(pom2%13==12) west_1=west_1+" "+"2";

                        }

                        if(j==1)//drugi kolor

                        {

                            pom2=piki[i][k];

                            if(pom2%13==0) west_2=west_2+" "+"A";

                            if(pom2%13==1) west_2=west_2+" "+"K";

                            if(pom2%13==2) west_2=west_2+" "+"D";

                            if(pom2%13==3) west_2=west_2+" "+"W";

                            if(pom2%13==4) west_2=west_2+" "+"10";                            

                            if(pom2%13==5) west_2=west_2+" "+"9";

                            if(pom2%13==6) west_2=west_2+" "+"8";

                            if(pom2%13==7) west_2=west_2+" "+"7";

                            if(pom2%13==8) west_2=west_2+" "+"6";                            

                            if(pom2%13==9) west_2=west_2+" "+"5";                            

                            if(pom2%13==10) west_2=west_2+" "+"4";                            

                            if(pom2%13==11) west_2=west_2+" "+"3";

                            if(pom2%13==12) west_2=west_2+" "+"2";

                        }

                        if(j==0)//trzeci kolor

                        {

                            pom2=piki[i][k];

                            if(pom2%13==0) west_3=west_3+" "+"A";

                            if(pom2%13==1) west_3=west_3+" "+"K";

                            if(pom2%13==2) west_3=west_3+" "+"D";

                            if(pom2%13==3) west_3=west_3+" "+"W";

                            if(pom2%13==4) west_3=west_3+" "+"10";                            

                            if(pom2%13==5) west_3=west_3+" "+"9";

                            if(pom2%13==6) west_3=west_3+" "+"8";

                            if(pom2%13==7) west_3=west_3+" "+"7";

                            if(pom2%13==8) west_3=west_3+" "+"6";                            

                            if(pom2%13==9) west_3=west_3+" "+"5";                            

                            if(pom2%13==10) west_3=west_3+" "+"4";                            

                            if(pom2%13==11) west_3=west_3+" "+"3";

                            if(pom2%13==12) west_3=west_3+" "+"2";

                        }

                        if(j==1)//czwarty kolor

                        {

                            pom2=piki[i][k];

                            if(pom2%13==0) west_4=west_4+" "+"A";

                            if(pom2%13==1) west_4=west_4+" "+"K";

                            if(pom2%13==2) west_4=west_4+" "+"D";

                            if(pom2%13==3) west_4=west_4+" "+"W";

                            if(pom2%13==4) west_4=west_4+" "+"10";                            

                            if(pom2%13==5) west_4=west_4+" "+"9";

                            if(pom2%13==6) west_4=west_4+" "+"8";

                            if(pom2%13==7) west_4=west_4+" "+"7";

                            if(pom2%13==8) west_4=west_4+" "+"6";                            

                            if(pom2%13==9) west_4=west_4+" "+"5";                            

                            if(pom2%13==10) west_4=west_4+" "+"4";                            

                            if(pom2%13==11) west_4=west_4+" "+"3";

                            if(pom2%13==12) west_4=west_4+" "+"2";

                        }


                    }

                }

            }

        }

Treści błędu nie ma bo problem polega na tym, że jak wylosuje jakąś kartę to wpisuje w 4 okna wszędzie jedną i tą samą kartę. Wkleiłem całość, dalej jest tylko umieszczanie w odpowiednich polach tekstu.

Nie mam pojęcia gdzie dokładnie tkwi problem, dlatego całość.

Projekt: Speedy Share, Rapidshare, Megaupload, mój hosting-bez limitów.

  1. zmień losowanie na krótszy i efektywniejszy, wg algorytmu który podałem wyżej.

  2. Ponieważ przy rozdaniu pobierasz w sposób talia_po[i\*j] to na przykład kartę z pozycji 0 pobierzesz 15 razy a kart z numerami 37…51 nie pobierzesz nigdy.

       java.util.Random rnd=new java.util.Random();      char kolory[]={'\u2660','\u2663','\u2666','\u2665'}; //piki,trefle,karo,kier      String gracze[]={"North","East","South","West"};      String karty[]={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

Dałoby radę jakoś łatwiej to napisać? Szczerze powiedziawszy prawie nic z tego nie rozumiem. :confused:

Jak wklejam całość do nowej klasy to wyświetla się kilka błędów i nawet nie mam jak sprawdzić co ten kod czyni. :frowning:

java.util.Random rnd=new java.util.Random();

Domyślam się, że to jakaś deklaracja zmiennej, która będzie randomizowana (odpowniednik “randomize;” z - chyba - pascala). Jeżeli to jest to czy nie może być po prostu to czego ja użyłem?

if((p=(byte)rnd.nextInt(52-i))!=i)

Czarna magia. :confused:

for(i=0;i<52;i+=13) java.util.Arrays.sort(talia,0+i,13+i);

Jw. Wydaje mi się, że to jakaś funkcja wbudowana, która automatycznie jakoś sortuje. Dałoby rade posortować bez używania funkcji? Albo chociaż objaśnić jak owa funkcja działa?

p=(byte)(i*13); // karty i-go gracza od "p" do "p+12"

         k=4; // za ostatnim kolorem

…czarnej magii ciąg dalszy.

(byte)

Co to w ogóle jest? :confused: Konwersja na typ byte? Ehh… :?

W ogóle to wolałbym abyś (w razie możliwości/chęci) poprawił mój kod aniżeli pisał swój, gdyż później będę musiał nauczycielowi tłumaczyć co i jak zrobiłem, a swój kod rozumiem. :confused:

“rnd” jest odpowiednikiem twojego “obiekt” - zobacz gdzie go zadeklarowałeś.

if((p=(byte)(i+rnd.nextInt(52-i)))!=i)

to to samo co:

p=(byte)(i+rnd.nextInt(52-i)); // czyli oblicz “i+rnd.nextInt(52-i)” skonwertuj na “byte” przypisz do “p”

if(p!=i)

Jak działa funkcja java.util.Arrays.sort() znajdziesz w dokumentacji javy.

byte - to “taki int” tylko z mniejszym zakresem, (byte)wyrażenie - konwersja wyrażenia na typ byte

możesz zmienić deklaracje z:

byte talia[]=new byte[52];

byte i,k,p,t,c;

na:

int talia[]=new byte[52];

int i,k,p,t,c;

i wszędzie powywalać (byte)

Twój program nie da się naprawić - prawie każda instrukcja beznadziejnie bezsensowna.

Drakkainen , proszę poprawić tytuł tematu na konkretny, mówiący dokładniej o problemie. W przeciwnym razie temat zostanie przeniesiony do kosza.

Trochę pozmieniałem Twój kod i teraz mi program znowu zamarza. Wiesz może dlaczego? Pętelek nie ruszałem.

java.util.Random rnd=new java.util.Random();

      char kolory[]={'0','1','2','3'}; //piki,trefle,kiery,kara

      String gracze[]={"North","West","South","East"};

      String karty[]={"2","3","4","5","6","7","8","9","10","W","D","K","A"};


      int talia[]=new int[52];

      int i,k,p,t,c;


    // posortowana talia

      for(i=0;i<52;++i)

      talia[i]=i;

    // losujemy rozdanie

      for(i=0;i<51;++i)

      {

         if((p=(i+rnd.nextInt(52-i)))!=i)

         {

            t=talia[i];

            talia[i]=talia[p];

            talia[p]=t;

         }

      }

    // sortowanie dla każdego gracza

      for(i=0;i<52;i+=13)

      java.util.Arrays.sort(talia,0+i,13+i);

      for(i=0;i<4;++i) // po graczam

      {

         //System.out.print("Gracz: "+gracze[i]);

         p=i*13; // karty i-go gracza od "p" do "p+12"

         k=4; // za ostatnim kolorem

         for(t=p+12;t>=p;--t) // po kartam gracza, od końca aby AS był pierwszym

         {

            c=talia[t]/13; // kolor kolejnej karty

            while(k>c) //System.out.print("\n"+kolory[--k]); // drukuj kolory

            //System.out.print(" "+karty[talia[t]%13]);

            if(gracze[i].equals("North"))

            {

                if(kolory[--k]==0) north_1=" "+karty[talia[t]%13];

                if(kolory[--k]==1) north_2=" "+karty[talia[t]%13];

                if(kolory[--k]==4) north_3=" "+karty[talia[t]%13];

                if(kolory[--k]==3) north_4=" "+karty[talia[t]%13];

            }

            if(gracze[i].equals("West"))

            {

                if(kolory[--k]==0) west_1=" "+karty[talia[t]%13];

                if(kolory[--k]==1) west_2=" "+karty[talia[t]%13];

                if(kolory[--k]==4) west_3=" "+karty[talia[t]%13];

                if(kolory[--k]==3) west_4=" "+karty[talia[t]%13];

            }

            if(gracze[i].equals("South"))

            {

                if(kolory[--k]==0) south_1=" "+karty[talia[t]%13];

                if(kolory[--k]==1) south_2=" "+karty[talia[t]%13];

                if(kolory[--k]==4) south_3=" "+karty[talia[t]%13];

                if(kolory[--k]==3) south_4=" "+karty[talia[t]%13];

            }

            if(gracze[i].equals("East"))

            {

                if(kolory[--k]==0) east_1=" "+karty[talia[t]%13];

                if(kolory[--k]==1) east_1=" "+karty[talia[t]%13];

                if(kolory[--k]==4) east_1=" "+karty[talia[t]%13];

                if(kolory[--k]==3) east_1=" "+karty[talia[t]%13];

            }

         }

Bezlitosny. :stuck_out_tongue:

Teraz może być? :confused:

         while(k>c)

Działa. Dziękuję za pomoc. Zauważyłem, że “praca” ze mną nie była dla Ciebie zachwycająca i dziwię się, że pomagałeś do końca. Tym bardziej dziękuję za poświęcony czas i włożoną w to energię.

Pozdrawiam. :]

Może dla tego że na ekranie ci się nie mieszczą.

Nie… Wystarczyło, że wcisnąłem “Clean and Build Project” i zadziałało. Przeczytaj post wyżej. I jeszcze raz dziękuję. :]