国际象棋C++.doc

举报
资源描述
#+ #include #include #include using namespace std; enum TResult {//结局状态 WHITEWIN = 1,//白方赢 BLACKWIN,//黑方赢 STALEMATE,//僵局 DRAW,//和局 DEAD,//过多的输入 PUZZLE,//无法决定移动棋子 ILLEGAL //非法 }; const char RESULT[8][20]= {//结局状态输出表示 "", "White Win", "Black Win", "Stalemate", "Draw", "Dead Moves", "Puzzle Move", "Illegal Move" }; enum TPieceType {//棋子类型 SPACE = 0, PAWN,//兵 KING,//王 QUEEN,//后 ROOK,//车 BISHOP,//象 KNIGHT //马 }; enum TSide { NONE = 0, WHITE,//黑方 BLACK //白方 }; typedef struct {//棋盘每个位置的表示 TSide side;//所属玩家 TPieceType pt;//棋子类型 }TPiece; const int BOARDSIZE = 8;//棋盘大小 typedef TPiece TBoard[BOARDSIZE][BOARDSIZE];//棋盘 int n;//棋谱步数 TResult result;//最后结局 /* *用来进行王车易位的布尔变量 * * whitecastled:白方是否已经王车易位 * blackcastled:黑方是否已经王车易位 * white0rookMoved: 白方号位的车是否已经移动 * white7rookMoved: 白方号位的车是否已经移动 * black0rookMoved: 黑方号位的车是否已经移动 * black7rookMoved: 黑方号位的车是否已经移动 * whitekingMoved: 白方王是否已经移动 * blackkingMoved: 黑方王是否已经移动 * */ bool whitecastled,blackcastled,white0rookMoved,white7rookMoved,black0rookMoved,black7rookMoved,whitekingMoved,blackkingMoved; TPieceType ChessType(const string& move) { switch(move[0]) { case K://王 return KING; case Q://后 return QUEEN; case R://车 return ROOK; case B://象 return BISHOP; case N://马 return KNIGHT; } return PAWN;//兵 } TSide Opponent(TSide side) {//获取对手类型 if (side==WHITE) return BLACK; return WHITE; } void clear(TBoard b,int x,int y) {//清空棋盘b的(x,y)位置 b[x][y].side = NONE;//所属玩家 b[x][y].pt = SPACE;//棋子类型 } void init(TBoard b) {//初始化棋盘 int i,j; //清空整个棋盘 for(i=0;iBOARDSIZE||y>BOARDSIZE) { return true; } return false; } bool CanMovePawn(TBoard b,int x,int y,int x2,int y2,int flag) {//判断能否把兵从(x,y)移动到(x2,y2),当flag=1时,表示(x,y)直接移动到(x2,y2),flag为其他表示从(x,y)吃子到(x2,y2) if (flag==1) {//直接移动,即兵直线前进一格 if (y!=y2||b[x2][y2].side!=NONE) {//y坐标不能改变,无法前进 return false; } if (b[x][y].side==WHITE) {//下棋的是白方 if (x==1) {//白方的兵是第一次移动 return x2==2 || (x2==3&&b[2][y].side==NONE);//第一次移动兵可以移动格或格 } else { return x2==x+1;//不是第一次移动,就只能向前移动格 } } else {//下棋的是黑方 if (x==6) {//黑方的兵是第一次移动 return x2==5 || (x2==4&&b[5][y].side==NONE);//第一次移动兵可以移动格或格 } else { return x2==x-1;//不是第一次移动,就只能向前移动格 } } } else {//吃子判断,吃子时,x向前格,y坐标改变格 if (b[x][y].side==WHITE) {//要吃子的是白方 return (x2==x+1&&abs(y2-y)==1); } else {//要吃子的是黑方 return (x2==x-1&&abs(y2-y)==1); } } return false; } bool CanMoveKing(TBoard b,int x,int y,int x2,int y2) {//判断能否把王从(x,y)移动到(x2,y2) return (abs(x-x2)<=1&&abs(y-y2)<=1); } bool CanMoveRook(TBoard b,int x,int y,int x2,int y2) {//判断能否把车从(x,y)移动到(x2,y2) int dx,dy,i,xx,yy; //判断移动是否是直线 if (x!=x2 && y!=y2) { return false; } //直线方向增量 if (x2
展开阅读全文
相关搜索
温馨提示:
taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

当前位置:首页 > 教育专区 > 教案示例


本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