C语言知识图形五子棋课程规划设计报告.doc

上传人:一*** 文档编号:2738650 上传时间:2020-05-02 格式:DOC 页数:63 大小:374.66KB
返回 下载 相关 举报
C语言知识图形五子棋课程规划设计报告.doc_第1页
第1页 / 共63页
C语言知识图形五子棋课程规划设计报告.doc_第2页
第2页 / 共63页
点击查看更多>>
资源描述

《C语言知识图形五子棋课程规划设计报告.doc》由会员分享,可在线阅读,更多相关《C语言知识图形五子棋课程规划设计报告.doc(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、/C语言课程设计报告五子棋院系:软件学院专业:软件工程班级:102032学号:10203230指导老师:王星摘 要五子棋是一种两人对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现二人对弈五子棋功能。二人对弈五子棋程序由图像生成、光标移动与落子、判断胜负和系统帮助等子程序构成;程序中应用了结构体、数组、全局变量、按键处理和图形编程等元素和语句。程序通过棋盘和棋子图像生成、二人移子与落子和判断胜负等功能的实现,在计算机上实现了二人五子棋对弈。Abstract Gobang is a traditional checker-type game in which the lining up

2、 of five pieces in a straight line scores victory. And C language can accomplish a 2-player gobang on computers. This 2-player gobang program contains 4 main sections, they are, graphics, movement and selection, victory judgment and helping system. Several elements and sentences of C programming lan

3、guage such as structural element, array, global variables, press processing and Graphics Programming are also applied in the program. With the accomplishment of the three main subprograms, namely, checker board and pieces construction, players step-selection and victory judgment, a whole program of

4、gobang is established and gobang is available on computers.目 录一、需求分析4二、概要设计6三、详细设计9四、调试分析23五、用户手册24六、测试数据25七、附录26第1章:需求分析1.1五子棋背景传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为1515,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。1.2 程序设计本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游

5、戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光标,摆放棋子。1.2.1 程序需求分析根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四个模块,以下分析各模块的需求。图形显示模块:程序开始运行时,给出欢迎及帮助界面;游戏开始后要求生成1919的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下的棋子;分出胜负后,要求给出游戏结束画面。玩家控制模块:程序开始时,需玩家确定而后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏结束时,有玩家选择是否开始

6、新棋局。胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,弹出该色玩家胜出界面。玩家计分模块:一方玩家再胜利后通过对文件的操作进行计分,并输出于计分板上。1.2.2程序流程设计根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。图1第2章:概要设计2.1.1 各类头文件,变量及宏定义#includestdio.h#include Conio.h#include graphics.h#include #include#define closegr closegraph/*定义1号玩家的操作键键码*/#define W 0x1

7、177/*上移-W*/#define S 0x1f73/*下移-S*/#define A 0x1e61/*左移-A*/#define D 0x2064/*右移-D*/#define SP 0x3920/*落子-空格键*/*定义2号玩家的操作键键码*/ #define UP 0x4800/*上移-方向键up*/#define DOWN 0x5000/*下移-方向键down*/#define LEFT 0x4b00/*左移-方向键left*/#define RIGHT 0x4d00/*右移-方向键right*/#define ENTER 0x1c0d/*落子-回车键Enter*/#define E

8、SC 0x011b/*退出*/#define Y 0x1579/*YES*/#define N 0x316e/*NO*/#define BACK 0xe08 /*悔棋*/#define DEL 0x5300 /*删除比分*/2.1.2 全局变量int ch,dh,del;/*文件操作计分变量*/int k,i,j,n,t;/*控制变量*/int a2020;/*棋盘数组*/2.2 图形模块棋盘的显示由游戏开始与结束部分控制,棋子以及棋子定位框的显示与保留由玩家操控部分决定,本章只列写棋盘与棋子的显示程序。图形模块主要由以下函数组成:initgr();/*图形界面初始化函数*/Welcome()

9、;/*欢迎界面*/Help();/*帮助界面*/board();/*画棋盘*/white();/*画白棋子*/black();/*画黑棋子*/bye();/*结束界面*/green();/*连珠时着色相应棋子*/show();drawmat();/*显示中文的点阵图函数,以及产生动态变色效果*/border();/*棋子定位框函数*/delborder();/*删除当前位置棋子定位框函数*/p1turn();/*轮到1p时在左边边框画出白棋以及输出white turn以提示1p进行操作*/p2turn();/*轮到2p时在右边边框画出黑棋以及输出black turn以提示2p进行操作*/p1d

10、el();/*轮到2p时去除p1turn();函数的效果*/p2del();/*轮到1p时去除p2turn();函数的效果*/2.3 玩家操作模块棋子的移动与落子有键盘上按键控制,本程序选取1P按键为W、S、A、D和空格键,2P按键为、和回车键,分别代表上移、下移、左移、右移光标和落子。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。1P、2P的落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。玩家操作模块主要由以下函数构成:P1move();/*玩家1移动函数*/P2move();/*玩家2移动函数*/Back();/*悔

11、棋函数*/2.4 胜负判断模块胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。以下简析本程序流程:,由获胜条件可以知,通过判断上、下、左、右、斜上、斜下八个方向上是否有连续的5个子即可得出是否获胜结果。在游戏开始时,将棋盘初始化,即将棋盘抽象为一个19*19的数组,数组中每个元素数值设为6。1P落子时,将数组内相应坐标处元素赋值为0;2P落子时,将数组内相应坐标处元素赋值为1。通过循环扫描棋盘数组

12、,如果 上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于5时,1P获胜;当上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于0时,2P获胜。胜负判断模块主要由以下几个函数构成:Win();/*主要函数,判断胜负*/P1win();/*p1胜利时调用,用于告知p1玩家胜利及询问是否继续*/P1win();/*p2胜利时调用,用于告知p2玩家胜利及询问是否继续*/restart();/*询问是否重新开始新的一局比赛的函数*/initialization();/*初始化棋盘对应数组所有值为6*/2.5玩家计分模块为了能使1p和2p更直观更便捷地看到双

13、方对战的比分,所以做了此计分模块,因为分数不能因为重新调用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计分文件写

14、入*/ p2_point_output();/*2p计分文件输出*/delscore1() ; /*删除当前1p分数*/delscore2(); /*删除当前2p分数*/2.6 各模块之间调用关系如下第3章:详细设计3.1 图形模块initgr() /* BGI初始化 */ int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */ registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */ initgraph(&gd, &gm, ); welcome() /*欢迎界面*/

15、 initgr() ;/*初始化*/clearviewport();/*清屏*/ setcolor(2); /*设置颜色*/ settextstyle(0,0,6); /*样式*/ outtextxy(180,180,Welcome);/*位置以及内容*/ settextstyle(0,0,2); /*文本样式*/ outtextxy(240,420,press any key to continue);/*位置以及内容*/ getch();/*press any key to continue*/ help() /*帮助界面,基本操作同welcome();函数*/ initgr(); cle

16、arviewport(); setcolor(2); settextstyle(0,0,2); outtextxy(60,100,P1 move; W S A D ); outtextxy(60,120, set : space ); outtextxy(60,180,P2 move: up down left right ); outtextxy(60,200, set: Enter); outtextxy(60,240,You can press Backspace to pull back!) ; outtextxy(60,280,When you want to quit the ga

17、me,); outtextxy(60,300,press Esc.); outtextxy(220,440,press any key to continue); getch(); bye() /*say bye!,实现功能同上*/ initgr(); clearviewport(); setcolor(4) ; settextstyle(0,0,6); outtextxy(130,180,Thank you!); settextstyle(0,0,2); outtextxy(240,420,press any key to quit); getch(); board()/*画棋盘*/ set

18、color(14); /*线色*/ setfillstyle(1,6); /*样式*/ bar(120,50,520,450); /*棋盘底*/ for(k=0;k21 ;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);

19、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)

