2016-09-28 55 views
1

我有一个java的任务是要求一个代码,告诉用户输入一个点(行和列或x和y)和程序输出所有可能的移动棋的骑士。如果语句产生乱码输出

package datastructureass1; 
import java.util.Scanner; 

public class DataStructureAss1 { 

    public static void main(String[] args) { 
     Scanner cin = new Scanner (System.in); 

     int knight[][]= new int [7][7]; 

        System.out.println("Please enter the knight's position starting with rows followed by columns"); 
         int i=cin.nextInt();  
         int j=cin.nextInt(); 

         i=i+2; 
         j=j+1; 
         if (i<=8&&j<=8) 

          System.out.println("{"+knight[i]+","+knight[j]+"}"); 

         i= i+2; 
         j=j-1; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}"); 

         i= i-2; 
         j=j+1; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}"); 
         i= i-2; 
         j=j-1; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}"); 

         i= i+1; 
         j=j+2; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}"); 
         i= i+1; 
         j=j-2; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}"); 
         i= i-1; 
         j=j+2; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}");  
         i= i-1; 
         j=j-2; 
         if (i<=8&&j<=8); 
          System.out.println("{"+knight[i]+","+knight[j]+"}"); 

    } 

       } 

当我在NetBeans中运行这个它给了我这样的输出:

{[[email protected],[[email protected]} 

{[[email protected],[[email protected]} 

{[[email protected],[[email protected]} 

{[[email protected],[[email protected]} 

{[[email protected],[[email protected]} 

{[[email protected],[[email protected]} 

{[[email protected],[[email protected]} 

它没有任何意义,我不知道我做错了什么在我的代码!

+2

你指向一个数组而不是数组索引....使用骑士[i] [j] – Rishi

+0

这是怎么得到upvote? – shmosel

回答

0

您需要封闭加法和减法运算为i和j括号内为if语句只获取的条件

1

你有一个二维数组执行,这是一个数组的数组:

[ 
    [ 0,1,2,3 ...], 
    [...], 
    [...] 
] 

当寻址数组中的位置,你会得到阵列在该位置,即

int[] knightAtI = knight[i]; 

由于int[]数组是一个对象,toString()方法将返回一个引用字符串。

所以,你要么必须使用两个坐标来访问现场:

int knightAtIandJ = knight[i][j] 

或者你转换阵列在我的字符串:

String knightAtI = Arrays.toString(knight[i]) 
+0

很好的答案。你能否解释一下'[I @ 6ac1abcf'是什么? – Gray

+0

这是'java.lang.Object'中定义的'toString()'的默认实现的输出,它是_objectsClassName_ + @ + _objectsHashCodeAsHexString_。 ''我是一个基本的int数组的类名(尝试'int []。class.toString()'), –

1

knight[i]knight[j]将指向一个内存位置因为knight是一个二维数组。 所以你必须使用knight[i][j]打印数组的值。

0

该代码指向一个数组而不是数组索引....使用knight [i] [j],由于数组的哈希码正在打印而不是实际值。

knight[i]  <-- it is an array 
knight[i][j] <-- it is j element in knight[i] array. 
1

你的数组没有意义。你想用它做什么? 要打印你想要的位置,使用方法:

System.out.println("(" + i + ";" + j + ")"); 
0

你大部分的if语句有右括号后立即分号,因而下一行代码是if语句之外。像@Amer Qarabsa所说的那样,并且总是将if语句的主体放在花括号内,并且非常小心,不要在末尾括号和左括号之间放置分号。