题目:
一个4*4的棋盘,每个单元可能是“.”“o”“x”的一种。其中,“.”代表当前单元没有棋子,“o”代表当前单元有乙的棋子,“x”代表当前单元有甲的棋子。现在需要判断:如果下一步轮到甲下棋,他能否获胜?(胜利的规则是棋盘上有自己方的3个子在一条线上,这条线可以是水平、竖直或者斜45°)。
思路:
可以遍历所有没有棋子的单元,挨个填'x'进行获胜判断。
代码如下:
// Chapter11_3.cpp : Defines the entry point for the application.
// 能否获胜
// 一个4*4的棋盘,每个单元可能是“.”“o”“x”的一种。其中,“.”代表当前单元没有棋子,
// “o”代表当前单元有乙的棋子,“x”代表当前单元有甲的棋子。
// 现在需要判断:如果下一步轮到甲下棋,他能否获胜?
// (胜利的规则是棋盘上有自己方的3个子在一条线上,这条线可以是水平、竖直或者斜45°)。
#include "stdafx.h"
#include<iostream>
using namespace std;
//判断是否能获胜
//chess[4][4]为棋盘局势,d为需要判断的棋子种类
int isSuccess(char chess[4][4],char d)
{
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<2;j++) //不管是判断行还是判断列,均需判断3个连续的棋子,因此j<2
{
//“||”前面的部分是判断自己方的连续3个棋子是否能连成1行,“||”后面部分是判断自己方的连续3个棋子是否能连成1列
if((chess[i][j] == 'x' && chess[i][j+1] == 'x' && chess[i][j+2] == 'x') || (chess[j][i] == 'x' && chess[j+1][i] == 'x' && chess[j+2][i] == 'x'))
return 1;
}
}
//判断自己方的连续3个棋子是否能连成45°斜线
//选取中间四个点为斜线上的中心点
for(i=1;i<3;i++)
for(j=1;j<3;j++)
{
if((chess[i-1][j-1] == 'x' && chess[i][j] == 'x' && chess[i+1][j+1] == 'x') || (chess[i-1][j+1] == 'x' && chess[i][j] == 'x' && chess[i+1][j+1] == 'x'))
return 1;
}
//以上情况均不是时(自己方的3个点不在一条线上),返回0
return 0;
}
int main()
{
int i,j;
char chess[4][4]; //棋局局势
//输入当前局势
cout << "输入当前局势:" << endl;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
cin >> chess[i][j];
}
//遍历所有单元
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
//在没有填棋子的单元尝试填‘x’
if(chess[i][j] == '.')
{
chess[i][j] = 'x';
//判断在该单元填'x',甲是否能获胜
if(isSuccess(chess,'x'))
{
cout << "甲可以获胜!" << endl;
system("pause");
}
//如果该单元填'x',甲不能获胜,则换一个单元填'x'试试
else
chess[i][j] = '.';
}
}
//当所有单元都试过后,甲均不能获胜,则输出甲不能获胜语句
cout << "甲不能获胜!" << endl;
system("pause");
return 0;
}
运行结果如下: