• 大体思路
    采用面相过程的设计方式实现,类似于我们平时做的课程设计,实现这样的小游戏无非就是多了图形处理库。这里使用的是acllib图形库。

    设计这种小游戏,首先要从宏观上去认识:象棋,要有棋盘,要有棋子,棋子要移动。
    对于棋盘,十行九列画出即可。
    对于棋子,分黑红两方,按照指定位置画出。
    如何移动棋子,我们有mouseEvent函数。

    初始化棋盘棋子:initmap,initpaint
    利用鼠标实现棋子移动分两步(mouseEvent):
    第一次点击,记录点击棋子的信息
    第二次点击,将第一次点击记录的棋子信息移动到第二次点击的位置。
    最后在添加亿点细节。

  • 首先画棋盘——chessboard()

  • 初始化棋子信息——initmp()

  • 将棋子画到棋盘上——initpaint()

  • 注册鼠标,通过鼠标点击不同位置实现棋子的移动(按照象棋行棋规范)——mouseEvent(int x, int y, int button, int e)x、y为点击位置,button(鼠标左右键与滑轮)、e(点击或抬起)为事件。

  • 行棋规范——judge_piece(int x, int y)代表能否从上一步走到x,y处。

此外,实现象棋必然缺不了人机对战。对于人机算法我们可以采用最简单的遍历。每次遍历获取所有人机方棋子能走的地方,然后根据评估函数找出这些步中对人机方来说收益最大的一步。思路很简单,但是想写出走一步看很多步的算法也很难。首先评估函数要尽量具有代表性,这直接决定了人机的棋力;其次需要迭代遍历,这样次数多了时间复杂度就会很高。

这里只写了走一步看一步的人机代码供参考,更深入的可以自行去了解:

1、void Get_All_path()——获取人机所有可能走的方式(将step存入向量v中)

2、int calculate_value()——评估函数

3、void Get_max_way()——得到对人机最有利的那一步(传到prex,prey与nowx,nowy中,即从pre走到now)。

struct step
{int x1, y1, x2, y2;
};//从x1,y1走到x2,y2
void Get_All_path()
{v.clear();//全局变量step temp;for (int a = 0; a < 16; a++){if (black_chess[a].is == 0)continue;prex = black_chess[a].row;prey = black_chess[a].col;temp.x1 = prex;temp.y1 = prey;for(int i=0;i<10;i++)for (int j = 0; j < 9; j++){temp.x2 = i;temp.y2 = j;if (judge_piece(i, j) == 1&&mp[i][j].color!='B'){v.push_back(temp);}}}
}
int calculate_value()
{int sum1 = 0, sum2 = 0;for(int a=0;a<10;a++)for (int b = 0; b < 9; b++){if (mp[a][b].color == 'B' && mp[a][b].is == 1){switch (mp[a][b].index){case 0:sum1 += 100;break;case 1:sum1 += 50;break;case 2:sum1 += 10;case 3:sum1 += 10;break;case 4:sum1 += 1500;break;case 5:sum1 += 50;break;case 6:sum1 += 20;break;default:break;}}else if (mp[a][b].color == 'R' && mp[a][b].is == 1){switch (mp[a][b].index){case 7:sum2 += 100;break;case 8:sum2 += 50;break;case 9:sum2 += 10;case 10:sum2 += 10;break;case 11:sum2 += 1500;break;case 12:sum2 += 50;break;case 13:sum2 += 20;break;default:break;}}}return sum1 - sum2;
}
void Get_max_way()
{//step ans;int minn = -150000;int calculate;Get_All_path();for (int a = 0; a<v.size(); a++){int f = 1;int index= mp[v[a].x2][v[a].y2].index;int pos=0;int generalx=mp[v[a].x1][v[a].y1].row, generaly= mp[v[a].x1][v[a].y1].col;if (mp[v[a].x2][v[a].y2].color == 'R')//黑方吃子{if (mp[v[a].x2][v[a].y2].pos == 1)//被吃掉的为南兵{pos = 1;mp[v[a].x2][v[a].y2].pos = 0;}if (mp[v[a].x1][v[a].y1].index == 4)//黑将移动{black_general_x = v[a].x2;black_general_y = v[a].y2;}mp[v[a].x1][v[a].y1].is = 0;mp[v[a].x1][v[a].y1].color = NULL;mp[v[a].x2][v[a].y2].is = 1;mp[v[a].x2][v[a].y2].color = 'B';mp[v[a].x2][v[a].y2].index = mp[v[a].x1][v[a].y1].index;}else{f = 0;if (mp[v[a].x1][v[a].y1].index == 4){black_general_x = v[a].x2;black_general_y = v[a].y2;}mp[v[a].x1][v[a].y1].is = 0;mp[v[a].x1][v[a].y1].color = NULL;mp[v[a].x2][v[a].y2].is = 1;mp[v[a].x2][v[a].y2].color = 'B';mp[v[a].x2][v[a].y2].index = mp[v[a].x1][v[a].y1].index;}calculate = calculate_value();if (minn < calculate){prex = v[a].x1;prey = v[a].y1;minn = calculate;nowx = v[a].x2;nowy = v[a].y2;}//printf("%d\n", minn);if (f == 1){mp[v[a].x2][v[a].y2].pos = pos;if (mp[v[a].x2][v[a].y2].index == 4){black_general_x = generalx;black_general_y = generaly;}mp[v[a].x1][v[a].y1].is = 1;mp[v[a].x1][v[a].y1].color = 'B';mp[v[a].x1][v[a].y1].index = mp[v[a].x2][v[a].y2].index;mp[v[a].x2][v[a].y2].color = 'R';mp[v[a].x2][v[a].y2].index = index;mp[v[a].x2][v[a].y2].is = 1;}else{if (mp[v[a].x2][v[a].y2].index == 4){black_general_x = generalx;black_general_y = generaly;}mp[v[a].x1][v[a].y1].is = 1;mp[v[a].x1][v[a].y1].color = 'B';mp[v[a].x1][v[a].y1].index = mp[v[a].x2][v[a].y2].index;mp[v[a].x2][v[a].y2].color = NULL;mp[v[a].x2][v[a].y2].index = index;mp[v[a].x2][v[a].y2].is = 0;}}//printf("%d\n", v.size());//printf("%d\n", minn);//return ans;
}

