我目前正在学习并使用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;
}
}
答案 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
。