Jeu de blackjack en java

scoubida42
Jeu de blackjack en java

Salut à tous,

Dans le cadre d'un cours d'informatique que je suis dans le cadre de mes études, je dois réaliser un jeu de blackjack. ayant commencé le java, il y a moins d'un mois, je galère, mais je m'en sors pas trop mal, ça va!! Comme logiciel, j'utilise Netbeans.

Pour ce jeu de blackjack, j'ai déjà un ficheir JPaneForm nommé blackjack.java mais ce fichier ne me sert à rien pour l'instant!! j'ai ensuite créé une class card dans un fichier card.java dont voici le code :

public class card {
    int colorcard;
    int valuecard;
 
    //*****************************************
    // Constructor
    //*****************************************
    public card(int color, int value) {
       valuecard = value;
       colorcard = color;
    }
 
      public int getColor() {
            // Return the int that codes for this card's suit.
        return colorcard;
    }
 
    public int getValue() {
            // Return the int that codes for this card's value.
        return valuecard;
    }
}
Code :

Ensuite, j'ai créé une class deck : (deck signifie jeu de carte en anglais!!)

public class deck {
    card[] carddeck= new card[52];
 
     public deck()
     {
         int color=0;
         int value=0;
         int cardcreated=0;
         for(color=0;color<4;color++)
             for(value=1;value<13;value++)
             {
                //if (value > 10)
                //    value = 10;   // For a Jack, Queen, or King.
                carddeck[cardcreated]=new card(value,color);
                cardcreated++;
                //System.out.println(carddeck[cardcreated]);
                //JOptionPane.showMessageDialog(null, carddeck[cardcreated]);
             }
     }         
}

Mon probleme maintenant, et il y en a plusieurs!! j'ai besoin d'aide pour afficher mon jeu de carte mais j'ai essayé plusieurs méthodes mais aucune ne marche!
J'aimerais maintenant créé une méthode dans ma classe deck afin de pouvoir choisir une carte au hasard mais ne jamais tomber sur la même carte 2 fois!!
mon souci, c'est que je ne sais pas par où commencé!!si quelqu'un pouvait juste me donner quelques pistes pour me guider, ce serait vraiment super sympa!

merci d'avance à tous ceux qui voudront bien me filer un coup de main!!!!!

fredericmazue
Re: Jeu de blackjack en java

Bonjour,

Quote:
J'aimerais maintenant créé une méthode dans ma classe deck afin de pouvoir choisir une carte au hasard mais ne jamais tomber sur la même carte 2 fois!!

Si au lieu de mettre tes cartes dans un tableau tu les mets dans un vector, il te suffit à chaque fois de tirer le premier élément. Comme en vrai lorsque la première carte du sabot est tirée.
Une fois la carte tirée, tu la supprimes du vector. C'est tout simple. Le vector se vide au fur et à mesure et tu ne peux pas tirer deux fois la même carte.
Je crois que la plus grosse difficulté est de mélanger le jeu de cartes. Tu sais comment faire ?

scoubida42
Re: Jeu de blackjack en java

En fait, mélanger le jeu de cartes est super facile mais je n'arrive vraiment pas à ne pas tirer 2 fois la même carte puisque je veux pouvoir accès à la valeur de la carte, il faut je pense qe mes cartes soient stocké quelque part mais je suis vraiment largués!!
VOici ma fonction pour mélanger :

package blackjack;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;

public class Deck {
    Card carddeck[];
    int currentCard=-1;;
    private List list;
     private List cardchosenlist;      //nom a changer !!!!!!!!!!!!!!!!!!!!!!!
    int cardcreated = 0;

//*****************************************
// Constructor
//*****************************************

    public Deck() {
        initiateDeck();
    }

    public void initiateDeck() {
        carddeck = new Card[52];
        int color = 0;
        int value = 0;
        
        
           for(color=0;color<4;color++)
             for(value=1;value<14;value++)
             {
                carddeck[cardcreated]=new Card(value,color);
                //*********************************************
                // Affichage jeu de carte dans l'ordre :
                // System.out.println(carddeck[cardcreated]);
                //*********************************************
                cardcreated++;
             }
        Shuffle();
     /*   for(cardcreated=0;color<53;color++){
            System.out.println(carddeck[cardcreated]);
            cardcreated++;
      }*/
    }

    //mélanger le jeu de carte :
    public void Shuffle() {
        list=Arrays.asList(carddeck);
        Collections.shuffle(list);
    }

    public void printCards() {
        for (int i = 0; i <=  list.size(); i++) {
            System.out.println( list.get(i));
        }
    }

