c五子棋课设说明书含完整源代码Word下载.docx

上传人:b****2 文档编号:4471455 上传时间:2023-05-03 格式:DOCX 页数:31 大小:358.58KB
下载 相关 举报
c五子棋课设说明书含完整源代码Word下载.docx_第1页
第1页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第2页
第2页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第3页
第3页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第4页
第4页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第5页
第5页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第6页
第6页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第7页
第7页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第8页
第8页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第9页
第9页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第10页
第10页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第11页
第11页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第12页
第12页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第13页
第13页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第14页
第14页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第15页
第15页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第16页
第16页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第17页
第17页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第18页
第18页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第19页
第19页 / 共31页
c五子棋课设说明书含完整源代码Word下载.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

c五子棋课设说明书含完整源代码Word下载.docx

《c五子棋课设说明书含完整源代码Word下载.docx》由会员分享,可在线阅读,更多相关《c五子棋课设说明书含完整源代码Word下载.docx(31页珍藏版)》请在冰点文库上搜索。

c五子棋课设说明书含完整源代码Word下载.docx

15,棋子放置于棋盘线交叉点上。

因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一个人的时候也能体验五子棋的乐趣。

因此我们设计了一款人机对战的五子棋游戏。

1.2设计目的

五子棋游戏不仅能增强人们的抽象思维能力、逻辑推理能力、空间想象力,提高人们的记忆力、心算能力等,而且深含哲理,有助于修身养性。

五子棋既有现代休闲方式所特有的特征“短、平、快”,又有中国古典哲学所包含的高深学问“阴阳易理”。

它既有简单易学的特点,为人民群众所喜闻乐见,又有深奥的技巧;

既能组织举办群众性的比赛、活动,又能组织举办高水平的国际性比赛;

它的棋文化源渊流长,具有东方的神秘和西方的直观,它是中西方文化的交融点,也是中西方文化交流的一个平台。

自从计算机作为游戏对战平台以来,各种棋类游戏如雨后春笋般纷纷冒出。

五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。

同时具有简单易学、既动手又动脑的特点。

同时也为锻炼自己的编程能力。

第2章需求分析

根据功能需求,将程序分为图形显示、玩家电脑走棋,胜负判断和电脑计分判断落子位置四个模块,以下分析各模块的需求。

图形显示模块:

在给vc++6.0增加了easyx后使用了#include<

graphics.h>

图形库头文件。

程序开始运行时,给出五子棋游戏名称界面;

游戏开始后要求生成15×

15的棋盘图像,给出窗口让玩家选择是否遵守游戏规则以及是否让电脑先落子,并在棋盘右方提示如何落子,游戏进行过程中,要求实时显示棋盘上已落下的棋子,玩家为白旗,电脑为黑棋;

分出胜负后,在棋盘上方显示“你赢了按任意键继续”“你输了按任意键继续”。

玩家控制模块:

程序开始时,需玩家确定遵守规则后,并且选择是否让电脑先落子,才能开始游戏;

游戏过程中,玩家通过鼠标点击棋盘选择落子;

游戏结束时,玩家按任意键开始新棋局,否则直接关掉程序窗口。

胜负判断模块:

实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,在棋盘上方显示玩家输赢语句。

电脑计分判断落子位置模块:

在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。

如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”。

如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”

第3章程序总体设计

3.1程序总体框图

3.2程序流程图

第4章程序详细设计

4.1各类头文件及自定义函数

#include<

//图形库头文件

#include<

conio.h>

//控制台输入输出,包含getch()函数

time.h>

//时间函数

stdlib.h>

//随机函数头文件

voidstart();

//开始界面

voidchessboard();

//布置棋盘

intscore(intm,intn,intk);

//打分函数

intjudge(intm,intn,intk);

//设置判断输赢自定义函数

4.2棋盘数组

inta[16][16];

//定义全局二维数组,作为虚拟棋盘,记录棋盘情况:

