在上下移动时实施pacman游戏问题

时间:2015-12-02 21:10:32

标签: java

我正在尝试构建一个简单的pacman游戏,我刚刚开始。

目前我的构造函数如下所示:

static String[][] board;
static int pacmanBornHeight;
static int pacmanBornWidth;

public PacmanKata(int height, int width) {

    board = new String[height][width];
    pacmanBornHeight = (int) Math.floor(height / 2);
    pacmanBornWidth = (int) Math.floor(width / 2);

    for (int i = 0; i < boardHeight; i++) {
        for (int j = 0; j < boardWidth; j++) {
            board[i][j] = "*";
        }
    }
    board[pacmanBornHeight][pacmanBornWidth] = "V";
}

这个构造函数设置了板,pacman将位于中间,我使用&#34; V&#34;作为符号。

我尝试创建两种方法currentnlty,上下移动。

以下是设置:

我首先调用了tickUp方法:

public void tickUp(int steps) {
    int counter = 1;
    int timer = 0;
    for (int loop = 0; loop < steps; loop++) {
        board[pacmanBornHeight - counter][pacmanBornWidth] = "V";
        for (int innerTimer = 0; innerTimer < counter; innerTimer++) {
            board[pacmanBornHeight - innerTimer][pacmanBornWidth] = " ";
        }
        counter++;
        timer++;
    }


    for (int i = 0; i < boardHeight; i++) {
        for (int j = 0; j < boardWidth; j++) {
            System.out.print(board[i][j]);
        }
        System.out.println();
    }
    System.out.println("-------------------------");
} //end going UP

然后我把它打印到控制台(我初始化了10×10板):

enter image description here

Pacman正如预期的那样向上移动了三步,吃了三个点。我略微修改并创建了一个向下移动的方法:

public void tickDown(int steps) {
    int counter = 1;
    int timer = 0;
    for (int loop = 0; loop < steps; loop++) {
        board[pacmanBornHeight + counter][pacmanBornWidth] = "V";
        for (int innerTimer = 0; innerTimer < counter; innerTimer++) {
            board[pacmanBornHeight + innerTimer][pacmanBornWidth] = " ";
        }
        counter++;
        timer++;
    }

    for (int i = 0; i < boardHeight; i++) {
        for (int j = 0; j < boardWidth; j++) {
            System.out.print(board[i][j]);
        }
        System.out.println();
    }
    System.out.println("-------------------------");
}//end tickDown

现在我打电话给tickDown并要求它向下移动3步,但我得到了这个结果:

enter image description here

我遇到的麻烦是,我不知道如何找到Pacman的最后位置。向下移动方法只是创建了一个新的Pacman并向下移动了3步,这不是我想要的。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

更改您的tickUptickDown方法以保存Pacman的新位置:

public void tickDown(int steps) {
    int counter = 1;
    int timer = 0;
    for (int loop = 0; loop < steps; loop++) {
        for (int innerTimer = 0; innerTimer < counter; innerTimer++) {
            board[pacmanBornHeight + innerTimer][pacmanBornWidth] = " ";
        }
        pacmanBornHeight += counter;
        //Allow for wraparounds:
        if (pacmanBornHeight > board.length) {
            pacmanBornHeight = 0;
        }
        board[pacmanBornHeight][pacmanBornWidth] = "V";
        timer++;
    }

    for (int i = 0; i < boardHeight; i++) {
        for (int j = 0; j < boardWidth; j++) {
            System.out.print(board[i][j]);
        }
        System.out.println();
    }
    System.out.println("-------------------------");
}//end tickDown

我移动循环以将板中的空间写入外循环的开头;这样你就可以根据Pacman的起始位置获得空间。将空格写入数组后,您将更新Pacman的位置并将其写入数组中。

编辑:

以下是一个示例,展示了如何使用一维数组作为您的主板:

public class PacmanKata {
    static String[] board;
    static int pacmanPosition;
    static int boardHeight;
    static int boardWidth;

    public static void main(String[] args) {

        PacmanKata kata = new PacmanKata(10,10);
        kata.tickUp(7);
        kata.tickRight(9);
    }

    public PacmanKata(int height, int width) {
        boardHeight = height;
        boardWidth = width;
        board = new String[height*width];
        int offset = (width + 1) % 2;
        pacmanPosition = (int) Math.floor((height + offset)*width/2);

        for (int i = 0; i < board.length; i++) {
            board[i] = "*";
        }
        board[pacmanPosition] = "V";
    }

    private void printBoard() {
        for (int i = 0; i < board.length; i++) {
            System.out.print(board[i]);
            if ((i+1) % boardWidth == 0) {
                System.out.println();
            }
        }
        System.out.println("-------------------------");
    }

    public void tickUp(int steps) {
        int counter = -1 * boardHeight;
        for (int loop = 0; loop < steps; loop++) {
            //Current position = ' '
            board[pacmanPosition] = " ";
            //Pacman's position changes:
            pacmanPosition += counter;
            //Allow for wraparounds:
            if (pacmanPosition < 0) {
                pacmanPosition += board.length;
            }
            //Update the board with Pacman's new position:
            board[pacmanPosition] = "V";
        }

        printBoard();
    }//end tickUp

    public void tickRight(int steps) {
        int counter = 1;
        for (int loop = 0; loop < steps; loop++) {
            //Current position = ' '
            board[pacmanPosition] = " ";
            //Pacman's position changes:
            pacmanPosition += counter;
            if (pacmanPosition % boardWidth == 0) {
                pacmanPosition -= boardWidth;
            }
            //Update the board with Pacman's new position:
            board[pacmanPosition] = "V";
        }

        printBoard();
    }//end tickUp
}

答案 1 :(得分:0)

您应该拥有一个包含pacman当前位置的字段(所有字段都不应该是静态的),而不是pacmanBornWidthpacmanBornHeight字段:

String[][] board;
java.awt.Point pacmenPos;

public PacmanKata(int height, int width) {

    board = new String[height][width];
    pacmanPos = new Point((int) width/2, (int) height/2);

    for (int i = 0; i < boardHeight; i++) {
        for (int j = 0; j < boardWidth; j++) {
            board[i][j] = "*";
        }
    }
    board[pacmanPos.x][pacmanPos.y] = "V";
}

现在用pacmanBornWidthpacmanBornHeight替换所有出现的pacmanPos.xpacmanPos.y

在您的tickUptickDown方法中,只需更新pacman位置:

public void tickUp(int steps) {
    ...
    pacmanPos.translate(0, steps);
    ...
}

public void tickDown(int steps) {
    ...
    pacmanPos.translate(0, -steps);
    ...
}

如果您添加tickLefttickRight方法,这也会有相同的效果:

public void tickLeft(int steps) {
    ...
    pacmanPos.translate(-steps, 0);
    ...
}

public void tickRight(int steps) {
    ...
    pacmanPos.translate(steps, 0);
    ...
}