辽宁工业大学c语言程序设计马超男 101401023_第1页
辽宁工业大学c语言程序设计马超男 101401023_第2页
辽宁工业大学c语言程序设计马超男 101401023_第3页
辽宁工业大学c语言程序设计马超男 101401023_第4页
辽宁工业大学c语言程序设计马超男 101401023_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

辽宁工业大学c语言程序设计马超男101401023辽宁工业大学c语言程序设计马超男101401023辽宁工业大学c语言程序设计马超男101401023辽宁工业大学c语言程序设计马超男101401023编制仅供参考审核批准生效日期地址:电话:传真:邮编:辽宁工业大学C语言程序设计课程设计(论文)题目:黑白棋游戏院(系):软件学院专业班级:电子商务101班学号:3学生姓名:马超男指导教师:丁宝柱教师职称:助教起止时间:至课程设计(报告)任务及评语院(系):软件学院教研室:软件教研窒学号3学生姓名马超男专业班级电子商务101班程序设计(报告)题目黑白棋游戏程序设计(报告)任务程序设计的任务与要求:(1)掌握C语言编程的基础知识。(2)较熟练地编写C语言应用程序。(3)了解C语言的常用标准函数、编程技巧、异常处理。(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。指导教师评语及成绩成绩:指导教师签字:2011年目录第1章课程设计的目的与要求 1课程设计目的 1课程设计的实验环境 1课程设计的预备知识 1课程设计要求 1程序功能介绍 2程序整体设计说明 2设计思路 2数据结构设计及用法说明 2程序结构(流程图) 3各模块的功能及程序说明 3程序结果 6程序源代码及注释 8第3章课程设计总结 17第4章参考文献资料18

第1章课程设计的目的与要求课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。本课程设计的目的和任务:1.巩固和加深学生对C语言课程的基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的软件设计4.掌握书写程序设计说明文档的能力5.提高运用C语言解决实际问题的能力课程设计的实验环境硬件要求能运行Windows2000/XP操作系统的微机系统。C语言程序设计及相应的开发环境。课程设计的预备知识熟悉C语言及C语言开发工具。课程设计要求1分析课程设计题目的要求2.写出详细设计说明3.编写程序代码,调试程序使其能正确运行4.设计完成的软件要便于操作和使用5.设计完成后提交课程设计报告

第2章课程设计内容程序功能介绍黑白棋游戏是一个深受人们喜爱的游戏,有人机对弈和人人对以两种情况,人与人对弈一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。按键盘上的方向键可以上下左右移动棋子,按回车键可以摆放棋子。程序整体设计说明2.2.1设计思路(1)每个棋手下棋时,摆子的位置必须是以自己的棋子能包围住对方一个或多个棋子,被包围住的对方棋子将成为自己的棋子。包围的方向可以是上下左右以及斜线8个方向,只要能连成一线即可。(2)当轮到某一个棋手下子,但是他没有可以包围对方棋子的位置时,他必须停步,让对方走棋,直到他可以走为止。(3)当棋盘上一方的棋子为0或者下满64格,游戏结束,棋子少者输2.2.2数据结构设计及用法说明在黑白棋的程序设计中主要应用了模块,利用主调函数和被调函数实现程序的运行。例如:在住函数中调用了函数DrawQp();以实现绘制棋盘的功能。在这个程序中多处运用这种调用关系,以实现程序的运行。我首先使用了最简单的顺序结构程序设计。这是最基本的数据结构设计。按照我的设计思路按书写顺序依次执行主函数,接下来是各个被调函数,在对这些函数进行简单的连接。但程序都不会是简单的顺序结构,而是顺序、选择、循环三种结构的组合。所以在本程序的设计中,我大量的使用了选择结构和循环结构程序设计,进行选择结构程序设计需要考虑两个方面的问题:一是在C语言中如何表示条件,二是在C语言中用什么语句来实现选择结构。我使用了if语句实现选择结构,if语句一般用来实现单分支和双分支选择结构,有三种形式。例如在playtoplay模块中就大量的运用了if语句。而循环语句是一种算法多次执行,直到运行结束。在运用循环结构时,难在掌握好循环体,比如在Qpchange模块中就运用了大量的for循环嵌套,并配合break、continue使用进行循环。使程序更简洁,易读性加强。2.2.3程序结构(流程图)可参考流程图2.2.3-1初始棋局(-1)+|||e3c3c(A)(B)(C)电脑下棋对手下棋初始棋局(-1)+|||e3c3c+++||||||||||||||f2f3f4f5f6c2d3e6f5b+84+36+12+5-1+11-1+6+6+6+0-5+3+51如上图所示棋局,设电脑为白棋,推理深度为2,可以形成如下的树:(数字为节点值)初始棋局白棋下棋之后黑棋下棋之后估值初始棋局(-1)+|||e3(-1)c3(-1)c5(-5)+++||||||||||||||f2f3f4f5f6c2d3e6f5b+84+36+12+5-1+11-1+6+6+6+0-5+3+5图2.2.3-1流程图2.2.4各模块的功能及程序说明(1)main()主函数首先初始化图形模式,然后通过调用函数先画出棋盘,再开始游戏,一旦游戏结束则关闭图形模式,程序结束。(2)DrawQp()画棋盘函数先设置背景色,然后通过循环利用水平和垂直直线画出棋盘,再利用填充圆画出初始棋子。(3)SetPlayColor()设置棋子的颜色目的是为判断棋手和棋盘的变化,根据函数参数的值来设计填充棋子的当前颜色,值为1代表白棋,值为2代表黑棋。(4)MoveColor()恢复原来棋子的状态棋手要通过移动光标键走到落子的位置,在经过的路程上显示当前棋子,则会覆盖原来的棋盘状态,所以一旦棋子走过后,就应恢复原来的状态。(5)playbplay()人人对战函数这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:1)按Esc键程序可以随时结束。2)按上下左右光标键,则改变棋子移动的坐标值。3)按回车键后判断:如落子的位置已经有棋则无效,继续压键。〔1〕如落子位置是空格,可以将棋子落入格内,调用函数QpChange()判断是否引起棋盘的变化,函数值为1有变化,为0没变化。如果棋盘有变化,说明将包围的对方棋子吃掉,统计当前分数,如果棋盘没有变化,则说明落子的位置无法包围对方的棋子也视为无效棋,可以继续寻找合适的位置,但开始统计其落子次数,一旦尝试次数超过当前棋盘的空格数,则说明他无棋可走,则放弃此步,让对方下棋。〔2〕如果棋子变化后,格子已占满64格或一方棋子为0,则游戏结束,显示胜利方信息。按任意键程序结束。〔3〕重复上述步骤,直到游戏结束。(6)QpChange()判断棋盘变化当棋手按回车键落子后,就要分别往8个方向判断是否包围住对方棋子,如果是,则改变棋盘,也就是棋盘上黑白棋子的个数要发生变化。表示黑白棋的图形用屏幕上的像素坐标,而棋子的状态是数组元素a,所以要根据落子的坐标x和y计算出对应数组元素a的下标i和j。i代表行,j代表列,对于8×8的棋盘,它们的值为0-7,如果j<6,往右边判断,从当前位置开始,用循环语句判断右边是否有一个或连续多个对方的棋子,遇到自己的棋子或空格则结束循环,如果循环结束不是遇到空白,且列坐标小于8,则说明这些位置的棋子是被自己包围的对方棋子,将它们吃掉.也就是改变为自己的棋子,如果有棋子发生了变化,给棋盘变化标志值yes赋值为1,同样的方法向左、上、下等8个方向进行判断,并作相应的变化。如果所有方向都判断过,并且没有引起棋盘的变化,则棋盘变化标志值yes为0,返回yes,结束本函数。(7)DoScore()处理分数根据当前数组元素的值判断分数,也就是各方棋子的个数,如果数组元素值为1,白棋棋子数累加;如果数组元素值为2,则黑棋棋子数累加。(8)PrintScore()输出成绩利用设置实体填充模式填充矩形条消除掉前次的成绩,再利用索赔sprintf()函数将整数转换为字符串的形式,再利用outtextxy0函数将成绩输出。(9)playWin()输出胜利者结果根据分数值score1和score2的大小得出下棋的结果,输出赢者信息。2.2.5程序结果运行结果可参照结果运行图2.2.5-1,图,图,图,图:图2.2.5-1结果运行1图2.2.5-2结果运行2图2.2.5-3结果运行3图2.2.5-4结果运行4图2.2.5-5结果运行5程序源代码及注释#include""/*图形系统头文件*/#defineLEFT0x4b00/*光标左键值*/#defineRIGHT0x4d00/*光标右键值*/#defineDOWN0x5000/*光标下键值*/#defineUP0x4800/*光标上键值*/#defineESC0x011b/*ESC键值*/#defineENTER0x1c0d/*回车键值*/inta[8][8]={0},key,score1,score2;/*具体分数以及按键与存放棋子的变量*/charplayone[3],playtwo[3];/*两个人的得分转换成字符串输出*/voidplaytoplay(void);/*人人对战函数*/voidDrawQp(void);/*画棋盘函数*/voidSetPlayColor(intx);/*设置棋子第一次的颜色*/voidMoveColor(intx,inty);/*恢复原来棋盘状态*/intQpChange(intx,inty,intz);/*判断棋盘的变化*/voidDoScore(void);/*处理分数*/voidPrintScore(intn);/*输出成绩*/voidplayWin(void);/*输出胜利者信息*//******主函数*********/voidmain(void){intgd=DETECT,gr;initgraph(&gd,&gr,"c:\\tc");/*初始化图形系统*/DrawQp();/*画棋盘*/playtoplay();/*人人对战*/getch();closegraph();/*关闭图形系统*/}voidDrawQp()/*画棋盘*/{inti,j;score1=score2=0;/*棋手一开始得分都为0*/setbkcolor(BLUE);for(i=100;i<=420;i+=40){line(100,i,420,i);/*画水平线*/line(i,100,i,420);/*画垂直线*/}setcolor(0);/*取消圆周围的一圈东西*/setfillstyle(SOLID_FILL,15);/*白色实体填充模式*/fillellipse(500,200,15,15);/*在显示得分的位置画棋*/setfillstyle(SOLID_FILL,8);/*黑色实体填充模式*/fillellipse(500,300,15,15);a[3][3]=a[4][4]=1;/*初始两个黑棋*/a[3][4]=a[4][3]=2;/*初始两个白棋*/setfillstyle(SOLID_FILL,WHITE);fillellipse(120+3*40,120+3*40,15,15);fillellipse(120+4*40,120+4*40,15,15);setfillstyle(SOLID_FILL,8);fillellipse(120+3*40,120+4*40,15,15);fillellipse(120+4*40,120+3*40,15,15);score1=score2=2;/*有棋后改变分数*/DoScore();/*输出开始分数*/}voidplaytoplay()/*人人对战*/{intx,y,t=1,i,j,cc=0;while(1)/*换棋手走棋*/{x=120,y=80;/*每次棋子一开始出来的坐标,x为行坐标,y为列坐标*/while(1)/*具体一个棋手走棋的过程*/{PrintScore(1);/*输出棋手1的成绩*/PrintScore(2);/*输出棋手2的成绩*/SetPlayColor(t);/*t变量是用来判断棋手所执棋子的颜色*/fillellipse(x,y,15,15);key=bioskey(0);/*接收按键*/if(key==ESC)/*跳出游戏*/break;elseif(key==ENTER)/*如果按键确定就可以跳出循环*/if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置没有棋子*/ {if(t%2==1)/*如果是棋手1移动*/a[(x-120)/40][(y-120)/40]=1;else/*否则棋手2移动*/a[(x-120)/40][(y-120)/40]=2;if(!QpChange(x,y,t))/*落子后判断棋盘的变化*/{a[(x-120)/40][(y-120)/40]=0;/*恢复空格状态*/cc++;/*开始统计尝试次数*/if(cc>=64-score1-score2)/*如果尝试超则停步*/{MoveColor(x,y);fillellipse(x,y,15,15);break}elsecontinue;/*如果按键无效*/}DoScore();/*分数的改变*/break;/*棋盘变化了,则轮对方走棋*/else/*已经有棋子就继续按键*/continue;}else/*四个方向按键的判断*/if(key==LEFT&&x>120)/*左方向键*/MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x-=40;fillellipse(x,y,15,15);elseif(key==RIGHT&&x<400&&y>80)/*右方向键*/ {MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);x+=40;fillellipse(x,y,15,15); }elseif(key==UP&&y>120)/*上方向键*/ {MoveColor(x,y);fillellipse(x,y,15,15);SetPlayColor(t);y-=40;fillellipse(x,y,15,15); }elseif(key==DOWN&&y<400)/*下方向键*/ {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)/*格子已经占满或一方棋子为0判断胜负*/{playWin();/*输出最后结果*/break;}t=t%2+1;/*一方走后,改变棋子颜色即轮对方走*/cc=0;/*计数值恢复为0*/}/*endwhile*/}if(i>1&&j<6)/*右上*/{for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]&&k>=0&&kk<8){for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++) {a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15); }if(ii!=i-1)yes=1;}}if(i<6&&j>1)/*左下*/{for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k<8&&kk>=0){for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--) {a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15); }if(ii!=i+1)yes=1;}}if(i>1&&j>1)/*左上*/{for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&k>=0&&kk>=0){for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);{if(ii!=i-1)yes=1;}}if(i<6&&j<6)/*右下*/{for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)if(a[k][kk]==a[i][j]||!a[k][kk])break;if(a[k][kk]!=0&&kk<8&&k<8){for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++){a[ii][jj]=a[i][j];fillellipse(120+ii*40,120+jj*40,15,15);{if(ii!=i+1)yes=1;}}returnyes;/*返回是否改变过棋子颜色的标记*/}voidDoScore()/*处理分数*/{inti,j;score1=score2=0;/*重新开始计分数*/if(a[i][j]==1)/*分别统计两个人的分数*/ score1++;elseif(a[i][j]==2)score2++;}voidPrintScore(intplaynum)/*输出成绩*/{if(playnum==1)/*清除以前的成绩*/{setfillstyle(SOLID_FILL,BLUE);bar(550,100,640,400);}setcolor(RED);settextstyle(0,0,4);/*设置文本输出样式*/if(playnum==1)/*判断输出哪个棋手的分,在不同的位置输出*/{sprintf(playone,"%d",score1);outtextxy(550,200,playone);}else{sprintf(playtwo,"%d",score2);outtextxy(550,300,playtwo);}setcolor(0);}voidplayWin()/*输出最后的胜利者结果*/{settextstyle(0,0,4);setcolor(12);if(score2>score1)/*开始判断最后的结果*/outtextxy(100,50,"blackwin!");elseif(score2<score1)outtextxy(100,50,"whitewin!");elseouttextxy(60,50,"youallwin!");}第3章课程设计总结这次课设是老师给了范例程序,经过自己的修改,实现要求。先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误有意外的收获,感觉课设很有意思。.我首先分析了程序的功能及要求,划分程序功能模块。然后画出系统流程图并进行代码的编写。然后定义数据结构和各个功能子函数。最后进行程序的功能调试。完成系统总结报告以及使用说明书这个黑白棋游戏原程序的最大特点是采用了在主函数中调用子函数思想,每一种功能都是用子函数的办法来进行处理,简洁,清晰,方便,不容易出现错误。在输入错误时本来想用一种警告的铃声来提醒用户,由于所学的知识不多,自己的编程经验不足,按现有的知识水平有些东西暂时还无法解决,还有待于在以后的学习中不断提高和改进!在具体操作中对这学期所学的C语言的理论知识得到巩固,达到课设的基本目的,也发现自己的不足之处,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现课设的重要作用,特别是对数组和循

温馨提示

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

评论

0/150

提交评论