【问题标题】:Simple 2d array java game简单的二维数组java游戏
【发布时间】:2013-03-11 01:32:35
【问题描述】:

我正在尝试用 Java 编写一个简单的游戏,它使用 2d 数组创建一个点网格,供用户继续前进。我已经做到了,我已经到了要求用户选择他们的动作的地步,但是,在那之后,我想重新打印网格,而他们的旧空间是空的,并且在他们搬到的空间。我不确定如何重新打印网格,因为当我第一次打印它时,我使用了一个 if 语句来告诉循环不要在哪里放置点。我将在下面发布代码,非常感谢提示!

import java.util.Scanner;
import java.util.Random;
public class main {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    char[][] gridArray = new char[10][10];
    int randomRow;
    int randomCol;
    int randomRow2;
    int randomCol2;
    String moveSelect;
    boolean validInput = true;

    int min = 0;
    int max = 9;

    Random tRNG = new Random();
    randomRow = tRNG.nextInt(max - min + 1) + min;
    randomCol = tRNG.nextInt(max - min + 1) + min;
    randomRow2 = tRNG.nextInt(max - min + 1) + min;
    randomCol2 = tRNG.nextInt(max - min + 1) + min;

    gridArray[randomRow][randomCol] = 'o';
    gridArray[randomRow2][randomCol2] = 'X';

    for (int i = 0; i < gridArray.length; i++)
    {
        for (int j = 0; j < gridArray.length; j++)
        {       
            if (gridArray[i][j] != gridArray[randomRow][randomCol] && gridArray[i][j] != gridArray[randomRow2][randomCol2])
            {
                gridArray[i][j] = '.';
            }
            System.out.print(gridArray[i][j]);
        }
        System.out.println("");  
    }

    System.out.println("Enter a movement choice W A S or D");
    do{

        Scanner keyboard = new Scanner(System.in);
        moveSelect = keyboard.nextLine();

        if ( moveSelect.equals("w"))
        {
            gridArray[randomRow][randomCol] = gridArray[randomRow+1][randomCol];
            gridArray[randomRow][randomCol] = ' ';
            validInput = true;      
        }

        else if ( moveSelect.equals("a"))
        {
            gridArray[randomRow][randomCol] = gridArray[randomRow][randomCol-1];
            gridArray[randomRow][randomCol] = ' ';
            validInput = true;
        }

        else if ( moveSelect.equals("s"))
        {
            gridArray[randomRow][randomCol] = gridArray[randomRow-1][randomCol];
            gridArray[randomRow][randomCol] = ' ';
            validInput = true;
        }

        else if (moveSelect.equals("d"))
        {
            gridArray[randomRow][randomCol] = gridArray[randomRow][randomCol+1];
            gridArray[randomRow][randomCol] = ' ';
            validInput = true;
        }

        else
        {
            System.out.println("Invalid Entry. Try again.");
            validInput = false;
        }

    } while (validInput == false);
}

}

【问题讨论】:

  • 你能指定w、a、s、d分别对应什么吗? (如上、下、左和右)。此外,您需要进行验证以确保它们的移动不会使它们超出数组的范围。
  • 我的错误,w = 上,a = 左,s = 下,d = 右。我明白你的意思,如果它超出范围,但不确定如何处理它
  • 如果 w 向上而 s 向下,则表示添加的行混淆了,您应该根据打印方式减去以转到更高的行。
  • 啊,是的,我会解决的。至于重印数组,最好的方法是什么?
  • 在考虑有效输入之前为每件事添加一个检查。所以在w中,检查是否randomRow==0,这种情况下上不去,所以应该设置validInput=false,不要重置grid里面的东西。当我回答您的实际问题时,我会将其移至答案部分,我将这样做。

标签: java arrays 2d


【解决方案1】:

我认为大多数问题来自于对数组的普遍混淆。例如。当您按下 w 时,代码块中的行会运行:

gridArray[randomRow][randomCol] = gridArray[randomRow+1][randomCol];

将 randomRow, randomCol 处的数组的 char 值(在本例中为“x”)设置为其下一行的数组空间 randomRow+1, randomCol 的 char 值。然后是之后的代码行:

gridArray[randomRow][randomCol] = ' ';

为同一空间分配一个新值,使上面的代码毫无价值!最后,randomRow 和 randomCol 永远不会被修改。 (您也对 x 以更高的行值移动的方式有些困惑)

在这个代码块中你真正需要做的就是:

randomRow -= 1;

在此之后,您可以使用之前的打印代码简单地重新打印整个网格。尽管此代码还存在其他问题,使其远非最佳。还有一个类似的问题,即 for 循环中的 if 语句有效,但后来导致了问题。只需重写它以修复所有错误,您会得到:

char[][] gridArray = new char[10][10];
int randomRow;
int randomCol;
int randomRow2;
int randomCol2;
String moveSelect;
boolean validInput = true;

int min = 0;
int max = 9;

Random tRNG = new Random();
randomRow = tRNG.nextInt(max - min + 1) + min;
randomCol = tRNG.nextInt(max - min + 1) + min;
randomRow2 = tRNG.nextInt(max - min + 1) + min;
randomCol2 = tRNG.nextInt(max - min + 1) + min;

gridArray[randomRow][randomCol] = 'o';
gridArray[randomRow2][randomCol2] = 'X';

for (int i = 0; i < gridArray.length; i++)
{
    for (int j = 0; j < gridArray.length; j++)
    {       
        if (!((i == randomRow && j == randomCol) || (i == randomRow2 &&  j == randomCol2)))
        {
            gridArray[i][j] = '.';
        }
        System.out.print(gridArray[i][j]);
    }
    System.out.println("");  
}

System.out.println("Enter a movement choice W A S or D");
do{

    Scanner keyboard = new Scanner(System.in);
    moveSelect = keyboard.nextLine();

    if ( moveSelect.equals("w"))
    {
        randomRow -= 1;
        validInput = true;      
    }

    else if ( moveSelect.equals("a"))
    {
        randomCol -= 1;
        validInput = true;
    }

    else if ( moveSelect.equals("s"))
    {
        randomRow += 1;
        validInput = true;
    }

    else if (moveSelect.equals("d"))
    {
        randomCol -= 1;
        validInput = true;
    }

    else
    {
        System.out.println("Invalid Entry. Try again.");
        validInput = false;
    }

} while (validInput == false);
gridArray[randomRow][randomCol] = 'o';
gridArray[randomRow2][randomCol2] = 'X';

for (int i = 0; i < gridArray.length; i++)
{
    for (int j = 0; j < gridArray.length; j++)
    {       
        if (!((i == randomRow && j == randomCol) || (i == randomRow2 &&  j == randomCol2)))
        {
            gridArray[i][j] = '.';
        }
        System.out.print(gridArray[i][j]);
    }
    System.out.println("");  
}

【讨论】:

  • 另外,对于这样一个简单的任务,char[][] 可以简单地消除。
【解决方案2】:

如果validInput==true,则创建一个打印网格的方法

public static void printGrid(char[][]gridArray){
    for (int i = 0; i < gridArray.length; i++)
    {
        for (int j = 0; j < gridArray.length; j++)
        {       
            System.out.print(gridArray[i][j]);
        }
        System.out.println("");  
    }
}

我将您的 gridArray[randomRow][randomCol] 从 =' ' 修改为 ='。'因为你希望它是一个点,对吗? (如果你真的希望它成为一个空间,就让它保持原样) 为了验证,将每个方向更改为:

if ( moveSelect.equals("w")&&randomRow!=0)
        {
            gridArray[randomRow][randomCol] = gridArray[randomRow-1][randomCol];
            gridArray[randomRow][randomCol] = '.';
            validInput = true;      
        }

在做的最后,

if(validInput) printGrid(gridArray);

【讨论】:

  • 好的,我更改了每个验证,并且效果很好。我想我应该解释一下我是 Java 新手,所以我不太确定如何使用方法,但我会阅读
  • 方法是执行功能的代码块。它可以被多次调用,因此您不必重复输入的所有内容。你只要按照我在那个 if 语句中写的方式来调用它,它就会遍历方法中的所有代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多