    int cardchose=0;
    // Choose one card :
    //***********************************
    public void dealCard(int choosecard){
        //for(int i=0;i<choosecard;i++){
        for(int i=1;i<choosecard+1;i++){
             list.get(i);
            System.out.println(list.get(i));
            cardchosenlist.add(list.get(i));
        }
        //return chosencard;
        //return cardchosen;
           // if(cardchosenlist.isEmpty())
           //     System.out.println("liste vide");
            //try{
            /*if(cardchosenlist.isEmpty()){
                     cardchoisis.add(list.get(choosecard));
                    System.out.println( "size = 0");
            }
            else
                for(int i=0;i< cardchosenlist.size();i++)
                    if(list.get(choosecard).equals(cardchosenlist.get(i)))
                    {
                        dealCard(choosecard);
                        System.out.println( "size = 0");
                    }
                    else
                    {
                     cardchoisis.add(list.get(choosecard));
                     System.out.println( "size = 0");
                    }
            }
            System.out.println(list.get(choosecard));
           // samecard;
            list.remove(choosecard);
            printCards();*/
    }
}

***************************

 package blackjack;

public class Card {

    private int colorcard;
    private int valuecard;

    //*****************************************
    // Constructor
    //*****************************************
    public Card(int value,int color) {
        this.colorcard = color;
        this.valuecard = value;
    }

    public int getColor() {
        // Return the int that codes for this card's suit.
        return colorcard;
    }

    public int getValue() {
        // Return the int that codes for this card's value.
        return valuecard;
    }

    public String transferColor() {
        switch (colorcard) {
            case 0:
                return "Spades";    //pique
            case 1:
                return "Hearts";    //coeur
            case 2:
                return "Diamonds";  //carreau
            case 3:
                return "Clubs";     //trefle
        }
                return "0";
    }

    public String transferValue() {
        switch (valuecard) {
            case 1:
                return "Ace";
            case 2:
                return "2";
            case 3:
                return "3";
            case 4:
                return "4";
            case 5:
                return "5";
            case 6:
                return "6";
            case 7:
                return "7";
            case 8:
                return "8";
            case 9:
                return "9";
            case 10:
                return "10";
            case 11:
                return "Jack";  //valet
            case 12:
                return "Queen"; //dame
            case 13:
                return "King";  //roi
        }
        return "0";
    }
    
    public String toString(){
        String value=transferValue();
        String color=transferColor();
        StringBuffer buffer=new StringBuffer(value+" of "+color);
        buffer.setLength(20);
        return (buffer.toString()); }
}

//cardchoisis.add(list.get(i)); mais cette ligne ne marche pas du tout!!
Ou alors une autre solution mais que je sais pas non plus comment la réaliser c'est de ne stocker que ka valeur de la carte dans un tableau mais c'est nulle comme idées puisque 2 cartes peuvent avoir la même valeur
merci de votre aide parce que là, j'ai vraiment chercher et le seul truc que j'arrive à faire c'est prendre 3 cartes de mon jeu et afficher leur valeur dans la console!!
J'ai aussi une question comment se fait -t-il que dans mon fichier principal ou j'ai le design pour appeler une fonction il faut que j'écrive : new Deck().dealCard(3); et non pas avec une variable de type Deck???
Merci!!!!! :D

Niroken
Re: Jeu de blackjack en java

Bonjour,

Ta classe Deck me parait un peu compliquée pour ce qu'il y a à faire....
Je ne connais pas le blackJack, mais si ta classe Deck contient juste
une liste de cartes à mettre à jour, cela devrait suffire.

Si tu veux représenter les cartes en main des joueurs, il faudra après faire
une classe player avec la liste des cartes qu'ils ont tirés.

Je te propose une classe Deck mise à jour :

package bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Deck {
    
    public List<Card> mCurrentCards;
    
    // Initialisation de la liste de cartes
    public Deck() {
        mCurrentCards = new ArrayList<Card>();
    }
    
    // Methode statique permettant de construire un nouveau Deck 
    public static Deck buildNewDeck() {
        Deck vResult = new Deck();
        
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j < 14; j++) {
                vResult.mCurrentCards.add(new Card(j, i));
            }
        }
        
        Collections.shuffle(vResult.mCurrentCards);
        return vResult;
    }
    
    // Pour mélanger les cartes, au cas ou
    public void Shuffle() {
        Collections.shuffle(mCurrentCards);
    }
    
    // Afficher le jeu
    public void printDeck() {
        for (Card vCurrentCard : mCurrentCards) {
            System.out.println("Couleur : " + vCurrentCard.transferColor() + 
                               " Valeur : " + vCurrentCard.transferValue());
        }
    }
    
    // On tire la carte à l'index passée en paramètre
    public Card dealCard(int pIndex) {
        if (pIndex <= mCurrentCards.size()) {
            Card vResult = mCurrentCards.get(pIndex - 1);
            mCurrentCards.remove(pIndex - 1);
            return vResult;
        } else {
            throw new RuntimeException("On ne peut pas tirer cette carte");
        }
    }
    
}

Ainsi que sa classe de test :

import bean.Card;
import bean.Deck;


public class TestDeck {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Deck vDeck = Deck.buildNewDeck();
        //vDeck.printDeck();
        
        Card vCard_1 = vDeck.dealCard(1);
        System.out.println(vCard_1);
        
        Card vCard_2 = vDeck.dealCard(4);
        System.out.println(vCard_2);
        
