黑白棋游戏课程设计.doc_第1页
黑白棋游戏课程设计.doc_第2页
黑白棋游戏课程设计.doc_第3页
黑白棋游戏课程设计.doc_第4页
黑白棋游戏课程设计.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目目 录录 一、设计目的 .3 二、设计要求 .3 三、所需仪器设备 .3 四、课题分析 .3 五、具体设计过程 .4 5.1、设计思路.4 5.2、程序设计流程图.4 5.3、函数实现说明.7 5.4、图形库函数介绍.8 5.5、程序源代码及注释 9 5.6、调试结果19 六、设计心得体会 20 七、参考文献 21 2 黑白棋游戏黑白棋游戏cc 语言课程设计语言课程设计 一、设计目的一、设计目的 本课程设计是计算机软件技术基础重要的实践性环节之一,是在学生学习完程序 设计语言(c)课程后进行的一次全面的综合练习。本课程设计的目的和任务: (1)巩固和加深学生对 c 语言课程的基本知识的理解和掌握; (2)掌握 c 语言编程和程序调试的基本技能; (3)利用 c 语言进行基本的软件设计,掌握软件设计一般方法,了解软件设计的思路; (4)掌握书写程序设计报告的能力; (5)提高运用 c 语言解决实际问题的能力; 这个程序也是对编程基本功的一个训练,对于初学 c 语言的人,讲分支、循环、数 组函数综合应用,而不仅限于编制独立的小程序,能够大大提高变成水平。 二、设计要求二、设计要求 (1)收集资料,全面分析课题,分解问题,形成中体编程思路; (2)深入分析各个小问题,编写个部分程序模块; (3)对于设计中用到的关键函数,要联系实际 问题进行具体介绍; (4)上机调试,确保程序能正确运行; (5)设计完成后提交课程设计报告; 三、所需仪器设备三、所需仪器设备 (1)硬件要求能运行 windows 2000/xp 操作系统的微机系统。 (2)c 语言程序设计及相应的开发环境。 (本设计用的是 turbo c for windows 集成实 验与学习环境 v6.0) 四、课题分析四、课题分析 编写一个黑白棋游戏的 c 程序,包括以下功能: 初始状态:在一个 8*8 的棋盘中央交叉排放黑白棋子各两枚,白棋先走。 (1)每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子, 被包围住的对方棋子将成为自己的棋子。包围的方向可以是上下左右以及斜线 8 个方向, 只要能连成一线即可。 (2)当轮到某一个棋手下子,但是他没有可以包围对方棋子的位置时,他必须停步,让 对方走棋,直到他可以走为止。 (3)当棋盘上一方的棋子为 0 或者下满 64 格,游戏结束,棋子少者输。 3 五、具体设计过程五、具体设计过程 5.15.1、设计思路、设计思路 程序界面应是一个二维平面图,所以数据的表示用二维数组,数组两个下标可以表示 棋盘上的位置,数组元素的值代表棋格中的状态,共有三种情况,分别是空格、黑棋和 白棋。这样给数组元素的取值设定为 0、1、2,其中 0 代表空格,1 代表白色棋子,2 代 表黑色棋子。这样程序的主要工作是接收棋手按键操作,一旦接收到回车键,说明棋手 摆子,先判断是不是有效位置,也就是能不能包围住对方棋子,如果能,便为棋子所在 的位置往上下、左右、左上、左下、右上、右下 8 个方向寻找被包围住的所有棋子(必 须是连续的,中间不能有空格) ,将这些被包围住的对方棋子都变成自己的棋子,然后对 当前棋盘中的黑白棋个数进行统计并输出结果。如果没有这样的位置可以落子,则停步, 让对方走棋,重复上述步骤,直到游戏结束。如果想提前终止游戏,可以按 esc 键。 5.25.2、程序设计流程图、程序设计流程图 (1)由上述设计思路可画出程序整体流程图,如下图所示: 4 图 1 程序整体流程图 开 始 结 束 游 戏 初始化图形系统 画出棋盘 按键操作 是否为有效 位置? 按键是否 为回车键? 落 棋 变成自己的棋子 统计黑白棋个数, 输出成绩。 输出胜利者信息 关闭图形系统 否 是 否 是 5 (2)人人对战模块程序流程图如下图所示: 图 2 人人对战模块流程图 (3) 成绩输出模块程序流程图如下图所示 6 图 3 成绩输出模块程序流程图 5.35.3、函数实现说明函数实现说明 (1)main()主函数 在主函数中,首先定义使用到的常数、全局变量、函数原型说明。盘状态用数组 a8 8,初值为 0,表示空格。函数的实体部分,开始初始化图形系统,然后通过调用函数 drawqp()先画出棋盘,调用 playtoplay()人人对战函数开始游戏,一旦游戏结束后,关 闭图形系统,程序结束。 (2)drawqp()画棋盘函数 背景颜色设为蓝色,从坐标(100,100)开始每隔 40 个单位用白色画一条水平直线, 一条垂直线,构成棋盘,用循环语句实现。函数 setfillstyle()可以设置填充模式和填 充颜色,fillellipse(int x,int y,xradius,int yradius)以 x 和 y 为圆心,xradius 和 yradius 为水平和垂直轴画一填充椭圆,当 xradius 和 yradius 相等时,则画出的是 圆,用它表示棋子。 (3)setplaycolor()设置棋子的颜色 函数的参数为整型变量 t,根据 t 的值来设计填充棋子的当前颜色,值为 1 代表白棋, 值为 2 代表黑棋。 (4)movecolor()恢复原来格子的状态 7 由于棋手在走棋的时候,他的棋子总是首先出现在棋盘的左上角,棋手要通过移动 光标走到要落子的位置,在经过的路程上显示当前棋子,就会覆盖原来的棋盘状态, 所以一旦棋子走过后,就应恢复原来的状态,是空格的依然显示空格,是棋子的就显 示原来棋子的颜色。因为棋子移动过程并没有改变数组元素的值,所以可以根据数组 元素的值判定原来的状态,如果值是 1,就恢复白色棋子,值是 2 则恢复黑色棋子,否 则恢复蓝色空格。 (5) 、playtoplay()人人对战函数 这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下: 1)按 esc 键程序可以随时结束。 2)按上下左右光标键,则改变棋子移动的坐标值。 3)按回车键后判断: 如落子的位置已经有棋则无效,继续压键。 如落子位置是空格,可以将棋子落入格内,调用函数 qpchange()判断是否引起棋 盘的变化,函数值为 1 有变化,为 0 没变化。如果棋盘有变化,说明将包围的对方棋子 吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视 为无效棋,可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过当前 棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。 如果棋子变化后,格子已占满 64 格或一方棋子为 0,则游戏结束,显示胜利方信息。 按任意键程序结束。 重复上述步骤,直到游戏结束。 (6) 、qpchange()判断棋盘变化 当棋手按回车键落子后,就要分别往 8 个方向判断是否包围住对方棋子,如果是,则改 变棋盘,也就是棋盘上黑白棋子的个数要发生变化。如果所有方向都判断过,并且没有 引起棋盘的变化,则棋盘变化标志值 yes 为 0,返回 yes,结束本函数。 (7) 、doscore()处理分数 根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为 1,白 棋棋子数累加;如果数组元素值为 2,则黑棋棋子数累加。 (8) 、printscore()输出成绩 利用设置实体填充模式填充矩形条清除掉前次的成绩,再利用 sprintf()函数将整数 转换为字符串的形式,再利用 outtextxy()函数将成绩输出。 (9) 、playwin()输出胜利者结果 根据分数值 score1 和 score2 的大小得出下棋的结果,输出赢者信息。如果是白方胜 就输出“white win!” ,黑方胜就输出“black win!” ,平局就输出“you all win!” 。 5.45.4、图形库函数介绍、图形库函数介绍 图形库 是 tc 里面的图形库,分为:像素函数、直线和线型函数、多边 形函数、填充函数等。在本程序中主要应用到了以下功能函数: 8 (1)、line() 画线函数 功能: 函数 line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。 函数原型: void line(int startx,int starty,int endx,int endy); 说明: 参数 startx,starty 为起点坐标,endx,endy 为终点坐标,函数调用前后,图 形状态下屏幕光标(一般不可见)当前位置不改变。 (2)、setcolor()图形屏幕函数 函数原型:void setcolor(int color) 功能:将当前图形屏幕的当前笔画颜色置为 color. (3)、setfillstyle() 设置填充图样和颜色函数 函数原型: void far setfillstyle(int pattern, int color); 功 能: 设置填充模式和颜色 (4) 、fillellipse() 画椭圆区函数 功 能: 画出并填充一椭圆 函数原型: void far fillellipse(int x, int y, int xradius, int yradius); 说明:填充边框所定义的椭圆的内部,该边框由一对坐标、一个宽度和一个高度指定。 (5) 、setbkcolor() 功能:该函数用指定的颜色值来设置当前的背景色 函数原型:void far setbkcolor(int color ); (6) 、c 语言中的颜色表及填充模式如下两表所示: 9 5.55.5、程序源代码及注释、程序源代码及注释 #include “graphics.h“ /*图形系统头文件*/ #define left 0x4b00 /*光标左键值*/ 10 #define right 0x4d00 /*光标右键值*/ #define down 0x5000 /*光标下键值*/ #define up 0x4800 /*光标上键值*/ #define esc 0x011b /* esc 键值*/ #define enter 0x1c0d /* 回车键值*/ int a88=0,key,score1,score2;/*具体分数以及按键与存放棋子的变量*/ char playone3,playtwo3;/*两个人的得分转换成字符串输出*/ void playtoplay(void);/*人人对战函数*/ void drawqp(void);/*画棋盘函数*/ void setplaycolor(int x);/*设置棋子第一次的颜色*/ void movecolor(int x,int y);/*恢复原来棋盘状态*/ int qpchange(int x,int y,int z);/*判断棋盘的变化*/ void doscore(void);/*处理分数*/ void printscore(int n);/*输出成绩*/ void playwin(void);/*输出胜利者信息*/ /*主函数*/ void main(void) int gd=detect,gr; initgraph( /*初始化图形系统*/ drawqp();/*画棋盘*/ playtoplay();/*人人对战*/ getch(); closegraph();/*关闭图形系统*/ void drawqp()/*画棋盘*/ int i,j; score1=score2=0;/*棋手一开始得分都为 0*/ setbkcolor(blue); for(i=100;i=64-score1-score2) /*如果尝试超过空格数则停步*/ movecolor(x,y); fillellipse(x,y,15,15); break; else continue;/*如果按键无效*/ doscore();/*分数的改变*/ break;/*棋盘变化了,则轮对方走棋*/ else/*已经有棋子就继续按键*/ continue; else /*四个方向按键的判断*/ if(key=left fillellipse(x,y,15,15); setplaycolor(t); x-=40; fillellipse(x,y,15,15); else if(key=right 13 fillellipse(x,y,15,15); setplaycolor(t); x+=40; fillellipse(x,y,15,15); else if(key=up fillellipse(x,y,15,15); setplaycolor(t); y-=40; fillellipse(x,y,15,15); else if(key=downk=0;k-) if(aik=aij|!aik) break; if(aik!=0kkkkk-) aikk=aij; fillellipse(120+i*40,120+kk*40,15,15); if(kk!=j-1) yes=1; if(i1)/*判断上边*/ for(k=i-1;k=0;k-) if(akj=aij|!akj) break; if(akj!=0kkkkk-) akkj=aij; fillellipse(120+kk*40,120+j*40,15,15); if(kk!=i-1) yes=1; if(i1ii-,jj+) aiijj=aij; fillellipse(120+ii*40,120+jj*40,15,15); if(ii!=i-1) yes=1; 17 if(i1)/*左下*/ for(k=i+1,kk=j-1;k=0;k+,kk-) if(akkk=aij|!akkk) break; if(akkk!=0ii1k=0k-,kk-) if(akkk=aij|!akkk) break; if(akkk!=0ii

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论