Что я делаю неправильный счетчик файлов блэкджек в Java? - PullRequest
1 голос
/ 25 мая 2011

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

* Учитывая входной файл, содержащий 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, но это неправильно.

Ответы [ 3 ]

4 голосов
/ 25 мая 2011

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

Бросьте else, и выдолжно быть в порядке.

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

  • Проверка рук 2-го / 3-го игрока включает ту же логику, что и первая.Используйте цикл.
  • Вместо того, чтобы явно проверять конкретные карты, возможно, вы сможете вычислить значение раздачи и проверить, равно ли оно 21. Было бы неплохо поместить эту логику в отдельный метод.
  • Простой способ вычислить ценность руки (при условии, что ввод всегда допустим) - сбросить масть (поскольку она не имеет значения) и использовать предопределенную карту для определения значения карты (например, «J» => 10, «A» - 11и т. д.)
1 голос
/ 25 мая 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 аналогичным образом.

0 голосов
/ 25 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...