Avatar billede svarejoergen Nybegynder
15. august 2012 - 14:52 Der er 12 kommentarer

simpel metode skaber uventet resultat.

Har brugt en del timer på at finde årsagen til en logisk fejl. Det viser sig at stamme fra denne simple metode.

Den giver hver spiller 2 kort i pokerspillet. Kortene holdes af spillerobjekter.
spillerobjekterne er i et array kaldet spillere:

private spiller[] spillere = new spiller[10];

Her er metoden. Overraskende nok ender den med at give alle spillere de kort som spiller 9 har :/
Først giver den spiller 0 de rigtige kort.
Så giver den spiller 0 og 1 de kort spiller 1 skulle have
Så giver den spiller 0, 1 og 2 de kort spiller 2 skulle have
etc.

Her er metoden fra dealer klassen

  public final void givkort()
{
    int[] temp = new int[2];
for(int n = 0;n<10;n++)//
if(tilstand[n]>1){//Dette udsagn er altid sandt i testfase
    temp[0] = bunke[5+2*n];
    temp[1] = bunke[6+2*n];//
    Arrays.sort(temp);//det vælges at sortere holekortene
spillere[n].sethand(temp);
}
}
Hvordan Søren kan det lade sig gøre når den kun løber gennem løkken 10 gange. Her er metoden sethand() fra spiller klassen. 

public class spiller {
    private int[] hand = new int[2];

public void sethand (int[] a)  {
    hand = a;
}
}
Avatar billede tjp Mester
15. august 2012 - 15:52 #1
Jeg har kun lige skimmet, men måske hjælper det at ændre til:

public void sethand (int[] a)  {
    hand[0] = a[0];
    hand[1] = a[1];
}
Avatar billede lclemens Nybegynder
15. august 2012 - 16:02 #2
Du opretter kun ét array. Det ændrer du så lidt i ved hvert gennemløb og tildeler det hver spiller.

temp = new int[2];

Prøv at flyt den linje ind i din løkke :-)
Avatar billede svarejoergen Nybegynder
15. august 2012 - 19:10 #3
Tak iclemens virker perfekt. Smid et svar :)

Kunne selvfølgelig have lavet det på den hårde måde uden løkken. Forstår simpelthen stadig ikke hvordan metoden kan lave det den gør/gjorde. Så hvis nogen kan forklare det ville det være dejligt.
Avatar billede lclemens Nybegynder
15. august 2012 - 19:33 #4
Hver gang du sender dit array videre til en metode, så er det kun en henvisning til det ene array du har oprettet. Alle spillere får altså tildelt det samme array. Dvs ændres kortene hos én spillere, ændres de hos alle.

Nu oprettes et nyt array til hver spiller.
Avatar billede svarejoergen Nybegynder
15. august 2012 - 19:51 #5
Takker smid et svar :)
Avatar billede arne_v Ekspert
19. august 2012 - 21:41 #6
Udover den konkrete fejl som lclemens har forklaret om, saa tror jeg at din kode med fordel kunne skifte fra arrays til collections.
Avatar billede svarejoergen Nybegynder
20. august 2012 - 22:43 #7
Har ikke erfaring med collections. Har været inde og læse lidt om det (http://docs.oracle.com/javase/tutorial/collections/intro/index.html). Kan godt se det giver nogle fordele. Hvad med afviklingshastigheden af kode baseret på collections. Læser det som om udviklingshastigheden er større, men gælder nok ikke for mig, da jeg føler mig godt tilpas med arrays.
Avatar billede svarejoergen Nybegynder
20. august 2012 - 22:58 #8
Tror jeg vil forsøge at skabe bekendskab med collections. Vil dog ikke ændre i eksisterende kode. Kun hvis det senere viser sig at konvertering til collections kan gøres "nemt" på et næsten færdigt program. Tak for rådet :)
Avatar billede arne_v Ekspert
28. august 2012 - 01:13 #9
Collections er lidt langsommere end arrays, saa hvis du skal lave milliarder af operationer i minuttet, saa hold dig til array.

Laver du kun nogle faa millioner i minuttet, saa betyder forskellen ikke noget.
Avatar billede arne_v Ekspert
28. august 2012 - 01:14 #10
Collections (specielt brug af mere specialiserede collections) kan give en mere letlaeselig kode med faerre fejl i.
Avatar billede arne_v Ekspert
28. august 2012 - 01:45 #11
Eksempel til inspiration:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Stack;

public class CardFun {
    private static ArrayList<Card> createDeck() {
        ArrayList<Card> res = new ArrayList<Card>();
        for(Suit suit : Suit.values()) {
            for(Value value : Value.values()) {
                res.add(new Card(suit, value));
            }
        }
        return res;
    }
    private static void shuffle(ArrayList<Card> deck) {
        Collections.shuffle(deck);
    }
    private static Stack<Card> deckToStack(ArrayList<Card> deck) {
        Stack<Card> res = new Stack<Card>();
        res.addAll(deck);
        return res;
    }
    private static ArrayList<Player> createPlayers(String... names) {
        ArrayList<Player> res = new ArrayList<Player>();
        for(String name : names) {
            res.add(new Player(name));
        }
        return res;
    }
    private static void deal(int numberCards, Stack<Card> stack, ArrayList<Player> players) {
        for(int i = 0; i < numberCards; i++) {
            for(Player player : players) {
                player.add(stack.pop());
            }
        }
    }
    public static void main(String[] args) {
        ArrayList<Card> deck = createDeck();
        //System.out.println(deck);
        shuffle(deck);
        //System.out.println(deck);
        Stack<Card> stack = deckToStack(deck);
        //System.out.println(stack);
        ArrayList<Player> players = createPlayers("Anders", "Boerge", "Christian");
        System.out.println(players);
        deal(2, stack, players);
        System.out.println(players);
    }
}

