ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:33.88KB ,
资源ID:6654672      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6654672.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(软件技术基础课程设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

软件技术基础课程设计.docx

1、软件技术基础课程设计软件技术基础课程设计项目名称: 用C语言编写的五子棋游戏软件 班 级: 信息学院2001级电子信息工程 学 号: XXX(2001714XXX) XXX(2001714XXX) XXX(2001714XXX) XXX(2001714XXX) XXX(2001714XXX) 完成时间: 2004年2月24日 指导教师: XXX 日期: 2004 年 2 月 24日C语言编写的一个五子棋游戏程序(课程设计 综合编程)课程设计的目的:运用所学的C语言基础编程知识,编写一个由简单向复杂过渡的软件,从中了解到开发一个实用软件的基本常识和一般步骤;使所学的理论性知识向应用型转变。一句话

2、,就是学有所用。课程设计的要求:不仅需要熟练掌握C语言的编程程序方法,而且要深知相应的计算机硬件知识,使用计算机寄存器进行数据操作,熟悉宏定义以及相应的编程技巧。课程设计的步骤: 一 确定软件的功能二 定义核心数据结构三 对整个软件功能模块进行划分四 编写程序实现各功能模块五 对源程序进行编译,调试,形成软件产品程序的功能分析: 本程序是提供两人对战的五子棋,不需要人机对战功能,两个玩家交替在五子棋盘上交替下棋子,当其中一位玩家的棋子布局有形成五子相连时,程序编判断他赢棋.定义核心数据结构:五子棋需要一个19X19的棋盘,因此要定义一个19X19的二维数组gChessboard来记录棋盘的状态

3、,数组中每个元素代表棋盘上的每个交点,比如gChessboard00代表棋盘的左上角,gChessboard019代表棋盘的右上角,gChessboard190代表棋盘的左下角,gChessboard1919代表棋盘的右下角.在棋盘中每个交点有三种状态,即有黑棋占据,白棋占据和无棋占据.因此,数组中定义的每个元素要反映三种状态,在程序中定义0时是表示无棋占据,O表示玩家1的棋子(黑子)占据,X表示玩家2的棋子(白子)占据.在程序中用当前光标移动来确定玩家的落子,因此要定义一个数据结构来记录光标的位置,在程序中定义了一个结构类型struck point它的两个整型成员X和Y分别用于记录光标位于棋

4、盘的行和列的坐标值.程序结构: Init()初始化 GetKey()获取用户按键 ChessKey()分析按键类型 CheckKey()判断按键类型main()函数 调用函数ChessGo来执行落子命令 调用函数JudgeWin来判断当前玩家是否赢棋 在初始化图象部分调用了函数DrawMap 调用DrawCross()来画棋盘上的交叉点bioskey(),textmode(),clrscr(),putch(),cputs(),程序用的库函数: gotoxy(),textcolor(),delay(),sound(),nosound().程序的功能模块划分:程序要根据用户的按键来决定执行什么操作

5、,因此要有一个专门的接收按键模块来接收和处理用户的输入,这个模块被循环调用,直到分出胜负或用户按下退出键.如图所示: 玩游戏循环 光标移动键 无效按键 退出 落子键 程序编译环境:Tubor C编译器运行环境:Windows 95/98/2000/NT/me/XP程序开发的工作进程:需求分析(黄昊升)(4天)确定五子棋规则(石挺干)(2天)可行性分析(吉训蓬)(5天)详细功能模块划分(陶文静)(6天)源程序代码编写(石挺干)(17天)编译、调试和验证(王全)(5天)设计起止时间:2004年1月18日2004年2月24日成果交付时间:2004年2月25日成员名单:石挺干(2001714054)

6、吉训蓬(2001714051) 陶文静(2001714094)王 全(2001714084)黄昊升(2001714079)五子棋源程序的编写:核心数据结构及符号常量定义模块:/*/* 棋盘交叉点坐标的数据结构 */struct point int x,y;/*/* 定义全局变量 */int gPlayOrder; /* 指示当前行棋方 */struct point gCursor; /* 光标在棋盘上的位置 */char gChessBoard1919; /* 用于记录棋盘上各点的状态*/*/* 定义符号常量 */*定义画棋盘所需的制表符*/#define CROSSRU 0xbf /*右上角

7、点*/#define CROSSLU 0xda /*左上角点*/#define CROSSLD 0xc0 /*左下角点*/#define CROSSRD 0xd9 /*右下角点*/#define CROSSL 0xc3 /*左边*/#define CROSSR 0xb4 /*右边*/#define CROSSU 0xc2 /*上边*/#define CROSSD 0xc1 /*下边*/#define CROSS 0xc5 /*十字交叉点*/*定义棋盘左上角点在屏幕上的位置*/#define MAPXOFT 5#define MAPYOFT 2/*定义1号玩家的操作键键码*/#define PL

8、AY1UP 0x1157/*上移-W*/#define PLAY1DOWN 0x1f53/*下移-S*/#define PLAY1LEFT 0x1e41/*左移-A*/#define PLAY1RIGHT 0x2044/*右移-D*/#define PLAY1DO 0x3920/*落子-空格键*/*定义2号玩家的操作键键码*/#define PLAY2UP 0x4800/*上移-方向键up*/#define PLAY2DOWN 0x5000/*下移-方向键down*/#define PLAY2LEFT 0x4b00/*左移-方向键left*/#define PLAY2RIGHT 0x4d00/

9、*右移-方向键right*/#define PLAY2DO 0x1c0d/*落子-回车键Enter*/*若想在游戏中途退出, 可按 Esc 键*/#define ESCAPE 0x011b/*定义棋盘上交叉点的状态, 即该点有无棋子 */*若有棋子, 还应能指出是哪个玩家的棋子 */#define CHESSNULL 0 /*没有棋子*/#define CHESS1 O/*一号玩家的棋子*/#define CHESS2 X/*二号玩家的棋子*/*定义按键类别*/#define KEYEXIT 0 /*退出键*/#define KEYFALLCHESS 1 /*落子键*/#define KEYM

10、OVECURSOR 2 /*光标移动键*/#define KEYINVALID 3 /*无效键*/*定义符号常量: 真, 假 - 真为1, 假为0 */#define TRUE 1#define FALSE 0初始化模块:/*/* 程序的初始化模块是用函数Init来实现的。 */* 在初始化图象部分调用了函数DrawMap。函数DrawMap的功能是 */* 根据gChessBoard棋盘状态在屏幕上画一个19X19的棋盘。 */* 在函数DrawMap中又调用了函数DrawCross,用来画棋盘上的交叉点。*/*/*界面初始化,数据初始化*/void Init(void) int i,j;

11、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+) for(j=0;j19;j+) gChessBoardij=CHESSNULL; /*光标初始位置*/ gCursor.x

