中易网

c++五子棋胜利的判断

答案:1  悬赏:0  
解决时间 2021-01-18 12:04
  • 提问者网友:wodetian
  • 2021-01-17 18:54
c++五子棋胜利的判断
最佳答案
  • 二级知识专家网友:一叶十三刺
  • 2021-01-17 19:49
不多说,直接上代码,你的那些判断感觉太乱了,看下我的吧

 #include 
#include

void printWinner(int x)
{
if (x == 0)
{
printf("black win
");
}
else if (x == 1)
{
printf("white win
");
}
else
{
printf("neither
");
}
}

void checkWinner(int data[1000][1000] ,int size)
{
//遍历所有棋子,找出赢家
int winerValue = 3;

for (int i = 0; i < size;i++)
{
bool win = false; //一方胜利,结束
for (int j = 0; j < size;j++)
{
if (data[i][j] == ' ') //空格不需要判定
continue;

//水平方向连续棋子个数检测
int cnt = 1;
//左侧
for (int k = j-1; k >= 0;k--)
{
if (data[i][k] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
}
//右侧
for (int k = j + 1; k < size; k++)
{
if (data[i][k] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
}
//胜利
if (cnt >= 5)
{
win = true;
winerValue = data[i][j];
break;
}

//竖直方向检测
cnt = 1;
//上方
for (int k = i - 1; k >= 0; k--)
{
if (data[k][j] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
}
//下方
for (int k = i + 1; k < size; k++)
{
if (data[k][j] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
}
//胜利
if (cnt >= 5)
{
win = true;
winerValue = data[i][j];
break;
}

//从左下到右上检测
cnt = 1;
//左下
int m = i + 1;
for (int k = j - 1; k >= 0; k--)
{
if (m>=size) //左下方出界
{
break;
}
if (data[m][k] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
m++;
}
//右上
m = i - 1;
for (int k = i + 1; k < size; k++)
{
if (m < 0) //右上方出界
{
break;
}
if (data[m][k] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
m--;
}
//胜利
if (cnt >= 5)
{
win = true;
winerValue = data[i][j];
break;
}

//从左上到右下检测
cnt = 1;
//左上
m = i - 1;
for (int k = j - 1; k >= 0; k--)
{
if (m < 0) //左上方出界
{
break;
}
if (data[m][k] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
m--;
}
//右下
m = i + 1;
for (int k = i + 1; k < size; k++)
{
if (m >= size) //右下方出界
{
break;
}
if (data[m][k] != data[i][j]) //非相同棋子时停止检测
{
break;
}
else
cnt++;
m++;
}
//胜利
if (cnt >= 5)
{
win = true;
winerValue = data[i][j];
break;
}

}
if (win)
{
break;
}
}
printWinner(winerValue);
}

int main()
{
int x, y, a, b, i, j, t;
int m_data[1000][1000];
scanf("%d", &a);
for (t = 1; t <= a; t++)
{
scanf("%d", &b);
for (i = 0; i <= b - 1; i++)
{
for (j = 0; j <= b - 1; j++)
{
scanf("%d", &m_data[i][j]);
}
}
checkWinner(m_data, b);

}
return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息