切换案例 - 意外行为

时间:2015-06-03 07:42:57

标签: c switch-statement case

我正在开展一个项目,我试图让代码更有效率,但现在我的交换机案例出现意外问题,我似乎无法解决。

代码在这里:

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问题是它没有正确地通过开关盒,我不知道为什么......

1 个答案:

答案 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.
            }