制作吃豆子有问题吗?

Posted

技术标签:

【中文标题】制作吃豆子有问题吗?【英文标题】:Having some issues with making pacman? 【发布时间】:2011-12-28 09:19:44 【问题描述】:

编辑:完全忘记提及我正在使用 Java 编码

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

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

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

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

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

【问题讨论】:

告诉我们您使用的语言会有所帮助。 你的板子是统一网格吗? 我不确定那是什么,所以我假设不是?我应该使用这个吗? @Matt 好的,那么使用它我将如何检查 pacman 是否仍在路径上或只允许他在路径上? @Fogest 是的,我打算将其发送给聊天,但您需要 20 个代表。我真的不喜欢那样。我希望当有代表的人创建房间时,至少有一种方法可以覆盖它。如果你愿意,一堵墙可以是-1。每次他基本上移动时,您都会检查这一点,以确保他可以移动到那个位置。如果它是一个 int 数组,那么你可以只为墙壁做 -1,为无点做 0,为一个点做 1。 【参考方案1】:

存储“老式”游戏板的典型方法是使用charint multidimensional array。使用Matt's excellent little graphic,您可以看到棋盘中有 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 在您的数组初始化程序中看起来更尴尬。

如果这是在 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";

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

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

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

我不记得足够多的 Java 来使这项工作在 Java 中工作 - 但我相信如果这看起来足够引人注目,您会想出一些东西。

【讨论】:

好的,我基本上明白你在说什么。虽然我必须为此使用 Java。我坚持的部分是如何实现这一点。所以假设我从一个空的 500 x 500 板开始。我如何制作网格并拥有一个数组,该数组知道每个框的坐标。因为您发布的第一个代码如何知道每个网格项的大小?我对那部分感到非常困惑。 看起来不错。是的,我只是建议使用 int,因为我认为在 java 中使用 int 更容易。但显然任何事情都会奏效。你可以在java中访问一个字符串,就像它是一个数组一样。 我觉得自己像个菜鸟。我真的越来越糊涂了。我试图理解这一点,但我仍然停留在这个网格上。 @Fogest 哦,这很简单。您只需检查坐标是什么。所以,假设吃豆人目前在 (1,5),他想向右移动到 (2,5),它是 (x,y)。如果你愿意,你可以翻转它。无论如何,您需要确保 (2,5) 不是墙。所以你检查数组,比如 if(board[1,4] == 0) pacman.move()。 pacman 将是一个在您调用 move 时会自行更新的对象。这是另一个话题。但是您只需在移动之前直接调用坐标以确保可以。如果它是 -1,那么您只需停留在同一个坐标中。你可以用字符串做同样的事情。 @Fogest 你不必把他放在网格上。在你的情况下,因为你不了解对象,我会说只创建两个变量。 PacmanX、PacmanY 或其他。这些将是对应于他所在位置的整数。

以上是关于制作吃豆子有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

手把手教学MFC吃豆子教程

手把手教学MFC吃豆子教程

CSS:吃豆子动画

试图用 C 和 raylib 制作蛇游戏。添加吃苹果后未定义的行为

怎么用html5制作简单的大球吃小球的游戏

Java 吃金币游戏设计与制作