Ввод координат линкора (с буквой) Java - PullRequest
0 голосов
/ 20 октября 2018

Я здесь новичок (stackoverflow и программирование в целом) и пытаюсь создать игру на линкоре на Java.Я вполне доволен тем, что у меня есть, и знаю, что код может быть не самым эффективным, но это не та проблема, которую я хочу здесь решить.

При вводе места для размещения вашего корабля или места для атаки, до того, как он у меня был, чтобы он спрашивал, что такое колонна, а затем отдельно, каков ряд.Сейчас я пытаюсь создать метод (называемый координатами, он последний), который позволит вам вводить координаты вместе (в формате «А1»).Он работал отлично, пока ввод не был неправильным (имелись либо две буквы, два числа, ничего в нем и т. Д ...)

Другое дело, что в методе координат в ловушке я должен был поставить return20, потому что в нем указано пропущенное возвращаемое выражение, но на самом деле мне не нужно ничего возвращать, поскольку это происходит в цикле do-while.Что я могу сделать, чтобы убрать это?

Это мой первый вопрос на этом сайте, поэтому я не знаю, понадобится ли это кому-нибудь (я не знаю, есть ли какие-либо правила против ненужного кода), но я оставлю здесь всю программу, а также пример выходных данных.

public static int firing(String[][] board, int hits, int torpedoes, int shipSize, int shipAmount, int whatPlayer)
{
    Scanner userInput = new Scanner(System.in);
    System.out.println("What coordinate do you want?");
    String coordinate = userInput.nextLine();
    int col = coordinates(coordinate, "col");
    int row = coordinates(coordinate, "row");
    while (col > 8 || col < 1 || row > 8 || row < 1)
    {
        System.out.println("That is not a valid coordinate.");
        Scanner input = new Scanner(System.in);
        System.out.println("What coordinate do you want?");
        coordinate = input.nextLine();
        col = coordinates(coordinate, "col");
        row = coordinates(coordinate, "row");
    }

}

public static int letterToNumber(String colLet)
//colLet = column in letter
//This method is to change the column letters to numbers
{
    int num = 1;
    while (!colLet.equalsIgnoreCase("A")&&
           !colLet.equalsIgnoreCase("B")&&
           !colLet.equalsIgnoreCase("C")&&
           !colLet.equalsIgnoreCase("D")&&
           !colLet.equalsIgnoreCase("E")&&
           !colLet.equalsIgnoreCase("F")&&
           !colLet.equalsIgnoreCase("G")&&
           !colLet.equalsIgnoreCase("H"))
    {
        System.out.println("That is not a valid coordinate (not one of the letters)");
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter a valid coordinate: "
                + "\nIt should be in the format 'A1' (column then row)");
        String coordinate = input.nextLine();
        colLet = "" + coordinate.charAt(0);
    }
    switch (colLet.toLowerCase())
    {
        case "a": num = 1; break;
        case "b": num = 2; break;
        case "c": num = 3; break;
        case "d": num = 4; break;
        case "e": num = 5; break;
        case "f": num = 6; break;
        case "g": num = 7; break;
        case "h": num = 8; break;
        default: System.out.println("That wasn't a letter!");
    }
    return num;
}


public static int coordinates(String coordinate, String RorC)
// RorC is for Row or column
{
    boolean isValid;
    if (RorC.equals("row"))
    {
        do
        {
            try
            {
                String rowStr = "" + coordinate.charAt(1);
                int row = Integer.parseInt(rowStr);
                isValid = true;
                return row;
            }
            catch(Exception e)
            {
                System.out.println("Error");
                Scanner userInput = new Scanner(System.in);
                System.out.println("That is an invalid coordinate (row probably only had one character)"
                        + "\nPlease enter a valid coordinate."
                        + "\nIt should be in the format 'A1' (column then row)");
                coordinate = userInput.nextLine();
                isValid = false;
                return 20;
            }
        }while(isValid = false);
    }
    else if (RorC.equals("col"))
    {
        do
        {
            try
            {
                String colLet = "" + coordinate.charAt(0);
                int col = letterToNumber(colLet);
                isValid = true;
                return col;
            }
            catch (Exception e)
            {
                System.out.println("Error");
                Scanner userInput = new Scanner(System.in);
                System.out.println(""
                        + "That is an invalid coordinate (col probably had nothing inside it)"
                        + "\nPlease enter a valid coordinate."
                        + "\nIt should be in the format 'A1' (column then row)");
                coordinate = userInput.nextLine();
                isValid = false;
                return 20;
            }
        }while(isValid=false);
    }
    else
    {
        return 0;
    }
}
}

Я знаю, что мой код не очень эффективен, но я почищу его после того, как закончу.Вот пример вывода (я не знаю, как поместить это в поле без формата кода)

It is now player 1's turn to choose where to place their ships.
Can the other player please turn around.

You will now be placing ship number 1.
Please write 'H' if you want to create a horizontal ship,
or 'V' if you want it to be vertical.
h
________________________________

   A  B  C  D  E  F  G  H  
