为什么我的switch语句不响应一半的情况?

时间:2018-04-28 15:00:47

标签: c++

我目前正在学习并使用C ++进行游戏,我想找到我的switch语句如何仅响应一半的情况?它只在从整数中减去时才响应。请注意,我和初学者一样多,所以任何建议都会有所帮助。

#include <fstream>
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;

#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define SPACE_BAR 32

void startingCoord (int & x, int & y)
{
    cout << "Starting coord" <<endl;
    cin >> x >> y;
}
void printGrid(int x, int y)
{
    for (int a = 0; a < 10; a++)
    {
        for (int b = 0; b < 10; b++)
        {
            if (a + 1 == x && b + 1 == y)
            {
                cout<<" 0 ";
            }
            else
            {
                cout<<" - ";
            }
        }
        cout<<endl;
    }
}
int main ()
{
    int c = 0, x = 0, y = 0;
    startingCoord(x, y);
    while (true)
    {
        printGrid(x, y);
        switch (c = getch()){
        case SPACE_BAR:
            return 0;
        case KEY_DOWN:
            x++;
        case KEY_RIGHT:
            y++;
        case KEY_UP:
            x--;
        case KEY_LEFT:
            y--;
        default:
            return 0;
        }
        cout<<x<<" "<<y;

    }
}

2 个答案:

答案 0 :(得分:7)

改变这个:

case KEY_DOWN:
    x++;

到此:

case KEY_DOWN:
   x++;
   break;

并对没有return语句的每个案例执行相同操作。

在没有break语句的情况下,控制流程会在其条件刚刚满足的情况下继续进行。

答案 1 :(得分:2)

就像@gsamaras所说的那样,你需要在每个案例结尾处包含一个break语句,除非你的案例returns或你希望控制流继续进行。

让我举个例子。

在您的情况下,如果您选择KEY_DOWN,则会执行以下操作:

switch (c = getch()) { // assume c = KEY_DOWN
    case SPACE_BAR: // is the value of c SPACE_BAR? no
        return 0;
    case KEY_DOWN: // is the value of c KEY_DOWN? yes
        x++; // do this
    case KEY_RIGHT: // no break, keep going
        y++; // do this
    case KEY_UP: // no break, keep going
        x--; // do this
    case KEY_LEFT: // no break, keep going
        y--; // do this
    default: // no break, keep going
        return 0; // returns 0
}

同样,如果您按KEY_RIGHT

switch (c = getch()) { // assume c = KEY_RIGHT
    case SPACE_BAR: // is the value of c SPACE_BAR? no
        return 0;
    case KEY_DOWN: // is the value of c KEY_DOWN? no
        x++; 
    case KEY_RIGHT: // is the value of c KEY_RIGHT? yes
        y++; // do this
    case KEY_UP: // no break, keep going
        x--; // do this
    case KEY_LEFT: // no break, keep going
        y--; // do this
    default: // no break, keep going
        return 0; // returns 0
}

对于上面两种情况,结果是相同的:它返回0,因为最后一种情况(default)是return 0;

你应该做什么

switch (c = getch()) { // assume c = KEY_DOWN
    case SPACE_BAR: // is the value of c SPACE_BAR? no
        return 0;
    case KEY_DOWN: // is the value of c KEY_DOWN? yes
        x++; // do this
        break; // there's a break, stop here.
    case KEY_RIGHT: 
        y++; 
        break; 
    case KEY_UP:
        x--; 
        break;
    case KEY_LEFT:
        y--;
        break;
    default: 
        return 0; 
}

实施您刚刚学到的东西

现在我们知道除非有中断,否则流程将会持续进行,我们可以将case SPACE_BAR:移到default:之上,因为我们知道它们都返回0反正:

switch (c = getch()) { 
    case KEY_DOWN: 
        x++;
        break;
    case KEY_RIGHT: 
        y++; 
        break; 
    case KEY_UP:
        x--; 
        break;
    case KEY_LEFT:
        y--;
        break;
    case SPACE_BAR: 
    default: 
        return 0; 
}

注意:虽然在默认情况下添加case SPACE_BAR:确实比单独留下它们更好,但您也可以完全放case SPACE_BAR,因为即使你不包括它,它也会落入default

祝你好运!