连连看(源码及图片素材)

@连连看(源码及图片素材)

连连看(源码及图片素材)

首先声明一下,我不是计算机专业的人,这是我大二上程设课的大作业,第一次做游戏,当时会的东西不多很焦虑,不知道该怎么开始第一步。开始前搜了很多东西,什么“图形界面编程”“面向对象编程”等等,结果其实根本用不上。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
  • 14
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值