战舰坐标输入(带字母)Java
我是新来的(一般来说是stackoverflow和编程),我正在尝试用Java创建一个战舰游戏。我对我所拥有的非常满意,并且意识到代码可能不是最有效的,但这不是我想要解决的问题 当输入你的船在哪里,或者攻击在哪里时,在我得到它之前,它会询问列是什么,然后分别询问行是什么。现在,我正在尝试创建一个方法(称为坐标,这是最后一个),允许您一起输入坐标(格式为“A1”)。它工作得很好,直到输入错误(有两个字母,两个数字,里面什么都没有,等等) 另一件事是在coordinates方法中,在catch中我必须输入return 20,因为它表示缺少return语句,但实际上我不需要返回任何东西,因为这在do-while循环中。我该怎么做才能把它拿走 这是我在这个网站上的第一个问题,所以我不知道是否有人会需要这个(我不知道是否有任何规则禁止不必要的代码),但我将把整个程序以及一个示例输出留在这里战舰坐标输入(带字母)Java,java,text-based,Java,Text Based,我是新来的(一般来说是stackoverflow和编程),我正在尝试用Java创建一个战舰游戏。我对我所拥有的非常满意,并且意识到代码可能不是最有效的,但这不是我想要解决的问题 当输入你的船在哪里,或者攻击在哪里时,在我得到它之前,它会询问列是什么,然后分别询问行是什么。现在,我正在尝试创建一个方法(称为坐标,这是最后一个),允许您一起输入坐标(格式为“A1”)。它工作得很好,直到输入错误(有两个字母,两个数字,里面什么都没有,等等) 另一件事是在coordinates方法中,在catch中我必
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);
}
}