java中的简单迷宫游戏

时间:2013-04-16 07:04:03

标签: java maze

我在java中创建一个简单的迷宫游戏。代码读取数据文件并将其分配给String array。玩家输入他或她想要进入的方向,并且每个位置包含与points (0, 1, or 2)对应的特定数量的obstacleNumber (0, 1, or 2)。我想跟踪分数以及玩家移动的次数,但我无法弄清楚在哪里调用我的方法来确保计数是正确的。如果这是一个非常愚蠢的问题,我很抱歉,但我是java新手!

数组正确填充但我无法计算移动和点数。

    import java.util.*; 
    import java.io.File;

    public class Program12
     {

 static public void main( String [ ] args ) throws Exception
 {

     if(args.length != 1) {
         System.out.println("Error -- usage is: java Lab11 roomData.txt"); 
         System.exit(0); 
     }

    File newFile = new File(args[0]); 
    Scanner inputFile = new Scanner(newFile);       

    int numberOfRows = inputFile.nextInt();
    int numberOfColumns = inputFile.nextInt();  

    Room[][] game; 

    game = new Room[numberOfRows][numberOfColumns]; 
    int rowNumber = 0; 
    int columnNumber = 0; 

    int moves = 0;
    int points = 0;


    for(int i = 0; i < numberOfRows; i++) 
    {
        for (int j = 0; j < numberOfColumns; j++) 
        {
            String obstacle = inputFile.nextLine(); 
            int obstacleNumber = inputFile.nextInt(); 

            Room room = new Room(obstacle, obstacleNumber); 

            game[i][j] = room;

        }
        System.out.println(); 
        countPoints(obstacleNumber, points);

    }


    while(true) 
    {
        printPlayerLocation(numberOfRows, numberOfColumns, rowNumber, columnNumber);

        System.out.println();
        System.out.print("Enter up, down, left, or right to move:  ");
        Scanner userInput = new Scanner(System.in);
        String in = userInput.nextLine();
        if(in.equals("left") || in.equals("right") || in.equals("up") || in.equals("down"))
        {
            if (in.equalsIgnoreCase("up"))  
            { 
                rowNumber = rowNumber - 1; 
            } 

            if (in.equalsIgnoreCase("down")) 
            {           
                rowNumber = rowNumber + 1; 
            } 

            if (in.equalsIgnoreCase("left"))  
            {   
                columnNumber = columnNumber - 1;  
            } 

            if (in.equalsIgnoreCase("right"))  
            {   
                columnNumber = columnNumber + 1; 
            }
        }
        else
        {
            System.out.println("Input invalid! Please enter up, down, left, or right.");
        }

        try 
        {
            System.out.println(game[columnNumber][rowNumber].toString());
        }

        catch (ArrayIndexOutOfBoundsException e)
        {
            System.out.println("You cannot leave the boardwalk during the hunt! Please start over.");
            System.exit(0);     
        }

        countMoves(in, moves);
        //countPoints(obstacleNumber, points);
    }        
}

    public static void printPlayerLocation(int numberOfRows, int numberOfColumns, int rowNumber, int columnNumber)
    {
        System.out.println();
        System.out.print("***** PLAYER LOCATION *****");
        String[][] game = new String[numberOfRows][numberOfColumns];
        for (int i = 0; i < numberOfRows; i++)
        {
            for (int j = 0; j < numberOfColumns; j++)
            {
                game[i][j] = "*";
            }   
        }

        game[rowNumber][columnNumber] = "P";

        for (int i = 0; i < numberOfRows; i++)
        {
            System.out.println();
            for (int j = 0; j < numberOfColumns; j++)
            {
                System.out.printf("%-5s", game[i][j]);
            }   
        }
        System.out.println();
    }

    //doesn't correctly count the moves
    public static void countMoves(String in, int moves)
    {
        if(in.equals("left") || in.equals("right") || in.equals("up") || in.equals("down"))
        {
            moves++;
        }
        System.out.println("You have used " + moves + " moves.");
    }

    //doesn't correctly count the points
    public static void countPoints(int obstacleNumber, int points)
    {
        if(obstacleNumber == 0)
        {
            points = points;
        }
        if(obstacleNumber == 1)
        {
            points++;
        }
        if(obstacleNumber == 2)
        {
            points = points + 2;
        }
        System.out.println("You have obtained " + points + " points so far. Keep hunting!");
    }

数据文件具有数组大小(4 4)和障碍物数量和障碍物

    0 this obstacleNumber would award 0 points
    1 this obstacleNumber would award 1 point
    2 this obstacleNumber would award 2 points

16次填充数组。

我希望样本输出打印播放器位置(它正确地执行),要求用户输入方向(它正确地执行),在数据文件中打印文本(再次已经完成)然后打印到目前为止已经使用的移动次数和玩家获得的分数。

如何正确计算用户输入“up, down, right, or left”的次数以及用户目前有多少分?提前感谢您的帮助我真诚地感谢您的时间。

3 个答案:

答案 0 :(得分:2)

移动计数不正确,因为countMoves不会从主函数增加变量移动。 如果你这样做:

System.out.println(moves);
countMoves(in, moves);
System.out.println(moves);

您将看到该值未发生变化。 所以你可以给countMoves添加一个返回值,然后用它来动作:

moves = countMoves(in,moves);

或者你可以在这里增加动作:

if(in.equals("left") || in.equals("right") || in.equals("up") || in.equals("down"))
    {
        moves++;
        if (in.equalsIgnoreCase("up"))  
        {

            rowNumber = rowNumber - 1; 
        } 

        if (in.equalsIgnoreCase("down")) 
        {           
            rowNumber = rowNumber + 1; 
        } 

        if (in.equalsIgnoreCase("left"))  
        {   columnNumber = columnNumber - 1;  
        } 

        if (in.equalsIgnoreCase("right"))  
        {   columnNumber = columnNumber + 1; 
        }
    }

与我认为的点相同。 这条线

points = points;

只有你有一个可获得点值的类变量但是赋予一个有自己值的变量才有意义才有意义。

所以也许可以在countPoints中添加一个返回值并用它来分配点:

points = countPoints(obstacleNumber, points);

答案 1 :(得分:1)

我可能在这里错了(一大早......)但我猜你总是得到相同的移动积分值?这是因为您没有增加实际移动的值。当您将Int作为参数发送到方法时,您不是发送指向Int的指针,而是发送一个将由该方法使用的指针的副本,然后在离开时将其删除。在增加值或将它们作为静态属性放置之后,您需要返回移动 points 。尝试这样做:

...
moves = countMoves(String in, int moves);
...

public static int countMoves(String in, int moves) {
    if(in.equals("left") || in.equals("right") || in.equals("up") || in.equals("down")) {
        moves++;
    }
    System.out.println("You have used " + moves + " moves.");
    return moves;
}

或者你可以在识别移动方向时增加它们(这样更有效率,因为如果移动有效,你不必重做检查):

if (in.equalsIgnoreCase("up")) { 
    rowNumber = rowNumber - 1; 
    moves++;
}
...

修改
要点问题:
既然你没有发布Room如何实现我只是即兴发挥,但我认为它应该是这样的:

...  
points = countPoints(game[rowNumber][columnNumber].getObstacleNumber(), points);
...

并将countPoints()更改为:

public static int countPoints(int obstacleNumber, int points) {
        if(obstacleNumber == 0) points = points;
        if(obstacleNumber == 1) points++;
        if(obstacleNumber == 2) points += 2;

        System.out.println("You have obtained " + points + " points so far. Keep hunting!");
        return points;
    }

或仅(如果您知道输入正确):

public static int countPoints(int obstacleNumber, int points) {
        points += obstableNumber;
        System.out.println("You have obtained " + points + " points so far. Keep hunting!");
        return points;
    }

答案 2 :(得分:1)

在Java中,方法的参数始终 passed by value。它可以获得confusing with objects。但是对于像int这样的原始类型,它非常简单。对于countMovescountPoints函数,您只分别给出movespoints的值,而不是它们的引用。也就是说,这些方法实际上与另一个变量一起工作。此变量初始化为您给出的值,您可以根据需要更改它,但是对此变量所做的更改仅对方法可见。因此,为了使更改可见于外部变量,您必须重置其值。例如,你可以这样做:

public static int countMoves(String in, int moves) {
       //... change the value of moves as you want
       return moves; //return the new value
}

然后使用如下方法:

moves = countMoves(in, moves);

set变量是您在main中定义的变量。类似于countPoints。另一种可能性是在类moves中定义pointsProgram12,并使方法count方法直接修改这些变量而不传递它们,例如:

public static void countMoves(String in) {
    moves = ...
}

在这种情况下,moves中定义的移动Program12countMoves可见,因此您可以直接更改所需的变量;没有必要重置它。

-

但很大但是。你拥有的代码是spaghetti。您应该考虑如何更好地构建代码并将代码划分为密切相关的逻辑单元。在面向对象的编程中,您可以使用类来完成它。例如,您可以定义一个名为GameState的类,它保留变量movespoints或其他任何您需要的类,并在那里定义count方法或其他方法修改游戏的统计数据。不要让main方法定义程序的逻辑。它应该仅用于读取输入以初始化某种类Game并写入以输出Game的结果。