我在 Java 中做错了啥二十一点文件计数器?
Posted
技术标签:
【中文标题】我在 Java 中做错了啥二十一点文件计数器?【英文标题】:What am I doing wrong blackjack file counter in Java?我在 Java 中做错了什么二十一点文件计数器? 【发布时间】:2011-09-01 08:48:32 【问题描述】:我在做这个练习,练习说:
*给定一个包含 3 位玩家之间的 1000 个随机二十一点手牌的输入文件(此处:blackjack.txt),计算所有游戏中任何玩家遇到的二十一点的数量。
21 点被定义为任何花色的 A 和任何花色的 10 点牌(J、Q、K 或 10)。
输入文件如下所示:(作为示例)
4H 5C AD JH 9C 10H
这意味着玩家 1 有红桃 4 和梅花 5;玩家 2 有方块 A 和红心 J(算作二十一点);玩家 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,但是是错误的。
【问题讨论】:
请定义“我的回答失败”是什么意思。究竟是什么不起作用? 我没有收到代码错误,只是我获得的答案失败 失败怎么办?你得到什么结果?你期待什么结果? 我得到 119,但是当我输入 cstutoringcenter.com/problems/problems.php?id=16 时,它说我的答案是错误的 【参考方案1】:您在每个if
中的条件都很难用大括号阅读,但看起来还可以。
你的问题在于else if
。玩家 #1 和玩家 #2(以及玩家 #3)可以同时拥有二十一点,因为您的代码只会计算其中的 1 个。
放下else
,你应该会没事的。
您还可以稍微提高代码的可读性。一些建议:
检查第 2 名/第 3 名玩家的手牌涉及与第一次相同的逻辑。使用循环。 也许您可以计算手牌的价值并检查它是否等于 21,而不是显式检查特定的牌。最好将该逻辑放在单独的方法中。 计算手牌价值的简单方法(假设输入始终合法)是放下花色(因为它无关紧要)并使用预定义的地图来确定牌面价值(例如“J” => 10、“A” - 11等)【讨论】:
非常感谢,我现在的答案是 123,我删除 else 就可以了【参考方案2】:我不喜欢你的做法。它太复杂了。我将创建一个具有值字段的 Card 类(带有一个采用 String 的构造函数,即在文件中找到的那些)。这样你就可以拿到每张 2 张牌并检查数值是否等于 21。
【讨论】:
是的,它更面向对象,我正在尝试这个练习来加强我在 Java 方面的技能,但我知道这是我想到的第一个【参考方案3】:要验证的简短 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] [ * ] [ * ]
4 次 2 次点击。 119+4 = 123
模式匹配当然可以以类似的方式用于生成 java 解决方案。
【讨论】:
你能解释一下吗,我不明白你在做什么? 你知道sed吗?它是一个流编辑器,主要用于进行模式匹配和替换非常短的命令。我修改了所有输入字符串,例如“4H 5C AD JH 9C 10H”。我们不关心颜色(HCDHCH),所以我们可以删除它们。我们不需要区分 10、J、Q、K。所以我将 JQK10 转换为 +,并将 +A 和 A+ 转换为 *,以标记所有二十一点。使用 grep 我过滤现在包含一个或多个 * 的行并计算它们。然后我列出了那些包含多个 * 的行。我使用 sed/grep/wc 只是为了快速制作原型。 Java 中的等效解决方案将涉及多个line.replaceAll (pattern, replacement);
语句。以上是关于我在 Java 中做错了啥二十一点文件计数器?的主要内容,如果未能解决你的问题,请参考以下文章