if(isEventMoveRight() == true)
{
if((playerX != 70) && (playerX+11 != 'T'))
{
playerX = playerX+1;
}
}
'T'是来自玩家的不同字符块。当然,我认为我没有使用数组用于'T'或背景的块我只使用一个用于播放器。我不确定它是否正在使用我为播放器正确设置的数组。事实上......我不知道如何使用数组来完成游戏地图。
我会告诉你我要做的事情。在控制台内部,我必须使用字符来创建游戏。我打算做一些像口袋妖怪一样的东西,一个人能够围绕一个屏幕跑动,当他像塞尔达一样到达它的边缘时移动窗户。显然我并没有制作整场比赛我只是做了一小部分,但这对我来说太过分了。我正在使用Visual Studio 2010,但我必须使用他所做的一些人的代码来帮助我们,但说实话它似乎更多的是障碍而不是帮助,因为所有在线教程都只是为了在VS2010中从头开始使用C ++而不是来自他的代码。
我首先想到我可以创建一个名为gameMap的数组,并使用两个for循环将其填充到背景空间中。然后在其上面有一个玩家阵列,一个障碍阵列和使用相同战术的敌人阵列。但由于一些奇怪的原因,我必须设置char的类型,两个for循环将打印到数组[i] [j] 里面两个for循环,即使事先在我明确设置的代码中数组中有什么。 例如,
char array[2][2] = {
{ '*', '*',},
{ '*', '*',},
};
但正如我所说的那样,当我试图打印出阵列时,它就像是完全忽略了我已经设置在阵列中的东西,并打印出一堆“星号”。这对背景来说很好但是当我想要打印播放器而不是在一个正方形中打印一堆星号时,它会用长行打印它们然后唯一的方法来使它看起来正确就是当打印出播放器阵列时,我在下面有另一个for循环打印出控制台窗口的其余值X,所以在这种情况下,70个字符的空格,但这当然是完全错误的,甚至不是一个合适的解决方案。
任何帮助都将受到高度赞赏。
答案 0 :(得分:0)
虽然我对你的问题并不完全清楚,但我有一些想法......
if(isEventMoveRight() == true)
{
if((playerX != 70) && (playerX+11 != 'T'))
{
playerX = playerX+1;
}
}
你的意思是playerX+1
?无论哪种方式,看起来你不是在与数组进行比较,而是在数组中代表一个你不能去的空间的值。看起来它应该是这样的:
if(isEventMoveRight() == true)
{
if((playerX < maximumX) && worldGrid(playerX+1, playerY).isWalkable)
{
playerX = playerX+1;
}
}
其中worldGrid()是一个返回对结构的引用的函数,该结构告诉我们给定网格空间的属性。
关于打印/调试问题,请注意许多char
值不会打印字母或数字。例如,您可以打印一个退格字符或制表符,它可以更改光标位置,可能会也可能不会覆盖您想要查看的内容。因此,简单地打印字符可能不是调试char
值的最佳方法,您可能希望将char
值打印为int
。除非您专门使用字母字符或其他可打印字符。
您可以将char转换为无符号短语,如下所示:
(unsigned short)(0x00FF & charVariable);
基于我从问题中理解的其他想法......
听起来你想要一个2D数组基本上是地图,其中数组中的某些字符代表不同的游戏资产,例如砖(不能穿过它)和地板(可以穿过它)。这些可能存储为char
,因此您最多可以获得256种不同类型的面板/墙壁/楼梯/等。这些是在场景中不移动的东西,只确定所有资产/项目/字符下面的楼层。
(您可以使用std :: map以及结构或单个16位int或其他一些可用作标志的int类型。基本上您希望能够快速查找每个块的属性。世界上的空间,例如你是否可以穿过它或者它是否滑,是水等等。)
然后你可能想要第二个数组来表示项目的位置和类型。这些可能是宝箱,可破坏的门/洞穴或可移动的砖块。这些是玩家可以在解谜中进行交互,拾取和/或使用的项目。
我不认为你想要角色(英雄和恶棍)都在二维阵列中。特别是你不想遍历一个巨大的阵列只是为了找出角色的位置。您可能也不希望任何字符锁定到网格空间,除非您正在进行文本冒险,否则您可能希望它们能够在地图上的中间块(如Zelda)。对于英雄,你可能只有变量来说明位置和方向是什么以及其他角色属性,如黄金和健康。不需要2D阵列。
对于敌人,使用std::vector
或类似的容器可能会很好,因为如果一个人死亡或产生,他们的数量会发生变化。而且因为你可以迭代一个类似于数组的向量,你可以相对容易地每次更新你所有的敌人,如果它们被杀死就在它们上面设置一个标志,这样你就可以在更新循环后将它们从向量中移除。
如果您希望能够拥有超过1个英雄,例如在本地多人游戏中,您也可以使用std::vector
作为英雄。