制作吃豆子有问题吗?
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】:存储“老式”游戏板的典型方法是使用char
或int
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 或其他。这些将是对应于他所在位置的整数。以上是关于制作吃豆子有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章