0代表空格1代表人下的棋2代表电脑下的棋。

4.3开始界面start()函数模块

initgraph()函数用于定义界面的宽度和长度,

loadimage()用于加载电脑相应位置的图片,使其作为背景图片铺满界面,setbkmode()用于界面文字的背景颜色,

settextcolor()用于定义文字的颜色,

settextstyle()用于定义文字的风格,

outtextxy()用于在指定坐标输出文字。

4.4棋盘界面chessboard()函数

Setbkcolor()函数用于定义背景颜色,

通过for()循环画15*15的棋盘界面,

画棋盘线条用lineh()函数,

4.5胜负判断judge()函数

定义int型函数judge(),通过判断横,竖,左斜,右斜有没有五子连成一线来决定输赢,并且返回一个int类型的值。

4.6得分判断score()函数

定义int类型的自定义函数score(),在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。

如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”。

通过这种方法实现了电脑下棋,也是人机五子棋的精髓所在。

4.7主函数main()

通过MOUSEMSGm;

定义鼠标,依次调用开始界面函数start(),棋盘界面函数chessboard(),通过调用HWNDwnd=GetHWnd();

设置了两个问题窗口:

“是否遵守游戏规则”“是否让电脑先落子”,使用if语句判断,如果玩家选择了确定则执行下一步,进入游戏界面并开始游戏,游戏过程中通过rand()函数让电脑在棋盘中部随机落子,并且使用setfillcolor(BLACK);

函数是电脑的棋子颜色为黑色,使用fillcircle(50*i,50*j,20);

函数画棋子为半径是20的圆。

同样的方法使玩家的棋子颜色为白色,半径为20的圆。

下去过程中通过m=GetMouseMsg();

获取鼠标信息,并且使用WN_LBUTTONDOWN表示获取的是鼠标左键的信息,即玩家通过鼠标左键来下棋。

在下棋过程中每一轮都重新调用得分函数判断最值,使电脑落子落在最值上,最后调用判断输赢judge()函数判断玩家的输赢,如果玩家赢了,则在棋盘界面上方显示“你赢啦按任意键继续”,如果玩家输了则显示“你输啦按任意键继续”。

第5章系统测试

5.1开始界面测试

设计计划:

使用一张五子棋图片作为背景,并在图片中间显示“五子棋游戏”,并且在下方提示玩家“按任意键开始游戏”。

测试结果:

如图5.1所示

图5.1

5.2棋盘界面测试

以黄色作为棋盘底色,在棋盘左边画15*15的棋盘界面,在界面的右侧显示五子棋游戏,并且在右上角显示游戏规则:

“在棋盘上单击鼠标左键开始游戏”,在界面的右下方显示制作团队。

并且在开始游戏首先弹出“是否遵守游戏规则的选择窗口”,玩家只有选择了确定才能进入游戏,玩家进入游戏后弹出是否让电脑先下的选择窗口,当玩家选择了确定时,电脑首先在棋盘落黑子,如果玩家选择了取消,则直接进入棋盘界面,由玩家选择地点落子。

如图5.2,5.3所示

图5.2

图5.3

5.3玩家输赢界面测试

测试计划:

如果玩家赢了,则在棋盘上方显示“你赢了按任意键继续”,如果玩家输了则在棋盘上方显示“你输了按任意键继续”。

如图5.4,5.5所示:

图5.4

图5.5

设计总结

通过对各子程序的设计与优化,本程序完成了人机对战五子棋软件的主体的设计与制作,基本达到了使用五子棋软件的核心要求。

最重要的是为了使界面更加的美观,找到了easyx,成功的在vc++6.0中使用了TC编译器才有的#include<

/图形库头文件。

而程序还有一些不足之处,首先,程序的电脑计分模块存在不够智能的问题。

其次,程序的界面过于简陋。

参考文献

