• 用VS软件开发“中国象棋“游戏<笔记摘录>


     整体架构如上

    1.很直观地去看这个中国象棋的界面,数一下它有多少行和多少列.

    10行,9列:要注意这里数的是安放象棋的位置,有10行9列

    这里我们首先想到的必然是二维数组,每一个行列交叉的点都设置成二维数组a[i][j]这样的格式,以此来确定棋盘上面每一个棋子的位置和走向.

    我们把上面安放棋子的二维数组定义成一个地图,也就是map[i][j]的格式,但同时要注意,每一个象棋棋子都有行,列,颜色,是否过河和名称(也就是什么棋子)几种定义区分.

    那么这里我们就需要把棋子定义成一个结构.如下:

    1. struct Chesscoordinate//棋子综合信息
    2. {
    3. int x;
    4. int y;
    5. DWORD type; //颜色
    6. bool river;//是否过河
    7. int id;
    8. };

    当定义了棋子综合信息,我们是不是需要每一个信息都拓展一下?

    x代表的是在棋盘上面的列,也就是竖行,y代表的是棋子在棋盘上面的行,也就是横线,而type代表的棋子的颜色,棋子颜色可以分为黑色和红色两种;river设置成bool型的,只需要判断棋子是否过河就可以了.最后id定义的是棋子上面的名称,比如将,帅等.

    接下来我们就来VS当中进行棋子的程序定义拓展:

    1. #define distance 35//窗口线与棋盘边界线的距离
    2. #define longth 65//棋盘方格的长
    3. #define high 61//棋盘方格的宽

    distance longth 和high我们都把其设置成宏,这个就要回溯到棋盘上面,把棋盘假设成一个xy的二维坐标,那么要定义每一个棋子的位置,或者说是每一行与每一列的交叉点,就要用到上面三个宏定义.

    比如左上角第一个棋子的坐标可以表示为:

    map[0][0].x=distance;

    map[0][0].y=distance

    而第一行第二个棋子的坐标可以表示为:

    map[1][0].x=distance+longth;

    map[1][0].y=distance

    依次类推......

    1. int xx(int a)//数组下标转换成坐标
    2. {
    3. a = distance + longth * a;
    4. return a;
    5. }
    6. int yy(int a)
    7. {
    8. a = distance + high * a;
    9. return a;
    10. }

    我们可以推断出每一个棋子的坐标,都可以通过上面几个宏定义以及棋子的实际行列表示出来,

    1. enum pieces
    2. {
    3. SPACE = -1,
    4. 車, 馬, 象, 士, 将, 炮, 卒,
    5. 车, 马, 相, 仕, 帥, 砲, 兵,
    6. BEGIN, END,
    7. };
    8. enum pieces redchess[] = { 車,馬,象,士,将,炮,卒, };
    9. enum pieces blackchess[] = { 车,马,相,仕,帥,砲,兵, };
    10. enum pieces state = BEGIN;
    11. struct move { //鼠标选中的棋子
    12. int beginx;
    13. int beginy;
    14. int endx;
    15. int endy;
    16. int state;
    17. }moving = { -1,-1,-1,-1,BEGIN };
    18. const char* chessname[] = { "車","馬","象","士","将","炮","卒","车","马","相","仕","帥","砲","兵", };

    这里我们把棋子的id设置成一个联合结构数组,因为里面的棋子的id都基本不同,同时我们考虑到了棋子要进行运动,把棋子的开始状态设置为BEGIN

    而新建一个move的结构,表示鼠标选中棋子的基本信息.begin的行列和结束的行列和运行状态.

    最后回到棋子id上面,我们是不是需要把这些id都设置到棋子或者棋盘上面啊,采用常量字符数组的形式,把棋盘上面所有的棋子都表示出来.

    而把刚才的map[i][j]二维数组同样定义成一个二维结构数组.如下:

    1. struct Chesscoordinate map[9][10];//坐标
    2. struct Chesscoordinate AImap[9][10];//坐标

    同时,我们设置了AImap[i][j]的二维结构数组,看看是否下面在进行棋子移动的时候,我们会用到.

    这里i=9,j=10是根据我们上面看中国象棋棋盘得到的数据.

    2.我们要开始加载图片信息了,把我们已经有的棋盘素材放在同文件下面,然后采用下面程序,就可以在窗口当中显示出中国棋盘的背景图.

    1. void begining()
    2. {
    3. loadimage(&img, "D:/program/Project3-chess successful/1.png");
    4. initgraph(img.getwidth(), img.getheight(), 1); //初始化图形系统
    5. putimage(0, 0, &img);//输出开始界面;

    至于,loadimage()和initgraph()函数以及putimage()函数三者的基本理解和解释,建议去搜索,都有比较详细的解释.这里我们解释一下initgraph()函数的基本含义:

    这个函数用于初始化绘图环境。

    1. HWND initgraph(
    2.     int width,
    3.     int height,
    4.     int flag = NULL
    5. );

    参数:

    width   绘图环境的宽度。

    height   绘图环境的高度。

    flag  绘图环境的样式,默认为 NULL。

    上面程序的基本思路也就不言而喻:先加载或者找到我们素材的地址,然后定义出素材的宽和长度,然后再输出这个棋盘背景.

    当输出完背景之后,我们是不是要先把所有的棋子放在初始位置,也就是初始化棋盘?

    1. void coord()//棋子信息赋值
    2. {
    3. loadimage(&img, "D:/program/Project3-chess successful/1.png");
    4. putimage(0, 0, &img);//输出棋盘
    5. for (int i = 0; i <= 8; i++)
    6. {
    7. for (int j = 0; j <= 9; j++)//遍历二维数组
    8. {
    9. enum pieces chessid = SPACE;//先把全部位置的id赋值为SAPCE
    10. DWORD chesstype;//定义颜色中间变量
    11. if (j <= 4)
    12. {
    13. chesstype = BLACK;//黑方
    14. if (j == 0)
    15. {
    16. if (i <= 4)
    17. {
    18. chessid = blackchess[i];//
    19. }
    20. else
    21. {
    22. chessid = blackchess[8 - i];
    23. }
    24. }
    25. if (j == 2 && (i == 1 || i == 7))
    26. {
    27. chessid = blackchess[5];
    28. }
    29. if (j == 3 && (i == 0 || i == 2 || i == 4 || i == 4 || i == 6 || i == 8))
    30. {
    31. chessid = blackchess[6];
    32. }
    33. }
    34. else
    35. {
    36. chesstype = RED;//红方
    37. if (j == 6 && (i == 0 || i == 2 || i == 4 || i == 6 || i == 8))
    38. {
    39. chessid = redchess[6];
    40. }
    41. if (j == 7 && (i == 1 || i == 7))
    42. {
    43. chessid = redchess[5];
    44. }
    45. if (j == 9)
    46. {
    47. if (i <= 4)
    48. {
    49. chessid = redchess[i];
    50. }
    51. else
    52. {
    53. chessid = redchess[8 - i];
    54. }
    55. }
    56. }//依次赋值
    57. map[i][j].id = chessid;
    58. map[i][j].river = false;
    59. map[i][j].type = chesstype;
    60. map[i][j].x = distance + longth * i;
    61. map[i][j].y = distance + high * j;
    62. }
    63. }
    64. for (int i = 0; i <= 8; i++)
    65. {
    66. for (int j = 0; j <= 9; j++)
    67. {
    68. if (map[i][j].id == SPACE)
    69. {
    70. map[i][j].type = YELLOW;
    71. }
    72. }
    73. }
    74. }

    看上述程序:

    首先先加载出棋盘背景,然后把棋盘上面行和列交叉的位置都设置为SPACE,可以理解为初始化棋盘.然后如果j<=4,也就是楚河的一侧,我们定义棋子type全部都为黑色,而棋子的id要根据行列的位置来确定,首先看第一行,前5列数据,是不是应该是"車,馬,象,士,将"而后四列数据,是不是应该是前面去除将的反序,而观察一下,如果把前面定义成i列,后面对应相等的字符则是8-i列.那么我们就定义完了第一行的数据.

    而炮和兵的数据,以及红方的数据是不是同上述思路一样.

    然后就开始定义每一个棋子初始化的状态,回溯到棋子的基本信息结构当中,有x,y,river,type和id,我们要依次对其进行定义,

    注意在初始状态的时候,棋子的river都为false,因为都没有过楚河

    定义完棋子的位置,那么剩下没有棋子的位置,我们是不是要把刚开始初始化的状态都修改为棋盘的背景颜色啊.上述定义完,再次输出棋盘

    1. void qiban()
    2. {
    3. loadimage(&img, "D:/program/Project3-chess successful/1.png");
    4. initgraph(img.getwidth(), img.getheight(), 1);
    5. putimage(0, 0, &img);//输出棋盘
    6. }

    这个时候就已经初始化了中国象棋的棋盘.

    接下来是不是要把每一个棋子都定义到棋盘上面.开始绘画棋子

    1. void getbackground() //画棋子
    2. {
    3. int x_start, y_start;
    4. x_start = distance;
    5. y_start = distance;
    6. settextstyle(30, 0, "黑体");//棋子大小颜色
    7. setbkmode(0);
    8. for (int i = 0; i <= 8; i++)
    9. {
    10. for (int j = 0; j <= 9; j++)
    11. {
    12. if (map[i][j].id != SPACE)//在棋盘上输出
    13. {
    14. setfillcolor(RGB(253, 216, 161));
    15. // setlinestyle(BLACK);
    16. settextcolor(map[i][j].type);
    17. fillcircle(map[i][j].x, map[i][j].y, 24);
    18. fillcircle(map[i][j].x, map[i][j].y, 18);
    19. outtextxy(map[i][j].x - 13, map[i][j].y - 13, chessname[map[i][j].id]);
    20. }
    21. }
    22. }
    23. }

    如果上面棋盘行列之间的id不是SPACE,那自然就是我们定义的棋子应该安置的位置.从第0行第0列开始,依次进行定义:

    画一个棋子,两个圆环,其颜色要画成背景颜色,而棋子上面的文本颜色要根据实际行列定义的type,设置成黑色和红色,

    最后便是采用outtextxy()把每一个棋子的字符输入进行.注意此处根据棋盘x和y的地址均减13,是根据实际调试来进行,并不是确定常量.

    写到这里,是不是就把棋子和棋盘都初始化好了?yes,of course.

    3.棋盘棋子都初始化好了,那么接下来我们是不是就可以开始移动棋盘上面的棋子,进行下棋了?

    这里有一个有意思的思考:我刚开始认为吃掉棋子和走到空白的地方是两种不同的情况,后面仔细思考了一下,是同一状态,只需要把原来的修改为结束的就可以了,而原来的只需要位置只需要修改颜色和id为空也就没了,不管他end地址有没有棋子.

    1. void movechess(int a, int b, int c, int d)//移动棋子,改变其坐标
    2. {
    3. map[c][d].id = map[a][b].id;
    4. map[c][d].river = map[a][b].river;
    5. map[c][d].type = map[a][b].type;
    6. map[c][d].x = xx(c);
    7. map[c][d].y = yy(d);
    8. map[a][b].id = SPACE;
    9. map[a][b].type = YELLOW;
    10. }
    1. int xx(int a)//数组下标转换成坐标
    2. {
    3. a = distance + longth * a;
    4. return a;
    5. }
    6. int yy(int a)
    7. {
    8. a = distance + high * a;
    9. return a;
    10. }

    把[a][b]位置的棋子信息,全部给了[c][d]位置处的棋子,而[a][b]棋子此处的信息要记得修改id和type,id设置为空,而颜色设置成背景颜色.而xx(c),yy(d)就成了棋子移动到下一个点的坐标

    1. void MouseControl()//获取鼠标点击信息并完响应
    2. {
    3. //getbackground();
    4. if (MouseHit())
    5. {
    6. float beginrow, beginrol, endrow, endrol;//第一次按下时的坐标
    7. int intbeginrow, intbeginrol, intendrow, intendrol;//第二次按下时的坐标
    8. MOUSEMSG msg = GetMouseMsg();/*这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。*/
    9. if (msg.uMsg == WM_LBUTTONDOWN)//按下鼠标左键时
    10. {
    11. //获取鼠标点击的数组的下标
    12. // printf("(%d,%d)", msg.x, msg.y);
    13. //回溯转换成行列
    14. beginrow = (float)(msg.x - distance) / longth;
    15. beginrol = (float)(msg.y - distance) / high;
    16. intbeginrow = round(beginrow);
    17. intbeginrol = round(beginrol);
    18. if (moving.state == BEGIN)
    19. {
    20. moving.state = END;
    21. moving.beginx = intbeginrow;
    22. moving.beginy = intbeginrol;
    23. // printf("(%d,%d) \n", moving.beginx, moving.beginy);
    24. }
    25. else if (moving.state == END)
    26. {
    27. moving.state = BEGIN;
    28. moving.endx = intbeginrow;
    29. moving.endy = intbeginrol;
    30. execute(moving.beginx, moving.beginy, moving.endx, moving.endy);
    31. }
    32. }
    33. }
    34. }

     上面这一段我其实有一点不清晰,我所理解的应该是定义了两个状态,如果状态是开始的时候,那状态改为结束,然后把第一次点击的数据给了开始的数据,如果状态是结束,把状态修改为开始,把第一次点击的数据给了结束的坐标.

    关键:

    1. intbeginrow = round(beginrow);
    2. intbeginrol = round(beginrol);

    判断输赢:

    1. int win()
    2. {
    3. int redgeneral = 0;
    4. int blackgeneral = 0;
    5. for (int i = 0; i <= 8; i++)
    6. {
    7. for (int j = 0; j <= 9; j++)
    8. {
    9. if (map[i][j].id == blackchess[4])
    10. {
    11. blackgeneral++;
    12. }
    13. else if (map[i][j].id == redchess[4])
    14. {
    15. redgeneral++;
    16. }
    17. else
    18. {
    19. blackgeneral = blackgeneral;
    20. redgeneral = redgeneral;
    21. }
    22. }
    23. }
    24. //printf("%d %d\n", blackgeneral, redgeneral);
    25. if (blackgeneral == 0)//红方胜
    26. {
    27. return 0;
    28. }
    29. else if (redgeneral == 0)//黑方胜
    30. {
    31. return 1;
    32. }
    33. else//打平
    34. {
    35. return 2;
    36. }
    37. }

    给将和帅都定义了初始值,相当于如果将死了,那就是帅赢,相反同理,而如果两者都存在,也就是1+1,那自然就是平手,return 2;

    下面就是判断每一种棋子是否按游戏规则进行移动:

    1. bool jiang(int a, int b, int c, int d)//判断是否只移动了一格(将军、兵的规则)
    2. {
    3. float h;
    4. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    5. if (b < 4 && c > 2 && c < 6 && d < 3)
    6. {
    7. if (h == 1 && map[c][d].type != map[a][b].type)
    8. return true;
    9. else
    10. return false;
    11. }
    12. if (b > 4 && c > 2 && c < 6 && d >6)
    13. {
    14. if (h == 1 && map[c][d].type != map[a][b].type)
    15. return true;
    16. else
    17. return false;
    18. }
    19. else
    20. {
    21. return false;
    22. }
    23. }
    24. bool bing(int a, int b, int c, int d)
    25. {
    26. float h;
    27. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    28. if (map[a][b].type == BLACK)
    29. {
    30. if (map[a][b].river == false)
    31. {
    32. if (d == b + 1 && h == 1 && map[c][d].type != map[a][b].type)
    33. {
    34. return true;
    35. }
    36. else
    37. {
    38. return false;
    39. }
    40. }
    41. else
    42. {
    43. if (d >= b && h == 1 && map[c][d].type != map[a][b].type)
    44. {
    45. return true;
    46. }
    47. else
    48. {
    49. return false;
    50. }
    51. }
    52. }
    53. else if (map[a][b].type == RED)
    54. {
    55. if (map[a][b].river == false)
    56. {
    57. if (d == b - 1 && h == 1 && map[c][d].type != map[a][b].type)
    58. {
    59. return true;
    60. }
    61. else
    62. {
    63. return false;
    64. }
    65. }
    66. else
    67. {
    68. if (d <= b && h == 1 && map[c][d].type != map[a][b].type)
    69. {
    70. return true;
    71. }
    72. else
    73. {
    74. return false;
    75. }
    76. }
    77. }
    78. else
    79. {
    80. return false;
    81. }
    82. }
    83. bool pao(int a, int b, int c, int d)//炮的移动
    84. {
    85. if (c == a && d != b)
    86. {
    87. int time = 0;
    88. int max = d > b ? d : b;
    89. int min = b < d ? b : d;
    90. for (int i = min; i <= max; i++)
    91. {
    92. if (map[c][i].id != SPACE)
    93. {
    94. time++;
    95. }
    96. }
    97. // printf("%d\n", time);
    98. if (map[c][d].id == SPACE)
    99. {
    100. if (time == 1)
    101. return true;
    102. else
    103. return false;
    104. }
    105. if (map[c][d].id != SPACE)
    106. {
    107. if (time != 3)
    108. {
    109. return false;
    110. }
    111. else
    112. {
    113. if (map[c][d].type == map[a][b].type)
    114. {
    115. return false;
    116. }
    117. else
    118. {
    119. return true;
    120. }
    121. }
    122. }
    123. }
    124. else if (d == b && c != a)
    125. {
    126. int time = 0;
    127. int max = a > c ? a : c;
    128. int min = c < a ? c : a;
    129. for (int i = min; i <= max; i++)
    130. {
    131. if (map[i][d].id != SPACE)
    132. {
    133. time++;
    134. }
    135. }
    136. // printf("%d\n", time);
    137. if (map[c][d].id == SPACE)
    138. {
    139. if (time == 1)
    140. return true;
    141. else
    142. return false;
    143. }
    144. if (map[c][d].id != SPACE)
    145. {
    146. if (time != 3)
    147. {
    148. return false;
    149. }
    150. else
    151. {
    152. if (map[c][d].type == map[a][b].type)
    153. {
    154. return false;
    155. }
    156. else
    157. {
    158. return true;
    159. }
    160. }
    161. }
    162. }
    163. else
    164. {
    165. return false;
    166. }
    167. }
    168. bool che(int a, int b, int c, int d)
    169. {
    170. if (c == a && d != b)//是否为直线
    171. {
    172. int time = 0;
    173. int max = d > b ? d : b;
    174. int min = b < d ? b : d;
    175. for (int i = min; i <= max; i++)//遍历路径
    176. {
    177. if (map[c][i].id != SPACE)
    178. {
    179. time++;
    180. }
    181. }
    182. // printf("%d", time);
    183. if (time == 1)//车移动不吃棋子
    184. {
    185. return true;
    186. }
    187. if (time == 2)//车移动并且吃目的坐标的棋子
    188. {
    189. if (map[c][d].type == map[a][b].type)//如果是目的坐标是自己的棋子,则返回false
    190. {
    191. return false;
    192. }
    193. if (map[c][d].type == YELLOW)
    194. {
    195. return false;
    196. }
    197. else
    198. {
    199. return true;
    200. }
    201. }
    202. else
    203. {
    204. return false;
    205. }
    206. }
    207. else if (d == b && c != a)
    208. {
    209. int time = 0;
    210. int max = c > a ? c : a;
    211. int min = a < c ? a : c;
    212. for (int i = min; i <= max; i++)//遍历路径
    213. {
    214. if (map[i][d].id != SPACE)
    215. {
    216. time++;
    217. }
    218. }
    219. // printf("%d", time);
    220. if (time == 1)//车是否车跳棋
    221. {
    222. return true;
    223. }
    224. else if (time == 2)
    225. {
    226. if (map[c][d].type == map[a][b].type)
    227. {
    228. return false;
    229. }
    230. if (map[c][d].type == YELLOW)
    231. {
    232. return false;
    233. }
    234. else
    235. {
    236. return true;
    237. }
    238. }
    239. else
    240. {
    241. return false;
    242. }
    243. }
    244. else
    245. {
    246. return 0;
    247. }
    248. }
    249. bool ma(int a, int b, int c, int d)
    250. {
    251. float h;
    252. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    253. // printf("%f", h);
    254. if (h <= 2 || h >= 2.5)//根号8=2.8.根号5=2.2
    255. {
    256. // printf("太远了!\n");
    257. return false;
    258. }
    259. else
    260. {
    261. int xx, yy, max, min;//关键点的坐标和中间值
    262. max = abs(d - b) > abs(c - a) ? abs(d - b) : abs(c - a);
    263. min = abs(c - a) < abs(d - b) ? abs(c - a) : abs(d - b);
    264. //printf("max\min:(%d,%d)", max, min);
    265. if (max == abs(d - b))
    266. {
    267. yy = b + (d - b) / 2;
    268. xx = a;
    269. }
    270. else
    271. {
    272. xx = a + (c - a) / 2;
    273. yy = b;
    274. }
    275. // printf("xx\yy:(%d,%d)\n", xx, yy);
    276. if (map[xx][yy].id == SPACE)
    277. {
    278. if (map[c][d].type != map[a][b].type)
    279. {
    280. // printf("目的坐标(%d,%d)\n", c, d);
    281. // printf("那是你自己的棋子!\n");
    282. return true;
    283. }
    284. else
    285. {
    286. // printf("那是你的棋子!\n");
    287. return false;
    288. }
    289. }
    290. else
    291. {
    292. // printf("关键位置有棋子!\n");
    293. return false;
    294. }
    295. }
    296. }
    297. bool xiang(int a, int b, int c, int d)
    298. {
    299. float h;
    300. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    301. if (b <= 4)
    302. {
    303. if (d > 4)
    304. {
    305. return false;
    306. }
    307. else
    308. {
    309. if (h < 2.4 || h>2.9)
    310. {
    311. return false;
    312. }
    313. else
    314. {
    315. int xx = (a + c) / 2;
    316. int yy = (b + d) / 2;
    317. if (map[xx][yy].id == SPACE)
    318. {
    319. if (map[c][d].type == map[a][b].type)
    320. {
    321. return false;
    322. }
    323. else
    324. {
    325. return true;
    326. }
    327. }
    328. else
    329. {
    330. return false;
    331. }
    332. }
    333. }
    334. }
    335. else
    336. {
    337. if (d < 5)
    338. {
    339. return false;
    340. }
    341. else
    342. {
    343. if (h < 2.4 || h>2.9)
    344. {
    345. return false;
    346. }
    347. else
    348. {
    349. int xx = (a + c) / 2;
    350. int yy = (b + d) / 2;
    351. if (map[xx][yy].id == SPACE)
    352. {
    353. if (map[c][d].type == map[a][b].type)
    354. {
    355. return false;
    356. }
    357. else
    358. {
    359. return true;
    360. }
    361. }
    362. else
    363. {
    364. return false;
    365. }
    366. }
    367. }
    368. }
    369. }
    370. bool shi(int a, int b, int c, int d)
    371. {
    372. float h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    373. // printf("%f", h)
    374. if (b < 5)
    375. {
    376. if (c >= 3 && c <= 5 && d <= 2)
    377. {
    378. if (1.2 < h && h < 1.5)
    379. {
    380. if (map[c][d].type != map[a][b].type)
    381. return true;
    382. else
    383. return false;
    384. }
    385. else
    386. {
    387. return false;
    388. }
    389. }
    390. else
    391. {
    392. return false;
    393. }
    394. }
    395. else if (b > 5)
    396. {
    397. if (c >= 3 && c <= 5 && d >= 7)
    398. {
    399. if (1.2 < h && h < 1.5)
    400. {
    401. if (map[c][d].type != map[a][b].type)
    402. return true;
    403. else
    404. return false;
    405. }
    406. else
    407. {
    408. return false;
    409. }
    410. }
    411. else
    412. {
    413. return false;
    414. }
    415. }
    416. else
    417. return false;
    418. }

    上述全都是bool型,用以表示判断是否正确就行

    接下来是行棋子,如果遵守规则,也就是上面的bool输出true,则移动,否则输出"你不能这样做!"

    1. void execute(int a, int b, int c, int d)//行棋
    2. {
    3. if (map[a][b].id == blackchess[4])//黑方将
    4. {
    5. if (jiang(a, b, c, d))
    6. {
    7. movechess(a, b, c, d);
    8. }
    9. else
    10. {
    11. printf("你不能这样做\n");
    12. }
    13. }
    14. else if (map[a][b].id == redchess[4])//红方将
    15. {
    16. if (jiang(a, b, c, d))
    17. {
    18. movechess(a, b, c, d);
    19. }
    20. else
    21. {
    22. printf("你不能这样做!\n");
    23. }
    24. }
    25. else if (map[a][b].id == blackchess[6])//黑方兵
    26. {
    27. if (map[a][b].river == false)
    28. {
    29. if (bing(a, b, c, d))
    30. {
    31. movechess(a, b, c, d);
    32. if (d > 4)
    33. {
    34. map[c][d].river = true;
    35. }
    36. }
    37. else
    38. {
    39. printf("你不可以这样做!\n");
    40. }
    41. }
    42. else
    43. {
    44. if (bing(a, b, c, d) && d >= b)
    45. {
    46. movechess(a, b, c, d);
    47. }
    48. else
    49. {
    50. printf("你不可以这样做\n");
    51. }
    52. }
    53. }
    54. else if (map[a][b].id == redchess[6])//红方兵
    55. {
    56. if (map[a][b].river == false)
    57. {
    58. if (bing(a, b, c, d))
    59. {
    60. movechess(a, b, c, d);
    61. if (d < 5)
    62. {
    63. map[c][d].river = true;
    64. }
    65. }
    66. else
    67. {
    68. printf("你不可以这样做!\n");
    69. }
    70. }
    71. else
    72. {
    73. if (bing(a, b, c, d) && d <= b)
    74. {
    75. movechess(a, b, c, d);
    76. }
    77. else
    78. {
    79. printf("你不可以这样做!\n");
    80. }
    81. }
    82. }
    83. else if (map[a][b].id == blackchess[5] || map[a][b].id == redchess[5])
    84. {
    85. if (pao(a, b, c, d))
    86. {
    87. movechess(a, b, c, d);
    88. }
    89. else
    90. {
    91. printf("你不能这样做!\n");
    92. }
    93. }
    94. else if (map[a][b].id == blackchess[0] || map[a][b].id == redchess[0])
    95. {
    96. if (che(a, b, c, d))
    97. {
    98. movechess(a, b, c, d);
    99. }
    100. else
    101. {
    102. printf("你不可以这样做!\n");
    103. }
    104. }
    105. else if (map[a][b].id == blackchess[1] || map[a][b].id == redchess[1])
    106. {
    107. if (ma(a, b, c, d))
    108. {
    109. movechess(a, b, c, d);
    110. }
    111. else
    112. {
    113. printf("你不能这样做!\n");
    114. }
    115. }
    116. else if (map[a][b].id == blackchess[2] || map[a][b].id == redchess[2])
    117. {
    118. if (xiang(a, b, c, d))
    119. {
    120. movechess(a, b, c, d);
    121. }
    122. else
    123. printf("你不能这样做!\n");
    124. }
    125. else if (map[a][b].id == blackchess[3])
    126. {
    127. if (shi(a, b, c, d))
    128. {
    129. movechess(a, b, c, d);
    130. }
    131. else
    132. printf("你不能这样做!");
    133. }
    134. else if (map[a][b].id == redchess[3])
    135. {
    136. if (shi(a, b, c, d))
    137. {
    138. movechess(a, b, c, d);
    139. }
    140. else
    141. printf("你不能这样做!");
    142. }
    143. }

    定义完上面所有的函数,最后就是主函数,运行就可以了

    1. int main()
    2. {
    3. begining();
    4. while (1)//当正确的时候
    5. {
    6. coord();//输出棋盘
    7. win();
    8. BeginBatchDraw();
    9. /*这个函数用于开始批量绘图。执行后
    10. 任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。*/
    11. //运行BeginBatchDraw后,所有的绘图都不再显示在屏幕上,而是在内存中进行
    12. //封装的双缓存,避免闪屏
    13. /*那如果我们能让打印的过程不显示出来,只显示打印完后的显示缓冲区不就行了吗*/
    14. while (win() == 2)//平局状态,是不是还需要继续运行下去?
    15. {
    16. win();
    17. putimage(0, 0, &img);
    18. getbackground();//输出棋子
    19. MouseControl();//鼠标更改数据
    20. FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/
    21. }
    22. putimage(0, 0, &img);
    23. getbackground();//输出棋子
    24. MouseControl();//鼠标更改数据
    25. FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/
    26. if (win() == 0)
    27. {
    28. printf("红方胜!\n");
    29. }
    30. else if (win() == 1)
    31. {
    32. printf("黑方胜!\n");
    33. }
    34. }
    35. getchar();
    36. return 0;
    37. }

    总代码:

    1. #include<stdio.h>
    2. #include<graphics.h>
    3. #include<math.h>
    4. void execute(int a, int b, int c, int d);
    5. bool jiang(int a, int b, int c, int d);
    6. bool pao(int a, int b, int c, int d);
    7. bool ma(int a, int b, int c, int d);
    8. IMAGE img;
    9. #define distance 35//窗口线与棋盘边界线的距离
    10. #define longth 65//棋盘方格的长
    11. #define high 61//棋盘方格的宽
    12. struct movecoordinate
    13. {
    14. long x;
    15. long y;
    16. };
    17. struct Chesscoordinate//棋子综合信息
    18. {
    19. int x;
    20. int y;
    21. DWORD type; //颜色
    22. bool river;//是否过河
    23. int id;
    24. };
    25. enum pieces
    26. {
    27. SPACE = -1,
    28. 車, 馬, 象, 士, 将, 炮, 卒,
    29. 车, 马, 相, 仕, 帥, 砲, 兵,
    30. BEGIN, END,
    31. };
    32. enum pieces redchess[] = { 車,馬,象,士,将,炮,卒, };
    33. enum pieces blackchess[] = { 车,马,相,仕,帥,砲,兵, };
    34. enum pieces state = BEGIN;
    35. struct move { //鼠标选中的棋子
    36. int beginx;
    37. int beginy;
    38. int endx;
    39. int endy;
    40. int state;
    41. }moving = { -1,-1,-1,-1,BEGIN };
    42. const char* chessname[] = { "車","馬","象","士","将","炮","卒","车","马","相","仕","帥","砲","兵", };
    43. struct Chesscoordinate map[9][10];//坐标
    44. struct Chesscoordinate AImap[9][10];//坐标
    45. movecoordinate begin = { -1,-1 }, end = { -1,-1 };
    46. int xx(int a)//数组下标转换成坐标
    47. {
    48. a = distance + longth * a;
    49. return a;
    50. }
    51. int yy(int a)
    52. {
    53. a = distance + high * a;
    54. return a;
    55. }
    56. void begining()
    57. {
    58. loadimage(&img, "D:/program/Project3-chess successful/1.png");
    59. initgraph(img.getwidth(), img.getheight(), 1); //初始化图形系统
    60. putimage(0, 0, &img);//输出开始界面;
    61. }
    62. void qiban()
    63. {
    64. loadimage(&img, "D:/program/Project3-chess successful/1.png");
    65. initgraph(img.getwidth(), img.getheight(), 1);
    66. putimage(0, 0, &img);//输出棋盘
    67. }
    68. void coord()//棋子信息赋值
    69. {
    70. loadimage(&img, "D:/program/Project3-chess successful/1.png");
    71. putimage(0, 0, &img);//输出棋盘
    72. for (int i = 0; i <= 8; i++)
    73. {
    74. for (int j = 0; j <= 9; j++)//遍历二维数组
    75. {
    76. enum pieces chessid = SPACE;//先把全部位置的id赋值为SAPCE
    77. DWORD chesstype;//定义颜色中间变量
    78. if (j <= 4)
    79. {
    80. chesstype = BLACK;//黑方
    81. if (j == 0)
    82. {
    83. if (i <= 4)
    84. {
    85. chessid = blackchess[i];//
    86. }
    87. else
    88. {
    89. chessid = blackchess[8 - i];
    90. }
    91. }
    92. if (j == 2 && (i == 1 || i == 7))
    93. {
    94. chessid = blackchess[5];
    95. }
    96. if (j == 3 && (i == 0 || i == 2 || i == 4 || i == 4 || i == 6 || i == 8))
    97. {
    98. chessid = blackchess[6];
    99. }
    100. }
    101. else
    102. {
    103. chesstype = RED;//红方
    104. if (j == 6 && (i == 0 || i == 2 || i == 4 || i == 6 || i == 8))
    105. {
    106. chessid = redchess[6];
    107. }
    108. if (j == 7 && (i == 1 || i == 7))
    109. {
    110. chessid = redchess[5];
    111. }
    112. if (j == 9)
    113. {
    114. if (i <= 4)
    115. {
    116. chessid = redchess[i];
    117. }
    118. else
    119. {
    120. chessid = redchess[8 - i];
    121. }
    122. }
    123. }//依次赋值
    124. map[i][j].id = chessid;
    125. map[i][j].river = false;
    126. map[i][j].type = chesstype;
    127. map[i][j].x = distance + longth * i;
    128. map[i][j].y = distance + high * j;
    129. }
    130. }
    131. for (int i = 0; i <= 8; i++)
    132. {
    133. for (int j = 0; j <= 9; j++)
    134. {
    135. if (map[i][j].id == SPACE)
    136. {
    137. map[i][j].type = YELLOW;
    138. }
    139. }
    140. }
    141. }
    142. void getbackground() //画棋子
    143. {
    144. int x_start, y_start;
    145. x_start = distance;
    146. y_start = distance;
    147. settextstyle(30, 0, "黑体");//棋子大小颜色
    148. setbkmode(0);
    149. for (int i = 0; i <= 8; i++)
    150. {
    151. for (int j = 0; j <= 9; j++)
    152. {
    153. if (map[i][j].id != SPACE)//在棋盘上输出
    154. {
    155. setfillcolor(RGB(253, 216, 161));
    156. // setlinestyle(BLACK);
    157. settextcolor(map[i][j].type);
    158. fillcircle(map[i][j].x, map[i][j].y, 24);
    159. fillcircle(map[i][j].x, map[i][j].y, 18);
    160. outtextxy(map[i][j].x - 13, map[i][j].y - 13, chessname[map[i][j].id]);
    161. }
    162. }
    163. }
    164. }
    165. void movechess(int a, int b, int c, int d)//移动棋子,改变其坐标
    166. {
    167. map[c][d].id = map[a][b].id;
    168. map[c][d].river = map[a][b].river;
    169. map[c][d].type = map[a][b].type;
    170. map[c][d].x = xx(c);
    171. map[c][d].y = yy(d);
    172. map[a][b].id = SPACE;
    173. map[a][b].type = YELLOW;
    174. }
    175. void MouseControl()//获取鼠标点击信息并完响应
    176. {
    177. //getbackground();
    178. if (MouseHit())
    179. {
    180. float beginrow, beginrol, endrow, endrol;//第一次按下时的坐标
    181. int intbeginrow, intbeginrol, intendrow, intendrol;//第二次按下时的坐标
    182. MOUSEMSG msg = GetMouseMsg();/*这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。*/
    183. if (msg.uMsg == WM_LBUTTONDOWN)//按下鼠标左键时
    184. {
    185. //获取鼠标点击的数组的下标
    186. // printf("(%d,%d)", msg.x, msg.y);
    187. //回溯转换成行列
    188. beginrow = (float)(msg.x - distance) / longth;
    189. beginrol = (float)(msg.y - distance) / high;
    190. intbeginrow = round(beginrow);
    191. intbeginrol = round(beginrol);
    192. if (moving.state == BEGIN)
    193. {
    194. moving.state = END;
    195. moving.beginx = intbeginrow;
    196. moving.beginy = intbeginrol;
    197. // printf("(%d,%d) \n", moving.beginx, moving.beginy);
    198. }
    199. else if (moving.state == END)
    200. {
    201. moving.state = BEGIN;
    202. moving.endx = intbeginrow;
    203. moving.endy = intbeginrol;
    204. execute(moving.beginx, moving.beginy, moving.endx, moving.endy);
    205. }
    206. }
    207. }
    208. }
    209. int win()
    210. {
    211. int redgeneral = 0;
    212. int blackgeneral = 0;
    213. for (int i = 0; i <= 8; i++)
    214. {
    215. for (int j = 0; j <= 9; j++)
    216. {
    217. if (map[i][j].id == blackchess[4])
    218. {
    219. blackgeneral++;
    220. }
    221. else if (map[i][j].id == redchess[4])
    222. {
    223. redgeneral++;
    224. }
    225. else
    226. {
    227. blackgeneral = blackgeneral;
    228. redgeneral = redgeneral;
    229. }
    230. }
    231. }
    232. //printf("%d %d\n", blackgeneral, redgeneral);
    233. if (blackgeneral == 0)//红方胜
    234. {
    235. return 0;
    236. }
    237. else if (redgeneral == 0)//黑方胜
    238. {
    239. return 1;
    240. }
    241. else//打平
    242. {
    243. return 2;
    244. }
    245. }
    246. bool jiang(int a, int b, int c, int d)//判断是否只移动了一格(将军、兵的规则)
    247. {
    248. float h;
    249. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    250. if (b < 4 && c > 2 && c < 6 && d < 3)
    251. {
    252. if (h == 1 && map[c][d].type != map[a][b].type)
    253. return true;
    254. else
    255. return false;
    256. }
    257. if (b > 4 && c > 2 && c < 6 && d >6)
    258. {
    259. if (h == 1 && map[c][d].type != map[a][b].type)
    260. return true;
    261. else
    262. return false;
    263. }
    264. else
    265. {
    266. return false;
    267. }
    268. }
    269. bool bing(int a, int b, int c, int d)
    270. {
    271. float h;
    272. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    273. if (map[a][b].type == BLACK)
    274. {
    275. if (map[a][b].river == false)
    276. {
    277. if (d == b + 1 && h == 1 && map[c][d].type != map[a][b].type)
    278. {
    279. return true;
    280. }
    281. else
    282. {
    283. return false;
    284. }
    285. }
    286. else
    287. {
    288. if (d >= b && h == 1 && map[c][d].type != map[a][b].type)
    289. {
    290. return true;
    291. }
    292. else
    293. {
    294. return false;
    295. }
    296. }
    297. }
    298. else if (map[a][b].type == RED)
    299. {
    300. if (map[a][b].river == false)
    301. {
    302. if (d == b - 1 && h == 1 && map[c][d].type != map[a][b].type)
    303. {
    304. return true;
    305. }
    306. else
    307. {
    308. return false;
    309. }
    310. }
    311. else
    312. {
    313. if (d <= b && h == 1 && map[c][d].type != map[a][b].type)
    314. {
    315. return true;
    316. }
    317. else
    318. {
    319. return false;
    320. }
    321. }
    322. }
    323. else
    324. {
    325. return false;
    326. }
    327. }
    328. bool pao(int a, int b, int c, int d)//炮的移动
    329. {
    330. if (c == a && d != b)
    331. {
    332. int time = 0;
    333. int max = d > b ? d : b;
    334. int min = b < d ? b : d;
    335. for (int i = min; i <= max; i++)
    336. {
    337. if (map[c][i].id != SPACE)
    338. {
    339. time++;
    340. }
    341. }
    342. // printf("%d\n", time);
    343. if (map[c][d].id == SPACE)
    344. {
    345. if (time == 1)
    346. return true;
    347. else
    348. return false;
    349. }
    350. if (map[c][d].id != SPACE)
    351. {
    352. if (time != 3)
    353. {
    354. return false;
    355. }
    356. else
    357. {
    358. if (map[c][d].type == map[a][b].type)
    359. {
    360. return false;
    361. }
    362. else
    363. {
    364. return true;
    365. }
    366. }
    367. }
    368. }
    369. else if (d == b && c != a)
    370. {
    371. int time = 0;
    372. int max = a > c ? a : c;
    373. int min = c < a ? c : a;
    374. for (int i = min; i <= max; i++)
    375. {
    376. if (map[i][d].id != SPACE)
    377. {
    378. time++;
    379. }
    380. }
    381. // printf("%d\n", time);
    382. if (map[c][d].id == SPACE)
    383. {
    384. if (time == 1)
    385. return true;
    386. else
    387. return false;
    388. }
    389. if (map[c][d].id != SPACE)
    390. {
    391. if (time != 3)
    392. {
    393. return false;
    394. }
    395. else
    396. {
    397. if (map[c][d].type == map[a][b].type)
    398. {
    399. return false;
    400. }
    401. else
    402. {
    403. return true;
    404. }
    405. }
    406. }
    407. }
    408. else
    409. {
    410. return false;
    411. }
    412. }
    413. bool che(int a, int b, int c, int d)
    414. {
    415. if (c == a && d != b)//是否为直线
    416. {
    417. int time = 0;
    418. int max = d > b ? d : b;
    419. int min = b < d ? b : d;
    420. for (int i = min; i <= max; i++)//遍历路径
    421. {
    422. if (map[c][i].id != SPACE)
    423. {
    424. time++;
    425. }
    426. }
    427. // printf("%d", time);
    428. if (time == 1)//车移动不吃棋子
    429. {
    430. return true;
    431. }
    432. if (time == 2)//车移动并且吃目的坐标的棋子
    433. {
    434. if (map[c][d].type == map[a][b].type)//如果是目的坐标是自己的棋子,则返回false
    435. {
    436. return false;
    437. }
    438. if (map[c][d].type == YELLOW)
    439. {
    440. return false;
    441. }
    442. else
    443. {
    444. return true;
    445. }
    446. }
    447. else
    448. {
    449. return false;
    450. }
    451. }
    452. else if (d == b && c != a)
    453. {
    454. int time = 0;
    455. int max = c > a ? c : a;
    456. int min = a < c ? a : c;
    457. for (int i = min; i <= max; i++)//遍历路径
    458. {
    459. if (map[i][d].id != SPACE)
    460. {
    461. time++;
    462. }
    463. }
    464. // printf("%d", time);
    465. if (time == 1)//车是否车跳棋
    466. {
    467. return true;
    468. }
    469. else if (time == 2)
    470. {
    471. if (map[c][d].type == map[a][b].type)
    472. {
    473. return false;
    474. }
    475. if (map[c][d].type == YELLOW)
    476. {
    477. return false;
    478. }
    479. else
    480. {
    481. return true;
    482. }
    483. }
    484. else
    485. {
    486. return false;
    487. }
    488. }
    489. else
    490. {
    491. return 0;
    492. }
    493. }
    494. bool ma(int a, int b, int c, int d)
    495. {
    496. float h;
    497. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    498. // printf("%f", h);
    499. if (h <= 2 || h >= 2.5)//根号8=2.8.根号5=2.2
    500. {
    501. // printf("太远了!\n");
    502. return false;
    503. }
    504. else
    505. {
    506. int xx, yy, max, min;//关键点的坐标和中间值
    507. max = abs(d - b) > abs(c - a) ? abs(d - b) : abs(c - a);
    508. min = abs(c - a) < abs(d - b) ? abs(c - a) : abs(d - b);
    509. //printf("max\min:(%d,%d)", max, min);
    510. if (max == abs(d - b))
    511. {
    512. yy = b + (d - b) / 2;
    513. xx = a;
    514. }
    515. else
    516. {
    517. xx = a + (c - a) / 2;
    518. yy = b;
    519. }
    520. // printf("xx\yy:(%d,%d)\n", xx, yy);
    521. if (map[xx][yy].id == SPACE)
    522. {
    523. if (map[c][d].type != map[a][b].type)
    524. {
    525. // printf("目的坐标(%d,%d)\n", c, d);
    526. // printf("那是你自己的棋子!\n");
    527. return true;
    528. }
    529. else
    530. {
    531. // printf("那是你的棋子!\n");
    532. return false;
    533. }
    534. }
    535. else
    536. {
    537. // printf("关键位置有棋子!\n");
    538. return false;
    539. }
    540. }
    541. }
    542. bool xiang(int a, int b, int c, int d)
    543. {
    544. float h;
    545. h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    546. if (b <= 4)
    547. {
    548. if (d > 4)
    549. {
    550. return false;
    551. }
    552. else
    553. {
    554. if (h < 2.4 || h>2.9)
    555. {
    556. return false;
    557. }
    558. else
    559. {
    560. int xx = (a + c) / 2;
    561. int yy = (b + d) / 2;
    562. if (map[xx][yy].id == SPACE)
    563. {
    564. if (map[c][d].type == map[a][b].type)
    565. {
    566. return false;
    567. }
    568. else
    569. {
    570. return true;
    571. }
    572. }
    573. else
    574. {
    575. return false;
    576. }
    577. }
    578. }
    579. }
    580. else
    581. {
    582. if (d < 5)
    583. {
    584. return false;
    585. }
    586. else
    587. {
    588. if (h < 2.4 || h>2.9)
    589. {
    590. return false;
    591. }
    592. else
    593. {
    594. int xx = (a + c) / 2;
    595. int yy = (b + d) / 2;
    596. if (map[xx][yy].id == SPACE)
    597. {
    598. if (map[c][d].type == map[a][b].type)
    599. {
    600. return false;
    601. }
    602. else
    603. {
    604. return true;
    605. }
    606. }
    607. else
    608. {
    609. return false;
    610. }
    611. }
    612. }
    613. }
    614. }
    615. bool shi(int a, int b, int c, int d)
    616. {
    617. float h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    618. // printf("%f", h)
    619. if (b < 5)
    620. {
    621. if (c >= 3 && c <= 5 && d <= 2)
    622. {
    623. if (1.2 < h && h < 1.5)
    624. {
    625. if (map[c][d].type != map[a][b].type)
    626. return true;
    627. else
    628. return false;
    629. }
    630. else
    631. {
    632. return false;
    633. }
    634. }
    635. else
    636. {
    637. return false;
    638. }
    639. }
    640. else if (b > 5)
    641. {
    642. if (c >= 3 && c <= 5 && d >= 7)
    643. {
    644. if (1.2 < h && h < 1.5)
    645. {
    646. if (map[c][d].type != map[a][b].type)
    647. return true;
    648. else
    649. return false;
    650. }
    651. else
    652. {
    653. return false;
    654. }
    655. }
    656. else
    657. {
    658. return false;
    659. }
    660. }
    661. else
    662. return false;
    663. }
    664. void execute(int a, int b, int c, int d)//行棋
    665. {
    666. if (map[a][b].id == blackchess[4])//黑方将
    667. {
    668. if (jiang(a, b, c, d))
    669. {
    670. movechess(a, b, c, d);
    671. }
    672. else
    673. {
    674. printf("你不能这样做\n");
    675. }
    676. }
    677. else if (map[a][b].id == redchess[4])//红方将
    678. {
    679. if (jiang(a, b, c, d))
    680. {
    681. movechess(a, b, c, d);
    682. }
    683. else
    684. {
    685. printf("你不能这样做!\n");
    686. }
    687. }
    688. else if (map[a][b].id == blackchess[6])//黑方兵
    689. {
    690. if (map[a][b].river == false)
    691. {
    692. if (bing(a, b, c, d))
    693. {
    694. movechess(a, b, c, d);
    695. if (d > 4)
    696. {
    697. map[c][d].river = true;
    698. }
    699. }
    700. else
    701. {
    702. printf("你不可以这样做!\n");
    703. }
    704. }
    705. else
    706. {
    707. if (bing(a, b, c, d) && d >= b)
    708. {
    709. movechess(a, b, c, d);
    710. }
    711. else
    712. {
    713. printf("你不可以这样做\n");
    714. }
    715. }
    716. }
    717. else if (map[a][b].id == redchess[6])//红方兵
    718. {
    719. if (map[a][b].river == false)
    720. {
    721. if (bing(a, b, c, d))
    722. {
    723. movechess(a, b, c, d);
    724. if (d < 5)
    725. {
    726. map[c][d].river = true;
    727. }
    728. }
    729. else
    730. {
    731. printf("你不可以这样做!\n");
    732. }
    733. }
    734. else
    735. {
    736. if (bing(a, b, c, d) && d <= b)
    737. {
    738. movechess(a, b, c, d);
    739. }
    740. else
    741. {
    742. printf("你不可以这样做!\n");
    743. }
    744. }
    745. }
    746. else if (map[a][b].id == blackchess[5] || map[a][b].id == redchess[5])
    747. {
    748. if (pao(a, b, c, d))
    749. {
    750. movechess(a, b, c, d);
    751. }
    752. else
    753. {
    754. printf("你不能这样做!\n");
    755. }
    756. }
    757. else if (map[a][b].id == blackchess[0] || map[a][b].id == redchess[0])
    758. {
    759. if (che(a, b, c, d))
    760. {
    761. movechess(a, b, c, d);
    762. }
    763. else
    764. {
    765. printf("你不可以这样做!\n");
    766. }
    767. }
    768. else if (map[a][b].id == blackchess[1] || map[a][b].id == redchess[1])
    769. {
    770. if (ma(a, b, c, d))
    771. {
    772. movechess(a, b, c, d);
    773. }
    774. else
    775. {
    776. printf("你不能这样做!\n");
    777. }
    778. }
    779. else if (map[a][b].id == blackchess[2] || map[a][b].id == redchess[2])
    780. {
    781. if (xiang(a, b, c, d))
    782. {
    783. movechess(a, b, c, d);
    784. }
    785. else
    786. printf("你不能这样做!\n");
    787. }
    788. else if (map[a][b].id == blackchess[3])
    789. {
    790. if (shi(a, b, c, d))
    791. {
    792. movechess(a, b, c, d);
    793. }
    794. else
    795. printf("你不能这样做!");
    796. }
    797. else if (map[a][b].id == redchess[3])
    798. {
    799. if (shi(a, b, c, d))
    800. {
    801. movechess(a, b, c, d);
    802. }
    803. else
    804. printf("你不能这样做!");
    805. }
    806. }
    807. int main()
    808. {
    809. begining();
    810. while (1)//当正确的时候
    811. {
    812. coord();//输出棋盘
    813. win();
    814. BeginBatchDraw();
    815. /*这个函数用于开始批量绘图。执行后
    816. 任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。*/
    817. //运行BeginBatchDraw后,所有的绘图都不再显示在屏幕上,而是在内存中进行
    818. //封装的双缓存,避免闪屏
    819. /*那如果我们能让打印的过程不显示出来,只显示打印完后的显示缓冲区不就行了吗*/
    820. while (win() == 2)//平局状态,是不是还需要继续运行下去?
    821. {
    822. win();
    823. putimage(0, 0, &img);
    824. getbackground();//输出棋子
    825. MouseControl();//鼠标更改数据
    826. FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/
    827. }
    828. putimage(0, 0, &img);
    829. getbackground();//输出棋子
    830. MouseControl();//鼠标更改数据
    831. FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/
    832. if (win() == 0)
    833. {
    834. printf("红方胜!\n");
    835. }
    836. else if (win() == 1)
    837. {
    838. printf("黑方胜!\n");
    839. }
    840. }
    841. getchar();
    842. return 0;
    843. }

    总代码参考于:

    (1条消息) 基于c语言的象棋游戏_m0_59564114的博客-CSDN博客_c语言象棋游戏代码

  • 相关阅读:
    CSS的元素显示模式和CSS的背景
    Microsoft 10/11 命令行打开系统设置页(WUAP,!WIN32)
    AI网络爬虫:批量爬取AI导航网站Futurepedia数据
    安全开发实战(3)--存活探测与端口扫描
    Dubbo启动报错
    代理模式详解
    11. 盛最多水的容器
    孙宇晨式“溢价逻辑”:不局限眼前,为全人类的“星辰大海”大胆下注
    【文献阅读】Cascaded Partial Decoder for Fast and Accurate Salient Object Detection
    大厂面试sql手撕题目总结
  • 原文地址:https://blog.csdn.net/Lukegood/article/details/128096856