20、;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,white turn); p2turn() /*右边边框内黑色棋子*/s

21、etcolor(0);setfillstyle(1,0);circle(580,250,9);floodfill(580,250,0);settextstyle(3,0,4);outtextxy(540,280,black turn); p1del()/*不是1turn时候抹去左边边框内棋子*/ setfillstyle(1,9) ;floodfill(60,250,9);setcolor(9);settextstyle(3,0,4);outtextxy(20,280,white turn);p2del()/*不是2turn时候抹去右边边框内棋子*/setfillstyle(1,9);floo

22、dfill(580,250,9) ;setcolor(9);settextstyle(3,0,4);outtextxy(540,280,black turn);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);

23、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()

24、-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,int matsize,int x,in

25、t y,int color)/*点阵图所用标准输出方式*/ int i,j,k,m; m=(matsize-1)/8+1; for(j=0;jmatsize;j+) for(i=0;im;i+) for(k=0;kk) putpixel(x+i*8+k,y+j,color);show() /*动态点阵图中文闪烁效果*/ for(n=0;n3;n+) delay(10000); drawmat(wu32K,32,240,0,3);/*输出点阵图的“五”字*/ delay(10000); drawmat(zi32K,32,290,0,3); delay(10000); drawmat(qi32K,

26、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函数对键盘操作*/ case W: /*上移*/ if(gety()90)所有if语句作用在于如果落子即将溢出边框,让其改变位置到另一端,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置 delborde

27、r();moveto(getx(),430); delborder();moverel(0,-20);border();p1move(); case A: /*左移*/ if(getx()410) delborder();moveto(getx(),70); delborder();moverel(0,20);border();p1move(); case D: /*右移*/ if(getx()480) delborder();moveto(140,gety(); delborder();moverel(20,0);border();p1move(); case SP: /*落子*/ if(a

28、getx()gety()!=6)/*判定如果棋盘此处无子才能下,否则重新调用p1move函数*/ p1move();delborder(); /*去除定位框*/white();/*画棋子*/agetx()gety()=1;/*将所在位置对应的数组点赋值为1*/win(); /*判断胜负*/border(); /*在新的位置画出定位框*/对左右两边提示框操作,提示轮到2p进行操作,并调用p2move()函数p1del();p2turn();p2move(); case ESC: / *结束游戏*/ bye();closegraph(); exit(0); case BACK : /*悔棋操作*/

29、 back();p1del();p2turn();p2move(); default: p1move(); P2move(); 函数与p1move();函数基本作用相同p2move() /*玩家2操作*/switch(bioskey(0) case UP: if(gety()90) delborder();moveto(getx(),430); delborder();moverel(0,-20);border();p2move(); case LEFT: if(getx()410) delborder();moveto(getx(),70);delborder();moverel(0,20)

30、;border();p2move(); case RIGHT: if(getx()480) delborder();moveto(140,gety();delborder();moverel(20,0);border();p2move(); case ENTER: if(agetx()gety()!=6) p2move();delborder();black();agetx()gety()=0;win();border();p2del();p1turn();p1move(); default: p2move(); case ESC: bye();closegraph(); exit(0); c

31、ase BACK : back();p2del();p1turn();p1move(); back()/*悔棋功能*/setcolor(6);setfillstyle(1,6);circle(getx(),gety(),9);floodfill(getx(),gety(),6); /*通过将现有棋子覆盖与棋盘底色相同的颜色来实现*/setcolor(14) ;line(getx()-9,gety(),getx()+9,gety() ;因为覆盖棋盘颜色后对应的棋谱线条颜色被覆盖,所以通过画线函数补回被覆盖负分的线色line(getx(),gety()-9,getx(),gety()+9) ; 3

32、.3胜负判断模块win()/*胜负判断主程序*/ for(i=120;i540;i=i+20) for(j=50;j470;j=j+20)/*通过循环扫描整个棋盘判定胜负*/ if(aij+ai+20j+ai+40j+ai+60j+ai+80j=5)|(aij+aij+20+aij+40+aij+60+aij+80=5)| (aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=5)|(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=5)/*如果棋盘上任何位置数组对应的值之和为5,则白方5子连珠*/ if(aij+ai+

33、20j+ai+40j+ai+60j+ai+80j=5)如果五子连珠,扫描是哪一个方向有连珠,并将连珠的5个字进行动态着色,以便玩家双方识别。 moveto(i,j); green();delay(10000);moveto(i+20,j);green(); delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); else if(aij+aij+20+aij+40+aij+60+aij+80=5) moveto

34、(i,j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+80);green();delay(10000); else if(aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=5) moveto(i,j); green();delay(10000);moveto(i+20,j+20);green(); delay(1000

35、0);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); else if(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=5) moveto(i,j+80); green();delay(10000);moveto(i+20,j+60);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i

36、+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000); delscore1();p1_point_input2();p1_point_output() ; p1win(); 此处判定如果棋盘上任何位置数组对应的值之和为0,则黑方5子连珠 if(aij+ai+20j+ai+40j+ai+60j+ai+80j=0)|(aij+aij+20+aij+40+aij+60+aij+80=0)| (aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=0)|(aij+80+ai+20j+60+

37、ai+40j+40+ai+60j+20+ai+80j=0) if(aij+ai+20j+ai+40j+ai+60j+ai+80j=0) moveto(i,j); green();delay(10000);moveto(i+20,j);green(); delay(10000);moveto(i+40,j);green();delay(10000);moveto(i+60,j);green();delay(10000);moveto(i+80,j);green();delay(10000); else if(aij+aij+20+aij+40+aij+60+aij+80=0) moveto(i,

38、j); green();delay(10000);moveto(i,j+20);green(); delay(10000);moveto(i,j+40);green();delay(10000);moveto(i,j+60);green();delay(10000);moveto(i,j+80);green();delay(10000); else if(aij+ai+20j+20+ai+40j+40+ai+60j+60+ai+80j+80=0) moveto(i,j); green();delay(10000);moveto(i+20,j+20);green(); delay(10000);

39、moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+60);green();delay(10000);moveto(i+80,j+80);green();delay(10000); 此处依旧是五子连珠后的着色模块。 else if(aij+80+ai+20j+60+ai+40j+40+ai+60j+20+ai+80j=0) moveto(i,j+80); green();delay(10000);moveto(i+20,j+60);green(); delay(10000);moveto(i+40,j+40);green();delay(10000);moveto(i+60,j+20);green();delay(10000);moveto(i+80,j);green();delay(10000);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