算法-五子棋禁手
·
//三三禁手
bool checkThreeThree(int row, int col, int player)
{
int directions[4][2] = { {0,1},{1,0},{1,1},{1,-1} };//水平+垂直+对角线
int size = 8;
int num = 0;;//初始数量为0
for (int i = 0; i < 4; i++) {
int dx = directions[i][0]; //
int dy = directions[i][1];//
int beginRow = row - (size - 1) * dx;
int beginCol = col - (size - 1) * dy;
for (int j = 0; j <= (size - 1); j++) {
int begin = j;
int end = j + (size - 1);
int bRow = beginRow + j * dx;
int bCol = beginCol + j * dy;
int blankNum = 0;
int currentNum = 0;
int other = 0;
int flag = 1;
for (int k = begin; k <= end; k++) {
int forR = bRow + (k - begin) * dx;
int forC = bCol + (k - begin) * dy;
if (ifRange(forR, forC)) { //判断再范围之内
if (k >= begin + 2 && k <= end - 2) {
if (board[forR][forC] == player) {//中间四个必须四个本方
currentNum++;
}
if (board[forR][forC] == 0) {//中间四个必须四个本方
blankNum++;
}
}
if (k == begin + 1 || k == end - 1) {
int data = board[forR][forC];
if (data != 0) {//第二个倒数第二个必须没有棋子
flag = 0;
break;
}
}
if (k == begin|| k == end) {
int data = board[forR][forC];
if (data == player) {//第二个倒数第二个必须没有棋子
flag=0;
break;
}
}
}
}
if (flag == 1 && blankNum == 1 && currentNum == 3) {
num++;
}
}
}
if (num >= 2)
return true;
return false;
}
//四四禁手
bool checkFourFour(int row, int col, int player)
{
int directions[4][2] = { {0,1},{1,0},{1,1},{1,-1} };//水平+垂直+对角线
int size = 8;
int num = 0;;//初始数量为0
for (int i = 0; i < 4; i++) {
int dx = directions[i][0]; //
int dy = directions[i][1];//
int beginRow = row - (size - 1) * dx;
int beginCol = col - (size - 1) * dy;
for (int j = 0; j <= (size - 1); j++) {
int begin = j;
int end = j + (size - 1);
int bRow = beginRow + j * dx;
int bCol = beginCol + j * dy;
int blankNum = 0;
int currentNum = 0;
int other = 0;
int flag = 1;
for (int k = begin; k <= end; k++) {
int forR = bRow + (k - begin) * dx;
int forC = bCol + (k - begin) * dy;
if (ifRange(forR, forC)) { //判断再范围之内
if (k >= begin + 2 && k <= end - 2) {
if (board[forR][forC] == player) {//中间四个必须四个本方
currentNum++;
}
}
if (k == begin + 1 || k == end - 1) {
int data= board[forR][forC];
if (data== 0) {//第二个倒数第二个必须没有棋子
blankNum++;
}
}
}
if (k == begin || k == end) {
if (ifRange(forR, forC)) {
if (board[forR][forC] != player) {
other++;
}
}
else {
if (k == -1) {
other++;
}
if (k == end + 1) {
other++;
}
}
}
}
if (flag && blankNum == 2 && currentNum == 4 && other >= 1) {
num++;
}
}
}
if (num >= 2)
return true;
return false;
}
//长连
bool checkLong(int row, int col, int dx, int dy, int player)
{
int count = 1;
for (int i = 1; i <= 5; i++)
{
int r = row + i * dx;
int c = col + i * dy;
if (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == player)
{
count++;
}
else
{
break;
}
}
for (int i = 1; i <= 5; i++)
{
int r = row - i * dx;
int c = col - i * dy;
if (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == player)
{
count++;
}
else
{
break;
}
}
return count >= 6;
}
//长连禁手
bool checkLongLink(int row, int col, int player)
{
int directions[4][2] = { {0,1},{1,0},{1,1},{1,-1} };
for (int i = 0; i < 4; i++)
{
if (checkLong(row, col, directions[i][0], directions[i][1], player))
{
return true;
}
}
return false;
}
//三三禁手
bool checkThreeThree(int row, int col, int player)
{
int directions[4][2] = { {0,1},{1,0},{1,1},{1,-1} };//水平+垂直+对角线
int size = 8;
int num = 0;;//初始数量为0
for (int i = 0; i < 4; i++) {
int dx = directions[i][0]; //
int dy = directions[i][1];//
int beginRow = row - (size - 1) * dx;
int beginCol = col - (size - 1) * dy;
for (int j = 0; j <= (size - 1); j++) {
int begin = j;
int end = j + (size - 1);
int bRow = beginRow + j * dx;
int bCol = beginCol + j * dy;
int blankNum = 0;
int currentNum = 0;
int other = 0;
int flag = 1;
for (int k = begin; k <= end; k++) {
int forR = bRow + (k - begin) * dx;
int forC = bCol + (k - begin) * dy;
if (ifRange(forR, forC)) { //判断再范围之内
if (k >= begin + 2 && k <= end - 2) {
if (board[forR][forC] == player) {//中间四个必须四个本方
currentNum++;
}
if (board[forR][forC] == 0) {//中间四个必须四个本方
blankNum++;
}
}
if (k == begin + 1 || k == end - 1) {
int data = board[forR][forC];
if (data != 0) {//第二个倒数第二个必须没有棋子
flag = 0;
break;
}
}
if (k == begin|| k == end) {
int data = board[forR][forC];
if (data == player) {//第二个倒数第二个必须没有棋子
flag=0;
break;
}
}
}
}
if (flag == 1 && blankNum == 1 && currentNum == 3) {
num++;
}
}
}
if (num >= 2)
return true;
return false;
}
//四四禁手
bool checkFourFour(int row, int col, int player)
{
int directions[4][2] = { {0,1},{1,0},{1,1},{1,-1} };//水平+垂直+对角线
int size = 8;
int num = 0;;//初始数量为0
for (int i = 0; i < 4; i++) {
int dx = directions[i][0]; //
int dy = directions[i][1];//
int beginRow = row - (size - 1) * dx;
int beginCol = col - (size - 1) * dy;
for (int j = 0; j <= (size - 1); j++) {
int begin = j;
int end = j + (size - 1);
int bRow = beginRow + j * dx;
int bCol = beginCol + j * dy;
int blankNum = 0;
int currentNum = 0;
int other = 0;
int flag = 1;
for (int k = begin; k <= end; k++) {
int forR = bRow + (k - begin) * dx;
int forC = bCol + (k - begin) * dy;
if (ifRange(forR, forC)) { //判断再范围之内
if (k >= begin + 2 && k <= end - 2) {
if (board[forR][forC] == player) {//中间四个必须四个本方
currentNum++;
}
}
if (k == begin + 1 || k == end - 1) {
int data= board[forR][forC];
if (data== 0) {//第二个倒数第二个必须没有棋子
blankNum++;
}
}
}
if (k == begin || k == end) {
if (ifRange(forR, forC)) {
if (board[forR][forC] != player) {
other++;
}
}
else {
if (k == -1) {
other++;
}
if (k == end + 1) {
other++;
}
}
}
}
if (flag && blankNum == 2 && currentNum == 4 && other >= 1) {
num++;
}
}
}
if (num >= 2)
return true;
return false;
}
//长连
bool checkLong(int row, int col, int dx, int dy, int player)
{
int count = 1;
for (int i = 1; i <= 5; i++)
{
int r = row + i * dx;
int c = col + i * dy;
if (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == player)
{
count++;
}
else
{
break;
}
}
for (int i = 1; i <= 5; i++)
{
int r = row - i * dx;
int c = col - i * dy;
if (r >= 0 && r < SIZE && c >= 0 && c < SIZE && board[r][c] == player)
{
count++;
}
else
{
break;
}
}
return count >= 6;
}
//长连禁手
bool checkLongLink(int row, int col, int player)
{
int directions[4][2] = { {0,1},{1,0},{1,1},{1,-1} };
for (int i = 0; i < 4; i++)
{
if (checkLong(row, col, directions[i][0], directions[i][1], player))
{
return true;
}
}
return false;
}
更多推荐
所有评论(0)