五子棋毕业课程设计报告Word文档下载推荐.docx
- 文档编号:19450533
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:22
- 大小:28.57KB
五子棋毕业课程设计报告Word文档下载推荐.docx
《五子棋毕业课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《五子棋毕业课程设计报告Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
第1章选题的意义
1.1意义
通过游戏过程增加编程的兴趣,提高编程水平。
编制该程序我对以下的知识点进行的巩固和掌握:
1.数组元素为结构体的数组应用。
2.全局变量应用。
3.按键的处理。
4.数组元素与蛇、食物的对应关系。
5.图形方式等等。
加深对所学知识的理解与掌握,增强自己对所学知识解决实际问题的能力,为以后的程序开发打下基础。
1.2
设计思路
棋盘设计为18×
18格,初始状态光标在棋盘的中央,玩家1先走,轮流落子,当一方连成五子或下满棋盘时,游戏结束(连成五子的一方获胜,下满棋盘为和棋)。
当游戏一方胜利后显示胜利信息。
从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。
这样程序的主要工作是接收棋手按键操作,棋手用Up、Down、Left、Right控制光标移动,空格键表示落子。
一旦接收到空格键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。
落子成功后,马上判断以该位置为中心的八个方向:
上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。
如果想退出游戏,可以按Esc键。
第2章系统功能需求分析
2.1系统的基本要求
操作系统为WindowsXP,设计语言为VisualC++或TurboC++3.0。
2.2需求分析
1.游戏需求
(1)在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;
(2)画出棋盘的大小;
(3)画棋子并确定棋子的大小;
(4)判断键盘输入哪个键执行操作;
(5)玩家P1先落棋;
(6)玩家轮流下棋;
(7)判断赢家。
2.功能模块
●初始化模块
●下棋操作模块
●判断胜负模块
●帮助模块
3.流程图
第3章系统设计
1.定义全局变量
1.intstatus[N][N];
*定义的数组,表示棋盘某点的状态(棋手1或棋手2)*
2.intstep_x,step_y;
*行走的坐标,即每一步光标移动的距离*
3.intkey;
*获取按下的键盘的键*
4.intflag;
*玩家标志,当flag=0时,表示该点无棋子,flag=1表示玩家1的棋子,flag=2表示玩家2的棋子*
2.Main()主函数
按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。
棋盘状态用数组intstatus[19][19],初值为0,表示空格。
函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。
3.DrawBoard()画棋盘函数
背景颜色设为绿色,从坐标(100,100)开始每隔20个单位用黄色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。
画线函数line()的参数为线的起点和终点坐标,注意要计算正确。
函数setfillstyle()可以设置填充模式和填充颜色,circle(x,y,8)以x和y为圆心画圆(这里半径为8),用它表示棋子。
4.ResultCheck(intx,inty)判断是否胜出函数
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:
红方获胜),否则继续落子。
5.Done()执行下棋函数
这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:
(1)
按Esc键程序可以随时结束。
(2)
按上下左右光标键,则改变棋子移动的坐标值。
(3)
按空格键后判断:
1)如落子的位置已经有棋则无效,继续按键。
2)如落子位置是空格,可以将棋子落入格内,调用ResultCheck(intx,inty)函数。
3)如果棋子变化后,棋盘已下满了棋子,则游戏结束。
显示平局信息。
(4)
重复上述步骤,直到游戏结束。
6.图形功能函数
以下函数原形都在graphics.-tc下的五子棋源代码*
*加载头文件*
#include<
stdio.();
*交换行棋方函数*
voidJudgePlayer(intx,inty);
*对不同的行棋方画不同颜色的圆函数*
voidDone();
*执行下棋函数*
intResultCheck(intx,inty);
*判断当前行棋方是否获胜函数*
voidWelcomeInfo();
*显示欢迎信息函数*
voidShowMessage();
*显示行棋方函数*
*定义函数*
*显示欢迎信息函数*
voidWelcomeInfo()
{
charch;
*定义显示欢迎函数数组*
*移动光标到指定位置*
gotoxy(12,4);
*将当前字符屏幕的光标位置移动到x,y坐标位置*
*显示欢迎信息*
printf("
Welcomeyoutowuziqiword!
"
);
gotoxy(12,6);
1.up,down,leftandrightkeytomove,"
gotoxy(12,8);
Spacekeytomove!
gotoxy(12,10);
2.Esckeytoexit!
gotoxy(12,12);
3.Donnotmovethepiecesoutofthechessboard!
gotoxy(12,14);
continue?
(YN)"
ch=getchar();
*从标准输入流读取一个字符并回显,读到回车符时退出*
*判断程序是否要继续进行,按n表示退出,y表示继续玩游戏*
if(ch=='
n'
||ch=='
N'
*如果不继续进行,则推出程序*
exit(0);
*程序中止执行,返回调用过程*
}
*画棋盘函数,用来画棋盘的格子和棋子,这里棋子用带某一颜色的圆圈表示*
voidDrawBoard()
intx1,x2;
inty1,y2;
*设置背景色*
setbkcolor
(2);
*设置线条颜色*
setcolor(14);
*设置前景颜色,颜色值含义如下:
*
*0-BLACK黑深色0-7*
*1-BLUE兰2-GREEN绿*
*3-CYAN青4-RED红*
*5-MAGENTA洋红6-BROWN棕*
*7-LIGHTGRAY淡灰8-DARKGRAY深灰淡色8-15*
*9-LIGHTBLUE淡兰10-LIGHTGREEN淡绿*
*11-LIGHTCYAN淡青12-LIGHTRED淡红*
*13-LIGHTMAGENTA淡洋红14-YELLOW黄*
*15-WHITE白*
*设置线条风格、宽度*
setlinestyle(DOTTED_LINE,3,1);
*设置画线模式,linestyle画线风格,取值和含义如下*
*SOLID_LINE=0实线DOTTED_LINE=1点线*
*CENTER_LINE=2中心线DASHED_LINE=3虚线*
*USERBIT_LINE=4用户自定义模式*
*upattern在linestyle=USERBIT_LINE时,表示自定义的线型thickness线宽,有2个取值;
*
*NORM_WIDTH=11个象素宽度THICK_WIDTH=33个象素宽度*
*按照预设的偏移量开始画棋盘*
for(x1=1,y1=1,y2=18;
x1<
=18;
x1++)*line用于画直线,x1,y1,x2,y2直线的起点和终点坐标*
line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFSET_y)*OFFSET);
for(x1=1,y1=1,x2=18;
y1<
y1++)
line((x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET);
*将各个点的状态设置为0*
for(x1=1;
x1++)
for(y1=1;
status[x1][y1]=0;
*显示帮助信息*
setcolor(150);
*设置字体、大小*
settextstyle(1,0,4);
*设置图形模式下字符显示底字体、方向和大小*
*font显示字体,取值如下:
*DEFAULT_FONT=08x8点阵*
*TRIPLEX_FONT=1三倍笔划*
*SMALL_FONT=2小号字体*
*SANS_SERIF_FONT=3无衬线字体*
*GOTHIC_FONT=4哥特字体*
*directiom显示方向,取值如下:
*HORIZ_DIR=0水平显示*
*VERT_DIR=1垂直显示*
*charsize字体放大倍数,取值为0-10*
outtextxy((19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,"
Playerkey:
*图形模式下在x,y坐标位置显示一行字符串*
setcolor(9);
settextstyle(3,0,1);
outtextxy((19+OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,"
UP--up"
outtextxy((19+OFFSET_x)*OFFSET,(6+OFFSET_y)*OFFSET,"
DOWN--down"
outtextxy((19+OFFSET_x)*OFFSET,(8+OFFSET_y)*OFFSET,"
LEFT--left"
outtextxy((19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,"
RIGHT--right"
outtextxy((19+OFFSET_x)*OFFSET,(12+OFFSET_y)*OFFSET,"
ENTER--space"
settextstyle(1,0,1);
outtextxy((19+OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,"
Exit:
outtextxy((19+OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,"
ESC"
*画圆函数,用来表示玩家的棋子*
voidDrawCircle(intx,inty,intcolor)
setcolor(color);
*设置画圆线条的风格,宽度,这里设置为虚线*
setlinestyle(SOLID_LINE,0,5);
x=(x+OFFSET_x)*OFFSET;
y=(y+OFFSET_y)*OFFSET;
*以(x,y)为圆心,8为半径画圆*
circle(x,y,8);
*交换行棋方函数,即让玩家轮流下棋*
voidAlternation()
if(flag==1)
flag=2;
*如果此时为玩家1落棋,则下回换为玩家2落棋*
else
flag=1;
*如果此时为玩家2落棋,则下回换为玩家1落棋*
}
*对不同的行棋方画不同颜色的圆函数,用于区分不同玩家的棋子*
voidJudgePlayer(intx,inty)
DrawCircle(x,y,15);
if(flag==2)
DrawCircle(x,y,4);
*判断当前行棋方是否获胜函数,即判断是否有五个相同颜色的棋子已连成一条线*
intResultCheck(intx,inty)
intj,k;
intn1,n2;
while
(1)
{
*对水平方向进行判断是否有5个同色的圆*
n1=0;
n2=0;
*水平向左数*
for(j=x,k=y;
j>
=1;
j--)
if(status[j][k]==flag)
n1++;
else
break;
}
*水平向右数*
j<
j++)
n2++;
if(n1+n2-1>
=5)
return
(1);
*对垂直方向进行判断是否有5个同色的圆*
*垂直向上数*
k>
k--)
break;
*垂直向下数*
k<
k++)
*从左上方到右下方进行判断是否有5个同色的圆*
*向左上方数*
(j>
=1)&
&
(k>
=1);
j--,k--)
*向右下方数*
(j<
=18)&
(k<
=18);
j++,k++)
*从右上方到左下方进行判断是否有5个同色的圆*
*向右上方数*
j++,k--)
*向左下方数*
j--,k++)
return(0);
*执行下棋函数*
voidDone()
inti;
intj;
*根据不同的key值进行不同的操作*
switch(key)
*如果是向左移动的*
caseLEFT:
*如果下一步超出棋盘左边界则什么也不作*
if(step_x-1<
0)
for(i=step_x-1,j=step_y;
i>
i--)
if(status[i][j]==0)
DrawCircle(step_x,step_y,2);
if(i<
1)
step_x=i;
JudgePlayer(step_x,step_y);
*如果是向右移动的*
caseRIGHT:
*如果下一步超出棋盘右边界则什么也不作*
if(step_x+1>
18)
for(i=step_x+1,j=step_y;
i<
i++)
*每移动一步画一个圆,显示移动的过程*
if(i>
18)break;
*根据不同的行棋者画不同颜色的圆*
*显示行棋一方是谁*
*如果是向下移动的*
caseDOWN:
*如果下一步超出棋盘下边界则什么也不作*
if((step_y+1)>
for(i=step_x,j=step_y+1;
if(j>
step_y=j;
*如果是向上移动的*
caseUP:
*如果下一步超出棋盘上边界则什么也不作*
if((step_y-1)<
for(i=step_x,j=step_y-1;
if(j<
1)break;
*如果是退出键*
caseESC:
*如果是确定键*
caseSPACE:
*如果操作是在棋盘之内*
if(step_x>
=1&
step_x<
=18&
step_y>
step_y<
=18)
*按下确定键后,如果棋子当前位置的状态为0*
if(status[step_x][step_y]==0)
*则更改棋子当前位置的状态在flag,表示是哪个行棋者行的棋*
status[step_x][step_y]=flag;
*如果判断当前行棋者获胜*
if(ResultCheck(step_x,step_y)==1)
*以指定频率打开PC扬声器*
sound(1000);
*扬声器的发生时间,为1秒钟*
delay(1000);
nosound();
gotoxy(30,4);
setbkcolor(BLUE);
*清除图形屏幕*
cleardevice();
*清除屏幕显示,仅用于图形工作方式*
*为图形输出设置当前视口*
setviewport(380,1);
*设置图形模式下图形函数操作的窗口大小*
*left,top,right,bottom窗口大小坐标clip是否剪切*
*1表示对超出设置图形窗口大小的操作不显示*
*0表示超出的内容也显示。
*绿色实填充*
setfillstyle(1,2);
*设置填充模式和填充颜色*
*color填充颜色pattern填充模式,共13种,具体如下:
*EMPTY_FILL背景色填充SOLID_FILL实填充*
*LINE_FILL---线填充LTSLASH_FILL斜线填充*
*SLASH_FILL粗斜线填充*
*BKSLASH_FILL反粗斜线填充LTBKSLASH_FILL反斜线填充*
*HATCH_FILL网格填充XHATCH_FILL斜网格填充*
*INTERLEAVE_FILL间隔点线填充WIDE_DOT_FILL稀疏点填充*
*CLOSE_DOT_FILL密集点填充USER_FILL用户自定义填充*
setcolor(YELLOW);
rectangle();
*图形方式下,在屏幕上画一个矩形*
floodfill();
*填充一个有边界的区域,x,y要填充区域内的任意一点坐标*
*border填充区域边界的颜色*
setcolor(12);
settextstyle(1,0,5);
*三重笔划字体,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 毕业 课程设计 报告