c语言五子棋课程设计.docx
- 文档编号:8808985
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:31
- 大小:352.53KB
c语言五子棋课程设计.docx
《c语言五子棋课程设计.docx》由会员分享,可在线阅读,更多相关《c语言五子棋课程设计.docx(31页珍藏版)》请在冰点文库上搜索。
c语言五子棋课程设计
课程设计任务书
题目:
C语言程序设计:
五子棋
年月日
课程设计任务书及成绩评定
课程设计的任务和具体要求
1.目的:
1)复习、巩固C语言的基础知识,进一步加深对C语言的理解和掌握;
2)课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。
提高学生适应实际,实践编程的能力;
3)培养学生在项目开发中团队合作精神、创新意识及能力。
2.要求:
1)、对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;
2)、系统设计要实用,编程简练,可用,功能全面
3)、说明书、流程图要清楚
4)、记录设计情况(备查,也为编写设计说明书作好准备);
5)、要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格式。
指导教师签字:
日期:
指导教师评语
成绩:
指导教师签字:
日期:
课程设计所需软件、硬件等
软件:
MicrosoftVisualC++6.0
操作系统:
WINxp
Rom:
256
Cpu:
1.6Ghz
课程设计进度计划
起至日期
工作内容
备注
5月25日
5月26日
5月27日
进行程序设计需求分析
分析程序代码
撰写课程设计任务书
参考文献、资料索引
序号
文献、资料名称
编著者
出版单位
[1]贾宗璞、许合利,C语言程序设计,江苏:
中国矿业大学出版社,2007.6
[2]谭浩强,C程序设计(第二版),北京:
清华大学出版社,2001.1
[3]
摘要
五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。
二人对弈五子棋程序由图像生成、光标移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。
程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对弈。
第1章:
需求分析
1.1五子棋背景
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
1.2程序设计
本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。
程序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光标,摆放棋子。
1.2.1程序需求分析
根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四个模块,以下分析各模块的需求。
图形显示模块:
程序开始运行时,给出欢迎及帮助界面;游戏开始后要求生成19×19的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下的棋子;分出胜负后,要求给出游戏结束画面。
玩家控制模块:
程序开始时,需玩家确定而后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏结束时,有玩家选择是否开始新棋局。
胜负判断模块:
实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,弹出该色玩家胜出界面。
玩家计分模块:
一方玩家再胜利后通过对文件的操作进行计分,并输出于计分板上。
1.2.2程序流程设计
根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。
图1
第2章:
概要设计
2.1.1各类头文件,变量及宏定义
#include"stdio.h"
#include"Conio.h"
#include"graphics.h"
#include
#include
#defineclosegrclosegraph
/*定义1号玩家的操作键键码*/
#defineW0x1177/*上移--'W'*/
#defineS0x1f73/*下移--'S'*/
#defineA0x1e61/*左移--'A'*/
#defineD0x2064/*右移--'D'*/
#defineSP0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#defineUP0x4800/*上移--方向键up*/
#defineDOWN0x5000/*下移--方向键down*/
#defineLEFT0x4b00/*左移--方向键left*/
#defineRIGHT0x4d00/*右移--方向键right*/
#defineENTER0x1c0d/*落子--回车键Enter*/
#defineESC0x011b/*退出*/
#defineY0x1579/*YES*/
#defineN0x316e/*NO*/
#defineBACK0xe08/*悔棋*/
#defineDEL0x5300/*删除比分*/
2.1.2全局变量
intch,dh,del;/*文件操作计分变量*/
intk,i,j,n,t;/*控制变量*/
inta[20][20];/*棋盘数组*/
2.2图形模块
棋盘的显示由游戏开始与结束部分控制,棋子以及棋子定位框的显示与保留由玩家操控部分决定,本章只列写棋盘与棋子的显示程序。
图形模块主要由以下函数组成:
initgr();/*图形界面初始化函数*/
Welcome();/*欢迎界面*/
Help();/*帮助界面*/
board();/*画棋盘*/
white();/*画白棋子*/
black();/*画黑棋子*/
bye();/*结束界面*/
green();/*连珠时着色相应棋子*/
show();drawmat();/*显示中文的点阵图函数,以及产生动态变色效果*/
border();/*棋子定位框函数*/
delborder();/*删除当前位置棋子定位框函数*/
p1turn();/*轮到1p时在左边边框画出白棋以及输出whiteturn以提示1p进行操作*/
p2turn();/*轮到2p时在右边边框画出黑棋以及输出blackturn以提示2p进行操作*/
p1del();/*轮到2p时去除p1turn();函数的效果*/
p2del();/*轮到1p时去除p2turn();函数的效果*/
2.3玩家操作模块
棋子的移动与落子有键盘上按键控制,本程序选取1P按键为W、S、A、D和空格键,2P按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。
在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
1P、2P的落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。
玩家操作模块主要由以下函数构成:
P1move();/*玩家1移动函数*/
P2move();/*玩家2移动函数*/
Back();/*悔棋函数*/
2.4胜负判断模块
胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。
以下简析本程序流程:
由获胜条件可以知,通过判断上、下、左、右、斜上、斜下八个方向上是否有连续的5个子即可得出是否获胜结果。
在游戏开始时,将棋盘初始化,即将棋盘抽象为一个19*19的数组,数组中每个元素数值设为6。
1P落子时,将数组内相应坐标处元素赋值为0;2P落子时,将数组内相应坐标处元素赋值为1。
通过循环扫描棋盘数组,如果上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于5时,1P获胜;当上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于0时,2P获胜。
胜负判断模块主要由以下几个函数构成:
Win();/*主要函数,判断胜负*/
P1win();/*p1胜利时调用,用于告知p1玩家胜利及询问是否继续*/
P1win();/*p2胜利时调用,用于告知p2玩家胜利及询问是否继续*/
restart();/*询问是否重新开始新的一局比赛的函数*/
initialization();/*初始化棋盘对应数组所有值为6*/
2.5玩家计分模块
为了能使1p和2p更直观更便捷地看到双方对战的比分,所以做了此计分模块,因为分数不能因为重新调用main()函数就丢失了,所以采用对文件的操作,通过文件来记录双方的比分,这里对score1.txt和score2.txt文件进行操作,用来计1p和2p的分数。
玩家计分模块主要由以下几个函数构成:
Point();/*整合所有文件操作的模块*/
p1_point_input();/*1p计分文件读取*/
p1_point_input2();/*1p计分文件写入*/
p1_point_output();/*1p计分文件输出*/
p2_point_input();/*2p计分文件读取*/
p2_point_input2();/*2p计分文件写入*/
p2_point_output();/*2p计分文件输出*/
delscore1();/*删除当前1p分数*/
delscore2();/*删除当前2p分数*/
2.6各模块之间调用关系如下
第3章:
详细设计
3.1图形模块
initgr()/*BGI初始化*/
{
intgd=DETECT,gm=0;/*和gd=VGA,gm=VGAHI是同样效果*/
registerbgidriver(EGAVGA_driver);/*注册BGI驱动后可以不需要.BGI文件的支持运行*/
initgraph(&gd,&gm,"");
}
welcome()/*欢迎界面*/
{initgr();/*初始化*/
clearviewport();/*清屏*/
setcolor
(2);/*设置颜色*/
settextstyle(0,0,6);/*样式*/
outtextxy(180,180,"Welcome");/*位置以及内容*/
settextstyle(0,0,2);/*文本样式*/
outtextxy(240,420,"pressanykeytocontinue");/*位置以及内容*/
getch();/*pressanykeytocontinue*/
}
help()/*帮助界面,基本操作同welcome();函数*/
{
initgr();
clearviewport();
setcolor
(2);
settextstyle(0,0,2);
outtextxy(60,100,"P1move;WSAD");
outtextxy(60,120,"set:
space");
outtextxy(60,180,"P2move:
updownleftright");
outtextxy(60,200,"set:
Enter");
outtextxy(60,240,"YoucanpressBackspacetopullback!
");
outtextxy(60,280,"Whenyouwanttoquitthegame,");
outtextxy(60,300,"pressEsc.");
outtextxy(220,440,"pressanykeytocontinue");
getch();
}
bye()/*saybye~@!
实现功能同上*/
{
initgr();
clearviewport();
setcolor(4);
settextstyle(0,0,6);
outtextxy(130,180,"Thankyou!
");
settextstyle(0,0,2);
outtextxy(240,420,"pressanykeytoquit");
getch();
}
board()/*画棋盘*/
{
setcolor(14);/*线色*/
setfillstyle(1,6);/*样式*/
bar(120,50,520,450);/*棋盘底*/
for(k=0;k<21;k++)
{
line(120+20*k,50,120+20*k,450);/*竖线*/
line(120,50+20*k,520,50+20*k);/*横线*/
}
setfillstyle(1,9);
bar(540,200,620,300);/*1p2p两边框*/
bar(20,200,100,300);
setcolor
(2);
settextstyle(3,0,4);
outtextxy(50,210,"1p");
outtextxy(570,210,"2p");
delay(50000);
show();/*显示动态变色效果的标题*/
moveto(320,250);/*初始化中心位置*/
border();/*画定位框*/
p1turn();/*p1开始落子,游戏开始*/
}
white()/*画白棋*/
{
setcolor(15);
setfillstyle(1,15);
circle(getx(),gety(),9);
floodfill(getx(),gety(),15);
}
black()/*画黑棋*/
{
setcolor(0);
setfillstyle(1,0);
circle(getx(),gety(),9);
floodfill(getx(),gety(),0);
}
green()/*用粉色着色连珠时的棋子*/
{
setcolor(13);
setfillstyle(1,13);
circle(getx(),gety(),9);
floodfill(getx(),gety(),13);
}
p1turn()/*画左边边框内白棋子*/
{
setcolor(15);
setfillstyle(1,15);
circle(60,250,9);
floodfill(60,250,15);
settextstyle(3,0,4);
outtextxy(20,280,"whiteturn");
}
p2turn()/*右边边框内黑色棋子*/
{
setcolor(0);
setfillstyle(1,0);
circle(580,250,9);
floodfill(580,250,0);
settextstyle(3,0,4);
outtextxy(540,280,"blackturn");
}
p1del()/*不是1turn时候抹去左边边框内棋子*/
{setfillstyle(1,9);
floodfill(60,250,9);
setcolor(9);
settextstyle(3,0,4);
outtextxy(20,280,"whiteturn");
}
p2del()/*不是2turn时候抹去右边边框内棋子*/
{
setfillstyle(1,9);
floodfill(580,250,9);
setcolor(9);
settextstyle(3,0,4);
outtextxy(540,280,"blackturn");
}
border()/*画定位框*/
{
setcolor(14);
line(getx()-8,gety()-9,getx()-3,gety()-9);/*通过画线函数画出定位框*/
line(getx()+8,gety()-9,getx()+3,gety()-9);
line(getx()-8,gety()-9,getx()-8,gety()-4);
line(getx()+8,gety()-9,getx()+8,gety()-4);
line(getx()-8,gety()+9,getx()-3,gety()+9);
line(getx()+8,gety()+9,getx()+3,gety()+9);
line(getx()-8,gety()+9,getx()-8,gety()+4);
line(getx()+8,gety()+9,getx()+8,gety()+4);
}
delborder()/*除去定位框*/
{
setcolor(6);/*本质在于颜色覆盖*/
line(getx()-8,gety()-9,getx()-3,gety()-9);line(getx()+8,gety()-9,getx()+3,gety()-9);
line(getx()-8,gety()-9,getx()-8,gety()-4);
line(getx()+8,gety()-9,getx()+8,gety()-4);
line(getx()-8,gety()+9,getx()-3,gety()+9);
line(getx()+8,gety()+9,getx()+3,gety()+9);
line(getx()-8,gety()+9,getx()-8,gety()+4);
line(getx()+8,gety()+9,getx()+8,gety()+4);
}
drawmat(char*mat,intmatsize,intx,inty,intcolor)/*点阵图所用标准输出方式*/
{
inti,j,k,m;
m=(matsize-1)/8+1;
for(j=0;j for(i=0;i for(k=0;k<8;k++) if(mat[j*m+i]&(0x80>>k)) putpixel(x+i*8+k,y+j,color); } show()/*动态点阵图中文闪烁效果*/ { for(n=0;n<3;n++) {delay(10000); drawmat(wu32K,32,240,0,3);/*输出点阵图的“五”字*/ delay(10000); drawmat(zi32K,32,290,0,3); delay(10000); drawmat(qi32K,32,340,0,3); delay(10000); drawmat(wu32K,32,240,0,2); delay(10000); drawmat(zi32K,32,290,0,2); delay(10000); drawmat(qi32K,32,340,0,2); } 3.2玩家操作模块 p1move()/*玩家1操作*/ { switch(bioskey(0))/*bioskey函数对键盘操作*/ { caseW: /*上移*/ 所有if语句作用在于如果落子即将溢出边框,让其改变位置到另一端,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置 {if(gety()<90) {delborder();moveto(getx(),430);} delborder();moverel(0,-20);border();p1move();} caseA: /*左移*/ {if(getx()<160) {delborder();moveto(500,gety());} delborder();moverel(-20,0);border();p1move();} caseS: /*下移*/ {if(gety()>410) {delborder();moveto(getx(),70);} delborder();moverel(0,20);border();p1move();} caseD: /*右移*/ {if(getx()>480) {delborder();moveto(140,gety());} delborder();moverel(20,0);border();p1move();} caseSP: /*落子*/ {if(a[getx()][gety()]! =6) /*判定如果棋盘此处无子才能下,否则重新调用p1move函数*/ {p1move();} delborder();/*去除定位框*/ white();/*画棋子*/ a[getx()][gety()]=1;/*将所在位置对应的数组点赋值为1*/ win();/*判断胜负*/ border();/*在新的位置画出定位框*/ 对左右两边提示框操作,提示轮到2p进行操作,并调用p2move()函数 p1del(); p2turn(); p2move();} caseESC: /*结束游戏*/ {bye();closegraph();exit(0);} caseBACK: /*悔棋操作*/ {back();p1del();p2turn();p2move();} default: p1move(); } } p2move()/*玩家2操作*/ { switch(bioskey(0)) { caseUP: {if(gety()<90) {delborder();moveto(getx(),430);} delborder();moverel(0,-20);border();p2move();} caseLEFT: {if(getx()<160) {delborder();moveto(500,gety());}delborder();moverel(-20,0);border();p2move();} caseDOWN: {if(gety()>410) {delborder();moveto(getx(),70);}delborder();moverel(0,20);border();p2move();} caseRIGHT: {if(getx()>480) {delborder();moveto(140,gety());}delborder();moverel(20,0);border();p2move();} caseENTER: {if(a[getx()][gety()]! =6) {p2move()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 五子棋 课程设计