1  -  -  -  -  -  -  -  -
2  -  -  -  -  -  -  -  -
3  -  -  -  -  -  -  -  -
4  -  -  -  -  -  -  -  -
5  -  -  -  -  -  -  -  -
6  -  -  -  -  -  -  -  -
7  -  -  -  -  -  -  -  -
8  -  -  -  -  -  -  -  -
________________________________

What coordinates do you want your ship to start on?
If it is horizontal, it will go right from there,
and if it is vertical, it will go down from there.
Please enter the coordinates in the format 'A1' (column then row).
If you enter anything after that, it will be ignored.
u9
That is not a valid coordinate (not one of the letters)
Please enter a valid coordinate: 
It should be in the format 'A1' (column then row)
a1
That is not a valid coordinate (addship).
What coordinates do you want your ship to start on?
Please enter them in the format 'A1' (column then row).
If you enter anything after that, it will be ignored.
d7
________________________________

   A  B  C  D  E  F  G  H  
1  -  -  -  -  -  -  -  -
2  -  -  -  -  -  -  -  -
3  -  -  -  -  -  -  -  -
4  -  -  -  -  -  -  -  -
5  -  -  -  -  -  -  -  -
6  -  -  -  -  -  -  -  -
7  -  -  -  S  S  S  -  -
8  -  -  -  -  -  -  -  -
________________________________

This is your board.

Буду признателен за любую помощь, даже если речь идет о чем-то другом (не проблема, которую яобращаюсь).

1 Ответ

0 голосов
/ 20 октября 2018

Я написал небольшую программу, которая вводит строку и преобразует ее в строку и столбец.Он будет постоянно спрашивать, вводит ли пользователь недопустимую строку.

Пример выполнения:

Provide a coordinate:
hello?
That is not a valid coordinate! Try again.
X4
That is not a valid coordinate! Try again.
C4
Coordinate{col=3, row=4}

Я создал вспомогательный класс для хранения координат.

Обратите внимание, как все читает /записи выполняются в одной функции (readCoordinate), а все манипуляции со строками - в другой (parseCoordinate).

Вы также можете выдать исключение, если строка пользователя недействительна, для простоты я вернул null.

package com.company;

import java.util.Scanner;

class Coordinate {
    private final int col, row;

    public Coordinate(int col, int row) {
        this.col = col;
        this.row = row;
    }

    @Override
    public String toString() {
        return "Coordinate{" +
                "col=" + col +
                ", row=" + row +
                '}';
    }
}


public class Main {
    private final Scanner input;

    public static void main(String[] args) {
        Main m = new Main();
        System.out.println(m.readCoordinate());
    }

    Main() {
        input = new Scanner(System.in);
    }

    private Coordinate readCoordinate() {
        System.out.println("Provide a coordinate:");

        while (true) {
            String line = input.nextLine();
            Coordinate c = parseCoordinate(line);

            if (c != null)
                return c;

            System.out.println("That is not a valid coordinate! Try again.");
        }
    }

    /**
     * Converts a string like A2 into a Coordinate object. Returns null if string is invalid.
     */
    public Coordinate parseCoordinate(String line) {
        line = line.trim().toLowerCase();

        if (line.length() != 2)
            return null;

        char letter = line.charAt(0);

        if (letter > 'h' || letter < 'a')
            return null;
        int col = letter - 'a' + 1;

        char number = line.charAt(1);
        if (number > '8' || number < '1')
            return null;
        int row = number - '1' + 1;

        return new Coordinate(col, row);
    }
}

Ответ на вопросы:

Что такое @Переопределить?

Это дополнительный декоратор, отмечающий, что я переопределяю метод, а не создаю новый.Если я ошибся toString, как tostring, моя IDE предупредит меня, что я не переопределил что-то.Вы можете проигнорировать это.

Почему столбец и строка в конце?Разве это не означает, что вы не можете изменить их позже?

Это означает, что вы не можете назначить их после первого присваивания (в конструкторе).Хорошей практикой является создание неизменяемых (неизменяемых == нельзя изменить) классов данных.Например, вы уверены, что если вы передадите Coordinate методу, метод не сможет изменить ваш экземпляр, и вы не получите испорченного Coordinate.

Что такое трим?

Обрезать удалить пробелы (пробел, табуляция, ...) с обоих концов строки." hello world! ".trim() - это "hello world!".

Что это за функция Main () со сканером (System.in) после метода main?

Я создал сканер один раз и использовал его много раз,Вы создали новый сканер каждый раз, когда хотите прочитать строку.Я не думаю, что это имеет значение для сканера, но в некоторых случаях вы можете потерять вещи, воссоздав объект.

В readCoordinate, что является истинным во время подготовки?

while (true) означает цикл навсегда.Есть оператор return, который разрывает бесконечный цикл.

В parseCoordinate, когда вы определяете col, как вы добавляете символ в int?

Символы представляются с помощью чисел, поэтому символы являются числамипод капотом.В Java char похоже на 16-разрядное целое число без знака, вы можете выполнять обычные целочисленные вычисления на них.

почему readCoordinate типа Coordinate и почему он частный?

Невозиться с модификаторами доступа, пока вы не станете лучше с программированием.Это не имеет большого смысла в небольших программах.Вы можете указать, какие методы следует вызывать извне, а какие - нет.

...