0

ユーザーが先に進むために、2次元配列を使用してドットのグリッドを作成する単純なゲームを Java で作成しようとしています。私はそれを行い、ユーザーに移動の選択を求めるところまで来ましたが、その後、古いスペースを空にしてグリッドを再印刷し、「o」を彼らが移動したスペース。グリッドを再印刷する方法はわかりませんが、最初に印刷したときは、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);
}

}
4

2 に答える 2

1

問題のほとんどは、配列に関する一般的な混乱から生じると思います。たとえば、w を押したときに実行されるコード ブロックの行:

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

randomRow、randomCol (この場合は「x」) の配列の char 値を、randomRow+1、randomCol の 1 行下の配列スペースの 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("");  
}
于 2013-03-11T02:39:57.640 に答える
0

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);
于 2013-03-11T02:09:32.920 に答える