如何创建简单的扑克手算法?

时间:2015-12-03 22:51:40

标签: java arrays algorithm

所以我一直用java创建这个简单的扑克游戏。我创建了一副牌(牌是由字符串和整数组成的对象)和数组列表来代表你的牌和经销商牌。一旦我在yourHand数组中有卡片,我怎样才能创建一种检查不同套装的方法?我想保持简单,就像它只检查对和3种。我怎么处理这个?我认为可以这样做的方法是创建一个循环来检查数组中的每个元素,并查看这些元素中的任何元素是否与另一个元素相等。但这说起来似乎更容易,因为我真的不明白我会怎么做。然后出现了这个想法,因为卡对象是String AND整数类型,这样做是否会成为一个问题?我是编程新手,非常感谢任何帮助。谢谢! (另外,如果你们想看到我设置卡片对象的代码,请告诉我,我在不同的课程中有这些对象)

public class pokerMain实现StackInterFace {

public static void main (String [] args){
    ArrayList<String> suits = new ArrayList<String>();//array list for the card suits
    ArrayList<Integer> val = new ArrayList<Integer>();//array list for card values
    ArrayList<CARDS> newCards = new ArrayList<CARDS>();//array list for cards with assigned val/suits
    ArrayList<CARDS> yourHand = new ArrayList<CARDS>();//array list for your hand
    ArrayList<CARDS> dealerHand = new ArrayList<CARDS>();//array list for the dealer's hand
    Stack<CARDS> deck = new Stack();//Stack to represent deck
    suits.add("Clubs");//These are the suits, added to the suits ArrayList
    suits.add("Hearts");
    suits.add("Diamonds");
    suits.add("Spades");

    System.out.println("suits contains: " + suits );//Testing for suit

    for(int i = 1; i <= 13; i ++){//loop that adds all 13 values to to the val ArrayList
        val.add(i);
    }

    System.out.println("val contains " + val);//Testing for val


    for(Integer i : val) {//second attempt of adding objects to newCards
        for(String s : suits) {
            newCards.add(new CARDS(s, i));
        }
    }

    System.out.println("the full deck contains: ");

    System.out.println(newCards.toString());//prints newCards arrayList

    Collections.shuffle(newCards);//shuffles array newCards

    System.out.println("When shuffled this is what is in the deck");
    System.out.println(newCards.toString());//prints shuffled array

    deck.addAll(newCards);//adds newCards into the decks stack




    System.out.println("Test print stack");
    System.out.println(deck.toString());//prints stack as test

    System.out.println("You pulled a " + deck.pop());//test pulling card from deck

    for(int i = 0; i < 5; i ++){//loop to draw cards and put into hand
        yourHand.add(deck.pop());
    }
    for(int i = 0; i < 5; i ++){//loop to draw cards and put into hand
        dealerHand.add(deck.pop());
    }

    System.out.println("Please draw your cards");
    System.out.println("Your hand contains:");
    System.out.println(yourHand.toString());

    for(int i = 0; i < yourHand.size(); i ++){//loop to check for pairs

    }
}





@Override
public Object pop() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Object peek() {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean isEmpty() {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void clear() {
    // TODO Auto-generated method stub

}



@Override
public void push(ArrayList newCards) {
    // TODO Auto-generated method stub

}



@Override
public void addAll(ArrayList newCards) {
    // TODO Auto-generated method stub

}

}

2 个答案:

答案 0 :(得分:1)

一种简单的方法是按面值对牌进行排序。这样可以很容易地在一行中找到N个相同的值。

我不写java,所以这可能充满了语法错误,但是做了类似的事情:

class CardFaceComparartor implements Comparator<CARD>
    public int compare(CARD a, CARD b) {
       return a.getFaceval() - b.getFaceaval;
    }
 }

...

Collections.sort(yourHand, CardFaceComparator);
int numSame=1;
int sets[4] = {0,0,0,0}  //counts singles, pairs, ...
bool maybeFlush=True;
for (i=0; i<yourHand.size()-; i++) {
   if (yourHand[i].getFaceval()==   yourHand[i-1].getFaceval())
       numSame+=1;
   else {
      sets[numSame]+=1;
      numSame = 1;
  }
  maybeFlush = maybeFlush & (yourHand[i].getSuit() == yourHand[i-1.getSuit());

}
// now you have all the info to find best hand.

答案 1 :(得分:1)

考虑使用Comparator和Collections工具的这个例子:

public static final Comparator comparator = new Comparator<Card>() {
        @Override
        public int compare(Card cardOne, Card cardTwo) {
            return cardOne.getFaceVal().compareTo(cardTwo.getFaceVal());
        }
    };

/* Later on we can then use the comparator object to sort! */   
Collections.sort(cards, comparator);

使Card对象的字段具有String类型为Suit,类型为Integer。然后,上面的代码可以应用于对包含Card对象(如您的手)或经销商手等的特定ArrayList进行排序。您从中获得的是检查直道,线对等可以优化和更容易,因为一切都是按升序排列。

以下是排序之前的一个例子:

5,4,Q,5,2

没有排序,你可以看到检查直线是非常困难的,然后还需要找到对...算法将是看到你有一个5,并检查直线像[5,6,通过查看剩下的卡片来看,这很难跟踪对。逻辑将在代码中变得非常混乱,并且难以测试或让其他人阅读。通过排序我们得到

2,3,4,5,5

我们可以在一次扫描中看到没有直接和找到对。我们知道期望后续卡只比最后一张卡大一个值,如果不是,则不存在直线。如果它是相同的值,它就是一对!更多的逻辑涉及到找到三种类型,四种类型等等。但我会把这个练习留给你!

虽然有一个Ace的边缘情况,因为它在一些游戏中可以按顺序使用2,3,4,5是直的..你没有说你正在制作什么样的游戏。同时确保将J-A分别视为11-14。