Программа создает 3 последовательных значений на сетке 7х7; пользователь должен угадать расположение


Я изучаю Java с головой в Java.

Я создал программу, которая создает сетку 7х7 (А0 на g6) и находится объект 3 последовательных значений внутри него. Пользователь должен угадать расположение и, когда нашел 3 значения, то программа подтвердит, что объект будет уничтожен.

Моя проблема сейчас заключается в том, что я не доволен своей текущей реализации, даже если она работает.

В классе DotComBust, где главный сидит, я создал эти 3 последовательных значений на сетке 7х7 и потом присвоить их поле ArrayList в Дотком. Затем, я попросил пользователя для входа и его вклад передается в метод, который пересекает это поле ArrayList и удаляет это значение из списка, если он там есть. После того как все 3 значения выбиваются, программа делает вывод, что объект был убит и выходы количество догадок.

Есть 96 строк кода, которые соответствуют к созданию этой сетки (строки 14 до 115). Я думаю, что это слишком много и я не уверен, если моя логика неправильная, выбор высказываний, или обоих.

DotCom.java

import java.util.ArrayList;

public class DotCom {

    private ArrayList<String> locationCells;
    private int numOfHits = 0;

    public DotCom() {

    }

    public void setLocationCells(ArrayList<String> locs) {
        locationCells = locs;
    }

    public String checkYourself (String stringGuess) {
        String result = "miss";

        int index = locationCells.indexOf(stringGuess);
        if (index >= 0) {
            locationCells.remove(index);
            if (locationCells.isEmpty()) {
                result = "kill";
            } else {
                result = "hit";
            }
        }
        System.out.println(result);
        return result;
    }

}

DotComBust.java (главный и где создается "сетка")

import java.util.ArrayList;
import java.util.Scanner;

public class DotComBust {

    public static void main(String[] args) {

        int numOfGuesses = 0;

        DotCom dot = new DotCom();

        int firstLocationVInteger = (int) (Math.random() * 7);
        int firstLocationH = (int) (Math.random() * 7);
        int secondLocationVInteger = 0;
        int thirdLocationVInteger = 0;
        int secondLocationH = 0;
        int thirdLocationH = 0;
        int directionChoice;
        if (((firstLocationVInteger >= 0) && (firstLocationVInteger <= 4)) && ((firstLocationH >= 0) && (firstLocationH <= 4))) {
            // 0 for down, 1 for right
            directionChoice = (int) (Math.random() * 2);
            if (directionChoice == 0) {
                secondLocationVInteger = firstLocationVInteger + 1;
                thirdLocationVInteger = firstLocationVInteger + 2;
                secondLocationH = firstLocationH;
                thirdLocationH = firstLocationH;
            } else {
                secondLocationH = firstLocationH + 1;
                thirdLocationH = firstLocationH + 2;
                secondLocationVInteger = firstLocationVInteger;
                thirdLocationVInteger = firstLocationVInteger;
            }
        }
        else {
            // 0 for up, 1 for left
            directionChoice = (int) (Math.random() * 2);
            if (directionChoice == 0) {
                secondLocationVInteger = firstLocationVInteger - 1;
                thirdLocationVInteger = firstLocationVInteger - 2;
                secondLocationH = firstLocationH;
                thirdLocationH = firstLocationH;
            } else {
                secondLocationH = firstLocationH - 1;
                thirdLocationH = firstLocationH - 2;
                secondLocationVInteger = firstLocationVInteger;
                thirdLocationVInteger = firstLocationVInteger;
            }
        }

        String firstLocationV;
        switch (firstLocationVInteger) {
            case 0:     firstLocationV = "A";
                break;
            case 1:     firstLocationV = "B";
                break;
            case 2:     firstLocationV = "C";
                break;
            case 3:     firstLocationV = "D";
                break;
            case 4:     firstLocationV = "E";
                break;
            case 5:     firstLocationV = "F";
                break;
            case 6:     firstLocationV = "G";
                break;
            default:    firstLocationV = "Invalid range";
                break;
        }

        String secondLocationV;
        switch (secondLocationVInteger) {
            case 0:     secondLocationV = "A";
                        break;
            case 1:     secondLocationV = "B";
                        break;
            case 2:     secondLocationV = "C";
                        break;
            case 3:     secondLocationV = "D";
                        break;
            case 4:     secondLocationV = "E";
                        break;
            case 5:     secondLocationV = "F";
                        break;
            case 6:     secondLocationV = "G";
                        break;
            default:    secondLocationV = "Invalid range";
                        break;
        }

        String thirdLocationV;
        switch (thirdLocationVInteger) {
            case 0:     thirdLocationV = "A";
                        break;
            case 1:     thirdLocationV = "B";
                        break;
            case 2:     thirdLocationV = "C";
                        break;
            case 3:     thirdLocationV = "D";
                        break;
            case 4:     thirdLocationV = "E";
                        break;
            case 5:     thirdLocationV = "F";
                        break;
            case 6:     thirdLocationV = "G";
                        break;
            default:    thirdLocationV = "Invalid range";
                        break;
        }

        //concatenate
        String firstLocation = firstLocationV + Integer.toString(firstLocationH);
        String secondLocation = secondLocationV + Integer.toString(secondLocationH);
        String thirdLocation = thirdLocationV + Integer.toString(thirdLocationH);

        ArrayList<String> locations = new ArrayList<>();
        locations.add(firstLocation);
        locations.add(secondLocation);
        locations.add(thirdLocation);
        dot.setLocationCells(locations);

        Scanner sc = new Scanner(System.in);

        boolean isAlive = true;
        while (isAlive) {
            System.out.print("Enter your guess: ");
            String userGuess = sc.next();
            String result = dot.checkYourself(userGuess);
            numOfGuesses++;

            if (result.equals("kill")) {
                    isAlive = false;
                    System.out.println("You took " + numOfGuesses + " guesses.");
            }
        }

    }
}

