0
votes

I try to implement the card game "Skat" in Java

The Rules:

There are 32 cards. Each card exists only once in the game.

The colors are: Clubs, Spades, Hearts, Diamonds

The values are: Ace, King, Queen, Jack, Ten, Nine, Eight, Seven

Those cards are shuffled. There are three players

First round: each player is given 3 cards. Then 2 cards are put into the Skat.

Second round: each player is given another 4 cards.

Third round: each player is given another 3 cards.

Desired output: the cards of each player revealed (every card should exist once)

My output: Diamonds Seven (32 times)

My code:

Class Card:

package skat;

public class Card
{
    private static String color, value;

    public static String getColor()
    {
        return color;
    }
    public static void setColor(String color)
    {
        Card.color = color;
    }
    public static String getValue()
    {
        return value;
    }
    public static void setValue(String value)
    {
        Card.value = value;
    } 

    @Override
    public String toString()
    {
        return color + " " + value;
    }
}

Class Main:

package skat;

import java.util.Random;

public class Main
{
    public static void main(String[] args)
    {
        Card[] game = new Card[32];

        genCardDeck(game);
        shuffleCardDeck(game);

        Card[] player1 = new Card[10];
        Card[] player2 = new Card[10];
        Card[] player3 = new Card[10];
        Card[] skat = new Card[2];

        dealCards(game,player1,player2,player3,skat);
        printCardDeck(game);
    }
    public static void genCardDeck(Card[] deck) //Generate the deck
    {
        final String colors[] = {"Clubs","Spades","Hearts","Diamonds"};
        final String values[] = {"Ace","King","Queen","Jack","Ten","Nine","Eight","Seven"};

        int i = 0;
        for (String f : colors)
        {
            for (String w : values)
            {
                deck[i] = new Card();
                deck[i].setColor(f);
                deck[i].setValues(w);
                i++;
            }
        }
    }
    public static void printCardDeck(Card[] deck) //Print out the deck
    {
        for (Card c : deck)
        {
            System.out.println(c);
        } 

    }
    public static void shuffleCardDeck(Card[] deck) //Shuffle the card deck
    {
        Random rand = new Random();
        for (int i = 0; i < deck.length; i++) { 
            int randomNum = rand.nextInt(deck.length); 
            Card temp = deck[i]; 
            deck[i] = deck[randomNum]; 
            deck[randomNum] = temp;
        }
    }
    public static void dealCards(Card[] deck, Card[] player1,
    Card[] player2, Card[] player3, Card[] skat) //Deal the cards
    {
        //Round 1
        int i;
        for(i=0;i<9;i++)
        {
            if(i<3)
                player1[i]=deck[i]; //Player 1
            else if(i<6)
                player2[i-3]=deck[i]; //Player 2
            else
                player3[i-6]=deck[i]; //Player 3 
        }
        for(i=0;i<2;i++)
        {
            skat[i]=deck[i]; //Skat
        }

        //Round 2
        for(i=0;i<12;i++)
        {
            if(i<4)
                player1[i]=deck[i+3]; //Player 1
            else if(i<8)
                player2[i-4]=deck[i+3]; //Player 2
            else
                player3[i-8]=deck[i+3]; //Player 3 
        }

        //Round 3
        for(i=0;i<9;i++)
        {
            if(i<3)
                player1[i]=deck[i+7]; //Player 1
            else if(i<6)
                player2[i-3]=deck[i+7]; //Player 2
            else
                player3[i-6]=deck[i+7]; //Player 3 
        }
    }
}
1
fyi you did not translate everything to english. Check the dealCards call in the main method. And your problem could be found if you debug the code. Knowing how to debug is a valuable skill for a developer; the problem is in shuffleCardDeck method. - KarelG
Why are color and value static in Card? Do you only have 1 color and value per JVM? - Jeroen Steenbeeke
You might want to check out JSkat or XSkat on github which provide Java playable implementations for Skat. - jmizv

1 Answers

0
votes

I fixed it. Now it works as intended.

Fixed Code:

Class Card:

package skat;

public class Card
{
    private String color, value;

    public String getColor()
    {
        return color;
    }
    public void setColor(String color)
    {
        this.color = color;
    }
    public String getValue()
    {
        return value;
    }
    public void setValue(String value)
    {
        this.value = value;
    } 

    @Override
    public String toString()
    {
        return color + " " + value;
    }
}

Class Main:

package skat;

import java.util.Random;

public class Main
{
    public static void main(String[] args)
    {
        Card[] game = new Card[32];

        genCardDeck(game);
        shuffleCardDeck(game);

        Card[] player1 = new Card[10];
        Card[] player2 = new Card[10];
        Card[] player3 = new Card[10];
        Card[] skat = new Card[2];

        dealCards(game,player1,player2,player3,skat);
        printCardDeck(game,player1,player2,player3,skat);
    }
    public static void genCardDeck(Card[] deck) //Generate the deck
    {
        final String colors[] = {"Clubs","Spades","Hearts","Diamonds"};
        final String values[] = {"Ace","King","Queen","Jack","Ten","Nine","Eight","Seven"};

        int i = 0;
        for (String f : colors)
        {
            for (String w : values)
            {
                deck[i] = new Card();
                deck[i].setColor(f);
                deck[i].setValues(w);
                i++;
            }
        }
    }
    public static void printCardDeck(Card[] deck, Card[] player1,
    Card[] player2, Card[] player3, Card[] skat) //Print out the deck
    {
        System.out.print("Player 1: "); //Print player 1
        for (Card p1 : player1)
        {
            System.out.print(p1 + ", ");
        }
        System.out.println("\n");

        System.out.print("Player 2: "); //Print player 2
        for (Card p2 : player2)
        {
            System.out.print(p2 + ", ");
        }
        System.out.println("\n");

        System.out.print("Player 3: "); //Print player 3
        for (Card p3 : player3)
        {
            System.out.print(p3 + ", ");
        }
        System.out.println("\n");

        System.out.print("Skat: "); //Print Skat
        for (Card sk : skat)
        {
            System.out.print(sk + ", ");
        }
    }
    public static void shuffleCardDeck(Card[] deck) //Shuffle the card deck
    {
        Random rand = new Random();
        for (int i = 0; i < deck.length; i++) { 
            int randomNum = rand.nextInt(deck.length); 
            Card temp = deck[i]; 
            deck[i] = deck[randomNum]; 
            deck[randomNum] = temp;
        }
    }
    public static void dealCards(Card[] deck, Card[] player1,
    Card[] player2, Card[] player3, Card[] skat) //Deal the cards
    {
        //Round 1
        int i;
        for(i=0;i<9;i++)
        {
            if(i<3)
                player1[i]=deck[i]; //Player 1
            else if(i<6)
                player2[i-3]=deck[i]; //Player 2
            else
                player3[i-6]=deck[i]; //Player 3 
        }
        for(i=9;i<11;i++)
        {
            skat[i-9]=deck[i]; //Skat
        }

        //Round 2
        for(i=11;i<23;i++)
        {
            if(i<15)
                player1[i-8]=deck[i]; //Player 1
            else if(i<19)
                player2[i-12]=deck[i]; //Player 2
            else
                player3[i-16]=deck[i]; //Player 3 
        }

        //Round 3
        for(i=23;i<32;i++)
        {
            if(i<26)
                player1[i-16]=deck[i]; //Player 1
            else if(i<29)
                player2[i-19]=deck[i]; //Player 2
            else
                player3[i-22]=deck[i]; //Player 3 
        }
    }
}