我在Java中做错误的21点文件计数器吗?

问题描述

| 我正在做这个练习,这个练习说: *给出一个输入文件,其中包含3个玩家之间的1000张随机二十一点牌(此处为blackjack.txt),计算所有游戏中任何玩家遇到的二十一点数量。 二十一点被定义为任何西装的王牌和任何西装的10值卡(杰克,皇后,国王或10)。 输入文件如下所示:(作为示例) 4H 5C AD JH 9C 10H 这意味着玩家一个拥有4个红心和5个俱乐部。玩家2有一个钻石王牌和一个红心杰克(计为二十一点);玩家3有9个俱乐部和10个红心。 出于这个问题的目的,已知有一个标准的52张卡片套,可用于每个新游戏。* 我认为我使用的是正确的方法,我的代码是正确的,但是我的答案失败了,没有任何提示,建议来找到正确的答案 这是我的代码
import java.io.*;

public class Problema16 {

    public static void main(String args[]) {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        int counter = 0;
        //int rest = 0;

        try {
            archivo = new File(\"C:\\\\Users\\\\\\blackjack.txt\");
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);
            String linea;
            String[] linea2 = null;

            while ((linea = br.readLine()) != null) //System.out.println(linea);
            {
                linea2 = linea.split(\" \");

                String a = (linea2[0]);
                String b = (linea2[1]);
                String c = (linea2[2]);
                String d = (linea2[3]);
                String e = (linea2[4]);
                String f = (linea2[5]);

                if ((a.startsWith(\"A\") && (b.startsWith(\"J\") || (b.startsWith(\"Q\") || (b.startsWith(\"K\") || (b.startsWith(\"10\")))))) || ((a.startsWith(\"J\") || (a.startsWith(\"Q\") || (a.startsWith(\"K\") || (a.startsWith(\"10\"))))) && (b.startsWith(\"A\")))) {
                    counter++;
                    //System.out.println(a + \"\" + b + \"\");
                } else if ((c.startsWith(\"A\") && (d.startsWith(\"J\") || (d.startsWith(\"Q\") || (d.startsWith(\"K\") || (d.startsWith(\"10\")))))) || ((c.startsWith(\"J\") || (c.startsWith(\"Q\") || (c.startsWith(\"K\") || (c.startsWith(\"10\"))))) && (d.startsWith(\"A\")))) {
                    counter++;
                    //System.out.println(c + \"\" + d + \"\");
                } else if ((e.startsWith(\"A\") && (f.startsWith(\"J\") || (f.startsWith(\"Q\") || (f.startsWith(\"K\") || (f.startsWith(\"10\")))))) || ((e.startsWith(\"J\") || (e.startsWith(\"Q\") || (e.startsWith(\"K\") || (e.startsWith(\"10\"))))) && (f.startsWith(\"A\")))) {
                    counter++;
                    //System.out.println(e + \"\" + f + \"\");
                } else {
                    //sobra++;
                }
            }

            System.out.println(counter);
            //System.out.println(sobra);

        } catch (Exception e) {
            e.printstacktrace();
        }
    }
}
这是在线练习1.我的答案是119,但是错误。     

解决方法

用大括号很难阅读每个
if
中的情况,但看起来还可以。 您的问题出在
else if
。玩家#1和玩家#2(以及玩家#3)可以同时拥有二十一点,因为您的代码将只计入其中的一个。 放下
else
,一切正常。 您还可以稍微提高代码的可读性。一些指针: 检查第二/第三名玩家的手与第一名相同。使用循环。 不必显式检查特定的卡,您可以计算出手的值并检查它是否等于21。最好将该逻辑放在单独的方法中。 一种简单的计算手牌价值(假设输入始终合法)的方法是放下西服(因为这无关紧要),并使用预定义的地图来确定卡牌价值(例如\“ J \” => 10, \“ A \”-11等)     ,简短的sed命令,用于验证:
sed \'s/[CDHS] / /g;s/[CDHS]\\r$//g;s/[JKQ]/+/g;s/10/+/g;s/A/-/g;s/\\(. .\\)/[\\1]/g;s/+ -/ * /g;s/- +/ * /g\' blackjack.txt | grep \" \\* \" | wc -l 
119 lines
删除颜色,将JKQ10与+,A与-(有点多余),+-和-+与*(BJ)组合在一起。 多重比对:
sed \'s/[CDHS] / /g;s/[CDHS]\\r$//g;s/[JKQ]/+/g;s/10/+/g;s/A/-/g;s/\\(. .\\)/[\\1]/g;s/+ -/ * /g;s/- +/ * /g\' blackjack.txt | grep \" \\*.*\\* \" 
[6 5] [ * ] [ * ]
[3 +] [ * ] [ * ]
[ * ] [ * ] [4 4]
[5 8] [ * ] [ * ]
4x 2hits。 119 + 4 = 123 当然,模式匹配可用于以类似方式产生Java解决方案。     ,我不喜欢你的方法。它太复杂了。我将创建一个具有值字段的Card类(带有一个String的构造函数,该构造函数在文件中找到的那个)。这样一来,您就可以得到每张2张牌并检查值是否等于21。