webForumDet fria alternativet

Ny händelse

5 svar · 370 visningar · startad av AG

AGMedlem sedan mars 20001 266 inlägg
#1

Har börjat göra ett enkelt kortprogram.
Som det är nu slumpar programmet fram ett kort. Jag skulle nu vilja välja så att dealern får ett kort utslumpat ur samma hög, men det kan ju givietvis inte vara samma som spelaren. Därefter skall man själv kunna välja ifall man vill ha ett övrigt kort. Hur går jag lättast tillväga?

import java.util.*;

class Shuffle { 

  public static void main(String argument[]) { 

    Random RNG = new Random() ;     
    int idx ;     
    int[] deck = new int[52] ;         
    // first, place every card in the deck...     
    for (idx=0; idx < deck.length; idx++) {         
        deck[idx] = (idx + 1) ;     
               }      
        // now shuffle them around randomly:     
        //   for each position in the array,      
        //      swap it with another randomly selected one     
        //     
        for (idx=deck.length-1; idx > 0; idx--) {         
            int other = RNG.nextInt(idx+1) ;         
            int tmp = deck[idx] ;         
            deck[idx] = deck[other] ;         
            deck[other] = tmp ;     
        }     
        
        for(int i = 0; i < deck.length; i++) {
            System.out.println(deck[i]);
        }

int cardnr = deck[RNG.nextInt(deck.length)]; 

System.out.println("Random:"+cardnr);

int color=cardnr%4;
int value=cardnr/4+1;
String colora = "";
String valuea = "";
if(color==0){
	colora = "Spades";
}
else if(color==1){
	colora = "Diamonds";
}
else if(color==2){
	colora = "Clubs";
}
else if(color==3){
	colora = "Hearts";
}

if(value==1){
	valuea = "Ace";
}
else if(value==2){
	valuea = "Two";
}
else if(value==3){
	valuea = "Three";
}
else if(value==4){
	valuea = "Four";
}
else if(value==5){
	valuea = "Five";
}
else if(value==6){
	valuea = "Six";
}
else if(value==7){
	valuea = "Seven";
}
else if(value==8){
	valuea = "Eight";
}
else if(value==9){
	valuea = "Nine";
}
else if(value==10){
	valuea = "Ten";
}
else if(value==11){
	valuea = "Jack";
}
else if(value==12){
	valuea = "Queen";
}
else if(value==13){
	valuea = "King";
}

System.out.println("Color:"+color);
System.out.println("Value:"+value);
System.out.println("A " +valuea+ " of " +colora);

  } //main metoden slutar här.
}

Andreas

pettssonMedlem sedan jan. 20021 122 inlägg
#2

Eftersom du "blandar" högen innan du delar ut bör det väl bara vara att börja ovan/underifrån efter egen preferens och ge ett kort till spelaren/delaren. Deras hand kan symboliseras av en int-array t.ex. För att kolla om man vill ha ett till kort är det välan bara att läsa in från tangentbordet?

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
final int MAX_CARDS = 42;
int playerHand[] = new int[MAX_CARDS];
int dealerHand[] = new int[MAX_CARDS];
int merKort = 0;
playerHand[0] = putCard();
dealerHand[0] = putCard();
System.out.print("Ta ett kort till? [0/1] ");
merKort = Integer.parseInt(in.readLine());
if(merKort == 1) {
playerHand[1] = putCard();
}
else {
System.out.println("Slipp då!");
}

Jag rekommenderar att du delar upp koden i metoder för att enklare kunna t.ex. dela nya kort, jag använde i koden ovan putCard(), vilken du kan skapa ifrån din egen kod.

Hoppas det hjälper :bire

matthewMedlem sedan okt. 2001166 inlägg
#3

Hej,
du kanske ska fundera på strukturen i ditt program.
Tex så borde shuffle klassen inte skapa en kortlek utan endast vaska leken.

Du kan skapa en metod som sköter vaskningen i stället som tex en dealer klass har eller så använder du den i en Deck klass.

Förslag på klasser:

Game
Dealer
Player
Deck
Card

