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


(Drakkainen1991) #1

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

            }

        }

([alex]) #2

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.


(Drakkainen1991) #3
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.


([alex]) #4

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


(Drakkainen1991) #5

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


([alex]) #6

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.


(Drakkainen1991) #7

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.


([alex]) #8
  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"};

(Drakkainen1991) #9

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:


([alex]) #10

"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.


(Airborn) #11

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


(Drakkainen1991) #12

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:


([alex]) #13
         while(k>c)

(Drakkainen1991) #14

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. :]


([alex]) #15

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


(Drakkainen1991) #16

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