Java扑克游戏字符串数组比较异常:无法校验重复牌面
德州扑克Java程序重复牌检测问题解决
我正在编写一个模拟德州扑克的Java程序,需要输出玩家手牌、对手手牌和翻牌,要求每张牌仅出现一次,不能重复发牌。我尝试将每张牌存入字符串数组,通过数组元素比较来检测重复,若存在重复则重新分配牌面直到无重复。但实际运行中,if(stringArr[x]==stringArr[y])这类字符串比较语句无法按预期判断值是否相等,调整条件语句后仍未解决问题,怀疑问题出在字符串数组元素的比较逻辑上。
相关代码如下:
// meine = mine, gegner = opponent (German = English) import java.util.Random; public class PokerGame { public static void main(String[] args) { int cards = 2; // Texas Hold em is played with 2 cards int flopCards = 3; // Texas Hold em has 2 cards on the flop String meine = dealer(cards); String gegner = dealer(cards); String flop = dealer(flopCards); String[] meineArr = meine.split(" "); String[] gegnerArr = gegner.split(" "); String[] flopArr = flop.split(" "); if( meineArr[0]!=meineArr[1] && meineArr[0]!=gegnerArr[0] && meineArr[0]!=gegnerArr[1] && meineArr[1]!=gegnerArr[1] && meineArr[1]!=gegnerArr[0] && flopArr[0]!=flopArr[1] && meineArr[0]!=flopArr[0] && meineArr[0]!=flopArr[1] && meineArr[1]!=flopArr[1] && meineArr[1]!=flopArr[0] && gegnerArr[0]!=gegnerArr[1] && gegnerArr[0]!=flopArr[0] && gegnerArr[0]!=flopArr[1] && gegnerArr[1]!=flopArr[1] && gegnerArr[1]!=flopArr[0] && gegnerArr[0]!=flopArr[2] && gegnerArr[1]!=flopArr[2] && flopArr[0]!=flopArr[1] && flopArr[0]!=flopArr[2] && flopArr[1]!=flopArr[2] && flopArr[2]!=flopArr[1] && flopArr[2]!=flopArr[0] ) { System.out.println("Your Hand: " + meine + "\n\n"+ "Opponent's Hand: " +gegner+ "\n\n"+ "FLOP: "+flop); }else { while(meineArr[0]==meineArr[1] || meineArr[0]==gegnerArr[0] || meineArr[0]==gegnerArr[1] || meineArr[1]==gegnerArr[1] || meineArr[1]==gegnerArr[0] || flopArr[0]==flopArr[1] || meineArr[0]==flopArr[0] || meineArr[0]==flopArr[1] || meineArr[1]==flopArr[1] || meineArr[1]==flopArr[0] || gegnerArr[0]==gegnerArr[0] || gegnerArr[0]==flopArr[0] || gegnerArr[0]==flopArr[1] || gegnerArr[1]==flopArr[1] || gegnerArr[1]==flopArr[0] || gegnerArr[0]==flopArr[2] || gegnerArr[1]==flopArr[2] || flopArr[0]==flopArr[1] || flopArr[0]==flopArr[2] || flopArr[1]==flopArr[2] || flopArr[2]==flopArr[1] || flopArr[2]==flopArr[0]){ gegner = dealer(cards); gegnerArr = gegner.split(" "); System.out.println("Your Hand: " + meine + "\n\n"+ "Opponent's Hand: " +gegner+ "\n\n"+ "FLOP: "+flop); } } System.out.println("\n\n\n"+legend()); } static String legend(){ String legend = "A = Ace h = hearts \n" +"K = King c = clubs\n" +"Q = Queen d = diomonds\n" +"J = Jack s = spades\n" +"T = 10"; return legend; } static String dealer(int len) { String value = "23456789TQJKA"; String face = "hcds"; Random rand = new Random(); char[] handvalue = new char[len]; char[] handface = new char[len]; int index = 0; String generatedHand = ""; for (int i = 0; i < len; i++) { handvalue[i] = value.charAt(rand.nextInt(value.length())); generatedHand += handvalue[i]; for (int j = 0; j < 1;j++ ){ handface[i] = face.charAt(rand.nextInt(face.length())); generatedHand += handface[i]; } generatedHand += " "; } return generatedHand; } }
问题根源与解决方法
1. 字符串比较逻辑错误
Java中,==运算符比较的是字符串对象的内存引用,而非内容是否相等。即使两个字符串内容完全一致,若属于不同对象,==也会返回false。正确的字符串内容比较应使用equals()方法。
将原代码中所有==/!=的字符串比较替换为equals()判断,例如:
// 修改后的if条件片段 if( !meineArr[0].equals(meineArr[1]) && !meineArr[0].equals(gegnerArr[0]) && !meineArr[0].equals(gegnerArr[1]) && // 剩余条件依次替换为equals判断... )
2. 现有重复检测逻辑的缺陷
- 原else分支仅重新生成对手手牌,未处理玩家手牌、翻牌自身的重复问题(比如玩家手牌两张重复、翻牌三张中有重复)。
- 条件中存在大量重复判断(如
flopArr[0]==flopArr[1]多次出现),冗余且易遗漏。
3. 更高效的发牌方案(从根源避免重复)
直接构建完整52张牌库,洗牌后按顺序发牌,彻底杜绝重复:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class PokerGame { public static void main(String[] args) { // 构建完整牌库 List<String> deck = new ArrayList<>(); String[] values = {"2","3","4","5","6","7","8","9","T","J","Q","K","A"}; String[] suits = {"h","c","d","s"}; for (String value : values) { for (String suit : suits) { deck.add(value + suit); } } // 洗牌 Collections.shuffle(deck); // 发牌:玩家2张,对手2张,翻牌3张 List<String> playerHand = deck.subList(0, 2); List<String> opponentHand = deck.subList(2, 4); List<String> flop = deck.subList(4, 7); // 输出结果 System.out.println("Your Hand: " + String.join(" ", playerHand)); System.out.println("\nOpponent's Hand: " + String.join(" ", opponentHand)); System.out.println("\nFLOP: " + String.join(" ", flop)); System.out.println("\n\n\n" + legend()); } static String legend(){ return "A = Ace h = hearts \n" + "K = King c = clubs\n" + "Q = Queen d = diamonds\n" // 修正原拼写错误diomonds→diamonds + "J = Jack s = spades\n" + "T = 10"; } }
该方案优势:
- 无需重复检测逻辑,天然保证所有牌唯一
- 代码简洁,逻辑清晰
- 避免随机生成可能导致的重复循环(极端情况多次生成重复牌)
内容的提问来源于stack exchange,提问作者Ma Wi
相关产品推荐
相关产品推荐