Game kan ju innehålla main där du bestämmer hur spelaren och dealern ska få kort.

Jag skickar med lite exempel kod som kanske kan hjälpa.

Klassen Deck

import java.util.*;
import java.util.Collection;

class Deck
{
	private Vector d = new Vector();
	private int decks;
	
	public Deck(int decks)
	{
		//number of decks that should be created
		this.decks = decks;
		createDeck();
	}
	
	//Creates n decks and fills the d vecktor with Card Objekt
	private void createDeck()
	{
		for(int i=0; i<decks; i++)
		{
			for(int type=1; type<=4; type++)
			{
				for(int cardNr=1; cardNr<14; cardNr++)
				{
					String fil=null;
					if(type==1) fil=new String("h");
					else if(type==2) fil=new String("c");
					else if(type==3) fil=new String("d");
					else if(type==4) fil=new String("s");
					
					//Builds a string thats includes the url to specified image
					String file = new String("images/" + fil + Integer.toString(cardNr) + ".gif");
					d.add(new Card(type, cardNr, file));
				}
			}
		}
	}
	
	//Returns the first Card from the deck
	public Card pop()
	{
		//If the last card has been drawn create a new deck
		if(d.size()==0) createDeck();
		Card c = ((Card)d.get(0));
		d.remove(0);
		return c;
	}
	
	//Shuffles the deck
	public void shuffle()
	{
		int index1, index2;
		MyRand rand = new MyRand();
		for(int times=0; times<1000; times++)
		{
			index1 = rand.getRand(52*decks);
			index2 = rand.getRand(52*decks);
			Card c1 = ((Card)d.get(index1));
			Card c2 = ((Card)d.get(index2));
			if(c1!=c2)
			{
				d.set(index1, c2);
				d.set(index2, c1);
			}
		}
	}	
	
}

Klassen Card

import java.awt.*;
import javax.swing.*;

class Card
{
	private int value;
	private	int type;
	private Image image;
	
	public Card(int type, int value, String file)
	{
		this.type = type;
		this.value = value;
		
		//      this.image = (new ImageIcon(file)).getImage();
		image = Toolkit.getDefaultToolkit().getImage(file);
	}
	
	public int getValue()
	{
		return this.value;
	}
	
	public int getType()
	{
		return this.type;
	}
	
	public Image getImage()
	{
		return this.image;
	}
	
}

Klassen Player

import java.util.*;

class Player
{
	private String name;
	private int bet;
	private double credit;
	private Vector cards = new Vector();
	
	//Initialize Player name and starting credit
	public Player(String n, double c)
	{
		setName(n);
		setCredit(c);
	}
	
	//Initialize Player name
	public Player(String n)
	{
		setName(n);
	}
	
	private void setName(String n)
	{
		this.name = n;
	}
	
	public String getName()
	{
		return this.name;
	}
	
	public void setCredit(double c)
	{
		this.credit = c;
	}
	
	public double getCredit()
	{
		return this.credit;
	}
	
	public void setBet(int b)
	{
		this.bet = b;
	}
	
	public int getBet()
	{
		return this.bet;
	}
	
	//Adds a card to players Vector of cards
	public void addCard(Card c)
	{
		cards.add(c);
	}
	
	//Returns a Card object
	public Card getCard(int index)
	{
		Card c = ((Card)cards.get(index));
		return c;
	}
	
	//After a round is done this method is called and removes players cards
	public void removeCards()
	{
		cards.clear();
	}
	
	//Returns number of cards player has in the Cards Vector
	public int getNumberOfCards()
   	{
		return this.cards.size();
   	}
	
   	//Returns the value of the players cards
   	public int getCardValues()
   	{
		int cards = getNumberOfCards();
		Card card;
		int aces=0;
		int sum=0;
		int cardVal=0;
		
		//Calculate values for all the cards except aces
		//For every occurence of a ace the value of aces will increase by 1
		for (int i=0;i<cards;++i)
		{
			card = getCard(i);
			cardVal = card.getValue();
			if(cardVal == 1) aces++;
			else if(cardVal < 10) sum+=cardVal;
			else if(cardVal >= 10) sum+=10;
		}
		
		//If player has any aces:
		//Check if its possible to add 11-1 and still be able to have <=21
		while(aces!=0)
		{
			if(sum+11+(aces-1)<=21) sum+=11;
			else sum+=1;
			aces-=1;
		}
		return sum;
	}
}

