Konsolowy Poker - problem z wyświetlaniem piątej karty pierwszego gracza

0

Witam. Piszę pokera na konsolę. Na razie karty powinny być pokazywane w konsoli, ale mam problem z zapisaniem i wyświetleniem piątej karty pierwszego gracza (linia 56.). Tablice są odpowiednich rozmiarów, mimo to wyskakuje mi ArrayIndexOutOfBoundsException. Proszę o podpowiedź.

import java.lang.Math;
import java.util.Scanner;

public class Poker{
    
    public static void main(String[] args){
        
        // pobieranie liczby graczy
        Scanner input = new Scanner(System.in);
        System.out.println("Podaj liczbę graczy: ");
        int liczbaGraczy = input.nextInt();
        
        // tablice z rodzajami i kolorami kart
        String[] rodzajeKart = {"2", "3", "4", "5", "6", "7", "8", "9", "Walet", "Dama", "Król", "As"};
        String[] koloryKart = {"pik", "karo", "trefl", "kier"};
        
        // tablice z kartami graczy
        String[][] graczRodzajeKart = new String[4][liczbaGraczy];
        String[][] graczKoloryKart = new String[4][liczbaGraczy];
        
        // wielkość tablic
        final int LICZBARODZAJOW = 12;
        final int LICZBAKOLOROW = 4;
        
        // zmienne do losowania kart
        int wylosowanyRodzaj, wylosowanyKolor;
        
        // losowanie i wyświetlenie kart graczy
        for(int i = 0; i<liczbaGraczy; i++){
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[0][i] = rodzajeKart[wylosowanyRodzaj-1];
            graczKoloryKart[0][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Pierwsza karta: ", graczRodzajeKart[0][i], graczKoloryKart[0][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[1][i] = rodzajeKart[wylosowanyRodzaj-1];
            graczKoloryKart[1][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Druga karta: ", graczRodzajeKart[1][i], graczKoloryKart[1][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[2][i] = rodzajeKart[wylosowanyRodzaj-1];
            graczKoloryKart[2][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Trzecia karta: ", graczRodzajeKart[2][i], graczKoloryKart[2][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[3][i] = rodzajeKart[wylosowanyRodzaj-1];
            graczKoloryKart[3][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Czwarta karta: ", graczRodzajeKart[3][i], graczKoloryKart[3][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[4][i] = rodzajeKart[wylosowanyRodzaj-1];
            graczKoloryKart[4][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Piąta karta: ", graczRodzajeKart[4][i], graczKoloryKart[4][i]);
            System.out.println();
        }
        
        // do zrobienia
        for (int i=0; i<graczRodzajeKart.length; i++){
            for (int j=1; j<graczRodzajeKart.length-i; j++){
                if (graczRodzajeKart[0][i] != graczRodzajeKart[0][graczRodzajeKart.length-j])
                    System.out.print("");
                else System.out.print("powtórzenie");
                if (graczRodzajeKart[1][i] != graczRodzajeKart[1][graczRodzajeKart.length-j])
                    System.out.print("");
                else System.out.print("powtórzenie");
                if (graczRodzajeKart[2][i] != graczRodzajeKart[2][graczRodzajeKart.length-j])
                    System.out.print("");
                else System.out.print("powtórzenie");
                if (graczRodzajeKart[3][i] != graczRodzajeKart[3][graczRodzajeKart.length-j])
                    System.out.print("");
                else System.out.print("powtórzenie");
                if (graczRodzajeKart[4][i] != graczRodzajeKart[4][graczRodzajeKart.length-j])
                    System.out.print("");
                else System.out.print("powtórzenie");
            }
        }
    }
}
1

String[][] graczRodzajeKart = new String[4][liczbaGraczy];
dozwolone indeksy: graczRodzajeKart[0] ... graczRodzajeKart[3]
graczRodzajeKart.length - zwróci 4, a nie liczbaGraczy

1

Pierwszy błąd jaki musisz poprawić, to przedział z którego losują się zmienne wylosowanyRodzaj i wylosowanyKolor. Kiedy wylosowanyRodzaj będzie równy 0 to np. ta linijka:

graczRodzajeKart[0][i] = rodzajeKart[wylosowanyRodzaj-1];

zwórci ci wyjątek java.lang.ArrayIndexOutOfBoundsException: -1

0

Dzięki za pomoc, poprawiłem i działa. Chciałbym jeszcze dopytać o część odpowiedzialną za sprawdzenie występowania powtórzeń, te pętle nie do końca dobrze działają.

0

Rozumiem, że zadaniem tej pętli jest sprawdzenie czy dany gracz nie ma powtórzonych kart? No to pierwszy błąd jaki widzę to linijka

if (!graczRodzajeKart[0][i].equals(graczRodzajeKart[0][graczRodzajeKart.length-j]))

a dokładnie:

graczRodzajeKart[0][graczRodzajeKart.length-j]

Jeżeli jest 5 rodzajów kart, to graczRodzajeKart[0][4] wyrzuci Ci wyjątek. Ten drugi indeks przecież tyczy się ilości graczy.

dodanie znaczników <code class="java"> i `` - fp

0

goldenka, dlatego w pętli opisałem zmienną j jako j<liczbaGraczy-i.

Poniżej zmodyfikowany kod, nadal niepoprawnie wychwytuje powtarzające się karty. Jak to można poprawić?

import java.lang.Math;
import java.util.Scanner;

public class Poker{
    
    public static void main(String[] args){
        
        // pobieranie liczby graczy
        Scanner input = new Scanner(System.in);
        System.out.println("Podaj liczbę graczy: ");
        int liczbaGraczy = input.nextInt();
        
        // tablice z rodzajami i kolorami kart
        String[] rodzajeKart = {"2", "3", "4", "5", "6", "7", "8", "9", "Walet", "Dama", "Król", "As"};
        String[] koloryKart = {"pik", "karo", "trefl", "kier"};
        
        // tablice z kartami graczy
        String[][] graczRodzajeKart = new String[5][liczbaGraczy];
        String[][] graczKoloryKart = new String[5][liczbaGraczy];
        
        // wielkość tablic
        final int LICZBARODZAJOW = 12;
        final int LICZBAKOLOROW = 4;
        
        // zmienne do losowania kart
        int wylosowanyRodzaj, wylosowanyKolor;
        
        // losowanie i wyświetlenie kart graczy
        for(int i = 0; i<liczbaGraczy; i++){
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[0][i] = rodzajeKart[wylosowanyRodzaj];
            graczKoloryKart[0][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Pierwsza karta: ", graczRodzajeKart[0][i], graczKoloryKart[0][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[1][i] = rodzajeKart[wylosowanyRodzaj];
            graczKoloryKart[1][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Druga karta: ", graczRodzajeKart[1][i], graczKoloryKart[1][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[2][i] = rodzajeKart[wylosowanyRodzaj];
            graczKoloryKart[2][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Trzecia karta: ", graczRodzajeKart[2][i], graczKoloryKart[2][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[3][i] = rodzajeKart[wylosowanyRodzaj];
            graczKoloryKart[3][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Czwarta karta: ", graczRodzajeKart[3][i], graczKoloryKart[3][i]);
            
            wylosowanyRodzaj = (int)(Math.random()*LICZBARODZAJOW);
            wylosowanyKolor = (int)(Math.random()*LICZBAKOLOROW);
            graczRodzajeKart[4][i] = rodzajeKart[wylosowanyRodzaj];
            graczKoloryKart[4][i] = koloryKart[wylosowanyKolor];
            System.out.printf("%-18s %-8s %-8s %n","Piąta karta: ", graczRodzajeKart[4][i], graczKoloryKart[4][i]);
            System.out.println();
        }
        
        for (int i=0; i<liczbaGraczy; i++){
            for (int j=1; j<liczbaGraczy-i; j++){
                if (!graczRodzajeKart[0][i].equals(graczRodzajeKart[0][liczbaGraczy-j]))
                    System.out.print("");
                else System.out.println("powtórzenie1");
                if (!graczRodzajeKart[1][i].equals(graczRodzajeKart[1][liczbaGraczy-j]))
                    System.out.print("");
                else System.out.println("powtórzenie2");
                if (!graczRodzajeKart[2][i].equals(graczRodzajeKart[2][liczbaGraczy-j]))
                    System.out.print("");
                else System.out.println("powtórzenie3");
                if (!graczRodzajeKart[3][i].equals(graczRodzajeKart[3][liczbaGraczy-j]))
                    System.out.print("");
                else System.out.println("powtórzenie4");
                if (!graczRodzajeKart[4][i].equals(graczRodzajeKart[4][liczbaGraczy-j]))
                    System.out.print("");
                else System.out.println("powtórzenie5");
            }
        }
    }
}

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