中国象棋课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

青岛理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:软件学生姓名:xxx班级:_XXX_学号:XXX题目:中国象棋程序设计起迄日期:2011.06.30————2011.07.13设计地点:现代教育中心机房指导教师:XXXX完成日期:2010年7月13日一、课程设计目的面向对象程序设计作为一门软件设计的课程,具有极强的实践性,要求学生具备灵活应用理论知识的能力及面向对象程序设计技能的基础。所以在《C++面向对象程序设计》课程学习完成后,安排课程设计教学环节。通过课程设计,学生能了解C++面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。通过这次课程设计,能了解并通过自学MFC,掌握一种可视化编程的方法,并通过实践加深对可视化编程与C++面向对象程序设计语言特点的认识与理解。同时,可以提高运用C++编程语言解决实际问题的能力;提高调查研究、查阅技术文献、资料以及编写软件设计文档的能力。二、课程设计内容与实现的功能课程设计的题目是中国象棋,所实现的功能是能画出象棋棋盘,在此基础上实现人机对弈。对弈中符合现实中下棋的规则情况。三、系统分析与设计1、系统分析中国象棋具有悠久的历史,几千年以来,一直被认为是人们所热爱的休闲活动之一。象棋具有独特的规则,主要为车行直路,马走狭日,相行田,士相不离老王边,炮翻山,兵、卒只进不退,过河后方能左右行。程序设计就是把现实中的人与人之间的对弈,改成电脑与人的对弈。电脑的形为仿照人的形为,正确的走棋,“思考”,下棋。任务要求,画出棋盘,实现简单的人机对弈。2、系统设计:概要设计1、数据表示:主要包括棋盘的表示和棋子的表示。2、走法的产生:包括车马相士炮等的基本走法和检测是否将军,或被将死,还包括检查一种棋子是否还有剩余,判断走法是否和法以及枚举可能有的合法的走法。3、搜索引擎:搜索棋子可能有的走法,并且产生最佳的走法。搜索引擎包括许多算法,如极大极小值、负极大值、深度优先搜索、置换表、历史启发等等搜索算法。4、估值方法:即对棋子的价值进行评估,如兵为300,车为1000,将帅位无限大等;对棋子的位置进行评估,如过河后越逼近九宫的卒/兵价值越大;对棋子的灵活性进行评估,灵活性越大,价值越大,如一般车的灵活性大于卒等;对棋子间关系进行评估,即棋子受到的威胁越大,价值越低,受到的保护越多,价值越高;还要与搜索算法相结合。5、界面设计:主要有棋盘、棋子、拖动实现走棋、悔棋、还原、搜素引擎(包括算法和搜索深度)设置等。一些美化可以直接使用网络上的美化资源,消息响应函数与处理函数等的实现。详细设计1棋盘BITMAPBitMap;m_BoardBmp.LoadBitmap(IDB_CHESSBOARD);m_BoardBmp.GetBitmap(&BitMap);//取BitMap对象m_nBoardWidth=BitMap.bmWidth;//棋盘宽度m_nBoardHeight=BitMap.bmHeight;//棋盘高度m_BoardBmp.DeleteObject();memcpy(m_byChessBoard,InitChessBoard,90);//初始化棋盘memcpy(m_byShowChessBoard,InitChessBoard,90);memcpy(m_byBackupChessBoard,InitChessBoard,90);m_pSE-SetSearchDepth(3);//设定搜索层数为3m_pSE-SetMoveGenerator(m_pMG);//给搜索引擎设定走法产生器m_pSE-SetEveluator(m_pEvel);//给搜索引擎设定估值核心m_pSE-SetUserChessColor(m_nUserChessColor);//设定用户为黑方或红方m_pSE-SetThinkProgress(&m_progressThink);//设定进度条m_MoveChess.nChessID=NOCHESS;//将移动的棋子清空returnTRUE;//returnTRUEunlessyousetthefocustoacontrol2颜色public:voidSetTextColor(COLORREFcolor){m_clrText=color;}voidSetBkColor(COLORREFcolor){m_clrBkGround=color;}voidSetStartColor(COLORREFcolor){m_clrStart=color;}voidSetEndColor(COLORREFcolor){m_clrEnd=color;}voidShowPercent(BOOLbShowPercent=TRUE){m_bShowPercent=bShowPercent;}voidShowText(CStringstr,boolbIsShowText){m_strShow=str,m_bIsShowText=bIsShowText;};COLORREFGetTextColor(void){returnm_clrText;}COLORREFGetBkColor(void){returnm_clrBkGround;}COLORREFGetStartColor(void){returnm_clrStart;}COLORREFGetEndColor(void){returnm_clrEnd;}intSetPos(intnPos);intSetStep(intnStep);intStepIt();voidSetRange(intnLower,intnUpper);3棋子走法CStringCChessDlg::GetMoveStr(intnFromX,intnFromY,intnToX,intnToY,intnSourceID){CStringstr;boolbIsAgain;inti;intnCount;intnPos[5];intj=0;switch(nSourceID){caseB_KING://黑将if(nFromY==nToY){str.Format(黑:将%d平%d,nFromX,nToX);break;}if(nFromYnToY)str.Format(黑:将%d退%d,nFromX,nFromY-nToY);elsestr.Format(黑:将%d进%d,nFromX,nToY-nFromY);break;caseB_CAR://黑车bIsAgain=false;for(i=0;i10;i++)if(m_byChessBoard[i][nFromX-1]==B_CAR&&i!=nFromY-1&&i!=nToY-1){bIsAgain=true;break;}if(nFromYnToY){if(bIsAgain){if(inFromY-1)str.Format(黑:后车进%d,nFromY-nToY);elsestr.Format(黑:前车进%d,nFromY-nToY);}elsestr.Format(黑:车%d退%d,nFromX,nFromY-nToY);}elseif(nFromYnToY){if(bIsAgain){if(inFromY-1)str.Format(黑:后车进%d,nToY-nFromY);elsestr.Format(黑:前车进%d,nToY-nFromY);}elsestr.Format(黑:车%d进%d,nFromX,nToY-nFromY);}else{if(bIsAgain){if(inFromY-1)str.Format(黑:后车平%d,nToX);elsestr.Format(黑:前车平%d,nToX);}elsestr.Format(黑:车%d平%d,nFromX,nToX);break;}break;caseB_HORSE://黑马bIsAgain=false;for(i=0;i10;i++)if(m_byChessBoard[i][nFromX-1]==B_HORSE&&i!=nFromY-1&&i!=nToY-1){bIsAgain=true;break;}if(bIsAgain){if(inFromY-1){if(nFromYnToY)str.Format(黑:后马退%d,nToX);elsestr.Format(黑:后马进%d,nToX);}else{if(nFromYnToY)str.Format(黑:前马退%d,nToX);elsestr.Format(黑:前马进%d,nToX);}}else{if(nFromYnToY)str.Format(黑:马%d退%d,nFromX,nToX);elsestr.Format(黑:马%d进%d,nFromX,nToX);}break;caseB_CANON://黑炮bIsAgain=false;for(i=0;i10;i++)if(m_byChessBoard[i][nFromX-1]==B_CANON&&i!=nFromY-1&&i!=nToY-1){bIsAgain=true;break;}if(nFromYnToY){if(bIsAgain){if(inFromY-1)str.Format(黑:后炮进%d,nFromY-nToY);elsestr.Format(黑:前炮进%d,nFromY-nToY);}elsestr.Format(黑:炮%d退%d,nFromX,nFromY-nToY);}elseif(nFromYnToY){bIsAgain=false;for(i=0;i10;i++)if(m_byChessBoard[i][nFromX-1]==B_CANON&&i!=nFromY-1&&i!=nToY-1){bIsAgain=true;break;}if(bIsAgain){if(inFromY-1)str.Format(黑:后炮进%d,nToY-nFromY);elsestr.Format(黑:前炮进%d,nToY-nFromY);}elsestr.Format(黑:炮%d进%d,nFromX,nToY-nFromY);}else{if(bIsAgain){if(inFromY-1)str.Format(黑:后炮平%d,nToX);elsestr.Format(黑:前炮平%d,nToX);}elsestr.Format(黑:炮%d平%d,nFromX,nToX);break;}break;caseB_BISHOP://黑士if(nFromYnToY)str.Format(黑:士%d退%d,nFromX,nToX);elsestr.Format(黑:士%d进%d,nFromX,nToX);break;caseB_ELEPHANT://黑象bIsAgain=false;for(i=0;i5;i++)if(m_byChessBoard[i][nFromX-1]==B_ELEPHANT&&i!=nFromY-1&&i!=nToY-1){bIsAgain=true;break;}if(bIsAgain){if(inFromY-1){if(nFromYnToY)str.Format(黑:后象退%d,nToX);elsestr.Format(黑:后象进%d,nToX);}else{if(nFromYnToY)str.Format(黑:前象退%d,nToX);elsestr.Format(黑:前象进%d,nToX);}}else{if(nFromYnToY)str.Format(黑:象%d退%d,nFromX,nToX);elsestr.Format(黑:象%d进%d,nFromX,nToX);}break;caseB_PAWN://黑卒nCount=0;j=0;for(i=

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功