Hoppas att du får några ideer av ovanstående kod exempel.
Om du vill kan jag skicka alla klasser...

Mvh,
Matt

PeWMedlem sedan juni 200010 432 inlägg
#4

Jag skickar med lite exempel kod som kanske kan hjälpa.

.. :e ;)

AGMedlem sedan mars 20001 266 inlägg
#5

Nu har jag ändrat endel. Saken är den att jag nu fört skulle vilja slumpa fram två kort, dvs gör en loop eller nåt sånt.
Men jag förstår inte hur jag skall göra, den slumpar ej fram nytt.

import java.util.*;

class BlackJack { 

public int getCard() {
	
		String ret = "";
    Random RNG = new Random() ;     
    int idx ;     
    int[] deck = new int[52] ;         
    // first, place every card in the deck...     
    for (idx=0; idx < deck.length; idx++) {         
        deck[idx] = (idx + 1) ;     
               }      
        // now shuffle them around randomly:     
        //   for each position in the array,      
        //      swap it with another randomly selected one     
        //     
        for (idx=deck.length-1; idx > 0; idx--) {         
            int other = RNG.nextInt(idx+1) ;         
            int tmp = deck[idx] ;         
            deck[idx] = deck[other] ;         
            deck[other] = tmp ;     
        }     
        
        for(int i = 0; i < deck.length; i++) {
            //System.out.println(deck[i]);
        }

       int cardnr = deck[RNG.nextInt(deck.length)]; 
	return cardnr;
	}

	public void getHand() {
		try {
int color=getCard()%4;
int value=getCard()/4+1;
			String colora = "";
String valuea = "";
if(color==0){
	colora = "Spades";
}
else if(color==1){
	colora = "Diamonds";
}
else if(color==2){
	colora = "Clubs";
}
else if(color==3){
	colora = "Hearts";
}

if(value==1){
	valuea = "Ace";
}
else if(value==2){
	valuea = "Two";
}
else if(value==3){
	valuea = "Three";
}
else if(value==4){
	valuea = "Four";
}
else if(value==5){
	valuea = "Five";
}
else if(value==6){
	valuea = "Six";
}
else if(value==7){
	valuea = "Seven";
}
else if(value==8){
	valuea = "Eight";
}
else if(value==9){
	valuea = "Nine";
}
else if(value==10){
	valuea = "Ten";
}
else if(value==11){
	valuea = "Jack";
}
else if(value==12){
	valuea = "Queen";
}
else if(value==13){
	valuea = "King";
}
System.out.println("A " +valuea+ " of " +colora+"");

		}
		catch( Exception e ) {
			System.err.println( "Error: " + e.getMessage() );
			e.printStackTrace();
		}
	}
  public static void main(String argument[]) { 

int countdown=5;
BlackJack bj = new BlackJack();
bj.getHand();
while (countdown > 0)
{

countdown--;

}

  } //main metoden slutar här.
}

Andreas

pettssonMedlem sedan jan. 20021 122 inlägg
#6
int color=getCard()%4;
int value=getCard()/4+1;

Detta är nog inte vad du vill... Nu hämtar du två kort, och alltså hör inte color och value ihop, vilket gör att "samma" kort kan generaras flera gånger.
Dessutom kommer getCard skapa en ny array av 52 intar varje gång den anropas. Initiering bör du bara utföra en gång, så att placera "gör-en-ny-kortlek"-biten någonstans där den bara utförs en gång kan vara bra.
När du gjort om din getHand() på lämpligt vis, kan du flytta in din getHand() i countdown-loopen, så kommer 5 kort att genereras. Ska du på något sätt manipulera korten efteråt är det bra att spara dem någonstans.

Lite förslag bara :)

143 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)