Gyakorlati alapok III.

Collection példakód - Römikártya keverése és leosztása


Ebben a fejezetben egy römikártya keverésén és első leosztásán keresztül nézzük meg egy ArrayList és a Collection.shuffle() összekeverő függvény és persze több más komponens működését.

 

Emlékeztetőül: a römikártyának 4 db úgynevezett színe van (kör, káró, treff, pikk) és 13 db úgynevezett rangja (ász, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Jani, Királynő, Király, utóbbi hármat nevezik Jumbó, Dáma, Királynak is). Ez összesen 52 db lap. A jelen projekten belül a Jolly Joker nevű lapokkal nem foglalkozunk.

 

Feladat: implementáljunk egy römikártya-alkotó és összekeverő alkalmazást, amelyik elvégzi az első kör leosztását is. Ehhez szükségünk van még a következőkre:

A römikártya megalkotásához elég 2 db String típusú tömb, amelyeket a römikártya standard elemeivel töltünk fel.

Ezután mindezt egy egybeágyazott for ciklusszerkezeten keresztül belevezetjük egy String típusú tömblistába (ArrayList). A "kártyacsomag" ekkor még rendezett, teljesen rendezetlenné akkor válik, mihelyt ráeresztjük a Collection.shuffle() káoszosító függvényt.

Az eredményt kinyomtatjuk a konzolra.

A következő algoritmus -szintén egy egybeágyazott for ciklusszerkezeten keresztül-, virtuálisan a csomag tetejéről indulva kioszt minden játékosnak 5 lapot és ezt kiírja a konzolra.

Bónusz algoritmusként pedig kinyomtatjuk a lent maradt kártyacsomag tartalmát.

 

Nézzük meg a futtatható Java-kódot:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.*;

public class Main {

public static void main(String[] args) {
    int szemelyekSzama = 4;
    int kartyaSzamEgyKezben = 5;
    int count = 0;
    String[] kartyaSzin = new String[]{"Kor", "Karo", "Treff", "Pikk"};
    String[] kartyaRang = new String[]{"asz","2","3","4","5","6","7","8","9","10","Jani","Kiralyno","Kiraly"};
    List<String> kartyak = new ArrayList<String>();
    for(int i = 0; i < kartyaSzin.length; i++) {
        for(int j = 0; j < kartyaRang.length; j++) {
            kartyak.add(kartyaSzin[i] + " " + kartyaRang[j]);
        }
    }
    Collections.shuffle(kartyak);
    System.out.println("Az összes kártya keverés után (52 db):");
    for(String elem : kartyak) {
        System.out.println(elem);
    }

    System.out.println("\nLeosztott lapok (4 x 5 = 20 db):");
    for(int i = 0; i < kartyaSzamEgyKezben; i++) {
        System.out.println("\n" + (i + 1) + ". korleosztas:");
            for(int j = 0; j < szemelyekSzama; j++) {
                System.out.println((j + 1) + ". jatekos - " + kartyak.get(count));
                count++;
            }
    }
    System.out.println("\nLent marad " + kartyak.get(count) + "-tol felfele:");
    for(int i = count; i < kartyak.size(); i++) {
        System.out.println(kartyak.get(count));
        count++;
        }
    }
}

 

Végeredmény:

Az összes kártya keverés után (52 db):
Karo 10
Karo 3
Karo asz
Karo Kiraly
Karo 8
Treff 5
Kor 10
Karo 5
Treff Kiraly
Karo 7
Pikk 4
Pikk 10
Pikk Kiralyno
Kor Kiraly
Treff Jani
Treff 4
Pikk Kiraly
Treff 3
Pikk 5
Kor 6
Karo 2
Treff asz
Pikk 7
Pikk 3
Kor Jani
Karo 4
Pikk 9
Pikk 2
Kor 8
Treff 8
Karo Kiralyno
Pikk 8
Pikk Jani
Karo 9
Kor 5
Kor 7
Kor 9
Kor asz
Kor 3
Pikk asz
Treff 7
Treff 2
Treff 10
Kor Kiralyno
Pikk 6
Karo 6
Kor 2
Karo Jani
Treff 6
Kor 4
Treff Kiralyno
Treff 9

Leosztott lapok (4 x 5 = 20 db):

1. korleosztas:
1. jatekos - Karo 10
2. jatekos - Karo 3
3. jatekos - Karo asz
4. jatekos - Karo Kiraly

2. korleosztas:
1. jatekos - Karo 8
2. jatekos - Treff 5
3. jatekos - Kor 10
4. jatekos - Karo 5

3. korleosztas:
1. jatekos - Treff Kiraly
2. jatekos - Karo 7
3. jatekos - Pikk 4
4. jatekos - Pikk 10

4. korleosztas:
1. jatekos - Pikk Kiralyno
2. jatekos - Kor Kiraly
3. jatekos - Treff Jani
4. jatekos - Treff 4

5. korleosztas:
1. jatekos - Pikk Kiraly
2. jatekos - Treff 3
3. jatekos - Pikk 5
4. jatekos - Kor 6

Lent marad Karo 2-tol felfele:
Karo 2
Treff asz
Pikk 7
Pikk 3
Kor Jani
Karo 4
Pikk 9
Pikk 2
Kor 8
Treff 8
Karo Kiralyno
Pikk 8
Pikk Jani
Karo 9
Kor 5
Kor 7
Kor 9
Kor asz
Kor 3
Pikk asz
Treff 7
Treff 2
Treff 10
Kor Kiralyno
Pikk 6
Karo 6
Kor 2
Karo Jani
Treff 6
Kor 4
Treff Kiralyno
Treff 9

 