12、=gCursor.y=0;/*画棋盘*/ textmode(C40); DrawMap();/*显示操作键说明*/ i=0; textcolor(BROWN); while(Msgi!=NULL) gotoxy(25,3+i); cputs(Msgi); i+; /*显示当前行棋方*/ ShowOrderMsg(gPlayOrder); /*光标移至棋盘的左上角点处*/ gotoxy(gCursor.x+MAPXOFT,gCursor.y+MAPYOFT);/*画棋盘*/void DrawMap(void) int i,j;clrscr();for(i=0;i19;i+) for(j=0;j1

13、9;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) textcolor(LIGHTBLUE); putch(CHESS2); return; textcolor(GREEN);/*左上角交叉点*/ if(x=0&y=

14、0) putch(CROSSLU); return; /*左下角交叉点*/ if(x=0&y=18) putch(CROSSLD); return; /*右上角交叉点*/ if(x=18&y=0) putch(CROSSRU); return; /*右下角交叉点*/ if(x=18&y=18) putch(CROSSRD); return; /*左边界交叉点*/ if(x=0) putch(CROSSL); return; /*右边界交叉点*/ if(x=18) putch(CROSSR); return; /*上边界交叉点*/if(y=0) putch(CROSSU); return; /*

15、下边界交叉点*/ if(y=18) putch(CROSSD); return; /*棋盘中间的交叉点*/ putch(CROSS); 接收用户的输入模块:/*/* 程序在主函数中进入循环后,调用函数GetKey来获取用户的按键。 */* 函数GetKey的作用就是等待用户按键,然后返回该按键值。 */* 按键如果是字母,GetKey函数将把按键值的低字节处理成大写字母。*/* 这样无论用户是按A还是a,返回的按键值是一样的。 */* 获取到按键值后,主函数要调用函数ChessKey来分析按键类型, */* 根据按键类型采取不同的反应动作。 */*/*/*主函数*/void main() .

