版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、;. C 语 言 课 程 设 计 学院: 班级: 姓名: 学号: 所在系: 指导教师: 2009 年 12 月 22 号 一一 题目与要求题目与要求3 . ;. 二二 问题的提出问题的提出4 三三 功能要求功能要求5 1、实现人机对弈功能;、实现人机对弈功能;5 2、基本的、基本的 C 作图的方法及循环控制模块;作图的方法及循环控制模块;5 3、评分规则及胜负判断。、评分规则及胜负判断。5 四四 详细设计详细设计6 1.程序中用到的库函数所在头文件应用程序中用到的库函数所在头文件应用 #INCLUDE 命令包含进来命令包含进来6 2.定义符号常量定义符号常量:6 3.定义棋盘交叉点坐标的数据结
2、构棋盘交叉点坐标的数据结构定义棋盘交叉点坐标的数据结构棋盘交叉点坐标的数据结构6 4.自定义函数原型说明自定义函数原型说明6 5.定义全局变量定义全局变量定义全局变量定义全局变量6 6.主函数主函数:6 7.界面初始化,数据初始化界面初始化,数据初始化:6 8. 画棋盘画棋盘7 9.交换行棋方交换行棋方7 10.获取按键值获取按键值, 如果用户没有按键,空循环如果用户没有按键,空循环7 11.落子错误处理落子错误处理7 12.赢棋处理赢棋处理赢棋处理赢棋处理7 13.走棋走棋: 判断交叉点上有无棋子判断交叉点上有无棋子, 若没有棋子若没有棋子, 则可以落子则可以落子7 14.判断当前行棋方落子
3、后是否赢棋即判断在指定方向上是否有连续判断当前行棋方落子后是否赢棋即判断在指定方向上是否有连续 5 个行棋方的棋子个行棋方的棋子7 15.判断在指定方向上是否有连续判断在指定方向上是否有连续 5 个行棋方的棋子个行棋方的棋子:7 16.移动光标移动光标8 17.游戏结束处理游戏结束处理8 18.显示当前行棋方显示当前行棋方8 19.落子正确处理落子正确处理落子正确处理落子正确处理8 20.检查用户的按键类别检查用户的按键类别:8 五、五、 总体设计结构图总体设计结构图9 六、调试与测试六、调试与测试10 七七 、下面是五子棋原程序、下面是五子棋原程序11 八八. 程序设计总结程序设计总结22
4、. ;. 一一 题目与要求题目与要求 题目:五子棋题目:五子棋 要求:利用要求:利用 C C 语言实现小型的五子棋人机对弈游戏语言实现小型的五子棋人机对弈游戏 . ;. 二二 问题的提出问题的提出 本人计划编一个五子棋游戏程序,主要是实现人机对弈的功能。本人计划编一个五子棋游戏程序,主要是实现人机对弈的功能。 . ;. 三三 功能要求功能要求 1、实现人机对弈功能;、实现人机对弈功能; 2、基本的、基本的 C 作图的方法及循环控制模块;作图的方法及循环控制模块; 3、评分规则及胜负判断。、评分规则及胜负判断。 . ;. 四四 详细设计详细设计 1.程序中用到的库函数所在头文件应用程序中用到的库
5、函数所在头文件应用 #include 命令包命令包 含进来含进来 2.定义符号常量定义符号常量: (1) 定义画棋盘所需的制表符定义画棋盘所需的制表符 (2) 定义棋盘左上角点在屏幕上的位置定义棋盘左上角点在屏幕上的位置 (3) 定义定义 1 1 2 2 号玩家的操作键键码号玩家的操作键键码 (4) 定义游戏中途退出键定义游戏中途退出键 (5) 定义棋盘上交叉点的状态并指出棋子归属定义棋盘上交叉点的状态并指出棋子归属 (6) 定义按键类别定义按键类别 (7) 定义真假符号常量定义真假符号常量 3.定义棋盘交叉点坐标的数据结构棋盘交叉点坐标的数据定义棋盘交叉点坐标的数据结构棋盘交叉点坐标的数据
6、结构结构 4.自定义函数原型说明自定义函数原型说明 5.定义全局变量定义全局变量定义全局变量定义全局变量 6.主函数主函数: (1) 初始化图象,数据初始化图象,数据 (2) 获取用户的按键值获取用户的按键值 (3) 判断按键类别判断按键类别 (4) 定义退出键定义退出键( ( (5) 清屏清屏 (6) 定义落子键定义落子键( ( (7) 定义走棋定义走棋 落子错误和正确落子错误和正确 (8) 如果当前行棋方赢棋退出循环标志置如果当前行棋方赢棋退出循环标志置, , 否则交换行棋方否则交换行棋方 (9)定义光标移动键和无效键定义光标移动键和无效键 (10) 游戏结束游戏结束 7.界面初始化,数据
7、初始化界面初始化,数据初始化: (1) 先手方为先手方为 1 1 号玩家号玩家 (2) 棋盘数据清零棋盘数据清零 (3) 光标初始位置光标初始位置 . ;. (4) 显示操作键说明显示操作键说明 (5) 显示当前行棋方显示当前行棋方 (6) 光标移至棋盘的左上角点处光标移至棋盘的左上角点处 8. 画棋盘画棋盘 (1) 画棋盘上的交叉点画棋盘上的交叉点 (2) 交叉点上是一号玩家的棋子交叉点上是一号玩家的棋子 (3) 交叉点上是二号玩家的棋子交叉点上是二号玩家的棋子 (4) 左上角交叉点左上角交叉点 (5) 左下角交叉点左下角交叉点 (6) 右上角交叉点右上角交叉点 (7) 右下角交叉点右下角交
8、叉点 (8) 左边界交叉点左边界交叉点 (9) 右边界交叉点右边界交叉点 (10) 上边界交叉点上边界交叉点上边界交叉点上边界交叉点 (11) 下边界交叉点下边界交叉点 (12)(12) 棋盘中间的交叉点棋盘中间的交叉点 9.交换行棋方交换行棋方 10.获取按键值获取按键值, 如果用户没有按键,空循环如果用户没有按键,空循环 11.落子错误处理落子错误处理 12.赢棋处理赢棋处理赢棋处理赢棋处理 13.走棋走棋: 判断交叉点上有无棋子判断交叉点上有无棋子, 若没有棋子若没有棋子, 则可以则可以 落子落子 14.判断当前行棋方落子后是否赢棋即判断在指定方向判断当前行棋方落子后是否赢棋即判断在指定
9、方向 上是否有连续上是否有连续 5 个行棋方的棋子个行棋方的棋子 15.判断在指定方向上是否有连续判断在指定方向上是否有连续 5 个行棋方的棋子个行棋方的棋子: (1) 在水平方向在水平方向 (2) 在垂直方向在垂直方向 (3) 在左下至右上的斜方向在左下至右上的斜方向 (4) 在左上至右下的斜方向在左上至右下的斜方向 . ;. 16.移动光标移动光标 17.游戏结束处理游戏结束处理 18.显示当前行棋方显示当前行棋方 19.落子正确处理落子正确处理落子正确处理落子正确处理 20.检查用户的按键类别检查用户的按键类别: (1) 退出键退出键 (2) 落子键落子键 (3) 光标移动键光标移动键
10、(4) 按键无效等。按键无效等。 . ;. 五、五、 总体设计结构图总体设计结构图 编译预处理编译预处理 主函数主函数 设计界面设计界面 胜负判断胜负判断 定义其他功能键定义其他功能键 . ;. 六、调试与测试六、调试与测试 将全部程序分块进行调试,将全部程序分块进行调试, 测试结果运行正常测试结果运行正常 . ;. 七七 、下面是五子棋原程序、下面是五子棋原程序 /* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */ #include #include #include #include #include #include #include #include #defi
11、ne pi 3.1415926 /*/ /* 定义符号常量 */ /*定义画棋盘所需的制表符*/ #define CROSSRU 0 xbf /*右上角点*/ #define CROSSLU 0 xda /*左上角点*/ #define CROSSLD 0 xc0 /*左下角点*/ #define CROSSRD 0 xd9 /*右下角点*/ #define CROSSL 0 xc3 /*左边*/ #define CROSSR 0 xb4 /*右边*/ #define CROSSU 0 xc2 /*上边*/ #define CROSSD 0 xc1 /*下边*/ #define CROSS 0
12、 xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义 1 号玩家的操作键键码*/ #define PLAY1UP 0 x1157/*上移-W*/ #define PLAY1DOWN 0 x1f53/*下移-S*/ #define PLAY1LEFT 0 x1e41/*左移-A*/ #define PLAY1RIGHT 0 x2044/*右移-D*/ #define PLAY1DO 0 x3920/*落子-空格键*/ /*定义 2 号玩家的操作键键码*/ #define PLAY2UP 0 x480
13、0/*上移-方向键 up*/ #define PLAY2DOWN 0 x5000/*下移-方向键 down*/ #define PLAY2LEFT 0 x4b00/*左移-方向键 left*/ #define PLAY2RIGHT 0 x4d00/*右移-方向键 right*/ #define PLAY2DO 0 x1c0d/*落子-回车键 Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0 x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ . ;. /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL
14、 0 /*没有棋子*/ #define CHESS1 O/*一号玩家的棋子*/ #define CHESS2 X/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ /*定义符号常量: 真, 假 - 真为 1, 假为 0 */ #define TRUE 1 #define FALSE 0 /*/ /* 定义数据结构 */ /*棋盘交叉点坐标的数据结构*/ struct po
15、int int x,y; ; /*/ /*自定义函数原型说明 */ void Init(void); int GetKey(void); int CheckKey(int press); int ChangeOrder(void); int ChessGo(int Order,struct point Cursor); void DoError(void); void DoOK(void); void DoWin(int Order); void MoveCursor(int Order,int press); void DrawCross(int x,int y); void DrawMap
16、(void); int JudgeWin(int Order,struct point Cursor); int JudgeWinLine(int Order,struct point Cursor,int direction); void ShowOrderMsg(int Order); void EndGame(void); /*/ /*/ /* 定义全局变量 */ int gPlayOrder; /*指示当前行棋方 */ struct point gCursor; /*光标在棋盘上的位置 */ char gChessBoard1919;/*用于记录棋盘上各点的状态*/ /*/ /*/ .
17、 ;. /*主函数*/ void main() int press; int bOutWhile=FALSE;/*退出循环标志*/ int i,j=0,x,y,k=1; int a=DETECT,b; initgraph( while(!kbhit() j+=10; for(i=0;i=2000;i+) x=300+100*cos(2*i*pi/1000)*sin(i*pi/1000+j*pi/1000); y=240+100*cos(2*i*pi/1000)*cos(i*pi/1000+j*pi/1000); if(j%500=0) k+; putpixel(x,y,k); delay(50
18、00); cleardevice(); getch(); closegraph(); Init();/*初始化图象,数据*/ while(1) press=GetKey();/*获取用户的按键值*/ switch(CheckKey(press)/*判断按键类别*/ /*是退出键*/ case KEYEXIT: clrscr();/*清屏*/ bOutWhile = TRUE; break; /*是落子键*/ case KEYFALLCHESS: if(ChessGo(gPlayOrder,gCursor)=FALSE)/*走棋*/ DoError();/*落子错误*/ else DoOK();
19、/*落子正确*/ /*如果当前行棋方赢棋*/ if(JudgeWin(gPlayOrder,gCursor)=TRUE) DoWin(gPlayOrder); . ;. bOutWhile = TRUE;/*退出循环标志置为真*/ /*否则*/ else /*交换行棋方*/ ChangeOrder(); break; /*是光标移动键*/ case KEYMOVECURSOR: MoveCursor(gPlayOrder,press); break; /*是无效键*/ case KEYINVALID: break; if(bOutWhile=TRUE) break; /*游戏结束*/ EndG
20、ame(); /*/ /*界面初始化,数据初始化*/ void Init(void) int i,j; char *Msg= Player1 key:, UP-w, DOWN-s, LEFT-a, RIGHT-d, DO-space, , Player2 key:, UP-up, DOWN-down, LEFT-left, RIGHT-right, DO-ENTER, , exit game:, . ;. ESC, NULL, ; /*先手方为 1 号玩家*/ gPlayOrder = CHESS1; /*棋盘数据清零, 即棋盘上各点开始的时候都没有棋子*/ for(i=0;i19;i+) f
21、or(j=0;j19;j+) gChessBoardij=CHESSNULL; /*光标初始位置*/ gCursor.x=gCursor.y=0; /*画棋盘*/ textmode(C40); DrawMap(); /*显示操作键说明*/ i=0; textcolor(GREEN); while(Msgi!=NULL) gotoxy(25,3+i); cputs(Msgi); i+; /*显示当前行棋方*/ ShowOrderMsg(gPlayOrder); /*光标移至棋盘的左上角点处*/ gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT); /*画棋盘*
22、/ void DrawMap(void) int i,j; clrscr(); for(i=0;i19;i+) for(j=0;j19;j+) DrawCross(i,j); /*画棋盘上的交叉点*/ void DrawCross(int x,int y) gotoxy(x+MAPXOFT,y+MAPYOFT); /*交叉点上是一号玩家的棋子*/ if(gChessBoardxy=CHESS1) . ;. textcolor(LIGHTBLUE); putch(CHESS1); return; /*交叉点上是二号玩家的棋子*/ if(gChessBoardxy=CHESS2) textcolo
23、r(LIGHTBLUE); putch(CHESS2); return; textcolor(WHITE); /*左上角交叉点*/ if(x=0 return; /*左下角交叉点*/ if(x=0 return; /*右上角交叉点*/ if(x=18 return; /*右下角交叉点*/ if(x=18 return; /*左边界交叉点*/ if(x=0) putch(CROSSL); return; /*右边界交叉点*/ if(x=18) . ;. putch(CROSSR); return; /*上边界交叉点*/ if(y=0) putch(CROSSU); return; /*下边界交叉
24、点*/ if(y=18) putch(CROSSD); return; /*棋盘中间的交叉点*/ putch(CROSS); /*交换行棋方*/ int ChangeOrder(void) if(gPlayOrder=CHESS1) gPlayOrder=CHESS2; else gPlayOrder=CHESS1; return(gPlayOrder); /*获取按键值*/ int GetKey(void) char lowbyte; int press; while (bioskey(1) = 0) ;/*如果用户没有按键,空循环*/ press=bioskey(0); lowbyte=p
25、ress press=press return(press); /*落子错误处理*/ void DoError(void) sound(1200); . ;. delay(50); nosound(); /*赢棋处理*/ void DoWin(int Order) sound(1500);delay(100); sound(0); delay(50); sound(800); delay(100); sound(0); delay(50); sound(1500);delay(100); sound(0); delay(50); sound(800); delay(100); sound(0)
26、; delay(50); nosound(); textcolor(RED+BLINK); gotoxy(25,20); if(Order=CHESS1) cputs(PLAYER1 WIN!); else cputs(PLAYER2 WIN!); gotoxy(25,21); cputs( /); getch(); /*走棋*/ int ChessGo(int Order,struct point Cursor) /*判断交叉点上有无棋子*/ if(gChessBoardCursor.xCursor.y=CHESSNULL) /*若没有棋子, 则可以落子*/ gotoxy(Cursor.x+
27、MAPXOFT,Cursor.y+MAPYOFT); textcolor(LIGHTBLUE); putch(Order); gotoxy(Cursor.x+MAPXOFT,Cursor.y+MAPYOFT); gChessBoardCursor.xCursor.y=Order; return TRUE; else return FALSE; /*判断当前行棋方落子后是否赢棋*/ int JudgeWin(int Order,struct point Cursor) . ;. int i; for(i=0;i4;i+) /*判断在指定方向上是否有连续 5 个行棋方的棋子*/ if(JudgeW
28、inLine(Order,Cursor,i) return TRUE; return FALSE; /*判断在指定方向上是否有连续 5 个行棋方的棋子*/ int JudgeWinLine(int Order,struct point Cursor,int direction) int i; struct point pos,dpos; const int testnum = 5; int count; switch(direction) case 0:/*在水平方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y; dpos.x=1; dpos.y=
29、0; break; case 1:/*在垂直方向*/ pos.x=Cursor.x; pos.y=Cursor.y-(testnum-1); dpos.x=0; dpos.y=1; break; case 2:/*在左下至右上的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y+(testnum-1); dpos.x=1; dpos.y=-1; break; case 3:/*在左上至右下的斜方向*/ pos.x=Cursor.x-(testnum-1); pos.y=Cursor.y-(testnum-1); dpos.x=1; dpos.y=1
30、; break; count=0; for(i=0;i=0 else count=0; pos.x+=dpos.x; pos.y+=dpos.y; return FALSE; /*移动光标*/ void MoveCursor(int Order,int press) switch(press) case PLAY1UP: if(Order=CHESS1 break; case PLAY1DOWN: if(Order=CHESS1 break; case PLAY1RIGHT: if(Order=CHESS1 break; case PLAY2DOWN: if(Order=CHESS2 break; case PLAY2RIGHT: if(Order=CHESS2 break; gotoxy(gCursor.x+M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2019版广西师范版 高中体育与健康 必修 10~12年级下篇 《第一章 健康行为的养成》大单元整体教学设计2020课标
- 《课电机正反转》课件
- 《级ACCESS数据库》课件
- 主题活动吃火锅真暖和
- 三年级数学五千以内加减混合两步运算题竞赛考核练习题
- 妇女节主题班队活动
- 危重患者突发事件应急处理
- 知觉的整体性微电影分库周欣然
- 住院病案首页数据质量评分表
- 医疗废物培训
- 天津市塘沽第二中学2024-2025学年七年级上学期期中考试数学试卷(无答案)
- 语文-重庆市2025年普通高等学校招生全国统一考试11月调研试卷(康德卷)试题和答案
- DB43T 2635-2023 大口径涂塑复合钢管通 用技术要求
- 初中一年级上学期数学《一元一次方程的应用-行程问题》课件
- 企业乒乓球活动外聘教练协议
- 人工智能与颈椎图像识别:应用前景与挑战
- 2024-2025部编版语文一年级上册语文园地八
- 一把手讲安全领导力与执行力考核试卷
- 租赁公司财务制度
- 2024-2030年祛痘化妆品行业市场深度分析及发展策略研究报告
- 医疗责任险行业研究报告
评论
0/150
提交评论