代码拉取完成,页面将自动刷新
#include"chessApi.h"
#include <stdio.h>
#include <string.h>
enum
{
NO_DIR,
TOP,
DOWN,
LEFT,
RIGHT
};
#define for_each_chess(row,col) \
for (int row=0; row< ROWS; row++) \
for(int col=0;col<COLS; col++)
BOOL nearSpace(int row, int col, int role);
BOOL nextIsSpace(int row, int col);
//当一方下了一子后,可能要提走另外一方的一些棋子,本函数处理这个逻辑
//判断棋盘上角色为role的棋子是否需要提走,如果需要,则提走
//最后2个参数用于记录本次提走的最后一颗棋子的位置
//返回提走的棋子数目
int removeChesses(int role, int *removeRow, int *removeCol)
{
int life[ROWS][COLS];
int count = 0;
for_each_chess(row,col)
life[row][col] = 1; //全部初始化为有生命
for_each_chess(row,col)
if(role == chessBoard[row][col]) {
if(!nearSpaceApi(row,col,role)) {
life[row][col] = 0;
//附近找不到空白,此棋无生命了
}
}
for_each_chess(row,col)
if(life[row][col] == 0) {
*removeRow = row;
*removeCol = col;
chessBoard[row][col]=EMPTY; //把无生命的棋子移除
count++;
}
return count;
}
int traverseData[ROWS][COLS]; //主要用于记录那些位置已经判断过是否附近有空格了,防止递归死循环
//附近是否有空白位置,如果一个空白位置都没有找到,那么说明这一片棋已经无气了
//row, col为当前棋子的位置,role为当前棋子的角色,exceptdir为排除的方向
BOOL nearSpace(int row, int col, int role)
{
//当前棋子的相邻位置为空白,则有气-生命
if (nextIsSpace(row,col)) {
return TRUE;
}
traverseData[row][col] = role; // 这个位置暂时记录一下,递归过程中,不就要再来处理了
BOOL res = FALSE;
if (row > 0 && traverseData[row-1][col] != role && chessBoard[row-1][col] == role)
res |= nearSpace(row-1,col,role);
if (row < ROWS-1 && traverseData[row+1][col] != role && chessBoard[row+1][col] == role)
res |= nearSpace(row+1,col,role);
if (col > 0 && traverseData[row][col-1] != role && chessBoard[row][col-1] == role)
res |= nearSpace(row,col-1,role);
if (col < COLS-1 && traverseData[row][col+1] != role && chessBoard[row][col+1] == role)
res |= nearSpace(row,col+1,role);
return res;
}
BOOL nextIsSpace(int row, int col)
{
if (row > 0 && chessBoard[row-1][col] == EMPTY)
return TRUE; //上方空白
if (col > 0 && chessBoard[row][col-1] == EMPTY)
return TRUE; //左方空白
if (row < ROWS-1 && chessBoard[row+1][col] == EMPTY)
return TRUE; //下方空白
if (col < COLS-1 && chessBoard[row][col+1] == EMPTY)
return TRUE; //右方空白
return FALSE;
}
//给其它模块使用
BOOL nearSpaceApi(int row, int col, int role)
{
memset(traverseData,0,sizeof(traverseData));
return nearSpace(row,col,role);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。