所以我一直用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
}
}
答案 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。