@连连看(源码及图片素材)
连连看(源码及图片素材)
首先声明一下,我不是计算机专业的人,这是我大二上程设课的大作业,第一次做游戏,当时会的东西不多很焦虑,不知道该怎么开始第一步。开始前搜了很多东西,什么“图形界面编程”“面向对象编程”等等,结果其实根本用不上。easyx也是现学的(好在并不难)。在CSDN上找到了好些前辈的文章,非常感谢他们(对了,如果是和我一样非常小白的小白,完全不知道要干啥,可以先去知乎看看童晶老师的文章,感受一下一个小游戏是怎么写的,缓解一下焦虑)。
为了把这份帮助传递下去,决定把自己写的连连看上传上来。第一次写这么长的代码,很大的工作量,写的时候思路不够清晰,有些混乱,所以,我也知道我代码写的不好,仅仅是抱着贡献一点绵薄之力的心态,希望读者可以自行甄别(也不知道有没有bug哈哈哈)。再次感谢CSDN上分享知识的前辈们。
可以转载,请务必注明出处。禁止商用。
将源码、图片素材(freeillustrations.xyz)、删减版实验报告和用到的字体文件上传到了百度网盘上(虽然我真的很讨厌百度网盘。。。),方便大家下载,希望能帮到大家。永久有效。
链接: https://pan.baidu.com/s/1bqBNjDoM14ohiJzBc-VEiA 密码: fhoq
图形库用的是easyx,头文件graphics.h
对了,放上最终游戏界面的部分截图(很用心地做了界面设计,不喜勿喷)
头文件
#pragma once
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<atlstr.h> //CString头文件atlstr.h
#include<algorithm>
#include<time.h>
#include<process.h>
#include<algorithm>
using namespace std;
定义
#pragma once
#define column 16
#define row 12
#define grid_size 40
#define x0 5
#define y0 5
#define gap 0
const short windows_width = 2 * x0 + grid_size * column + gap * (row - 1) + 250;
const short windows_lenth = 2 * y0 + grid_size * row + gap * (row - 1);
//img[13] 开始菜单背景, img[14] 游戏界面背景, img[15] 排行榜、设置界面的“退出”按钮
IMAGE img[16];
LOGFONT textstyle;
//为真则进入菜单界面
bool flg = true;
short nhint = 2;
short nshuffle = 1;
int combo = 2;
int score = 0;
long t_start;
short resttime = 360;
short t_limit = 360;
//t代表游戏开始到上一次消除成功多久了,t初始化为-5是为了防止第一次消除被误判为combo
short t = -5;
short n_img = (column - 2) * (row - 2);
short level = 1;
//在设置界面记录之前是否已经选择过一个关卡
short prechoice = 0;
char fl_name[20] = "rank_list1.txt";
class labels
{
public:
labels() : x(0), y(0), w(200), h(60), n(13) {
}
labels(short _x, short _y, short _w, short _h, short _n) : x(_x), y(_y), w(_w), h(_h), n(_n) {
}
//判断是否点击了该按钮
bool init(MOUSEMSG m)
{
if (m.x >= x && m.x <= x + w && m.y >= y && m.y <= y + h)
return true;
else
return false;
}
private:
short x, y, w, h, n;
};
labels lstart_game(250, 270, 400, 80, 13);
labels lrank_list(380, 5, 140, 40, 14);
labels lexit_game(760, 460, 120, 40, 15);
labels lsetting(855, 5, 40, 40, 16);
labels lshuffle(646, 287, 79, 46, 17);
labels lhint(646, 207, 79, 46, 18);
labels lbk_to_menu(720, 392, 79, 46, 19);
labels lclose_rank(410, 440, 79, 46, 20);
RECT rthint = {
631, 200, 870, 260 };
RECT rtshuffle = {
631, 280, 870, 340 };
RECT rlhint = {
646, 207, 725, 253 };
RECT rlshuffle = {
646, 287, 725, 333 };
RECT rbk_to_menu = {
720, 392, 799, 438 };
RECT rscores = {
650, 85, 870, 175 };
//输出“排行榜”三个字的矩形,“设置”两个字也是这个区域
RECT rrank_name = {
235, 25, 665, 120 };
RECT rrank1 = {
235, 25, 665, 120 };
RECT rrank2 = {
235, 125, 665, 425 };
RECT R = {
0, 5, windows_width, 45 };
struct grids
{
short x = 0;
short y = 0;
//编号 -1 表示没有图片
short img_num = -1;
}grid[row][column];
struct levels
{
char fl_name[20];
short n_img;
short t_limit;
};
struct levels level1 = {
"rank_list1.txt", 140, 360 };
struct levels level2 = {
"rank_list2.txt", 140, 150 };
struct levels level3 = {
"rank_list3.txt", 80, 150 };
struct levels level4 = {
"rank_list4.txt", 110, 200 };
struct levels level5 = {
"rank_list5.txt", 110, 150 };
int Rand(int i)
{
return rand() % i;
}
void initgridxy();
void initimg();
void initmap1();
void initmap2();
void initmap3();
void draw_start_menu();
void draw_game_window();
void rank_list();
void setting();
void hint();
void shuffle();
bool ten_solutions();
bool start_menu();
void start_game();
void game_window();
void game_over();
bool judge();
void save_memory();
void draw_map();
void drawline(short x1, short y1, short x2, short y2);
void drawrectangle(short x, short y);
void drawsolidrectangle(short x, short y);
void print_score(int scores);
bool is_solution(short &solution_x1, short &solution_y1, short &solution_x2, short &solution_y2);
bool x_no_dots_between(short x1, short x2, short y);
bool y_no_dots_between(short y1, short y2, short x);
bool is_connected(short x1, short y1, short x2, short y2, short &x3, short &y3, short &x4, short &y4);
bool no_turn(short x1, short y1, short x2, short y2);
bool one_turn(short x1, short y1, short x2, short y2, short &x3, short &y3);
bool two_turns(short x1, short y1, short x2, short y2, short &x3, short &y3, short &x4, short &y4);
bool cmp(short a, short b)
{
return a > b;
}
/*返回label序号,label序号即为对应的img[]序号;
false代表在开始菜单界面,true代表在游戏界面 */
short clk_labels(MOUSEMSG m, bool flg);
//选择哪个关卡
void clk_levels(MOUSEMSG m);
函数们
#include"headers.h"
#include"definitions.h"
//#include<iostream>
int main()
{
initgraph(windows_width, windows_lenth + 30);
setbkcolor(WHITE); //背景色
setfillcolor(WHITE);
setbkmode(OPAQUE);
gettextstyle(&textstyle);
textstyle.lfHeight = 50;
textstyle.lfWidth = 30;
textstyle.lfQuality = ANTIALIASED_QUALITY;
textstyle.lfWeight = 700;
_tcscpy(textstyle.lfFaceName, _T("Aa方萌 (非商业使用)"));
settextstyle(&textstyle);
LINESTYLE linestyle;
linestyle.thickness = 2;
setlinestyle(&linestyle);
initimg();
initgridxy();
while (1)
{
//返回false代表用户点击了“退出游戏”
if (!start_menu())
{
closegraph();
return 0;
}
start_game();
while (!flg);
}
_getch();
closegraph();
}
//开始菜单界面
bool start_menu()
{
level = 1;
prechoice = 0;
flg = true;
cleardevice();
draw_start_menu();
FlushMouseMsgBuffer();
while (1)
{
MOUSEMSG m;
m = GetMouseMsg();
if (m.mkLButton)
{
if (clk_labels(m, false) == 13) //开始游戏
{
flg = false;
return true;
}
else if (clk_labels(m, false) == 14)
{
rank_list();
draw_start_menu();
}
else if (clk_labels(m, false) == 15)
{
return false; //用户点击了“退出游戏”
}
else if (clk_labels(m, false) == 16)
{
setting();
draw_start_menu();
}
}
}
}
//进入哪一关
void start_game()
{
while (!flg)
{
switch (level)
{
case 1