7

编辑:完全忘了提到我正在用 Java 编码

我很难制作某种检测系统或某种方法来让我的 pacman 精灵/角色在游戏中顺利通过我的棋盘。我没有把板子做成图像。

我首先尝试了颜色检测,它效果最好,但一点也不流畅,而且很不稳定。

然后我尝试手动输入不允许输入的位置坐标。这也没有那么好。

我目前正在尝试让程序使用颜色检测并检查一个单独的看不见的板,看看我是否还在路上。这是迄今为止最失败的。看起来这将是最聪明的,但角落只是alful,很难通过调整图像来修复。

我想知道你们会为这样的任务建议什么方法。

4

1 回答 1

5

存储“老派”游戏板的典型方法是使用一个charint 多维数组。使用马特出色的小图形,您可以看到板上有 21 x 21 个正方形:

int board[21][21] = {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, 
                     {1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
                     {1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1},
                     /* ... and so on, for all 21 lines .. */                      }};

您为墙壁和路径选择哪个数字并不重要。“路径”位置最初包含“包含点”的代码。当 paccy 消耗点时,将新值存储到板上的位置以指示点已被消耗,但它仍然是路径正方形。马特推荐-1墙壁,0无点,和1一个点 - 这是一个漂亮的计划,因为它让你的“墙壁碰撞”例程简单地寻找

if (board[pac.x][pac.y] > 0) {
    /* still in bounds */
} else {
    /* collided against a wall */
}

缺点是-1在您的数组初始化程序中看起来更尴尬。

char board[21][21]如果这是在 C 中完成的,那么使用而不是int board[21][21]将游戏板存储为 C 字符串来“改进”它会很容易:

char board[21][21] = " XXXXXXXXXXXXXXXXXXX "
                     " X        X        X "
                     " X XX XXX X XXX XX X "
                     " X                 X "
                     " X XX X XXXXX X XX X "
                     " X    X   X   X    X "
                     " XXXX XXX X XXX XXXX "
                     "    X X       X X    "
                     "XXXXX X XXXXX X XXXXX"
                     "        X   X        "
                     "XXXXX X XXXXX X XXXXX"
                     "    X X       X X    "
                     " XXXX X XXXXX X XXXX "
                     " X        X        X "
                     " X XX XXX X XXX XX X "
                     " X  X           X  X "
                     " XX X X XXXXX X X XX "
                     " X    X   X   X    X "
                     " X XXXXXX X XXXXXX X "
                     " X                 X "
                     " XXXXXXXXXXXXXXXXXXX";

这在源代码中更容易阅读,占用更少的内存,并且您的墙壁碰撞例程可以如下所示:

if (board[pac.x][pac.y] == 'X') {
    /* collided with a wall */
} else {
    /* still in bounds */
}

(虽然NUL编译器将在字符串末尾插入的尾随意味着右下角的正方形永远不能用于路径墙壁 - 更多的努力可以解决这个问题,但它并不那么漂亮。 )

我不记得有足够多的 Java 可以在 Java 中完成这项工作——但我相信如果这看起来足够引人注目,你会发现一些东西。

于 2011-11-14T06:07:36.577 回答