



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/精选文库/ main.c/ 象棋/ 車马相仕帅仕相马車/ 十十十十十十十十十/ 十炮十十十十十炮十/ 兵十兵十兵十兵十兵/ 十十十十十十十十十/ 楚河汉界/ 十十十十十十十十十/ 卒十卒十卒十卒十卒/ 十炮十十十十十炮十/ 十十十十十十十十十/ 車马象士将士象马車/ Created by tarena121 on 15/8/12./Copyright (c) 2015年 Tarena. All rights reserved.2精选文库/#include <stdio.h>#include <stdbool.h>#include <math.h>#incl
2、ude <stdlib.h>#define R(piece)"03331m" #piece "0330m" /红色棋子#define B(piece)"03330m" #piece "0330m" /黑色棋子#define CROSS"03333m 十0330m"/定义外部变量 ,棋盘坐标char * array 11 9;int xi,yi; /要移动的棋子int xj,yj; /移动的目标位置bool isStandard =1;/ 是否符合规则,初始值1,符合bool game
3、OverSign =1 ;/游戏是否结束,0结束bool restart =0;/生成棋盘void chessboardBuilding();/打印棋盘void printChessboard();/判断是红棋还是黑棋,红旗返回 1, 黑棋返回 -1, 否则返回 0int redOrBlack( int x,int y);/红棋移动void redMove();/黑棋移动void blackMove();/每种棋子的规则void rulesOfAllKindsOfChessPieces();3精选文库/判断游戏结束void isGameOver();/*主函数 *int main()/生成棋盘
4、chessboardBuilding();/打印棋盘printChessboard();/开始下棋int turn = - 1;while ( gameOverSign) isStandard= 1;turn *= (- 1);/ 双方交替下棋switch (turn) case 1:redMove ();turn = ( restart ) ? (turn*- 1 ) : turn;break ;case -1:blackMove ();turn = ( restart ) ? (turn*- 1 ) : turn;break ;isGameOver ();printf ("游戏结
5、束 !n" );/主函数结束/*自定义函数 *4精选文库/生成棋盘void chessboardBuilding()for ( int i = 0; i < 11; i +) for ( int j = 0; j < 9 ; j +) array ij = CROSS ;printf ("n" );array 50 = array 5 1 = array 5 4 = array 5 7 = array 5 8 = " "array 52 = B(楚 );array 53 = B(河 );array 55 = B(汉 );array
6、56 = B(界 );/布置红棋array 00 = array 0 8 = R(車 );array 01 = array 0 7 = R(马 );array 02 = array 0 6 = R(相 );array 03 = array 0 5 = R(仕 );array 04 = R(帅 );array 21 = array 2 7 = R(炮 );array 30 = array 3 2 = array 3 4 = array 3 6 = array 3 8 = R(兵);/布置黑棋array 100 = array 108 = B(車 );array 101 = array 107 =
7、 B(马 );5精选文库array 102 = array 106 = B(相 );array 103 = array 105 = B(仕 );array 104 = B(将);array 81 = array 8 7 = B(炮 );array 70 = array 7 2 = array 7 4 = array 7 6 = array 7 8 = B(卒);/打印棋盘void printChessboard()/显示printf ("03343;30m 中国象棋欢迎您 0330mnn" );for ( int i = 0; i < 11;i +) for ( in
8、t j = 0; j < 9; j +) printf ("%s" ,array ij);printf ("n" );/判断是红棋还是黑棋,红旗返回 1, 黑棋返回 -1, 否则返回 0int redOrBlack( int x,int y)if (array xy = R(車 ) | array xy = R( 马) | array xy = R(相 ) | array xy = R(仕 ) | array xy= R(帅 ) | array xy = R(炮) | array xy = R( 兵)return1;else if (array x
9、y = B(車 ) | array xy = B( 马) | array xy = B(象 ) | array xy = B( 仕) |array xy = B(将 ) | array xy = B(炮 ) | array xy = B(卒)6精选文库return -1 ;elsereturn 0;/红棋移动void redMove()if (restart ) printf ("违反游戏规则,请重新输入n");restart = 0 ;printf ("红棋 请输入你要移动的棋子:n" );scanf ("%d %d" ,&
10、 xi,& yi);printf ("红棋 请输入你要放置的位置:n" );scanf ("%d %d" ,& xj,& yj);rulesOfAllKindsOfChessPieces();printChessboard();/黑棋移动void blackMove()if (restart ) printf ("违反游戏规则,请重新输入n");restart = 0 ;printf ("黑棋 请输入你要移动的棋子:n" );scanf ("%d %d" ,& x
11、i,& yi);printf ("黑棋 请输入你要放置的位置:n" );scanf ("%d %d" ,& xj,& yj);rulesOfAllKindsOfChessPieces();printChessboard();7精选文库/判断游戏结束void isGameOver()bool sign_r = 0 ;bool sign_b =0 ;for ( int i = 0; i < 11; i +) for ( int j = 0; j < 9; j +) if (array ij = R( 帅) sign_r =
12、 1;else if (array ij = B( 将)sign_b = 1;if (sign_r =0 )|(sign_b =0) gameOverSign= 0;/每种棋子的规则void rulesOfAllKindsOfChessPieces()/R (車) -if (arrayxiyi = R(車 )if (yi = yj) /列坐标不变,同列移动for ( int i = xi+ 1; i < xj; i +)if (i = 5 )continue ;/ 如果行等于 5,跳过if (arrayiyi != CROSS)isStandard =0;/如果初始位置和目标位置之间有棋
13、子,则不符合规则8精选文库for ( int i = xi- 1; i > xj; i -)if (i = 5 )continue ;/ 如果行等于 5,跳过if (arrayxiyi != CROSS)isStandard =0;else if (xi = xj) /行坐标不变,同行移动for ( int i = yi+ 1; i < yj; i +)if (arrayxii != CROSS)isStandard =0;for ( int i = yi- 1; i > yj; i -)if (arrayxii != CROSS)isStandard =0;if (xi =
14、 xj | yi = yj)&& isStandard && (redOrBlack(xj, yj) !=1)/如果棋子直行、没有犯规且落点不是红棋,可以移动arrayxiyi = CROSS;arrayxjyj = R( 車 );elserestart = 1 ;/B(車) -else if (arrayxiyi = B(車 )if (yi = yj) /列坐标不变,同列移动9精选文库for ( int i = xi+ 1; i < xj; i +)if (i = 5 )continue ;/ 如果行等于 5,跳过if (arrayiyi != CROS
15、S)isStandard =0;/如果初始位置和目标位置之间有棋子,则不符合规则for ( int i = xi- 1; i > xj; i -)if (i = 5 )continue ;/ 如果行等于 5,跳过if (arrayiyi != CROSS)isStandard =0;else if (xi = xj) /行坐标不变,同行移动for ( int i = yi+ 1; i < yj; i +)if (arrayxii != CROSS)isStandard =0;for ( int i = yi- 1; i > yj; i -)if (arrayxii != CR
16、OSS)isStandard =0;if (xi = xj | yi = yj)&& isStandard && redOrBlack(xj, yj) != -1)/如果棋子直行、没有犯规且落点不是红棋,可以移动arrayxiyi = CROSS;arrayxjyj = B(車);elserestart = 1 ;10精选文库/R (马) -else if (arrayxiyi = R(马)if (redOrBlack(xj, yj) !=1) && (xj = xi- 2 && yj = yi- 1 &&redO
17、rBlack(xi-1, yi) = 0) | (xj = xi- 2&& yj = yi+ 1 &&redOrBlack(xi-1, yi) = 0) | (xj = xi- 1 && yj = yi- 2 &&redOrBlack(xi, yi-1) = 0) | (xj =xi-1 && yj = yi+ 2 &&redOrBlack(xi, yi+1) = 0) | (xj = xi+ 1 && yj = yi- 2 &&redOrBlack(xi, yi-1
18、) = 0 ) |(xj = xi+ 1 && yj = yi+ 2 &&redOrBlack(xi, yi+1) = 0) | (xj = xi+ 2 && yj = yi- 1 &&redOrBlack(xi+1, yi)= 0) | (xj = xi+ 2 && yj = yi+ 1 &&redOrBlack(xi+1 , yi) = 0)arrayxiyi = CROSS;arrayxjyj = R( 马 );elserestart = 1 ;/B(马) -else if (arrayxiy
19、i = B(马 )if (redOrBlack(xj, yj) != -1) && (xj = xi- 2 && yj = yi- 1 &&redOrBlack(xi-1, yi) = 0) | (xj = xi- 2&& yj = yi+ 1 &&redOrBlack(xi-1, yi) = 0) | (xj = xi- 1 && yj = yi- 2 &&redOrBlack(xi, yi-1) = 0) | (xj =xi-1 && yj = yi+ 2 &am
20、p;&redOrBlack(xi, yi+1) = 0) | (xj = xi+ 1 && yj = yi- 2 &&redOrBlack(xi, yi-1) = 0 ) |(xj = xi+ 1 && yj = yi+ 2 &&redOrBlack(xi, yi+1) = 0) | (xj = xi+ 2 && yj = yi- 1 &&redOrBlack(xi+1, yi)= 0) | (xj = xi+ 2 && yj = yi+ 1 &&redOrB
21、lack(xi+1 , yi) = 0)arrayxiyi = CROSS;arrayxjyj = B(马);elserestart = 1 ;/R (炮) -11精选文库else if (arrayxiyi = R(炮)int count = 0 ;/起始位置间棋子的个数if (yi = yj) /列坐标不变,同列移动for ( int i = xi+ 1; i < xj; i +)if (i = 5 )continue ;/ 如果行等于 5,跳过if (redOrBlack(i, yi) !=0)count+;for ( int i = xi- 1; i > xj; i -)i
22、f (i = 5 )continue ;/ 如果行等于 5,跳过if (redOrBlack(i, yi) !=0)count+;else if (xi = xj) /行坐标不变,同行移动for ( int i = yi+ 1; i < yj; i +)if (redOrBlack(xi, i) !=0)count+;for ( int i = yi- 1; i > yj; i -)if (redOrBlack(xi, i) !=0)count+;if (xi = xj | yi = yj)&& (count <=1 ) && redOrBla
23、ck(xj, yj) != 1) /如果棋子直行、没有犯规且落点不是红棋,可以移动arrayxiyi = CROSS;arrayxjyj = R( 炮 );12精选文库elserestart = 1 ;/B(炮) -else if (arrayxiyi = B(炮 )int count = 0 ;/起始位置间棋子的个数if (yi = yj) /列坐标不变,同列移动for ( int i = xi+ 1; i < xj; i +)if (i = 5 )continue ;/ 如果行等于 5,跳过if (redOrBlack(i, yi) !=0)count+;for ( int i =
24、xi- 1; i > xj; i -)if (i = 5 )continue ;/ 如果行等于 5,跳过if (redOrBlack(i, yi) !=0)count+;else if (xi = xj) /行坐标不变,同行移动for ( int i = yi+ 1; i < yj; i +)if (redOrBlack(xi, i) !=0)count+;for ( int i = yi- 1; i > yj; i -)if (redOrBlack(xi, i) !=0)count+;13精选文库if (xi = xj | yi = yj)&& (count
25、 <=1 ) && redOrBlack(xj, yj) != -1 )/ 如果棋子直行、没有犯规且落点不是红棋,可以移动arrayxiyi = CROSS;arrayxjyj = B(炮);elserestart = 1 ;/R (兵) -else if (arrayxiyi = R(兵)if (xi > xj)isStandard =0;/如果倒退,则不符合规范if (xi = 3)if (xj != xi+ 1) | (yi != yj)isStandard =0 ;/第 3行时只能前进一步if (xi = 4)if (xj != xi+ 2) | (yi !
26、= yj)isStandard =0 ;/第 4行时只能前进两步if (xi > 4) if (xj = xi+ 1 && yi =yj)| (xj = xi && yi =yj+1)|(xj = xi && yi =yj-1 )elseisStandard =0 ;if (xi = xj | yi = yj)&& isStandard && redOrBlack(xj, yj) !=1 )/arrayxiyi = CROSS;14精选文库arrayxjyj = R (兵 );elserestart = 1
27、;/B(卒) -else if (arrayxiyi = B(卒 )if (xi < xj)isStandard =0;/如果倒退,则不符合规范if (xi = 7)if (xj != xi- 1) | (yi != yj)isStandard =0 ;/第 3行时只能前进一步if (xi = 6)if (xj != xi- 2) | (yi != yj)isStandard =0 ;/第 4行时只能前进两步if (xi < 4) if (xj = xi- 1 && yi =yj)| (xj = xi && yi =yj+1 )|(xj = xi &
28、amp;& yi =yj-1)elseisStandard =0 ;if (isStandard && redOrBlack(xj, yj) != -1 )/arrayxiyi = CROSS;arrayxjyj = R (卒 );elserestart = 1 ;15精选文库/R (相) -else if (arrayxiyi = R(相)if (xj <= 4)&&(redOrBlack(xj, yj) !=1) && (xj = xi- 2 && yj = yi- 2 &&redOrBlack(
29、xi-1, yi- 1) = 0)| (xj = xi- 2 && yj = yi+ 2 &&redOrBlack(xi-1 , yi+ 1) = 0 ) | (xj = xi+ 2 && yj = yi- 2 &&redOrBlack(xi+1,yi-1) = 0) | (xj = xi+ 2 && yj = yi+ 2 &&redOrBlack(xi+1, yi+ 1 ) = 0)arrayxiyi = CROSS;arrayxjyj = R( 相 );elserestart = 1 ;/B(象
30、) -else if (arrayxiyi = B(象 )if (xj >= 6 )&&(redOrBlack(xj, yj) != -1) && (xj = xi-2 && yj = yi- 2 &&redOrBlack(xi-1, yi- 1) =0) | (xj = xi- 2 && yj = yi+ 2 &&redOrBlack(xi-1 , yi+ 1) = 0 ) | (xj = xi+ 2 && yj = yi- 2&&redOrBlack(xi+
31、1 , yi- 1) = 0) | (xj = xi+ 2 && yj = yi+ 2 &&redOrBlack(xi+1, yi+ 1) = 0 )arrayxiyi = CROSS;arrayxjyj = B(象);elserestart = 1 ;/R (仕) -else if (arrayxiyi = R(仕)16精选文库if (xj <= 2 )&&(redOrBlack(xj, yj) != 1 ) && (xj = xi- 1 && yj = yi- 1 ) | (xj = xi- 1 &&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 假期有收获课件教学设计
- 数位板建筑专业知识培训课件
- 散装食品知识培训课件
- 2025年在线教育平台用户留存策略与满意度提升研究
- 散文标题意蕴探究课件
- 工作知识培训讲稿课件
- 金融科技与金融保险报告:科技保险的创新模式与市场前景研究
- 皮带传动安全知识培训课件
- 慢病社区服务模式-洞察及研究
- 工作后业务知识培训总结课件
- 气溶胶大气边界层研究-深度研究
- 2025年中国协同办公软件行业市场发展前景及发展趋势与投资战略研究报告
- 颈椎病课件完整版
- 传染科专科护士培训
- 综合设计我的书包课件
- 《海洋遥感技术》课件
- 企业人力资源管理师三级历年真题及答案(2024年11月-2025年5月)版
- 2024年度德国企业博士实习生招聘与雇佣合同3篇
- 华为-供应链管理课件
- 企业环保组织机构情况及管理制度模版(3篇)
- 【培训课件】商务礼仪培训
评论
0/150
提交评论