Пример вывода

...
Enter your guess: F0
miss
Enter your guess: F1
miss
Enter your guess: F2
miss
Enter your guess: F3
miss
Enter your guess: F4
miss
Enter your guess: F5
miss
Enter your guess: F6
miss
Enter your guess: G0
miss
Enter your guess: G1
hit
Enter your guess: G2
hit
Enter your guess: G3
kill
You took 47 guesses.


Комментарии
3 ответа


  1. все переключения, заявления такие же, просто ссылаться на разные переменные -> положите в способ и передать его переменной для запроса. Кроме того, все переключатели заявление может быть заменен, получив индекс инт-место, из строка "ABCDEFG":
    locationStr = "ABCDEFG".substring(locationInt, locationInt+1); и вы можете поймать IndexOutOfBoundsException чтобы обнаружить вне диапазона int значение

  2. вы уже используете коллекция для размещения. вместо того, чтобы держать три отдельный набор переменных для V/H, а остаток-> использовать коллекции для них.

3
ответ дан 10 апреля 2018 в 11:04 Источник Поделиться

Немного опоздала на вечеринку, но вот некоторые мысли.

Для этого типа проекта, я найти большой простоте в представлении каждой точке на сетке с классом(Cell). Поскольку размер платы известен перед началом игры, простой 2D массив типа Cell идеально подходит для представления совету. Это довольно тривиальный вопрос, чтобы преобразовать читаемый представление координат в индексы массива.

На следующем занятии я хотел бы сделать это Location класс для представления координаты каждой ячейки. Основным преимуществом этого, вы не только можете назвать координаты частей(row,col), вы можете очень легко включить местоположения в поле в ячейке класса.

Одна вещь, я заметил, где вы могли бы реально использовать некоторые улучшения принятии решения о направлении мишени будет лежать. Считают, что направление может быть представлено смещения начального местоположения. Если мы рассмотрим начальное местоположение со смещением 0,0, а затем в направлении сверху и справа будут -1,1 и т. д.

-------------------
|-1,-1|-1, 0|-1, 1|
-------------------
| 0,-1| 0, 0| 0, 1|
-------------------
| 1,-1| 1, 0| 1, 1|
-------------------

Чтобы сохранить параметр ячейки в этом направлении, просто добавить смещение к каждой координате на сколько клеток вы хотите установить. Взять случайное целое число возвращающихся любое значение от 0 - 2 и вычесть единицу, чтобы получить случайное смещение по одной координате.

2
ответ дан 10 апреля 2018 в 11:04 Источник Поделиться

Предполагая, что все три блока же вы можете заполнить сетку так:

    int firstLocationVInteger = 0;
int secondLocationVInteger = 0;
int thirdLocationVInteger = 0;
int firstLocationH = 0;
int secondLocationH = 0;
int thirdLocationH = 0;

int firstLocNum1 = (int) (Math.random() * 5);
int firstLocNum2 = (int) (Math.random() * 7);

if ((int) (Math.random() * 2) == 0) { //horizontal
firstLocationVInteger = firstLocNum2;
secondLocationVInteger = firstLocNum2;
thirdLocationVInteger = firstLocNum2;
firstLocationH = firstLocNum1;
secondLocationH = firstLocNum1 + 1;
thirdLocationH = firstLocNum1 + 2;
} else { //vertical
firstLocationVInteger = firstLocNum1;
secondLocationVInteger = firstLocNum1 + 1;
thirdLocationVInteger = firstLocNum1 + 2;
firstLocationH = firstLocNum2;
secondLocationH = firstLocNum2;
thirdLocationH = firstLocNum2;
}

Это может быть улучшено с помощью коллекции на месте, как уже упоминалось.

0
ответ дан 10 апреля 2018 в 02:04 Источник Поделиться