制作pacman有些问题?

Com*_*cus 7 java methods collision-detection pacman

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

我真的很难制作某种检测系统或某种方法让我的pacman精灵/角色在游戏中顺利通过我的棋盘.我没有把它作为一张图片.

我曾经尝试过色彩检测,它起到了最好的效果,但根本不光滑,而且很不稳定.

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

我现在正在尝试让程序使用颜色检测并检查一个单独看不见的板,看看我是否还在路上.到目前为止,这已经失败了.它看起来似乎是最聪明的,但角落只是通过调整图像而难以修复.

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

sar*_*old 5

存储"旧学校"游戏板的典型方法是使用多维数组charint 多维数组.使用Matt优秀的小图形,您可以看到板上有21个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 .. */                      }};
Run Code Online (Sandbox Code Playgroud)

你选择哪些墙壁和路径并不重要."路径"位置最初包含"包含点"的代码.当paccy消耗这些点时,将新值存储到该位置的板上以指示该点已被消耗但它仍然是通道方块.马特建议-1用于墙壁,0无点和1点 - 这是一个非常好的计划,因为它让你的"墙碰撞"程序只是寻找

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

缺点是-1你的阵列初始化程序看起来更尴尬.

如果这是在C中完成的,那么用"C改变"来char board[21][21]代替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";
Run Code Online (Sandbox Code Playgroud)

这在源代码中更容易阅读,占用更少的内存,而且墙碰撞例程看起来像这样:

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

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

我不记得有足够的Java在Java中使用它 - 但我相信如果这看起来足够引人注目,你可以弄明白.