战舰坐标输入(带字母)Java

战舰坐标输入(带字母)Java,java,text-based,Java,Text Based,我是新来的(一般来说是stackoverflow和编程),我正在尝试用Java创建一个战舰游戏。我对我所拥有的非常满意,并且意识到代码可能不是最有效的,但这不是我想要解决的问题 当输入你的船在哪里,或者攻击在哪里时,在我得到它之前,它会询问列是什么,然后分别询问行是什么。现在,我正在尝试创建一个方法(称为坐标,这是最后一个),允许您一起输入坐标(格式为“A1”)。它工作得很好,直到输入错误(有两个字母,两个数字,里面什么都没有,等等) 另一件事是在coordinates方法中,在catch中我必

我是新来的(一般来说是stackoverflow和编程),我正在尝试用Java创建一个战舰游戏。我对我所拥有的非常满意,并且意识到代码可能不是最有效的,但这不是我想要解决的问题

当输入你的船在哪里,或者攻击在哪里时,在我得到它之前,它会询问列是什么,然后分别询问行是什么。现在,我正在尝试创建一个方法(称为坐标,这是最后一个),允许您一起输入坐标(格式为“A1”)。它工作得很好,直到输入错误(有两个字母,两个数字,里面什么都没有,等等)

另一件事是在coordinates方法中,在catch中我必须输入return 20,因为它表示缺少return语句,但实际上我不需要返回任何东西,因为这在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;
    }
}
}

如果您有任何帮助,我将不胜感激,即使是关于不同的东西(不是我要解决的问题)。

我编写了一个小程序,输入字符串并将其转换为行和列。它将不断询问用户是否输入了无效字符串

样本运行:

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);
    }
}
package.com公司;
导入java.util.Scanner;
类坐标{
世界其他地区的非公开最终int col;
公共坐标(整数列,整数行){
this.col=col;
this.row=行;
}
@凌驾
公共字符串toString(){
返回“坐标{”+
“col=”+col+
“,row=“+行+
'}';
}
}
公共班机{
专用最终扫描仪输入;
公共静态void main(字符串[]args){
Main m=新的Main();
System.out.println(m.readCoordinate());
}
Main(){
输入=新扫描仪(System.in);
}
专用坐标readCoordinate(){
System.out.println(“提供坐标:”);
while(true){
String line=input.nextLine();
坐标c=坐标(直线);
如果(c!=null)
返回c;
System.out.println(“该坐标无效!请重试”);
}
}
/**
*将类似A2的字符串转换为坐标对象。如果字符串无效,则返回null。
*/
公共坐标(字符串线){
line=line.trim().toLowerCase();
如果(line.length()!=2)
返回null;
字符字母=line.charAt(0);
如果(字母>'h'| |字母<'a')
返回null;
int col=字母-‘a’+1;
字符号=行字符(1);
如果(编号>'8'| |编号<'1')
返回null;
整行=数字-'1'+1;
返回新坐标(列、行);
}
}

对问题的答复:

什么是@Override? 它是一个可选的装饰器,标记我正在重写一个方法,而不是创建一个新方法。如果我拼错了
toString
toString
一样,我的IDE将警告我实际上没有重写某些内容。你可以忽略它

为什么col和row是最终的?这不意味着你以后不能改变它们吗? 这意味着您不能在第一次赋值之后(在构造函数中)赋值给它们。创建不可变(immutable==不能更改)数据类是一种很好的做法。例如,如果您将
坐标
传递给一个方法,该方法将无法修改您的实例,您将不会得到一个混乱的
坐标

什么是修剪? 修剪删除字符串两端的空白(空格、制表符等)<代码>“你好,世界!”。trim()是
“你好,世界!”

Main方法后面的Scanner(System.in)的Main()是什么? 我创建了一次扫描仪,并多次使用它。每次要读取字符串时,都会创建一个新的扫描仪。我认为这对扫描仪来说并不重要,但在某些情况下,重新创建一个对象可能会丢失一些东西

在ReadCoordination中,while条件反射中的真实值是什么?
while(true)
表示永远循环。有一个return语句打破了原本无限的循环

在parseCoordinate中,定义col时,如何将字符添加到int? 字符是用数字来表示的,所以字符是隐藏的数字。在Java中,char类似于一个16位无符号整数,您可以对其进行普通的整数计算

为什么readCoordinate的类型是Coordinate,为什么它是私有的?
在编程变得更好之前,不要使用访问修饰符。这在小程序中没有多大意义。您可以标记哪些方法应该从外部调用,哪些方法不应该从外部调用。

您应该发布一个。不要给人们太多的东西去挖掘。请详细说明你的问题,并向我们展示相关代码。是否希望函数获取字符串并将其转换为坐标?比如将“C2”转换为(2,1)?确切地说是@Armanodookhani,它是有效的,但是当我输入不同的东西时,比如两个字母、一个空格或两个数字,它就不起作用了@khelwood,我会尝试编辑它,所以需要显示的是如何,非常感谢。不过,在您的代码中有一些我不理解的地方。很抱歉,有很多问题,我只是在java方面不是很高级(特别是在类和对象方面)。首先,w
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);
    }
}