Что я делаю не так, как счетчик файлов блэкджека в Java?

Я делаю это упражнение, в упражнении сказано следующее:

* Учитывая входной файл, содержащий 1000 случайных комбинаций блэкджека между 3 игроками (здесь: 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, но это неверно.


person bentham    schedule 24.05.2011    source источник
comment
Пожалуйста, определите, что вы имеете в виду под моим неудачным ответом. Что именно не работает?   -  person Oliver Charlesworth    schedule 25.05.2011
comment
Я не получаю ошибки в коде, просто ответы, которые я получаю, не работают   -  person bentham    schedule 25.05.2011
comment
Не получается как? Какой результат вы получаете? Какого результата вы ждали?   -  person Oliver Charlesworth    schedule 25.05.2011
comment
Я получаю 119, но когда я захожу на cstutoringcenter.com/problems/problems.php ? id = 16 В нем написано, что мои ответы неверны   -  person bentham    schedule 25.05.2011


Ответы (3)


Ваши условия в каждом if трудно читать со всеми фигурными скобками, но кажутся нормальными. Ваша проблема заключается в else if. Игрок №1 и Игрок №2 (и Игрок №3) могут играть в блэкджек одновременно, тогда как ваш код учитывает только 1 из них.

Отбросьте else, и все будет в порядке.

Вы также можете немного улучшить читаемость вашего кода. Некоторые указатели:

  • Проверка рук 2-го и 3-го игроков включает ту же логику, что и проверка первых рук. Используйте петлю.
  • Вместо того, чтобы явно проверять наличие определенных карт, возможно, вы можете рассчитать ценность руки и проверить, равно ли она 21. Было бы неплохо выделить эту логику в отдельный метод.
  • Простой способ вычислить значение руки (при условии, что ввод всегда допустим) - отказаться от масти (поскольку это не имеет значения) и использовать предопределенную карту для определения значения карты (например, «J» => 10, «A» - 11 и т. Д. )
person ChssPly76    schedule 24.05.2011
comment
Большое спасибо, сейчас мои ответы 123, я удаляю еще и все в порядке - person bentham; 25.05.2011

Короткая команда 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 2хита. 119 + 4 = 123

Разумеется, сопоставление с образцом можно было бы использовать для создания Java-решения аналогичным образом.

person user unknown    schedule 25.05.2011
comment
Вы можете объяснить это, я не понимаю, что вы делаете? - person bentham; 31.05.2011
comment
Вы знаете sed? Это потоковый редактор, который в основном используется для сопоставления с образцом и замены очень короткими командами. Я изменяю все входные строки, например «4H 5C AD JH 9C 10H». Нас не волнуют цвета (HCDHCH), поэтому мы можем их удалить. Нам не нужно различать 10, J, Q, K. Поэтому я преобразовываю JQK10 в +, а + A и A + в *, чтобы отметить все блэкджеки. С помощью grep я фильтрую строки, которые теперь содержат один или несколько *, и подсчитываю их. Затем я перечисляю те строки, которые содержат более одного *. Я использовал sed / grep / wc только для быстрого прототипирования. - person user unknown; 31.05.2011
comment
Эквивалентное решение на Java включало бы несколько операторов line.replaceAll (pattern, replacement);. - person user unknown; 31.05.2011

Мне не нравится твой подход. Это слишком сложно. Я бы создал класс Card (с конструктором, который принимает String, те, которые находятся в файле), у которого есть поле значения. Таким образом, вы могли просто взять каждую комбинацию из двух карт и проверить, равны ли значения 21.

person hvgotcodes    schedule 25.05.2011
comment
Да, он более объектно-ориентированный, я пробую это упражнение, чтобы закрепить свои навыки в java, но я знаю, что это первое, что приходит мне в голову - person bentham; 25.05.2011