不含人机的代码如下:

#include"acllib.h"
#include<math.h>
#include<stdio.h>
#include<queue>
#define INTERVAL 50
using namespace std;
ACL_Image chessimg;
const double pi = 3.14;
//左上角为:(102,100)
// width:55
//height:55
//棋盘大小:440*495
//棋子半径:20
const char* chessname[] = { "車","馬","象","士","将","炮","卒","车","马","相","仕","帥","砲","兵" };
struct piece
{int x, y;int index;int is;char color;int pos;//兵 卒是否过河int row, col;
};
deque<piece>q;//悔棋——三步
void paint(piece s);
struct piece mp[10][9];
void initmp();
void initpaint();
void mouseEvent(int x, int y, int button, int e);
void paint_rect(int tmpx, int tmpy);
int judge_piece(int x, int y);
void chessboard();
int mouseflag = 0;
int prex, prey;
int black_general_x = 0, black_general_y = 4, black_general_isexist = 1;
int red_general_x = 9, red_general_y = 4, red_general_isexist = 1;
piece tmp;
int judge_general(int x, int y);
int Setup()
{//initConsole();initWindow("chess", DEFAULT, DEFAULT, 650, 701);chessboard();//loadImage("qipan.bmp", &chessimg);/*beginPaint();putImageScale(&chessimg, 0, 0, 650, 701);endPaint();*/registerMouseEvent(mouseEvent);//paint(piece s);initmp();initpaint();return 0;
}
void mouseEvent(int x, int y, int button, int e)
{if (button == LEFT_BUTTON && e == BUTTON_DOWN){if (x >= INTERVAL + 8 * 55 + 33 && x <= INTERVAL + 8 * 55 + 33 + 100 && y >= INTERVAL + 55 && y <= INTERVAL + 55 + 100)// INTERVAL + 8 * 55 + 33, INTERVAL + 55){/*beginPaint();setPenColor(BLACK);setPenWidth(3);setBrushColor(EMPTY);rectangle(INTERVAL + 8 * 55 + 33, INTERVAL + 55, INTERVAL + 8 * 55 + 33 + 100, INTERVAL + 55 + 50);endPaint();*/if (!q.empty()){piece p1 = q.back();q.pop_back();piece p2 = q.back();q.pop_back();//piece p3 = p1;mp[p1.row][p1.col].color = p1.color;mp[p1.row][p1.col].index = p1.index;mp[p1.row][p1.col].is = p1.is;mp[p1.row][p1.col].pos = p1.pos;mp[p2.row][p2.col].color = p2.color;mp[p2.row][p2.col].index = p2.index;mp[p2.row][p2.col].is = p2.is;mp[p2.row][p2.col].pos = p2.pos;initpaint();}}int tmpx, tmpy, f = 0;for (int a = 0; a < 10; a++){if (f == 1)break;for (int b = 0; b < 9; b++){if (sqrt(((double)x - mp[a][b].x) * ((double)x - mp[a][b].x) + ((double)y - mp[a][b].y) * ((double)y - mp[a][b].y)) <= 20){f = 1;tmpx = a;tmpy = b;break;}}}if (f == 1)//有格子{initpaint();//paint_rect(tmpx, tmpy);/*tmp.x = mp[tmpx][tmpy].x;tmp.y = mp[tmpx][tmpy].y;tmp.is = mp[tmpx][tmpy].is;tmp.index = mp[tmpx][tmpy].index;*/if (mp[tmpx][tmpy].is == 1)//格子内有棋子{if (tmp.color == mp[tmpx][tmpy].color || tmp.color == NULL)//同色copy{paint_rect(tmpx, tmpy);prex = tmpx;prey = tmpy;tmp.is = mp[tmpx][tmpy].is;tmp.index = mp[tmpx][tmpy].index;tmp.color = mp[tmpx][tmpy].color;}else if (judge_piece(tmpx, tmpy) == 1)    //异色吃掉{q.push_back(mp[tmpx][tmpy]);q.push_back(mp[prex][prey]);while (q.size() > 6) {q.pop_front();q.pop_front();}if (mp[tmpx][tmpy].pos == 1)//若被吃掉的是南兵{mp[tmpx][tmpy].pos = 0;}else if (mp[prex][prey].pos == 1)//南兵吃别人{mp[prex][prey].pos = 0;mp[tmpx][tmpy].pos = 1;}if (mp[prex][prey].index == 4)//若是黑将移动,黑将位置重新赋值{black_general_x = tmpx;black_general_y = tmpy;}else if (mp[prex][prey].index == 11)//若是红将移动,红将位置重新赋值{red_general_x = tmpx;red_general_y = tmpy;}if (mp[tmpx][tmpy].index == 11)red_general_isexist = 0;else if (mp[tmpx][tmpy].index == 4)black_general_isexist = 0;mp[tmpx][tmpy].color = tmp.color;mp[tmpx][tmpy].index = tmp.index;mp[prex][prey].is = 0;mp[prex][prey].color = NULL;tmp.is = 0;tmp.color = NULL;initpaint();if (judge_general(tmpx, tmpy) == 1){beginPaint();setTextColor(RED);setTextSize(30);setTextBkColor(EMPTY);paintText(250, 600, "将   军!");endPaint();}}else{beginPaint();setTextColor(RED);setTextSize(30);setTextBkColor(EMPTY);paintText(250, 600, "请规范行棋");endPaint();tmp.is = 0;tmp.color = NULL;}}else//格子内没有棋子{//paint_rect(tmpx, tmpy);if (tmp.is == 1){if (judge_piece(tmpx, tmpy) == 1){q.push_back(mp[tmpx][tmpy]);q.push_back(mp[prex][prey]);if (q.size() > 6) {q.pop_front();q.pop_front();}if (mp[prex][prey].pos == 1){mp[prex][prey].pos = 0;mp[tmpx][tmpy].pos = 1;}if (mp[prex][prey].index == 4)//若是黑将移动,黑将位置重新赋值{black_general_x = tmpx;black_general_y = tmpy;}else if (mp[prex][prey].index == 11)//若是红将移动,红将位置重新赋值{red_general_x = tmpx;red_general_y = tmpy;}mp[prex][prey].is = 0;mp[prex][prey].color = NULL;mp[tmpx][tmpy].index = tmp.index;mp[tmpx][tmpy].is = tmp.is;mp[tmpx][tmpy].color = tmp.color;tmp.is = 0;tmp.color = NULL;initpaint();if (judge_general(tmpx, tmpy) == 1){beginPaint();setTextColor(RED);setTextSize(30);setTextBkColor(EMPTY);paintText(250, 600, "将   军!");endPaint();}}else{beginPaint();setTextColor(RED);setTextSize(30);setTextBkColor(EMPTY);paintText(250, 600, "请规范行棋");endPaint();tmp.is = 0;tmp.color = NULL;}//initpaint();}else paint_rect(tmpx, tmpy);//initpaint();}}if (red_general_isexist == 0){beginPaint();setTextSize(70);setTextColor(BLACK);setTextBkColor(RGB(3, 168, 158));paintText(130, 270, "黑方获胜");endPaint();}else if (black_general_isexist == 0){beginPaint();setTextSize(70);setTextColor(RED);setTextBkColor(RGB(3, 168, 158));paintText(130, 270, "红方获胜");endPaint();}}else if (button == RIGHT_BUTTON && e == BUTTON_DOWN){initpaint();tmp.is = 0;tmp.color = NULL;}//initpaint();
}
void paint(piece s)
{beginPaint();//clearDevice();//putImageScale(&chessimg, 0, 0, 650, 701);setPenColor(RGB(245, 222, 179));setPenWidth(3);setBrushColor(RGB(245, 222, 179));ellipse(s.x - 20, s.y - 20, s.x + 20, s.y + 20);if (s.color == 'B')setTextColor(BLACK);else setTextColor(RED);setTextSize((int)(20 * sin(pi / 4)) * 2);setTextBkColor(EMPTY);paintText(s.x - (int)(20 * sin(pi / 4)), s.y - (int)(20 * sin(pi / 4)), chessname[s.index]);endPaint();
}
/*void paintb(piece s)
{beginPaint();//clearDevice();setPenColor(RGB(245, 222, 179));setPenWidth(3);setBrushColor(RGB(245, 222, 179));ellipse(s.x - 20, s.y - 20, s.x + 20, s.y + 20);setTextColor(BLACK);setTextSize((int)(20 * sin(pi / 4)) * 2);setTextBkColor(EMPTY);paintText(s.x - (int)(20 * sin(pi / 4)), s.y - (int)(20 * sin(pi / 4)), chessname[s.index]);endPaint();
}*/
void initmp()
{for (int a = 0; a < 10; a++){for (int b = 0; b < 9; b++){mp[a][b].x = INTERVAL + 55 * (b);mp[a][b].y = INTERVAL + 55 * (a);mp[a][b].color = NULL;mp[a][b].index = -1;mp[a][b].is = 0;mp[a][b].pos = 0;mp[a][b].row = a;mp[a][b].col = b;}}int j = 0;for (int a = 0; a < 5; a++){mp[0][a].index = j++;mp[0][a].is = 1;mp[0][a].color = 'B';}j = 3;for (int a = 5; a < 9; a++){mp[0][a].index = j--;mp[0][a].is = 1;mp[0][a].color = 'B';}int i = 7;for (int a = 0; a < 5; a++){mp[9][a].index = i++;mp[9][a].is = 1;mp[9][a].color = 'R';}i = 10;for (int a = 5; a < 9; a++){mp[9][a].index = i--;mp[9][a].is = 1;mp[9][a].color = 'R';}mp[2][1].index = 5;mp[2][7].index = 5;mp[2][1].color = 'B';mp[2][7].color = 'B';mp[7][1].index = 12;mp[7][7].index = 12;mp[7][1].color = 'R';mp[7][7].color = 'R';mp[2][1].is = 1;mp[2][7].is = 1;mp[7][1].is = 1;mp[7][7].is = 1;for (int a = 0; a < 9; a += 2){mp[3][a].index = 6;mp[6][a].index = 13;mp[3][a].is = 1;mp[6][a].is = 1;mp[3][a].color = 'B';mp[6][a].color = 'R';mp[6][a].pos = 1;}
}
void initpaint()
{/*for (int a = 0; a < 9; a++){//mp[0][a].is = 1;paintb(mp[0][a]);}paintb(mp[2][1]);paintb(mp[2][7]);//mp[2][1].is = 1;//mp[2][7].is = 1;for (int a = 0; a < 9; a += 2){//mp[3][a].is = 1;paintb(mp[3][a]);}for (int a = 0; a < 9; a++){//mp[9][a].is = 1;paintr(mp[9][a]);}paintr(mp[7][1]);paintr(mp[7][7]);mp[7][1].is = 1;mp[7][7].is = 1;for (int a = 0; a < 9; a += 2){//mp[6][a].is = 1;paintr(mp[6][a]);}*//*beginPaint();clearDevice();putImageScale(&chessimg, 0, 0, 650, 701);endPaint();*/chessboard();for (int a = 0; a < 10; a++)for (int b = 0; b < 9; b++){if (mp[a][b].is == 1){paint(mp[a][b]);}}
}
void paint_rect(int tmpx, int tmpy)
{//initpaint();beginPaint();setPenColor(RGB(0, 0, 225));setBrushColor(EMPTY);rectangle(mp[tmpx][tmpy].x - 25, mp[tmpx][tmpy].y - 25, mp[tmpx][tmpy].x + 25, mp[tmpx][tmpy].y + 25);endPaint();
}
int judge_piece(int x, int y)//18ma07che5 12pao29xiang3 10shi6 13zu else jiang
{if (mp[prex][prey].index == 1 || mp[prex][prey].index == 8){if ((x == prex - 2 && y == prey - 1 && mp[prex - 1][prey].is == 0) || (x == prex - 2 && y == prey + 1 && mp[prex - 1][prey].is == 0)|| (x == prex - 1 && y == prey + 2 && mp[prex][prey + 1].is == 0) || (x == prex + 1 && y == prey + 2 && mp[prex][prey + 1].is == 0)|| (x == prex + 2 && y == prey + 1 && mp[prex + 1][prey].is == 0) || (x == prex + 2 && y == prey - 1 && mp[prex + 1][prey].is == 0)|| (x == prex + 1 && y == prey - 2 && mp[prex][prey - 1].is == 0) || (x == prex - 1 && y == prey - 2 && mp[prex][prey - 1].is == 0)){return 1;}else return 0;}else if (mp[prex][prey].index == 0 || mp[prex][prey].index == 7){if (prey == y){for (int i = min(prex, x) + 1; i < max(prex, x); i++){if (mp[i][prey].is == 1)return 0;}return 1;}else if (prex == x){for (int i = min(prey, y) + 1; i < max(prey, y); i++){if (mp[prex][i].is == 1)return 0;}return 1;}else return 0;}else if (mp[prex][prey].index == 5 || mp[prex][prey].index == 12){if (mp[x][y].is == 1){if (prey == y){int ant = 0;for (int i = min(prex, x) + 1; i < max(prex, x); i++){if (mp[i][prey].is == 1)ant++;}if (ant == 1)return 1;else return 0;}else if (prex == x){int ant = 0;for (int i = min(prey, y) + 1; i < max(prey, y); i++){if (mp[prex][i].is == 1)ant++;}if (ant == 1)return 1;else return 0;}else return 0;}else{if (prey == y){for (int i = min(prex, x) + 1; i < max(prex, x); i++){if (mp[i][prey].is == 1)return 0;}return 1;}else if (prex == x){for (int i = min(prey, y) + 1; i < max(prey, y); i++){if (mp[prex][i].is == 1)return 0;}return 1;}else return 0;}}else if (mp[prex][prey].index == 2 || mp[prex][prey].index == 9){if (prex <= 4){if (x <= 4){if ((x == prex - 2 && y == prey - 2 && mp[prex - 1][prey - 1].is == 0)|| (x == prex - 2 && y == prey + 2 && mp[prex - 1][prey + 1].is == 0)|| (x == prex + 2 && y == prey + 2 && mp[prex + 1][prey + 1].is == 0)|| (x == prex + 2 && y == prey - 2 && mp[prex + 1][prey - 1].is == 0)){return 1;}else return 0;}else return 0;}else if (prex >= 5){if (x > 4){if ((x == prex - 2 && y == prey - 2 && mp[prex - 1][prey - 1].is == 0)|| (x == prex - 2 && y == prey + 2 && mp[prex - 1][prey + 1].is == 0)|| (x == prex + 2 && y == prey + 2 && mp[prex + 1][prey + 1].is == 0)|| (x == prex + 2 && y == prey - 2 && mp[prex + 1][prey - 1].is == 0)){return 1;}else return 0;}else return 0;}}else if (mp[prex][prey].index == 3 || mp[prex][prey].index == 10){if (prex <= 4){if (x > 2 || y < 3 || y>5)return 0;else{if ((x == prex - 1 && y == prey - 1) || (x == prex - 1 && y == prey + 1)|| (x == prex + 1 && y == prey + 1) || (x == prex + 1 && y == prey - 1)){return 1;}else return 0;}}else{if (x < 7 || y < 3 || y>5)return 0;else{if ((x == prex - 1 && y == prey - 1) || (x == prex - 1 && y == prey + 1)|| (x == prex + 1 && y == prey + 1) || (x == prex + 1 && y == prey - 1)){return 1;}else return 0;}}}else if (mp[prex][prey].index == 6 || mp[prex][prey].index == 13){if (mp[prex][prey].pos == 0)//北卒{if (prex <= 4){if ((x == prex + 1) && (y == prey))return 1;else return 0;}else{if (((x == prex + 1) && (y == prey)) || ((x == prex) && (y = prey - 1)) || ((x == prex) && (y = prey + 1)))return 1;else return 0;}}else//南兵{if (prex >= 5){if ((x == prex - 1) && (y == prey)) { return 1; }else return 0;}else{if (((x == prex - 1) && (y == prey)) || ((x == prex) && (y = prey - 1)) || ((x == prex) && (y = prey + 1))) {return 1;}else return 0;}}}else{//int ant = 0;if (prex <= 4){int ant = 0;for (int i = prex + 1; i <= 9; i++){if (mp[i][prey].index == 4 || mp[i][prey].index == 11)break;if (mp[i][prey].is == 1)ant++;}if (ant == 0)return 1;}else{int ant = 0;for (int i = prex - 1; i >= 0; i--){if (mp[i][prey].index == 4 || mp[i][prey].index == 11)break;if (mp[i][prey].is == 1)ant++;}if (ant == 0)return 1;}if (mp[prex][prey].pos == 0){if (((x == prex) && (y == prey + 1)) || ((x == prex) && (y == prey - 1)) || ((y == prey) && (x == prex - 1)) || ((y == prey) && (x == prex + 1))){return 1;}else return 0;}else{if (((x == prex) && (y == prey + 1)) || ((x == prex) && (y == prey - 1)) || ((y == prey) && (x == prex - 1)) || ((y == prey) && (x == prex + 1))){return 1;}else return 0;}}//return 1;
}
void chessboard()
{beginPaint();clearDevice();setPenColor(RED);setPenWidth(1);for (int a = 0; a <= 9; a++){line(INTERVAL, INTERVAL + a * 55, INTERVAL + 440, INTERVAL + a * 55);}for (int a = 0; a <= 8; a++){line(INTERVAL + a * 55, INTERVAL, INTERVAL + a * 55, INTERVAL + 495);}line(INTERVAL + 3 * 55, INTERVAL, INTERVAL + 5 * 55, INTERVAL + 2 * 55);line(INTERVAL + 5 * 55, INTERVAL, INTERVAL + 3 * 55, INTERVAL + 2 * 55);line(INTERVAL + 3 * 55, INTERVAL + 7 * 55, INTERVAL + 5 * 55, INTERVAL + 9 * 55);line(INTERVAL + 5 * 55, INTERVAL + 7 * 55, INTERVAL + 3 * 55, INTERVAL + 9 * 55);setBrushColor(EMPTY);rectangle(INTERVAL - 5, INTERVAL - 5, INTERVAL + 5 + 440, INTERVAL + 5 + 495);setBrushColor(WHITE);rectangle(INTERVAL, INTERVAL + 220, INTERVAL + 440 + 1, INTERVAL + 275 + 1);setTextColor(BLACK);setTextFont("楷体");setTextSize(30);setTextBkColor(WHITE);paintText(INTERVAL + 73, INTERVAL + 235, "楚河           汉界");setTextBkColor(RGB(218, 112, 214));setTextSize(50);paintText(INTERVAL + 8 * 55 + 33, INTERVAL + 55, "悔棋");endPaint();}
int judge_general(int x, int y)//判断是否被将军
{if (mp[x][y].index == 1 || mp[x][y].index == 8){if (mp[x][y].color == 'B'){if ((red_general_x == x - 2 && red_general_y == y - 1) || (red_general_x == x - 2 && red_general_y == y + 1)|| (red_general_x == x - 1 && red_general_y == y + 2) || (red_general_x == x + 1 && red_general_y == y + 2)|| (red_general_x == x + 2 && red_general_y == y + 1) || (red_general_x == x + 2 && red_general_y == y - 1)|| (red_general_x == x + 1 && red_general_y == y - 2) || (red_general_x == x - 1 && red_general_y == y - 2)){return 1;}else return 0;}else{if ((black_general_x == x - 2 && black_general_y == y - 1) || (black_general_x == x - 2 && black_general_y == y + 1)|| (black_general_x == x - 1 && black_general_y == y + 2) || (black_general_x == x + 1 && black_general_y == y + 2)|| (black_general_x == x + 2 && black_general_y == y + 1) || (black_general_x == x + 2 && black_general_y == y - 1)|| (black_general_x == x + 1 && black_general_y == y - 2) || (black_general_x == x - 1 && black_general_y == y - 2)){return 1;}else return 0;}}else if (mp[x][y].index == 0 || mp[x][y].index == 7){if (mp[x][y].color == 'B'){if (red_general_y == y){for (int i = min(red_general_x, x) + 1; i < max(red_general_x, x); i++){if (mp[i][red_general_y].is == 1)return 0;}return 1;}else if (red_general_x == x){for (int i = min(red_general_y, y) + 1; i < max(red_general_y, y); i++){if (mp[red_general_x][i].is == 1)return 0;}return 1;}else return 0;}else{if (black_general_y == y){for (int i = min(black_general_x, x) + 1; i < max(black_general_x, x); i++){if (mp[i][black_general_y].is == 1)return 0;}return 1;}else if (black_general_x == x){for (int i = min(black_general_y, y) + 1; i < max(black_general_y, y); i++){if (mp[black_general_x][i].is == 1)return 0;}return 1;}else return 0;}}else if (mp[x][y].index == 5 || mp[x][y].index == 12){if (mp[x][y].color == 'B'){if (red_general_y == y){int ant = 0;for (int i = min(red_general_x, x) + 1; i < max(red_general_x, x); i++){if (mp[i][red_general_y].is == 1)ant++;}if (ant == 1)return 1;else return 0;}else if (red_general_x == x){int ant = 0;for (int i = min(red_general_y, y) + 1; i < max(red_general_y, y); i++){if (mp[red_general_x][i].is == 1)ant++;}if (ant == 1)return 1;else return 0;}else return 0;}else{if (black_general_y == y){int ant = 0;for (int i = min(black_general_x, x) + 1; i < max(black_general_x, x); i++){if (mp[i][black_general_y].is == 1)ant++;}if (ant == 1)return 1;else return 0;}else if (black_general_x == x){int ant = 0;for (int i = min(black_general_y, y) + 1; i < max(black_general_y, y); i++){if (mp[black_general_x][i].is == 1)ant++;}if (ant == 1)return 1;else return 0;}else return 0;}return  0;}else if (mp[x][y].index == 6 || mp[x][y].index == 13){if (mp[x][y].color == 'B'){if ((red_general_x == x + 1 && red_general_y == y) || (red_general_x == x && red_general_y == y - 1)|| (red_general_x == x && red_general_y == y + 1)){return 1;}else return 0;}else{if ((black_general_x == x - 1 && black_general_y == y) || (black_general_x == x && black_general_y == y - 1)|| (black_general_x == x && black_general_y == y + 1)){return 1;}else return 0;}}
}

打完收工!

C/C++:实现象棋游戏相关推荐

  1. java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器

    java通用象棋游戏 The Universal Chess Interface (UCI) has been around a long time and used by many chess en ...

  2. 团队-象棋游戏-设计文档

    项目名称:象棋游戏 项目参加人员:李一轩.程吉.刘泽宇.苑旺.李瑞鹏.周建伟 项目所需环境及工具:HBuilder.Google浏览器 页面设计:在网页中使用,并由图片来进行棋盘的显示 游戏功能设计: ...

  3. 团队-象棋游戏-需求分析

    HTML版象棋游戏需求分析: 一.在HTML页面中将象棋棋盘绘画出来 二.对PVE/PVP对战进行分析: 1.进行游戏胜负的分析,将红方/黑方的帅/将进行斩杀便取得胜利 2.游戏的各种功能按键(如:悔 ...

  4. java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载

    运行于手机上的中国象棋游戏,鉴于JAVA J2ME技术,本游戏分服务端和客户端,导入JAR包即可在手机上运行,内有开发文档和运用说明. Java手机网络版象棋游戏附源码 (1 folders, 2 f ...

  5. c语言编程一个象棋游戏,急求:C语言编写的中国象棋游戏一个

    急求:C语言编写的中国象棋游戏一个 來源:互聯網  2009-09-08 12:30:35  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: 由于学习 ...

  6. 【笔记】JAVA 中国象棋游戏 部分源码

    /**  * 演示棋谱类  *  * @author cnlht  */ public class Demon extends JPanel implements ActionListener, Ru ...

  7. 朋友写的一个中国象棋游戏,JAVA代码

    朋友写的一个中国象棋游戏,JAVA代码.有兴趣的可以这里下载:中国象棋下载 (1)地址,不知现在还能下否....中国象棋历史悠久,吸引了无数的人研究,现对中国象棋的对战和实现棋谱的制作做如下的设计和说 ...

  8. 奇怪的象棋游戏及升级版

    题目描述 ​ 小明和李华在玩一种奇怪的象棋游戏,这个棋盘的大小为 500×500,有一种棋子,既能"马走日"也能"象走田",现在棋盘上有两个棋子在位置 X1,Y ...

  9. C++900行代码实现中国象棋游戏规则以及相关功能

    本文章通过C++中的900行代码实现中国象棋游戏以及相关功能,主要的内容如下: 1.设置未进入游戏前的主页面: 2.绘制棋盘(如果有刚好尺寸的图片也可直接加载),包括棋盘网格,炮与兵的特殊标记绘制: ...

  10. Java网络象棋游戏(功能版)

    Java 网络象棋游戏(功能版) 网络象棋目录 客户端 走棋 悔棋 认输 保存棋谱 演示棋谱(自动.手动) 服务器端 与客户端相同 网络象棋目录 客户端 走棋 悔棋 认输 保存棋谱 演示棋谱(自动.手 ...

最新文章

  1. python查找字符串出现次数_Python 中找出字符串中出现频率最高的字母
  2. python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...
  3. 笔记-信息系统开发基础-CMMI组织能力成熟度模型-连续式和阶梯式的分组
  4. Uboot启动流程分析
  5. Python机器学习---何为机器学习?
  6. linux远程拷贝免手动输入密码,scp远程拷贝避免输入密码
  7. SQL Server-【知识与实战II】条件查询、比较运算符查询、模糊查询、枚举查询、范围查询、空值查询、多重条件查询
  8. idea 2019.3 集成SVN
  9. Python3之pip加速
  10. 大文件(10G以上吧)的处理
  11. 【金猿人物展】龙盈智达首席数据科学家王彦博:量子科技为AI大数据创新发展注入新动能...
  12. 微信小程序、苹果手机(ios)时间格式显示NAN.....(已解决)
  13. 2016 版 Laravel 系列入门教程(二)【最适合中国人的 Laravel 教程】
  14. unity2D 动态漫画剧本(给猛虎桥章节做动画演示二)
  15. 后台流量跑得快?软件厂商和运营商或许在偷着乐
  16. Socket.IO使用方法
  17. Visual Studio 2022的下载安装及使用
  18. 智能客服 | 浅谈人工智能聊天机器人ChatGPT
  19. 李永乐660高等数学极限题目技巧
  20. 图神经网络在推荐领域,图神经网络的优势

热门文章

  1. Python数据处理课程设计-房屋价格预测
  2. 【001】基于51单片机的DS18B20温度检测与报警装置的proteus仿真设计
  3. 情侣相处最佳模式,写得很有道理~
  4. 如何迅速成为Java高手-王维树
  5. 谷歌浏览器驱动国内镜像下载地址
  6. 华为手机android9隐藏游戏的方法,我的华为Mate10pro为什么玩不了安卓隐藏小游戏?...
  7. 求二阶系统输入单位斜坡响应matlab,二阶系统的斜坡响应教程.docx
  8. 郑州学车驾校考驾照流程攻略
  9. 算法 - 多目标优化的注意点及常用方法概述
  10. 户外电源品牌之间比较的是什么?