C语言图形五子棋课程设计报告Word下载.docx
《C语言图形五子棋课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《C语言图形五子棋课程设计报告Word下载.docx(45页珍藏版)》请在冰豆网上搜索。
传统五子棋的与围棋相同,分为黑白两色,棋盘为15×
15,棋子放置于棋盘线上。
两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。
因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。
程序设计
本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。
程序执行过程中,要求棋盘、棋子时时可见,并且人可以通过按键盘按键移动光标,摆放棋子。
程序需求分析
根据功能需求,将程序分为图形显示、玩家控制、胜负判断和玩家计分四个模块,以下分析各模块的需求。
图形显示模块:
程序开始运行时,给出欢迎及帮助界面;
游戏开始后要求生成19×
19的棋盘图像,并在棋盘上方提示当前落子方棋子颜色,游戏进行过程中,要求实时显示棋盘上已落下的棋子;
分出胜负后,要求给出游戏结束画面。
玩家控制模块:
程序开始时,需玩家确定而后开始游戏;
游戏过程中,两个玩家通过不同的按键移动光标,选择落子;
游戏结束时,有玩家选择是否开始新棋局。
胜负判断模块:
实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,弹出该色玩家胜出界面。
玩家计分模块:
一方玩家再胜利后通过对文件的操作进行计分,并输出于计分板上。
程序流程设计
根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。
图1
第2章:
概要设计
各类头文件,变量及宏定义
#include"
"
#include"
#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/*删除比分*/
全局变量
intch,dh,del;
/*文件操作计分变量*/
intk,i,j,n,t;
/*控制变量*/
inta[20][20];
/*棋盘数组*/
图形模块
棋盘的显示由游戏开始与结束部分控制,棋子以及棋子定位框的显示与保留由玩家操控部分决定,本章只列写棋盘与棋子的显示程序。
图形模块主要由以下函数组成:
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();
玩家操作模块
棋子的移动与落子有键盘上按键控制,本程序选取1P按键为W、S、A、D和空格键,2P按键为↑、↓、←、→和回车键,分别代表上移、下移、左移、右移光标和落子。
在光标移动的过程中,光标按照玩家按键移动;
在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。
1P、2P的落子后,程序会为落子处的数组元素赋一个特定值,用于判定胜负。
玩家操作模块主要由以下函数构成:
P1move();
/*玩家1移动函数*/
P2move();
/*玩家2移动函数*/
Back();
/*悔棋函数*/
胜负判断模块
胜负判断模块是程序的关键,该模块的设计直接关系到程序的运行速率和运行结果的正确与否。
本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息,否则继续落子。
以下简析本程序流程:
由获胜条件可以知,通过判断上、下、左、右、斜上、斜下八个方向上是否有连续的5个子即可得出是否获胜结果。
在游戏开始时,将棋盘初始化,即将棋盘抽象为一个19*19的数组,数组中每个元素数值设为6。
1P落子时,将数组内相应坐标处元素赋值为0;
2P落子时,将数组内相应坐标处元素赋值为1。
通过循环扫描棋盘数组,如果上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于5时,1P获胜;
当上、下、左、右、斜上、斜下八个方向某5个连续的子所对应的数组中元素之和等于0时,2P获胜。
胜负判断模块主要由以下几个函数构成:
Win();
/*主要函数,判断胜负*/
P1win();
/*p1胜利时调用,用于告知p1玩家胜利及询问是否继续*/
/*p2胜利时调用,用于告知p2玩家胜利及询问是否继续*/
restart();
/*询问是否重新开始新的一局比赛的函数*/
initialization();
/*初始化棋盘对应数组所有值为6*/
玩家计分模块
为了能使1p和2p更直观更便捷地看到双方对战的比分,所以做了此计分模块,因为分数不能因为重新调用main()函数就丢失了,所以采用对文件的操作,通过文件来记录双方的比分,这里对和文件进行操作,用来计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分数*/
各模块之间调用关系如下
第3章:
详细设计
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();
outtextxy(60,100,"
P1move;
WSAD"
outtextxy(60,120,"
set:
space"
outtextxy(60,180,"
P2move:
updownleftright"
outtextxy(60,200,"
set:
Ent