        Card vCard_3 = vDeck.dealCard(6);
        System.out.println(vCard_3);
        
        Card vCard_4 = vDeck.dealCard(65);
        System.out.println(vCard_4);
    }

}

La classe Card n'est pas modifiée à part la suppression de :

StringBuffer buffer=new StringBuffer(value+" of "+color);
buffer.setLength(20);

dans la méthode toString() qui est inutile puisque Java alloue
automatiquement la taille qu'il faut à ton buffer. De plus sous
la sortie console Eclipse il affiche des caractères bizarres
puisque ta chaine ne fait pas 20 caractères.

J'ai par contre modifié les noms des packages.

Bonne chance,
Niroken

fredericmazue
Re: Jeu de blackjack en java

Quote:
Si tu veux représenter les cartes en main des joueurs

Au black jack, les joueurs n'ont pas de "cartes en main" comme à la belote. C'est à dire que les cartes ne sont pas distribuées aux joueurs au début d'un tour. Les cartes sont tirées une à une d'un sabot pour être exposées sur le tapis.d'où ma proposition du sabot sous forme de vector se vidant de ses éléments un à un

Niroken
Re: Jeu de blackjack en java

Hello,

Hmmm vi tu as raison, mais on peut encore faire mieux à utiliser l'objet Stack qui étend Vector:)

Niroken

fredericmazue
Re: Jeu de blackjack en java

En effet :)

tabouet
Re: Jeu de blackjack en java

bonjour,

Moi, j'avais du programmer un casse brique...

@+
Alexis

scoubida42
Re: Jeu de blackjack en java

ok, merci beaucoup pour votre aide!!!! mon blakcjack marche presque mais j'ai une erreur quand je veux faire l'affichage des cartes, le seul problème c'est que l'erreur je ne l'ai aps tout le temps et je ne comprends pas ce que c'est, d'où elle vient et donc je ne sais pas trop comment faire pour la corriger!!!

Voici mon code :
l'erreur se trouve à cette ligne là :
BufferedImage im = ImageIO.read(getClass().getResource(source));

Voici mon fichier entier pour l'affichage des cartes :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package graphics;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
 */
public class computergraphicsPanel extends JPanel{


        //##############################################################################
    public graphicsGUI game;   //saves the current BlackjackGui instance on this variable so it can be reffered to in this class

    Graphics2D g2;

    public computergraphicsPanel(graphicsGUI b) {
        super();
        game = b; //creates a new game called b
}

        public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g2 = (Graphics2D) g;
        draw(g2);
    }

           //  !--- All the drawing is done in this method ---!
    public void draw(Graphics2D g2) {
        Boolean turnCard1=game.turnCard;
        Hand computerHand = game.getComputerHand();
        int xPosition = 10; //starting x coordinate which gets larger to shift the additional cards accross
        int numberOfCards = computerHand.getSize();
        for (int i = 0; i < numberOfCards; i++) {

            if (i == 0 && turnCard1==false) {    //draw the dealers cards and check if first card should be faceup or facedown

                try {
                    BufferedImage im = ImageIO.read(getClass().getResource("/graphics/images/back-blue-75-1.png"));    //while the first card should be facedown, draw a facdown card

                    g2.drawImage(im, xPosition, 20, this);  //draws the card im at those coordinates

                    xPosition = xPosition + 100;    //shifts the next card over to the right by 40 pixels

                } catch (IOException ex) {
                     Logger.getLogger(humangraphicsPanel.class.getName()).log(Level.SEVERE, null, ex);

                }

            }
            else {

                Card currentCard = computerHand.getCard(i);
                String source = currentCard.getImage();

                try {
                    BufferedImage im = ImageIO.read(getClass().getResource(source));
                    g2.drawImage(im, xPosition, 20, this);
                    xPosition = xPosition + 100;

                } catch (IOException ex) {
                    Logger.getLogger(humangraphicsPanel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

        repaint();
        game.repaint();
    }
}

Voici l'erreur :

Exception occurred during event dispatching:
java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1362)
at graphics.computergraphicsPanel.draw(computergraphicsPanel.java:72)
at graphics.computergraphicsPanel.paintComponent(computergraphicsPanel.java:40)

Merci de votre aide pour corriger cette erreur, où juste me dire ce qu'il faut que je fasse ce serait super gentil:!!!merci beaucoup par avance!!!

Niroken
Re: Jeu de blackjack en java

Hello,

Quand tu fais un "getClass.getRessource(...)", ca implique que ta ressource en question se trouve dans ton classpath. On va suppposer que dans ton cas ce n'est pas le cas.

Comme tu n'as pas de temps et pour minimiser les erreurs je te propose de faire :

BufferedImage im = ImageIO.read(new File("C:/UnChemin/UneCarte.jpg"));

Bon evidemment mettre le chemin en dur comme ca c'est moyen alors, on pourrait utiliser un chemin relatif du style "./img/UneCarte.jpg", ou le dossier img se trouverait dans le même dossier que ta mainclass.

Bonne chance,
Niroken