五子棋小游戏需求分析
1.需求分析:
双人对战五子棋游戏是一个益智游戏,它可以锻炼人们的反应能力,尤其是在开发人的智力方面,很受人们的欢迎。
本组该次设计的小游戏是仅供人人对弈的,而因为函数的复杂性及人机对弈的情况的多样性,所以还未进行人机对弈的程序的编译。
本程序设计包含二维数组、鼠标操作及图形化函数等方面知识。
具体需求如下:
(1) 初始化:屏幕初始化,屏幕被初始化宽600*600像,显示19*19格的棋盘。
系统默认为黑棋先走,然后黑白双
方轮流落子。
(2) 鼠标处理:通过鼠标点击落子,从而开始游戏。
(3) 游戏中途未设置退出功能,只有一方获胜,棋局结束方可根据提示退出。
2.运行环境:
该课程设计在设计与实验过程中需要在windows XP系统/windows 2000以上系统中进行,程序设计要求在visual C++6.0平台中进行,完成代码的编写、编译、调试、测试等工作。
本游戏对计算机硬件和操作系统要求极低,所以在这里只是把自己的电脑硬件参数和系统参数列下: 操作系统:windows xp 软件环境:安装VC++6
3.设计概要:
(1)初始化模块:即屏幕初始化。
屏幕初始化用于显示欢迎信息及简介。
(2)棋盘模块:显示棋盘和棋子,棋盘设计为20*20格的二维平面图,背景颜色为黑色,每隔20个单位,用白线画出水平和垂直线,可以用循环语句控制实现。
画线函数line()的参数就是棋盘线的起始坐标和终点坐标,
(3)判断模块:判断上、下、左、右、左上、右上、左下、右下是否有五个相同的颜色,如果有的游戏就结束,显示胜利方,否则,游戏双方继续落子。
而当棋盘已满,即数组空间已满的时候,也结束程序,显示和局。
4.技术要求
定义二维数组char a[20][20],用于记录鼠标当前位置。
定义结构体 MOUSEMSG
struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
int x; // 当前鼠标 x 坐标(物理坐标)
int y; // 当前鼠标 y 坐标(物理坐标)
int wheel; // 鼠标滚轮滚动值
};
定义三个名为board,black,white的图像对象 IMAGE board,black,white
5.详细设计及实现
1. int main()主函数
2.void Init() 画出启动界面调用棋盘函数,以及以下函数
判断鼠标点击位置,在棋盘内则获取鼠标信息,在棋盘外不显示。
用for循环将棋盘内可以下棋的位置进行序号排列,方便后面进行引用和判断
用s对鼠标点击次数进行统计,若为偶数则下黑子,若为奇数则下白子。
下子之后进行判断,引用check函数,若check=1则表示白子获胜输出信息,若check=2则表示黑子获胜输出信息
获取鼠标信息,点击鼠标左键,则推出该程序
调用棋盘函数,画出棋盘,定义所需变量以及存储落子信息的数组initgraph(600, 600)
创建一个600*600的工作区域。
outtextxy(70, 250, "五子棋小游戏")
在(70,250)显示“五子棋小游戏”
While函数,获取鼠标点击信息,调用清屏函数
cleardevice()
清屏函数,消除启动图像
drawchessboard()
drawblack();
drawwhite()
画出五子棋19*19棋盘
表示下棋的一方黑子
表示下棋的另一方白子
3. void drawchessboard(): 棋盘函数,画出棋盘
用for循环和line 函数画出21条,长度为400的,相隔20的纵线,作为棋盘的纬线。
用fillcircle函数,在棋盘的中心以及,四周中心部分画出圆点,进行定位。
用for循环和line函数画出21条,长度为400相隔20的横线,作为棋盘的经线,至此一个21*21的棋盘已画完成。
void line(
int x1,//线的起始点X坐标
int y1,//线的起始点的Y坐标
int x2,//线的终止点的X坐标
int y2//线的终止点Y坐标)
void fillcircle(
int x,
int y,
int radius);
X:圆心的X坐标;
Y:圆心的Y坐标;
Radius:圆的半径
4.void drawblack(): 画出黑棋子
setfillstyle(BLACK);
fillcircle(450,450,8)
getimage(&black,442,442,17,17)
定义填充方式,用黑色填充
在工作区域的(450,450)地方,画出半径为8的圆,并用黑色填充
获取上述所画的实心黑圆图像信息,保存图像的指针为black,
5. void drawwhite() 画出白棋子
setfillstyle(WHITE)
fillcircle(470,470,8);
getimage(&white,462,462,17,17);
定义填充方式,用白色填充
在工作区域的(470,470)地方,画出半径为8的圆,并用白色填充
获取上述所画的实心白圆图像信息,保存图像的指针为white,
6. int check(char a[][20]): 判断从左上到右下,从右上到坐下,从左到右,从上到下是否有五个相同的颜色,如果有的游戏就结束,显示胜利方,否则,游戏双方继续落子。
而当棋盘已满,即数组空间已满的时候,也结束程序,显示和局。
从棋盘左上角开始依次遍历,当获取棋子图像信息之后,进行判断黑白子
若为黑子
若为白子
从左上角到右下角的斜线上面,分五种情况判断是否五子连线。
若该子是第五子,该子是第四子,该子是第三子,该子是第二子,该子是第一子。
若五子连线,则输出-1
从左上角到右下角的斜线上面,分五种情况判断是否五子连线。
若该子是第五子,该子是第四子,该子是第三子,该子是第二子,该子是第一子。
若五子连线则输出1
从右上角到左下角的斜线上面重复上述判断过程,判断是否五子连线从左向右重复上述判断过程,判断是否五子连线
从上到下重复上述判断过程,判断是否五子连线
从右上角到左下角的斜线上面重复上述判断过程,判断是否五子连线从左向右重复上述判断过程,判断是否五子连线
从上到下重复上述判断过程,判断是否五子连线
直到遍历完棋盘所有位置,若没有-1或1输出,则返回主函数,继续落子,若棋盘已满则输出“平局”
6.成员分组
宋嘉文:main函数
阮梦宇、张莉:棋盘函数
马一菲、张宏旭:判断函数check。