我正在做这个练习,练习说:
*如果输入文件包含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,但是错了。
答案 0 :(得分:4)
每个if
的条件很难用所有大括号阅读,但似乎没问题。
你的问题在于else if
。玩家#1和玩家#2(和玩家#3)可以同时拥有二十一点 ,因为您的代码只会计算其中一个。
删除else
,你应该没问题。
您还可以稍微提高代码的可读性。一些指示:
答案 1 :(得分:1)
要验证的短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)。
Multimatches:
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解决方案。
答案 2 :(得分:0)
我不喜欢你的做法。它太复杂了。我将创建一个Card类(带有一个构造函数,它带有一个String,在文件中找到的那个),它有一个值字段。这样你就可以得到每张2张牌并检查值是否等于21。