连连看C语言课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
问题描述
连连看是一款简单有趣的小游戏,曾经风靡一时,玩家要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手,游戏速度节奏快,画面清晰可爱,适合细心的玩家。游戏胜利条件的判定:将棋盘上面的格子全部消除掉;失败的判定:规定的时间内格子没有消除。
问题分析
连连看需要解决的问题包括:
(1)整个游戏界面和各种图案的图形显示;
(2)如何判断鼠标所点的两个图像能否相消;
(3)如何判断是否消除完全;
(4)如何判断游戏的结束及如何终止游戏;
(5)游戏难度的设计和得分规则
游戏总的流程可以描述如下:首先出现游戏界面,一幅由10*6的小图片的构成的画面,玩家需要点击2 个相同图案的对子,其连接线不多于3 根直线,也就是说连接相同图案时,直线只能有两个折点,就可以成功将对子消除。
此外,需要重点考虑的是游戏面板和各种形状的方块的数据结构表示。格子面板可以用一个二维数组来表示。
1、开发工具的介绍
【VS2008 】
VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。使用Visual Studio 2008可以高效开发Windows应用程序。设计器中可
以实时反映变更,XAML中智能感知功能可以提高开发效率。同时Visual Studio 2008支持项目模板、调试器和部署程序。Visual Studio 2008可以高效开发Web应用,集成了AJAX 1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。
VS的开发界面分为两个版本:整合模式和孤立模式,分别对基于语言的开发和基于特别工具的开发作了优化。
【EasyX 】
EasyX 是针对C++ 的图形库,可以帮助C 语言初学者快速上手图形和游戏编程。许多学编程的都是从C 语言开始入门的,而目前的现状是:
1. 有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
2. 有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用TC,很是无奈。
3. 还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
所以,于是就有了EasyX 库方便的开发平台和TC 简单的绘图功能。
2、设计
【程序总体结构】:
【界面设计】:
界面的设计通过插入背景图片beijing.bmp , 在对每一个格子的赋图片,通过getimage( )从board.bmp中截下所需要的图,再利用putimage( )放置每一个小图。具体算法:
loadimage(&beijing,"D:\\llk\\beijing.bmp");//载入背景图
putimage(0,0,&beijing);//放置背景图
for(int i = 0 ;i < ROW; i ++)
for(int j = 0 ;j < COL ; j++)
{
idy = i * 54 + board_Y ,idx = j * 48+ board_X;
putimage(idx,idy,&image[board[i + 1][j + 1]]); //根据赋的值放置每一个格子图
}
beijing.bmp
board.bmp
【重要数据的数据结构设计】:
struct BOARD //点击的格子信息{
int tx,ty; //格子坐标
int xx,yy; //屏幕坐标
int data; //图片类型
};
定义BOARD型的结构体,里面包含的是鼠标点击以后,所读取的点击点在屏幕里的坐标(xx,yy)在二维数组里的坐标board[tx][ty],以及在给每一个二维数组元素赋的值data(用来判断两个格子是否相等,相等以后赋值为0,以便判断是否存在格子,为之后的寻找路径铺垫)
int board[ROW + 2][COL + 2];
二维数组,用来记录格子的信息,其值是判定是否有方块的标志。
MOUSEMSG mouse;
鼠标的记录类型struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
int x; // 当前鼠标x 坐标(物理坐标)
int y; // 当前鼠标y 坐标(物理坐标)
int wheel; // 鼠标滚轮滚动值
};
#define board_X 140 //格子区距左边框距离
#define board_Y 140 //格子呢区距上边框距离
#define COL 10 //格子区列数
#define ROW 6 //格子区行数
#define board_number 15 //游戏图片数目
【函数设计】:
函数的功能列表:
void Init(); //初始化界面
void load_picture (); //加载图片
void del(BOARD &rec); //每个格子赋值为
void leftbottondown (MOUSEMSG mouse); //实现鼠标左击效果
void frame (int leftx,int lefty); //画边框
bool judge_mouse(int leftx,int lefty); //判断鼠标是否在游戏区
void select(int leftx,int lefty); //显示选中效果
void accurate(int& leftx,int& lefty); //使格子的坐标都在边缘
void cover(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); //覆盖直线
void line(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4) ; //用直线连接
void exchange(BOARD& pre,BOARD& cur); //交换格子信息
bool click(int mousex,int mousey); //判断单击是否有效
void record(int leftx,int lefty,BOARD &rec);//记录选中的格子
void mouse_to_board(int mousex,int mousey,int *idx,int *idy);//鼠标的坐标转为格子的数组下标int findpath(BOARD &pre,BOARD &cur);//寻找路径,判断是否相等
void progressbar();//画进度条
void updateprogressbar(long t);//更新进度条