1

我有一个类Grid,它管理所有地图功能。问题是,pacman 地图逆时针旋转了 90 度。

它看起来如何

问题

它应该是什么样子

“固定”版本

我通过换grid[x][y]grid[y][x]里面得到了“固定”版本isWall()(一种不整洁、不正确的方法)

这是Grid该类的完整代码;

package com.jackwilsdon.pacman.game;

import org.newdawn.slick.Graphics;

public class Grid {
    public static final int BLOCK_SIZE = 20;

    public int[][] grid = null;

    public Grid()
    {
        grid = new int[][]  {   {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
                                {0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0},
                                {0,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,0},
                                {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
                                {0,1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,0},
                                {0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0},
                                {0,1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,0},
                                {0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0},
                                {0,0,0,0,1,0,1,0,1,1,0,1,1,0,1,0,1,0,0,0,0},
                                {0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0},
                                {0,0,0,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,0,0,0},
                                {0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0},
                                {0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,1,0},
                                {0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0},
                                {0,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,0},
                                {0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0},
                                {0,1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0},
                                {0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0},
                                {0,1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,0},
                                {0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
                                {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}     };
    }

    public boolean isWall(int x, int y)
    {
        if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length)
        {
            return grid[y][x] == 1;
        }

        return true;
    }

    public void draw(Graphics g)
    {
        for (int cX = 0; cX < grid.length; cX++)
        {
            for (int cY = 0; cY < grid[cX].length; cY++)
            {
                if (this.isWall(cX, cY))
                {
                    g.fillRect(cX*Grid.BLOCK_SIZE, cY*Grid.BLOCK_SIZE, Grid.BLOCK_SIZE, Grid.BLOCK_SIZE);
                }
            }
        }
    }
}

我在代码中犯了一个愚蠢的错误吗?

我不想切换 x 和 y,因为这不再是二维数组的正确格式。

4

2 回答 2

2

我在您的代码中看到的问题是边界检查不正确。换句话说,这段代码:

if (x >= 0 && x < grid.length && y >= 0 && y < grid[0].length)
{
    return grid[y][x] == 1;
}

实际上应该是

if (x >= 0 && x < grid[0].length && y >= 0 && y < grid.length)
{
    return grid[y][x] == 1;
}

您当前的代码仅因为尺寸相等(地图是方形的)才有效。

draw您在功能上有相同的错误。换句话说,应该是

for (int cY = 0; cY < grid.length; cY++)
{
    for (int cX = 0; cX < grid[cY].length; cX++)
    {
        if (this.isWall(cX, cY))
        {
            g.fillRect(cX*Grid.BLOCK_SIZE, cY*Grid.BLOCK_SIZE, Grid.BLOCK_SIZE, Grid.BLOCK_SIZE);
        }
    }
}

在任何情况下,grid[y][x]都是正确的,而不是grid[x][y]因为grid[i]指的是二维数组索引处的i,而不是列。

于 2013-03-30T20:24:07.767 回答
1

这只是grid[i][j]引用第th 子数组j中的第 th 元素的事实的症状,它实际上是格式化网格中第 th 列和第th 行的位置。iji

由于您要x表示列并y表示行,grid[y][x]因此是访问数组中位置的正确方法。

于 2013-03-30T20:29:38.557 回答