1、课程设计任务书学院理学院专业统计学学生姓名班级学号课程设计题目黑白棋程序设计实践教学要求与任务:1、进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;2、针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。3、掌握C语言的编程技巧及程序设计的常用算法设计任务:本次设计主要实现黑白棋游戏的系统程序该程序主要实现与黑白棋有关的包括棋盘绘制,棋子绘制,双方执棋下子,统计双方分数,比较,输出输赢等一系列程序,实现在该程序中能够正常进行双方对弈的功能。工作计划与进度安排:第一天查阅资料; 第二、三天 程序设计 ;第四天 程序调
2、试 ;第五天 答辩指导教师: 201 年 月 日专业负责人: 201 年 月 日学院教学副院长: 201 年 月 日摘要程序设计语言类课程的指导思想是:使学生通过学习即高级编程语言的知识、编程技术和基本算法,又掌握程序设计的思想和方法,更具备利用计算机求解实际问题的能力,能灵活运用高级语言进行程序设计6。 其实认真学习一门语言并不困难,关键要所追求的学习的方法和途径。一条好的途径便于快速掌握,熟悉运用语言。学习的目的在于应用,理论来源于实践,如果在学习中能够通过有效的途径如自己动手设计一个功能比较前大的开发系统,借鉴于各种工具书,善于总结。定可以很好的效果。正是如此,使我们在这几年中对语言学习
3、有了很大提高。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。关键词: 掌握编程语言的知识 ;编程技术;基本算法思想和方法目录黑白棋442.1.用到的函数:42.1.1main()主函数:42.1.2DrawQp()画棋盘函数:42.1.3MoveColor()恢复原来格子的状态42.1.4playtoplay()人人对战函数42.1.5QpChange()判断棋盘变化42.1.6PrintScore()输出成绩52.2.子函数功能一览表52.3. 主函
4、数流程图62.3.1棋盘绘制流程图62.4.函数解析72.4.1图形库文件72.4.2图形初始化函数72.4.3设置背景颜色72.4.4画线72.4.5设置填充模式和颜色72.4.6方向操作72.4.7落棋位置判断82.4.8判断棋盘的变化和改变棋子的颜色82.4.9 成绩输出82.4.10输出成绩82.4.11输出最后的胜利者结果8u2.5.源代码9u2.6运行结果17u2.7心得体会17参考文献18黑白棋2.1.用到的函数:2.1.1main()主函数:在主函数中,棋盘状态用数组a88,初值为0,表示空格。用图形系统画出棋盘,调用playtoplay()人人对弈函数开始游戏,一旦游戏结束后
5、,关闭图形系统,程序结束。2.1.2DrawQp()画棋盘函数:背景颜色设为蓝色,从坐标(100,100)开始每隔40个单位用白色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。以x和y为圆心,xradius和yradius为水平和垂直轴画一填充椭圆,当xradius和yradius相等时,则画出的是圆,用它表示棋子。SetPlayColor()设置棋子的颜色:函数的参数为整型变量t,根据t的值来设计填充棋子的当前颜色,值为1代表白棋,值为2代表黑棋。2.1.3MoveColor()恢复原来格子的状态因为棋子移动过程并没有改变数组元素的值,所以可以根据数组元素的值判定原来的状态,如果值是
6、1,就恢复白色棋子,值是2则恢复黑色棋子,否则恢复蓝色空格。2.1.4playtoplay()人人对战函数这是游戏进行的函数,主要是接收棋手的按键消息,按Esc键程序可以随时结束。按上下左右光标键,则改变棋子移动的坐标值。按回车键后判断。2.1.5QpChange()判断棋盘变化当棋手按回车键落子后,就要分别往8个方向判断是否包围住对方棋子,如果是,则改变棋盘。如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标志值yes为0,返回yes,结束本函数。根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为1,白棋棋子数累加;如果数组元素值为2,则黑棋棋子数累加。2.1.6P
7、rintScore()输出成绩利用设置实体填充模式填充矩形条清除掉前次的成绩,再利用sprintf()函数将整数转换为字符串的形式,再利用outtextxy()函数将成绩输出。playWin()输出胜利者结果 根据分数值score1和score2的大小得出下棋的结果,输出赢者信息2.2.子函数功能一览表序号123456名称DrawQpSetPlayPlaytoplayMoveColorQpChangeDoScore功能绘制棋盘和初始棋子设置棋子第一次的颜色人人对战函数恢复原来棋盘状态判断棋盘的变化改变棋子的颜色处理分数备注在界面上绘制320*320的棋盘,并在棋盘中绘制8*8的格子,初始棋子先
8、走棋者持白子,后走棋黑子,每次交替俩棋手交替走棋,定义键盘操作等棋子由初始位置到落子位置的路径不改变颜色走棋后判断棋盘的变化情况,根据变化情况判断是否可以输出分数根据棋盘上旗子的多少进行分数的处理2.3. 主函数流程图开始绘制棋盘和棋子棋手对战判断棋盘变化计算棋手成绩输出胜利者信息结束Y恢复原来棋盘状态2.3.1棋盘绘制流程图绘制棋盘盘面棋位置定义大小定义底色定义绘制棋子棋子大小颜色定义棋子位置2.4.函数解析2.4.1图形库文件#include graphics.h2.4.2图形初始化函数intgd=DETECT,gr图形初始化函数initgraph(&driver,&mode,“路径”)功
9、能:装入图形驱动程序2.4.3设置背景颜色在本程序中,设置的的北京颜色为蓝色,setbkcolor(BLUE),根据上述可知,此时,游戏界面的底色为蓝色。setcolor(0)将线的颜色设置为黑色,由此是为了取消圆形周围的东西。2.4.4画线在本程序中,使用上述源代码实现绘制棋盘的功能,也就是以40为一个步增,以(100,100)为起点,以(100,420)、(420,100)(420,420)为顶点画出棋盘,棋盘大下为320*320,由于步增是40,所以,棋盘上自然出现8*8的格子,由于画线的时候,没有定义线的颜色,所以线的颜色是默认的白色,所以最终出现了兰色的底面上以白色画格子的棋盘。2.
10、4.5设置填充模式和颜色 在本程序中,棋子为半径为15的圆,颜色分别为代码为15和8的深灰色和白色两种棋子,分别由两位旗手来使用。附表:颜色代号颜色号0115颜色黑色蓝色白色符号常量BLACKBLUEWHITE2.4.6方向操作在主程序前,使用宏定义将 UP、DOWN 、LEFT 、RIGHT,做了相应的定义,因此,在对战函数当中可以使用已经进行过定义的以上四个进行操作,每次移动后,在屏幕上显示的都是一个以15为半径的圆形。由于走棋时,每个格子不能重复落子,所以,需要判断棋手要落子处是不是 已经有了棋子2.4.7落棋位置判断走棋后,判断棋盘的变化情况,将棋子途径的地方恢复为空格状态,并且开始统
11、计棋手的尝试次数,当一个棋手在一次走棋的过程中尝试的次数超过空格的个数的时候,取消该棋手的本次走棋,改为下个旗手走棋,也就是跳出本次循环,进行下一次的循环。如果常识的次数没有超过空格的个数,而是落棋的位置无效,则旗手可以继续尝试,知道到达尝试次数。当某次走棋后,接受的按键的值为ESC的时候,则退出游戏,当落子后在判定棋盘的变化时,一方的棋子为0,或者是双方已经下满60手,则执行 playWin 函数,输出游戏的结果 。2.4.8判断棋盘的变化和改变棋子的颜色通过判断数aij的值来判断棋子的颜色,已经定义当aij=1的时候,棋子为白色,当aij=2的时候棋子为黑色,当aij的值不为1和2的时候,
12、则此时恢复为背景2.4.9 成绩输出清空之前的成绩,aij=1/2?;Score2+;Score1+;Score2+Score1+?黑色胜利,全部胜利=?白色胜利2.4.10输出成绩在统计完得分后,分别在(550,200)和(550,300)俩个地方输出参与游戏的俩个人的分数信息。2.4.11输出最后的胜利者结果黑子胜利,在(100,50)的位置上输出black win,白子获得胜利,在(100,50)的位置上输出“white win”,当出现得分相同的情况时,在(60,50)的位置上输出“you all win!”。u2.5.源代码#include graphics.h #define LE
13、FT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define ENTER 0x1c0d int a88=0,key,score1,score2;charplayone3,playtwo3;voidplaytoplay(void);void DrawQp(void);/*画棋盘函数*/voidSetPlayColor(int x);voidMoveColor(intx,int y);intQpChange(intx,inty,int z);/voidDoScore(v
14、oid);voidPrintScore(int n);/voidplayWin(void);/void main(void)intgd=DETECT,gr;initgraph(&gd,&gr,c:tc); DrawQp();playtoplay();/*人人对战*/getch();closegraph();voidDrawQp()inti,j; score1=score2=0;setbkcolor(BLUE);for(i=20;i=64-score1-score2) MoveColor(x,y);fillellipse(x,y,15,15);break; elsecontinue; DoSco
15、re();break; elsecontinue; elseif(key=LEFT&x120) MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15); elseif(key=RIGHT&x80) MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t); x+=40;fillellipse(x,y,15,15); elseif(key=UP&y120) MoveColor(x,y);fillellipse(x,y,15,15);Set
16、PlayColor(t);y-=40;fillellipse(x,y,15,15); elseif(key=DOWN&y400) MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t); y+=40;fillellipse(x,y,15,15); if(key=ESC)break;if(score1+score2)=64|score1=0|score2=0) playWin();break; t=t%2+1; cc=0; /*endwhile*/voidSetPlayColor(int t)if(t%2=1)setfillstyle(SOLI
17、D_FILL,15);elsesetfillstyle(SOLID_FILL,8);voidMoveColor(intx,int y)if(y100)setfillstyle(SOLID_FILL,BLUE);elseswitch(a(x-120)/40(y-120)/40) case 1:setfillstyle(SOLID_FILL,15);break;case 2:setfillstyle(SOLID_FILL,8);break;default:setfillstyle(SOLID_FILL,BLUE); intQpChange(intx,inty,int t)inti,j,k,kk,i
18、i,jj,yes;yes=0; i=(x-120)/40; j=(y-120)/40; SetPlayColor(t); if(j6)/*往右边*/ for(k=j+1;k8;k+)if(aik=aij|aik=0)break;if(aik!=0&k8) for(kk=j+1;kkk&k1) for(k=j-1;k=0;k-)if(aik=aij|!aik)break;if(aik!=0&k=0) for(kk=j-1;kkk&k=0;kk-) aikk=aij;fillellipse(120+i*40,120+kk*40,15,15); if(kk!=j-1)yes=1; if(i6) fo
19、r(k=i+1;k8;k+)if(akj=aij|!akj)break;if(akj!=0&k8) for(kk=i+1;kkk&k1) for(k=i-1;k=0;k-)if(akj=aij|!akj)break;if(akj!=0&k=0) for(kk=i-1;kkk&k=0;kk-) akkj=aij;fillellipse(120+kk*40,120+j*40,15,15); if(kk!=i-1)yes=1; if(i1&j=0&kk=0&kkk&k=0;ii-,jj+) aiijj=aij;fillellipse(120+ii*40,120+jj*40,15,15); if(ii
20、!=i-1)yes=1; if(i1) for(k=i+1,kk=j-1;k=0;k+,kk-)if(akkk=aij|!akkk)break;if(akkk!=0&k=0) for(ii=i+1,jj=j-1;iik&k1&j1) for(k=i-1,kk=j-1;k=0&kk=0;k-,kk-)if(akkk=aij|!akkk)break;if(akkk!=0&k=0&kk=0) for(ii=i-1,jj=j-1;iik&k=0;ii-,jj-) aiijj=aij;fillellipse(120+ii*40,120+jj*40,15,15); if(ii!=i-1)yes=1; if
21、(i6&j6) for(k=i+1,kk=j+1;kk8&kk8;k+,kk+)if(akkk=aij|!akkk)break;if(akkk!=0&kk8&k8) for(ii=i+1,jj=j+1;iik&k8;ii+,jj+) aiijj=aij;fillellipse(120+ii*40,120+jj*40,15,15); if(ii!=i+1)yes=1; return yes;voidDoScore()inti,j; score1=score2=0;for(i=0;i8;i+)for(j=0;jscore1)outtextxy(100,50,black win!);elseif(s
22、core28; return(key); u2.6运行结果u2.7心得体会在这次课程设计中,我深深地感受到了C语言的博大精深,从中知道了好多之前不知的知识。比如,用C语言还可以制作出有图形化,有色彩的界面,之前都只是以为C语言制作出来的程序的运行界面是一片黑屏,没有什么有趣的东西,老想着那个黑屏下能做出什么方便用户操作的界面呢?但通过这次课程设计,我清楚地得到了答案,用C语言做出的程序是很实用的,运行效率是很高的。在这次课程设计中,我对程序做了一些扩展:A.采用类似图形化的界面,运用一些屏幕操作函数对程序运行界面进行一些美化,使程序运行时会出现欢迎界面,运行界面,退出界面,在运行界面中,有输入、输出窗口,还有菜单窗口、操作信息提示窗口、这些窗口在程序运行过程中的位置是固定的,使信息可以在相对应的窗口内进行输入、输出,改变了以往程序运行界面从上到下进行输入或输出信息的单一窗口界面形式。使程序运行时出现了多窗口。B.在程序中调用一个时间函数,使程序运行窗口的右上角显示出了当前的系统时间。在这次设计中,学到的知识很多,但要学知识也很多。在以后的学习中,我会努力地扩展C语言,加深对C语言的学习参考文献1 谭浩强. C程序设计(第四版). 北京,清华大学出版社.2010.62 谭浩强. C程序设计(第四版)学习辅导. 北京,清华大学出版社. 2010.718
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922