További, alább már nem kódolt lehetőség lehet az aktuális játékosok számának és az 1 kézben lévő lapok számának konzolról való bekérése; emiatt nem kell a kódot nagyon átszabnunk.

 

Azonban kissé más a helyzet, ha a kiosztott kártyákat játékosok szerint el is szeretnénk menteni (hiszen vegyük észre, hogy fentebb csak szekvenciálisan írtuk ki a kártyákat, azaz aktuális körleosztás alapján). Az ilyen módon átszabott kód végeredménye a következő lesz (részlet):

 

Leosztott lapok (4 x 5 = 20 db):
1. jatekos: [Karo 7, Pikk 2, Pikk asz, Karo 9, Kor asz]
2. jatekos: [Karo 2, Kor 6, Kor 7, Pikk Kiralyno, Pikk Jani]
3. jatekos: [Pikk 8, Pikk 3, Treff 7, Treff Kiralyno, Treff 4]
4. jatekos: [Kor Kiraly, Treff asz, Treff 9, Treff Jani, Kor 5]

 

Nézzük meg az átszabott Java-kódot:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.*;

public class Main {

public static void main(String[] args) {
    int szemelyekSzama = 4;
    int kartyaSzamEgyKezben = 5;
    int count = 0;
    String[] kartyaSzin = new String[]{"Kor", "Karo", "Treff", "Pikk"};
    String[] kartyaRang = new String[]{"asz","2","3","4","5","6","7","8","9","10","Jani","Kiralyno","Kiraly"};
    List<String> kartyak = new ArrayList<String>();
    for(int i = 0; i < kartyaSzin.length; i++) {
        for(int j = 0; j < kartyaRang.length; j++) {
            kartyak.add(kartyaSzin[i] + " " + kartyaRang[j]);
        }
    }
    Collections.shuffle(kartyak);
    System.out.println("Az összes kártya keverés után (52 db):");
    for(String elem : kartyak) {
        System.out.println(elem);
    }
    List<String> jatekos1 = new ArrayList<String>();
    List<String> jatekos2 = new ArrayList<String>();
    List<String> jatekos3 = new ArrayList<String>();
    List<String> jatekos4 = new ArrayList<String>();

    for(int i = 0; i < kartyaSzamEgyKezben; i++) {
        jatekos1.add(kartyak.get(count));
        count++;
        jatekos2.add(kartyak.get(count));
        count++;
        jatekos3.add(kartyak.get(count));
        count++;
        jatekos4.add(kartyak.get(count));
        count++;
    }

    System.out.println("\nLeosztott lapok (4 x 5 = 20 db):");
    System.out.println("1. jatekos: " + jatekos1);
    System.out.println("2. jatekos: " + jatekos2);
    System.out.println("3. jatekos: " + jatekos3);
    System.out.println("4. jatekos: " + jatekos4);

    System.out.println("\nLent marad " + kartyak.get(count) + "-tol felfele:");
    for(int i = count; i < kartyak.size(); i++) {
        System.out.println(kartyak.get(count));
        count++;
        }
    }
}

 

Végeredmény:

Az összes kártya keverés után (52 db):
Karo 7
Karo 2
Pikk 8
Kor Kiraly
Pikk 2
Kor 6
Pikk 3
Treff asz
Pikk asz
Kor 7
Treff 7
Treff 9
Karo 9
Pikk Kiralyno
Treff Kiralyno
Treff Jani
Kor asz
Pikk Jani
Treff 4
Kor 5
Pikk 10
Kor Jani
Kor 3
Kor 4
Karo 4
Treff 3
Pikk 9
Karo asz
Kor 9
Kor 10
Treff 8
Kor 8
Pikk Kiraly
Treff 2
Pikk 5
Pikk 6
Karo 3
Karo Kiraly
Karo Kiralyno
Treff 5
Karo Jani
Pikk 4
Karo 8
Karo 5
Treff Kiraly
Kor Kiralyno
Karo 10
Treff 10
Pikk 7
Karo 6
Kor 2
Treff 6

Leosztott lapok (4 x 5 = 20 db):
1. jatekos: [Karo 7, Pikk 2, Pikk asz, Karo 9, Kor asz]
2. jatekos: [Karo 2, Kor 6, Kor 7, Pikk Kiralyno, Pikk Jani]
3. jatekos: [Pikk 8, Pikk 3, Treff 7, Treff Kiralyno, Treff 4]
4. jatekos: [Kor Kiraly, Treff asz, Treff 9, Treff Jani, Kor 5]

Lent marad Pikk 10-tol felfele:
Pikk 10
Kor Jani
Kor 3
Kor 4
Karo 4
Treff 3
Pikk 9
Karo asz
Kor 9
Kor 10
Treff 8
Kor 8
Pikk Kiraly
Treff 2
Pikk 5
Pikk 6
Karo 3
Karo Kiraly
Karo Kiralyno
Treff 5
Karo Jani
Pikk 4
Karo 8
Karo 5
Treff Kiraly
Kor Kiralyno
Karo 10
Treff 10
Pikk 7
Karo 6
Kor 2
Treff 6