class Player {
    private String name;
    private ArrayList<Card> cards;
    public Player(String name) {
        this.name = name;
        cards = new ArrayList<Card>();
    }
    public void add(Card card) {
        cards.add(card);
    }
    @Override
    public String toString() {
        return name + " : " + cards;
    }
}

class Card {
    private Suit suit;
    private Value value;
    public Card(Suit suit, Value value) {
        this.suit = suit;
        this.value = value;
    }
    public Suit getSuit() {
        return suit;
    }
    public Value getValue() {
        return value;
    }
    @Override
    public String toString() {
        return value + " of " + suit;
    }
}

enum Suit { CLUBS,  DIAMONDS, HEARTS, SPADES }

enum Value { TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }
Avatar billede svarejoergen Nybegynder
29. august 2012 - 18:14 #12
Mange tak for hjælpen. Som sagt er projektet ret fremskredent, så jeg vil holde de gode råd in mente.




En lille update til de eventuelt interesserede (Advarsel: der er ingen spørgsmål!)

Skrev selv en odds calculator som det første. Den tager bordet og udregner en "unikværdi" for alle mulige 2 korts hænder (1=Royal Straight flush, 1610 = 3 esser med konge dame sidekort). Disse værdier bliver skrevet i et dobbelt array 52x52. Den kan blandt andet omsættes til dobbelt array der viser hvor mange hænder man er bagud og foran (tie= mulige-bagud-foran) Den er altså rigtig brugbar til mange ting, men håbløs langsom når der er rigtig mange mulige boards (tidligt i hånden, eller med spiller ranges).
Jeg har fået lavet en GUI via netbeans palette som jeg er rigtig godt tilfreds med. Spillets logiske side er også på plads, dog kun standard "pengespil. Resten skal jeg nok få lavet med tiden.

Det jeg for  tiden kæmper med, er at implementere en ny og hurtig odds-calculater til visse opgaver. Det anvender lookup list, hvilket åbenbart er det hurtigste. Har ikke brugt "fremmed" kode endnu, så der kommer helt sikkert flere spørgsmål herinde, da det kan være lidt svært at gennemskue. Er dog ret heldig at den anvender int til både kort og håndværdi ligesom min kode (kortene har godt nok andre værdier end mine, men det kan let oversættes, og mine håndværdier er mere "kompakte").

Her er min spiller klasse hvis det har interesse:




public class spiller {
    private String navn = new String();
    private int idnr = 0;//et unik nummer til alle spillere
    private boolean folded = false;
    private boolean allin = false;
    private boolean aktiv = false;//hvorvidt spilleren ønsker kort i den følgende hånd
    private boolean aktivlast = false;//fik spilleren kort sidste hånd?
    private boolean betallowed = true;//er der åbnet for et bet eller raise
    private double bankroll = 0;
    private double buyin = 0;
    private double stack; //hvor meget har spilleren foran sig
    private double stackstart = 1000; //hvor meget havde spilleren foran sig da hånden startede
    private int seat = 0;
    private int strategy = 1;
    private int[] hand = new int[2];


    public spiller(String navn,double stack)
    {
    this.navn = navn;
        this.stack = stack;
    }

public void sethand (int[] a)  {
    hand = a;
}
public int[] gethand ()  {
    return hand;
}
public void setfolded (boolean a){
    folded = a;
}
public boolean getfolded ()
        {
  return folded;
}
public void setidnr (int a){
    idnr = a;
}
public int getidnr ()
        {
  return idnr;
}
public void setallin (boolean a){
    allin = a;
}
public boolean getallin ()
        {
  return allin;
}
public void setaktiv (boolean a){
    aktiv = a;
}
public boolean getaktiv ()
        {
  return aktiv;
}
public void setaktivlast (boolean a){
    aktivlast = a;
}
public boolean getaktivlast ()
        {
  return aktivlast;
}
public void setbetallowed (boolean a){
    betallowed = a;
}
public boolean getbetallowed ()
        {
  return betallowed;
}
public void setnavn (String a){//gøres i constructor
    navn = a;
}
public String getnavn ()
        {
  return navn;
}
public void setbankroll (double a){
    bankroll = a;
}
public double getbankroll ()
        {
  return bankroll;
}
public void setstack (double a){
    stack = a;
}
public double getstack ()
        {
  return stack;
}
public void stackind (double a){
    stack = stack + a;
}
public void stackud (double a){
    stack = stack - a;
}
public void setstackstart (double a){
    stackstart = a;
}
public double getstackstart ()
        {
  return stackstart;
}
public void setbuyin (double a){
    buyin = a;
}
public double getbuyin ()
        {
  return buyin;
}
public void setseat (int a){
    seat = a;
}
public int getseat ()
        {
  return seat;
}
public void setstrategy (int a){
    strategy = a;
}
public int getstrategy ()
        {
  return strategy;
}
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester