我正在开展一个项目,我试图让代码更有效率,但现在我的交换机案例出现意外问题,我似乎无法解决。
代码在这里:
switch (start){
case 0:
start = 1;
for (int y = 0; y < 20; y++)
{
for (int x = 0; x < 30; x++)
{
//le coords du pacman, ghost, T.
switch (Map[y][x])
{
case '@':
yPacman = y;
xPacman = x;
case 'G':
yGhost1 = y;
xGhost1 = x;
case 'T':
yPacman = y;
xPacman = x;
}
}
} break;
此位搜索一次数组映射以获得初始坐标 &#34; @&#34; (吃豆) &#34; G&#34; (鬼) &#34; T&#34; (pacman in rage mode)
它将coords的值存储在全局变量中。
现在代码的res:
case 1:
switch(Map[yPacman][xPacman])
{
case '@':
printf(Map[yPacman][xPacman]);
printf("\n\n\nCoordinates Pacman: (%i,%i)\n", yPacman, xPacman);
break;
case 'T':
printf(Map[yPacman][xPacman]);
printf("\n\n\nCoordinates Pacman: (%i,%i)\n", yPacman, xPacman);
break;
default:
printf("test");
}
switch(Map[yGhost1][xGhost1])
{
case 'G':
break;
}
break;
}
我制作了printf语句,使其更清晰,看看会发生什么。
这是地图数组:
char Map[40][40] = {"#####################",
"# @ #",
"# # # #",
"# # # ####### #### #",
"# # # # #",
"# #### ### ## # #",
"# # # #",
"# # ## # # # ## # #",
"# # # # #",
"# # # ## # ## # ## #",
"# # #",
"#####################"
};
基本上问题如下:
当只有一个&#34; @&#34;在te领域(&#34;#&#34;是它避免的墙壁),没有问题,pacman按照我想要的方式移动。
当数组地图中有Pacman和Ghost时, 使用断点和调试工具,它告诉我它运行第一个
switch(Map[yPacman][xPacman]){
}
语句,但随后跳过所有可能的情况(Pacman,ragemode甚至默认),并直接跳转到ghost状态并使ghost执行代码中的任何操作。
如果我删除幽灵并在野外放置一个普通的Pacman和一个Ragemode Pacman,只有ragemode会移动,如果我只放一个普通的pacman,pacman会移动..
Soomy问题是它没有正确地通过开关盒,我不知道为什么......
答案 0 :(得分:2)
您在break;
中遗漏了switch
,因此代码将继续运行,并将鬼魂指定为与pacman相同的位置。
以下是如何修复它的示例:
for (int x = 0; x < 30; x++)
{
//le coords du pacman, ghost, T.
switch (Map[y][x])
{
case '@': // Both @ and T denote pacman, so both symbols can share the same code
case 'T':
yPacman = y;
xPacman = x;
break; // break added here so that we don't fall through and set the ghost coordinates as well.
case 'G':
yGhost1 = y;
xGhost1 = x;
break; // Not really needed, but people tend to forget to add one when adding new cases, so let's put one in for good measure.
}