南昌航空大学信息工程学院课程设计说明书课程名称: C语言课程设计设计题目:中国象棋专业:计算机科学与技术班级:______姓名:学号:___评分:指导教师:2012 年 6月26日目录Ⅰ摘要Ⅱ前言Ⅲ功能描述Ⅳ配置要求Ⅴ总体设计(个人负责模块)一、功能模块设计二、数据结构设计三、函数功能描述四、代码实现五、运行结果Ⅵ小结Ⅰ摘要中国象棋是一款很古老、很受欢迎的游戏,其开发过程有一定的技巧和方法,其中涉及到函数调用、二维数组、键盘操作等方面的知识。
本游戏的开发者需要基本掌握复杂情况下函数的编写以及调用能力、二维数组的运用能力、复杂算法的设计能力等。
Ⅱ前言中国象棋是一款经典的智力游戏,具有悠久的历史,早在战国时期就有了关于中国象棋的记载,经过几千年的流传,目前仍然是中国家喻户晓的棋类游戏,颇受欢迎。
因此,我们决定借这次机会通过用C语言将中国象棋实现出来,当然,我们也借鉴了前人的一些技巧经验。
有不足之处,希望老师能够谅解,我们以后将会再接再厉。
Ⅲ功能描述本人负责棋子帅(将)、象(相)、士(仕)、卒(兵)子函数的编写,它们的所能实现的功能分别是:(1)帅(将):控制棋子帅(将)能符合现实情况下的游戏规则而行走,例如帅(将)只能在规定范围内向上或向左、右、下行走一格,最后返回一个行走正确或行走错误的数据。
(2)象(相):控制棋子象(相)能符合现实情况下的游戏规则而行走,例如象(相)只能在自己领域内走“田”字格,且中间不能有其他棋子阻挡,最后返回一个行走正确或行走错误的数据。
(3)士(仕):控制棋子士(仕)能符合现实情况下的游戏规则而行走,例如士(仕)只能在规定范围内斜着跨一格,然后返回一个行走正确或行走错误的数据。
(4)卒(兵):控制棋子卒(兵)能符合现实情况下的游戏规则而行走,例如卒(兵)只能一次走一格,同时在自己领域内只能向前走,而在对方领域内可向前、左、右方向走一格,最后返回一个行走正确或行走错误的数据。
Ⅳ配置要求(1) 硬件配置CPU :≥Pentium III 600 内存:≥64MB硬盘剩余空间:≥128MB (2) 软件环境Visual C++6.0及其以上版本Ⅴ 总体设计(个人负责模块)本人为小组成员,负责的模块是:棋子帅(将)、象(相)、士(仕)、卒(兵)子函数的设计与编写。
一、系统模块设计1、系统模块图本人所负责的模块共有四个小项目组成,分别是控制棋子正确行走的帅(将)、象(相)、士(仕)、卒(兵)子函数。
(1)帅(将)该子函数主要负责控制维持棋子帅(将)的正确行走,返回正确或错误的数据信息。
(2)象(相)该子函数主要负责控制维持棋子象(相)的正确行走,返回正确或错误的数据信息。
(3)士(仕)该子函数主要负责控制维持棋子士(仕)的正确行走,返回正确或错误的数据信息。
(4)卒(兵)该子函数主要负责控制维持棋子卒(兵)的正确行走,返回正确或错误的数据信息。
调 调用 调 调 调用用 用用图1. 系统模块图2、任务执行流程图在玩家进行游戏移动棋子帅(将)、象(相)、士(仕)、卒(兵)的时候,主函数调用这几个子函数的执行流程图均为:图2. 任务执行流程图二、数据结构设计四个子函数均定义了局部变量x1,x2,y1,y2,table[][10],通过主函数调用将玩家从键盘输入的值传递给x1,x2,y1,y2. table[][10]是在主函数中定义的一个二维数组,在子函数中同样控制棋盘的输出。
三、函数功能描述1.chekshuai ( )函数原型:int checkshuai(int x1,int y1,int x2,int y2,int table[][10]) checkshuai( )函数控制棋子帅(将)的正确行走,通过主函数将初始位置的坐标x1,y1与目标位置的坐标x2,y2传递给该子函数,从而判别帅(将)的行走是否符合规则。
2.checkxiang ( )函数原型:int checkxiang(int x1,int y1,int x2,int y2,int table[][10])checkxiang( )函数控制棋子象(相)的正确行走,通过主函数将初始位置的坐标x1,y1与目标位置的坐标x2,y2传递给该子函数,从而判别象(相)的行走是否符合规则。
3.checkshi ( )函数原型:int checkshi(int x1,int y1,int x2,int y2,int table[][10])checkshi( )函数控制棋子士(仕)的正确行走,通过主函数将初始位置的坐标x1,y1与目标位置的坐标x2,y2传递给该子函数,从而判别士(仕)的行走是否符合规则。
4.checkbing ( )函数原型:int checkbing(int x1,int y1,int x2,int y2,int table[][10])checkbing( )函数控制棋子士(仕)的正确行走,通过主函数将初始位置的坐标x1,y1与目标位置的坐标x2,y2传递给该子函数,从而判别士(仕)的行走是否符合规则。
四、代码实现1. 帅(将)int checkshuai(int x1,int y1,int x2,int y2,int table[][10]){if ((x2<8 || x2>10 || y2<4 ||y2>6)&&(x2<1 || x2>3 || y2<4|| y2>6))//控制棋子的行走范围是在自己领域的九宫格内{printf("\n将或者帅是不能移出九宫区域的,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if ((abs(x2-x1)==1)&&(abs(y2-y1)==1))// 控制棋子的行走只能是直线{printf("\n将或者帅是不能走斜线的哦,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if (table[x2][y2]*table[x1][y1]>0)// 控制棋子只能覆盖对方棋子以分清敌我{printf("\n自己不能吃掉自己呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))// 控制棋子每次只能跨越一格{printf("\n将或者帅不能一次走多格呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else return 1; // 若未遇到错误则返回1继续进行游戏}2. 象(相)int checkxiang(int x1,int y1,int x2,int y2,int table[][10]){if ((abs(x2-x1))!=2 || (abs(y2-y1))!=2)// 控制棋子的行走路线为田字格对角线{printf("\n相(象)只能走田字呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if ((table[x1][y1]>0 &&x2>5)||(table[x1][y1]<0 &&x2<5)) // 控制棋子只能在自己领域内移动{printf("\n相(象)不能渡过楚河汉界呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if (table[(x1+x2)/2][(y1+y2)/2]!=0)// 当棋子移动路径上有其他棋子阻挡时棋子不能移动{printf("\n您要移动的路径上有其他棋挡着呢,不能移动,重新输入吧!\n"); return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if (table[x2][y2]*table[x1][y1]>0)// 控制棋子只能覆盖对方棋子以分清敌我{printf("\n自己不能吃掉自己呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else return 1; // 若未遇到错误则返回1继续进行游戏}3. 士(仕)int checkshi(int x1,int y1,int x2,int y2,int table[][10]){if ((x2<8 || x2>10 || y2<4 ||y2>6)&&(x2<1 || x2>3 || y2<4|| y2>6)) //控制棋子的行走范围是在自己领域的九宫格内{printf("\n士或者仕是不能移出九宫区域的,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if (table[x2][y2]*table[x1][y1]>0)// 控制棋子只能覆盖对方棋子以分清敌我{printf("\n自己不能吃掉自己呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))// 控制棋子每次只能跨越一格{printf("\n士或者仕不能一次走多格呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else if (!((abs(x2-x1)==1)&&(abs(y2-y1)==1)))// 控制棋子行走路径只能是沿着一格的对角线{printf("\n士或者仕只能斜着走呀,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}else return 1; // 若未遇到错误则返回1继续进行游戏}4. 卒(兵)int checkbing(int x1,int y1,int x2,int y2, int table[][10]){if(table[x1][y1]>0)// 兵(卒)是否是甲方棋子(在上方){if(table[x2][y2]>0)// 控制棋子只能覆盖对方棋子以分清敌我{printf("\n拜托,不能自己吃自己!!!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}if(x1<6)// 此时兵(卒)没过河{if((y1==y2)&&(x2-x1==1))// 控制棋子只能向前走{return 1; // 若符合规则则继续游戏}else{printf("\n兵(卒)过河前只能向前走,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}}else// 若此时兵(卒)已过河{if(((y1==y2)&&(x2-x1==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1))) //控制棋子过河后只能向前或者向左、右移动{return 1; // 若符合规则则继续游戏}else{printf("\n兵(卒)过河后只能向前走或者平移,不能后退,重新输入吧!\n"); return 0; // 规则错误后出现提示信息并且返回0进行重新输入}}}else//判断兵是否在乙方(在下方){if(table[x2][y2]<0)// 控制棋子只能覆盖对方棋子以分清敌我{printf("\n拜托,自己不能吃自己!!!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}if(x1>5)// 如果兵(卒)没过河{if((y1==y2)&&(x1-x2==1))// 控制棋子只能向前走return 1; // 若符合规则则继续游戏else{printf("\n兵(卒)过河前只能向前走,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}}else// 如果兵(卒)已过河{if(((y1==y2)&&(x1-x2==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1))) //控制棋子过河后只能向前或者向左、右移动return 1; // 若符合规则则继续游戏else{printf("\n兵(卒)过河后只能向前走或者平移,不能后退,重新输入吧!\n");return 0; // 规则错误后出现提示信息并且返回0进行重新输入}}}}五、运行结果1、游戏进入初始界面进入游戏后显示的初始界面截图如下图:图3. 游戏初始界面2、游戏进行中的界面如下显示了游戏进行中的界面截图:图4. 游戏进行过程中界面3、游戏结束完成游戏后结束的界面截图:图5.游戏结束界面Ⅵ小结两周的课程设计结束了,这次的课程设计不仅检验了我们所学的知识,同时也培养了大家如何去把一件事情认认真真的做好。