[1]颜晖,柳俊.C语言程序设计实验与习题指导(第二版)[M].北京:

高等教育出版社,2012.3

[2]谭浩强,C语言程序设计[M].清华大学出版社,2010.6

[3]谭浩强,C程序设计题解与上机指导[M].清华大学出版社,2010.6

[4]何钦铭,颜晖.C语言程序设计(第2版)[M].北京:

[5]王连相.C/C++程序设计上机指导与测试(第二版)[M].中国铁道出版社,2011

[6]陈超.C语言函数手册[M].机械工业出版社,1999

[7]杨传杰.C语言的实际应用[M].安徽科学技术出版社,2000

致谢

感谢两周以来两位老师尤其是朱老师以及各位同学的的帮助,使得我能够顺利完成此次C语言课程设计任务,使得我对结构化的程序设计思想有了进一步的理解,对c语言程序设计有了更深的体会,最重要的是能培养好的代码风格,这对我来说受益匪浅。

附录(源代码)

//五子棋人机对战

//电脑方设计思路:

在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值

//如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”

//如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”

0代表空格1代表人下的棋2代表电脑下的棋

voidmain(){

srand((unsigned)time(NULL));

//随机种子

intscore_p[16][16],score_c[16][16];

intk,i,j,s,t,x=0,max,p;

MOUSEMSGm;

start();

//调用start函数,获取开始界面

for(;

;

){

k=1;

for(i=1;

i<

16;

i++){

for(j=1;

j<

j++)

a[i][j]=0;

}

chessboard();

//调用chessboard函数,获取棋盘界面

HWNDwnd=GetHWnd();

if(MessageBox(wnd,_T("

游戏规则:

点击鼠标落子。

是否遵守游戏规则?

"

),_T("

游戏提醒"

),MB_OKCANCEL|MB_ICONQUESTION)==IDOK){

//获取玩家选择,是否先下

HWNDwnd=GetHWnd();

//h是类型描述,表示句柄(handle),Wnd是变量对象描述,表示窗口,所以hWnd表示窗口句柄

/*MessageBox指的是显示一个模态对话框,其中包含一个系统图标、一组按钮和一个简短的特定于应用程序消息,

如状态或错误的信息。

消息框中返回一个整数值,该值指示用户单击了哪个按钮。

*/

if(MessageBox(wnd,_T("

您是否让电脑先下?

),MB_OKCANCEL|MB_ICONQUESTION)==IDOK){//mb_okcancel只有两个选择键,MB_ICONQUESTION表示问题图标,IDOK表示结果的ID是OK执行程序

/*rand()函数rand()%20表示随机产生0-19的数,rand()%20+1表示随机产生1-20的数*/

i=rand()%6+6;

//在6-11之间,找一个随机数作为电脑下棋的X坐标

j=rand()%6+6;

//在6-11之间,找一个随机数作为电脑下棋的Y坐标

a[i][j]=2;

setfillcolor(BLACK);

//棋子的颜色为黑色

fillcircle(50*i,50*j,20);

//棋子为半径是20的圆

}

for(;

for(;

p!

=1;

//玩家下棋,获取鼠标信息

m=GetMouseMsg();

//获取鼠标

switch(m.uMsg){

caseWM_LBUTTONDOWN:

{//WN_LBUTTONDOWN表示鼠标左键按下消息

for(i=50;

=750;

i=i+50){

for(j=50;

j=j+50){

//判断是否能下,且下好位置

if(m.x<

i+10&

&

m.x>

i-10&

m.y<

j+10&

m.y>

j-10&

a[i/50][j/50]==0){

setfillcolor(WHITE);

//玩家的棋子颜色为白色

fillcircle(i,j,20);

p=1;

break;

}

}

if(p==1){

break;

}

}

}

}

p=0;

a[i/50][j/50]=1;

x=judge(i/50,j/50,k);

//调用自定义函数判断输赢

if(x>

4){

settextcolor(CYAN);

settextstyle(30,0,_T("

方正舒体"

));

outtextxy(200,0,"

---你赢啦按任意键继续---"

);

getch();

break;

k=-k;

//初始化分数score_c[i][j]:

电脑分数score_p[i][j]:

玩家分数

for(i=1;

for(j=1;

j++){

score_c[i][j]=0;

score_p[i][j]=0;

if(a[i][j]==0){

a[i][j]=1;

x=score(i,j,1);

score_p[i][j]+=x;

//记录如果玩家下在此处,得到多少分

a[i][j]=2;

x=score(i,j,-1);

score_c[i][j]+=x;

//记录如果电脑下在此处,得到多少分

a[i][j]=0;

//找到能下棋的空位置中,假设电脑和人下在此处,得到分数中最大值

for(s=t=i=1,max=score_c[1][1];

if(score_c[i][j]>

max){

max=score_c[i][j];

s=i;

t=j;

if(score_p[i][j]>

max=score_p[i][j];

a[s][t]=2;

//在最高分处落棋

fillcircle(s*50,t*50,20);

x=judge(s,t,k);

outtextxy(200,0,"

---你输啦按任意键继续---"

}

}

}

/*开始界面函数*/

voidstart(){

initgraph(900,800);

setbkcolor(GREEN);

//cleardevice();

//这个函数用于清除屏幕内容。

具体的,是用当前背景色清空屏幕,并将当前点移至(0,0)。

//IMAGEbackgroundimg,img2;

//loadimage(&

img2,_T("

C:

\\wuziqi.jpg"

//backgroundimg=img2;

//intwidth=backgroundimg.getwidth();

//intheight=backgroundimg.getheight();

//获取长和宽

//initgraph(width,height);

//根据背景图片的长和宽初始化窗口,使之铺满窗

//BeginBatchDraw();

//putimage(0,0,&

backgroundimg);

//在窗口上绘制背景图片

//EndBatchDraw();

setbkmode(TRANSPARENT);

//文字背景透明

settextcolor(WHITE);

settextstyle(120,0,_T("

宋体"

outtextxy(150,200,"

人机五子棋游戏"

settextcolor(RED);

settextstyle(20,0,_T("

outtextxy(400,400,"

---按任意键开始游戏---"

getch();

/*棋盘函数*/

voidchessboard(){

initgraph(900,780);

setbkcolor(YELLOW);

cleardevice();

for(inti=50;

i+=50){

setlinecolor(BLACK);

line(50,i,750,i);

line(i,50,i,750);

settextcolor(GREEN);

settextstyle(30,0,_T("

楷体"

outtextxy(770,80,"

outtextxy(770,130,"

在棋盘上"

outtextxy(770,170,"

单击鼠标左键"

settextstyle(100,0,_T("

outtextxy(770,200,"

五"

outtextxy(770,320,"

子"

outtextxy(770,440,"

棋"

outtextxy(770,700,"

制作团队:

settextstyle(25,0,_T("

outtextxy(760,750,"

--周,贾,张"

/*判断输赢函数*/

intjudge(intm,intn,intk){

ints,i,j,p=0,q=0,x=0,shu,heng,zuoxie,youxie;

if(k==1)

s=1;

else

s=2;

for(i=m;

m+5,i<

if(a[i][n]!

=s)

break;

else

p++;

for(i=m-1;

i>

m-5,i>

0;

i--){

q++;

heng=p+q;

for(j=n,p=0;

n+5,j<

if(a[m][j]!

for(j=n-1,q=0;

j>

n-5,j>

j--){

shu=p+q;

for(i=m,j=n,p=0;

16,i<

m+5,j<

i++,j++){

if(a[i][j]!

for(i=m-1,j=n-1,q=0;

0,i>

m-5,j>

i--,j--){

zuoxie=p+q;

m-5,j<

i--,j++){

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2