C语言课设下棋范本.docx
- 文档编号:29265860
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:21
- 大小:43.30KB
C语言课设下棋范本.docx
《C语言课设下棋范本.docx》由会员分享,可在线阅读,更多相关《C语言课设下棋范本.docx(21页珍藏版)》请在冰豆网上搜索。
C语言课设下棋范本
辽宁工业大学
C语言程序设计课程设计(论文)
题目:
黑白棋游戏
院(系):
软件学院
专业班级:
计算机信息管理000班
学号:
000000000
学生姓名:
000000
指导教师:
教师职称:
起止时间:
2009.12.14至2009.12.26
课程设计(报告)任务及评语
院(系):
软件学院教研室:
软件教研窒
学号
091403059
学生姓名
于秀影
专业班级
计算机信息管理092班
程序设计(报告)题目
黑白棋游戏
程序设计(报告)任务
程序设计的任务与要求:
(1)掌握C语言编程的基础知识。
(2)较熟练地编写C语言应用程序。
(3)了解C语言的常用标准函数、编程技巧、异常处理。
(5)联系已学过的内容,巩固所学的理论,增强独立工作能力。
(6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。
(7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。
课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。
正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
2009年12月31日
目录
第1章课程设计的目的与要求1
1.1课程设计目的1
1.2课程设计的实验环境1
1.3课程设计的预备知识1
1.4课程设计要求1
第2章课程设计内容2
2.1程序功能介绍2
2.2程序整体设计说明2
2.2.1设计思路2
2.2.2数据结构设计及用法说明2
2.2.3程序结构(流程图)3
2.2.4各模块的功能及程序说明3
2.2.5程序结果6
2.3程序源代码及注释8
第3章课程设计总结17
参考资料.18
第1章课程设计的目的与要求
1.1课程设计目的
本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:
1.巩固和加深学生对C语言课程的基本知识的理解和掌握
2.掌握C语言编程和程序调试的基本技能
3.利用C语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C语言解决实际问题的能力
1.2课程设计的实验环境
硬件要求能运行Windows2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3课程设计的预备知识
熟悉C语言及C语言开发工具。
1.4课程设计要求
1分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
第2章课程设计内容
2.1程序功能介绍
黑白棋游戏是一个深受人们喜爱的游戏,有人机对弈和人人对以两种情况,人与人对弈一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。
按键盘上的方向键可以上下左右移动棋子,按回车键可以摆放棋子。
2.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
图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-2,图2.2.5-3,图2.2.5-4,图2.2.5-5:
图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
2.3程序源代码及注释
#include"graphics.h"/*图形系统头文件*/
#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;
else
if(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
}
else
continue;/*如果按键无效*/
}
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);
else
if(key==RIGHT&&x<400&&y>80)/*右方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x+=40;
fillellipse(x,y,15,15);
}
else
if(key==UP&&y>120)/*上方向键*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y-=40;
fillellipse(x,y,15,15);
}
else
if(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 { 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 { 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++; else if(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! "); else if(score2 outtextxy(100,50,"whitewin! "); else outtextxy(60,50,"youallwin! "); } 第3章课程设计总结 这次实训是老师给了范例程序,经过自己的改写,实现要求。 先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。 .我首先分析了程序的功能要求,划分程序功能模块。 然后画出系统流程图并进行代码的编写。 然后定义数据结构和各个功能子函数。 最后程序的功能调试。 完成系统总结报告以及使用说明书 在具体操作中对这学期所学的C语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。 发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。 . 由于课程设计的时间较短,自身的知识水平有限,该系统的开发还有许多不尽如人意的地方,比如用户界面不够美观,出错处理不够完善等问题。 这些都有待进一步的改善。 但是,在这次课程设计中,我通过自己的努力以及老师和同学们的帮助,基本解决了所遇到的困难,按期完成了任务。 计时在此希望以后应多进行这样的实训,加长设间,培养学生独立思考问题的能力,提高实际操作水平。 参考资料 [1]蔡明志.数据结构: 使用C语言.北京.希望电脑公司C语言技术丛书.2005: 38-46 [2]吕凤翥.C语言程序设计习题解答与上机指导.北京: 清华大学出版社,2006: 65-70 [3]张贤德.常用C语言用法速查手册.科学出版社,龙门.龙门书局.2003: 105-111 [4]彭光泽.C语言入门.北京.电子科技大学出版社.2001: 34-40 [5]吴京.C语言基础教程.上海.科学出版社.2006: 75-83 [6]赵国玲,卫林.程语言基础C语言.北京.机械工业出版社.2003: 90-96 [7]龙昭华.语言程序设计.延边.延边出版社.1998: 72-77 [8]吕凤翥.C语言程序设计教师使用参考书.北京.清华大学出版社.2004: 88-94 [9]张先亮,梁大伟.精通C语言高级教程.深圳.海洋出版社.2004: 102-109 [10]孙玉芳,文强.C语言.北京.中国铁道出版社.2003: 121-127 [11]马秋菊.C语言程序设计道学靠道教.中国水利水电出版社.2006: 231-238 [12]赵欣胜,亢慧娟,刘晨宏.北京: 北京科学出版社。 2004: 115-121 [13]严桂兰.TurboC语言程序设计.北京: 电子工业出版社.1991: 99-107 [14]杨传杰.C语言实际应用.安徽科学技术.1994: 100-109 [15]彭光泽.应用: 北京.ANSIC.子科技大学出版社.2002: 66-73
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 下棋 范本