16、while(1) press=GetKey();/*获取用户按键*/ switch(CheckKey(press)/*判断按键类型*/ . . /*/*获取按键值*/int GetKey(void) char lowbyte; int press;while (bioskey(1) = 0);/*如果用户没有按键,空循环*/press=bioskey(0);/*将低字节一律转换位大写*/ lowbyte=press&0xff; press=press&0xff00 + toupper(lowbyte);return(press);/*/*分析按键类型*/int CheckKey(int pre

17、ss) if(press=ESCAPE)return KEYEXIT;/*是退出键*/else if ( ( press=PLAY1DO & gPlayOrder=CHESS1) | ( press=PLAY2DO & gPlayOrder=CHESS2) )return KEYFALLCHESS;/*是落子键*/elseif ( press=PLAY1UP | press=PLAY1DOWN | press=PLAY1LEFT | press=PLAY1RIGHT | press=PLAY2UP | press=PLAY2DOWN | press=PLAY2LEFT | press=PLAY

18、2RIGHT ) return KEYMOVECURSOR;/*是光标移动键*/else return KEYINVALID;/*按键无效*/光标移动模块:/*/* 程序在主函数中进入循环后,调用函数GetKey来获取用户的按键。 */* 函数GetKey的作用就是等待用户按键,然后返回该按键值。 */* 按键如果是字母,GetKey函数将把按键值的低字节处理成大写字母。*/* 这样无论用户是按A还是a,返回的按键值是一样的。 */* 获取到按键值后,主函数要调用函数ChessKey来分析按键类型, */* 根据按键类型采取不同的反应动作。 */*/*/*主函数*/void main() .

19、while(1) press=GetKey();/*获取用户按键*/ switch(CheckKey(press)/*判断按键类型*/ . . /*/*获取按键值*/int GetKey(void) char lowbyte; int press; while (bioskey(1) = 0);/*如果用户没有按键,空循环*/press=bioskey(0);/*将低字节一律转换位大写*/ lowbyte=press&0xff; press=press&0xff00 + toupper(lowbyte);return(press);/*/*分析按键类型*/int CheckKey(int pr

20、ess) if(press=ESCAPE) return KEYEXIT;/*是退出键*/else if ( ( press=PLAY1DO & gPlayOrder=CHESS1) | ( press=PLAY2DO & gPlayOrder=CHESS2) ) return KEYFALLCHESS;/*是落子键*/else if ( press=PLAY1UP | press=PLAY1DOWN | press=PLAY1LEFT | press=PLAY1RIGHT | press=PLAY2UP | press=PLAY2DOWN | press=PLAY2LEFT | press=

21、PLAY2RIGHT ) return KEYMOVECURSOR;/*是光标移动键*/else return KEYINVALID;/*按键无效*/落子与判断胜负模块:/*/* 当玩家按下落子键,主函数先调用函数ChessGo来执行落子命令。 */* 若是当前玩家在棋盘上的空格点落子,则函数ChessGo返回TRUE, */* 且主函数继续调用函数JudgeWin来判断当前玩家是否赢棋。 */*/*/*主函数*/void main() . . /*是落子键*/ case KEYFALLCHESS: if(ChessGo(gPlayOrder,gCursor)=FALSE)/*走棋*/ DoE

22、rror();/*落子错误*/ else DoOK();/*落子正确*/ /*如果当前行棋方赢棋*/ if(JudgeWin(gPlayOrder,gCursor)=TRUE) DoWin(gPlayOrder); bOutWhile= TRUE;/*退出循环标志置为真*/ /*否则*/ else /*交换走棋方*/ ChangeOrder(); break; . ./*/*走棋*/int ChessGo(int Order,struct point Cursor) /*判断交叉点上有无棋子*/ if(gChessBoardCursor.xCursor.y=CHESSNULL) /*若没有棋子

23、, 则可以落子*/ gotoxy(Cursor.x+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个行

24、棋方的棋子*/ if(JudgeWinLine(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.

25、x=1; dpos.y=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; break; count=0;for(i=0;i=0&pos.x=0&pos.y=18) if(gChessBoardpos.xpos.y=Order) count+

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1