Alternative for if-break in c?



你好,我仍然是一个初学者,当它涉及到编程,我一直在做一个跳棋游戏。然而,我们不能对程序使用'break',除非它是switch case。我怎样修改我的作业?我已经试过用while循环它了。

int validateMove(int x1 , int y1)
{
int a , b;
printf( "Available coordinates to send the piece are: n" ) ;

a=1, b=1;
while(board[x1-a][y1+b] == ' ')
{
if((x1-a)==-1 || (y1+b)==8) 
break;
printf("%d%d , ", x1-a , y1+b);
a++;
b++;
}
a=1 , b=1;
while(board[x1+a][y1-b] == ' ')
{
if((x1+a)==8 || (y1-b)==-1) 
break;
printf("%d%d , ", x1+a, y1-b);
a++;
b++;
}
a=1 , b=1;
while(board[x1+a][y1+b] == ' ')
{
if((x1+a)==8 || (y1+b)==8) 
break;
printf("%d%d , ",x1+a, y1+b);
a++;
b++;
}
a=1;
b=1;
while(board[x1-a][y1-b] == ' ')
{
if((x1-a)==-1 || (y1-b)==-1) 
break;
printf("%d%d , ", x1-a, y1-b);
a++;
b++;
}
}

您只提供给我们一个片段,所以这还没有经过测试。validateMove()没有返回任何东西,所以我将返回类型从int更改为void。考虑为您的魔法值' '引入一个常量,例如:

#define EMPTY ' '

我将提取一个函数,而不是重复自己4次。returnbreak的合适替代品:

void validateMoveHelper(int x1, int y1, int af, int bf, int v, int v2) {
for(int a = 1, b = 1; board[x1 + af * a][y1 + bf * b] == ' '; a++, b++) {
if((x1 + af * a) == v || (y1 + bf * b) == v2)
return;
printf("%d%d , ", x1 + af * a , y1 + bf * b);
}
}
void validateMove(int x1, int y1) {
printf( "Available coordinates to send the piece are: n" ) ;
validateMoveHelper(x1, y1, -1, -1,  1,  8);
validateMoveHelper(x1, y1,  8,  1, -1, -1);
validateMoveHelper(x1, y1,  8,  1,  1,  8);
validateMoveHelper(x1, y1, -1, -1, -1, -1);
}

然后我将这4行4值提取到表t中,并在循环中运行它。但是,您需要记录表中包含的内容,或者可以使用结构数组来代替。

void validateMoveHelper(int x1, int y1, int t[4]) {
for(int a = 1, b = 1; board[x1 + t[0] * a][y1 + t[1] * b] == ' '; a++, b++) {
if((x1 + t[0] * a) == t[2] || (y1 + t[1] * b) == t[3])
return;
printf("%d%d , ", x1 + t[0] * a , y1 + t[1] * b);
}
}
void validateMove(int x1, int y1) {
printf( "Available coordinates to send the piece are: n" ) ;
int t[][4] = {
{-1, -1,  1,  8},
{ 8,  1, -1, -1},
{ 8,  1,  1,  8},
{-1, -1, -1, -1}
};
for(int i = 0; i < sizeof t / sizeof *t; i++)
validateMoveHelper(x1, y1, t[i]);
}

最新更新