You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:40:34