-2

这是我的井字游戏程序的接受函数,因此s只会以字符串格式存储数据,介于 0,0 或 2,2 之间。

我现在正在使用该getNumericValue函数将数字分别存储在pq中,但是在运行时,StringIndexOutOfBounds尝试将值存储在p.

仅当在 accept() 之前调用用于决定 x 或 O 的 choice() 函数时才会出现问题,否则它运行良好。选择()函数有什么问题?

void accept()throws IOException
{
    System.out.println("Your move:");
    String s=xy.readLine();

    int p = (Character.getNumericValue(s.charAt(0)))-1;
    int q = Character.getNumericValue(s.charAt(2))-1;
    if(ar[p][q]==0)
        ar[p][q]=1;
    else
    {
        System.out.println("You can't capture a location that has already been captured!");
        accept();
    }
}



void choice() throws IOException
    {
        System.out.println("Welcome to tictactoe");
        System.out.print("Enter your weapon X or O : ");
        chp = Character.toUpperCase((char)xy.read());

        if (chp=='X')
            chc='O';
        else 
            chc = 'X';

        System.out.println("kkbot chose: "+ chc);
    }
4

3 回答 3

1

你的问题是:

这是我的井字游戏程序的接受函数,所以 s 只会以 0,0 或 2,2 之间的格式存储数据。

但是你的代码会:

String s=xy.readLine();
int p = (Character.getNumericValue(s.charAt(0)))-1;
int q = Character.getNumericValue(s.charAt(2))-1;

用户可以输入他想要的任何内容。readLine()中的任何内容都不会阻止他添加空字符串或太长的字符串!

在对该字符串进行任何操作之前,您已验证它是否具有假定的长度;像:

String inputFromUser = "";
do {
  System.out.println("Your move [enter a value like A1]: ");
  inputFromUser = scanner.readLine();
} while (inputFromUser.length != 2);

除此之外:请为您的变量使用真实姓名。s, xy, p, q ...没有告诉读者这些变量的用途。是的,您在打字时节省了一些时间;以后阅读源代码时,您将花费 10 倍的时间;而且你用那些难看的单字符名字也大大增加了愚蠢错别字的可能性!

于 2017-01-13T08:16:55.380 回答
0

0,0如果您只是想将值存储1,1在两个单独的int变量中,那应该是一个简单的过程。不过,您应该对错误输入采取预防措施。因此,您的accept()方法应该是这样的:

public void accept(){
        Scanner sc = new Scanner(System.in);
        System.out.println("Your move [Enter marking position in the form x,y]: ");
        String userInput = sc.nextLine();
        String[] userMarkedPositions = userInput.split(",");
        if(userMarkedPositions.length == 2){
            int x = Integer.parseInt(userMarkedPositions[0]);
            int y = Integer.parseInt(userMarkedPositions[1]);
            //Followed by your other operations
            //....
            //....
        }else{
            System.out.println("Invalid input!!");
            System.out.println("Input should be in the form of x,y");
            accept();
        }
        sc.close();
    }

就像@GhostCat 正确提到的那样,您应该为变量使用正确的名称。这提高了代码的可读性。

于 2017-01-13T09:35:01.333 回答
0

嘿,我终于在代码中发现了问题。choice() 函数接受一个字符,但是在接受字符串之后,机器不会让用户有机会输入字符串,而是自动将 null 作为输入字符串(在字符后按空格时产生)。

问题

每当尝试在 CHAR 之后接受字符串或任何其他数据类型时,都会产生此问题,例如,在输入 'ch' 之后输入 's'。

解决方案

将输入读取为字符串,并提取第一个字符以消耗并丢弃后续的空格和换行符,不过我也找到了解决此问题的方法。:)

import java.io.*;
class tictactoe
{
    BufferedReader xy=new BufferedReader(new InputStreamReader(System.in));
    void accept()throws IOException
    {
        System.out.println("Enter your weapon X or O : ");
        char ch = xy.readLine().charAt(0);  #Ahaaa momemt
    
        System.out.println("Your move:");
        String s=xy.readLine();              
    }
}
于 2017-01-13T13:00:07.123 回答