69,371
社区成员
发帖
与我相关
我的任务
分享
0 1 2
0 1 2
0 1 2
012
3333*4444
567
5 6 7
5 6 7
5 6 7
/************全局变量***********/
char nHeiBai; //1:白子 2:黑子 0:停止
char qz[15][15]; //记录棋子
char qx, qy; //最后一颗棋子位置
int nTotle; //剩余空位置个数
/************判断胜利函数***********/
int IsWin()
{
int i, j;
int x, y; //当前判断棋子
int t; //离中心棋子距离
int k = 0; //方向
unsigned char w[8] = { 1, 1, 1, 1 }; //连续棋子个数
int ntq = nHeiBai % 2 + 1; //最后棋子位置,nHeiBai
--nTotle; //棋盘空位置计数(全局变量)
for( i = -1; i < 2; ++i )
for( j = -1; j < 2; ++j )
{
if( i == 0 && j == 0 ) continue;
t = 0;
do
{
if( t++ ) k < 4 ? ++w[k] : ++w[7-k]; //同方向结合
x = qx + j * t;
y = qy + i * t;
if( x < 0 || x > 14 || y < 0 || y > 14 ) break; //判断出界
} while ( qz[y][x] == ntq ); //连续棋子
++k;
}
for( i = 0; i < 4; ++i )
if( w[i] == 5 ) return ntq; //连续5颗棋子胜利
if( nTotle == 0 ) return 3; //棋盘占满则平局
return 0;
}
/************全局变量***********/
char nHeiBai; //1:白子 2:黑子 0:停止
char qz[15][15]; //记录棋子
char qx, qy; //最后一颗棋子位置
int nTotle; //剩余空位置个数
/************判断胜利函数***********/
int IsWin()
{
int i, j;
int x, y; //当前判断棋子
int t; //离中心棋子距离
int k = 0; //方向
unsigned char w[8] = { 1, 1, 1, 1 }; //连续棋子个数
int ntq = nHeiBai % 2 + 1; //最后棋子位置,nHeiBai
--nTotle; //棋盘空位置计数(全局变量)
for( i = -1; i < 2; ++i )
for( j = -1; j < 2; ++j )
{
if( i == 0 && j == 0 ) continue;
t = 0;
do
{
if( t++ ) k < 4 ? ++w[k] : ++w[7-k]; //同方向结合
x = qx + j * t;
y = qy + i * t;
if( x < 0 || x > 14 || y < 0 || y > 14 ) break; //判断出界
} while ( qz[y][x] == ntq ); //连续棋子
++k;
}
for( i = 0; i < 4; ++i )
if( w[i] == 5 ) return ntq; //连续5颗棋子胜利
if( nTotle == 0 ) return 3; //棋盘占满则平局
return 0;
}
#define numb_direct 4
#define board_rows 16
#define board_cols 16
#define chess_over 1
#define chess_change 0
struct coord
{
int y;
int x;
};
int is_over(struct coord curr_coord, int curr_color, int board_data[board_rows][board_cols])
{
struct coord step_direct[numb_direct] = {{0, 1}, {1, 0}, {1, 1}, {1, -1}};
struct coord dest_coord; //搜索目标位置
int i, j, count_chessman;
for(i = 0; i < numb_direct; i++)
{
count_chessman = 1;
for(j = 0; j < 2; j++) //正反搜索方向
{
dest_coord.y = curr_coord.y + step_direct[i].y;
dest_coord.x = curr_coord.x + step_direct[i].x;
while(curr_color == board_data[dest_coord.y][dest_coord.x])
{//建议:棋盘边缘为-2,没有棋子为-1,红色为0,黑色为1
count_chessman++;
if(count_chessman >= 5)return chess_over;
dest_coord.y += step_direct[i].y;
dest_coord.x += step_direct[i].x;
}
step_direct[i].y *= -1;
step_direct[i].x *= -1; //搜索方向反转
}
}
return chess_change;
}