期末项目设计 C语言写的连连看`

期末项目设计 C语言写的连连看

学会熟练运用C语言,以及一些做游戏的简单思路,还有esayX的图形界面的使用等。

#include<stdio.h>
#include<graphics.h>
#include <conio.h>
#pragma comment(lib,"Winmm.lib")
#pragma warning(disable : 4996)
#define IMG_SIZE 39 
#define MAX_ANIMAL_NUM 42 
#define MAP_SIZE 10  
#define WIN_SIZE (MAP_SIZE*IMG_SIZE+2*IMG_SIZE)


IMAGE img_total[2];
IMAGE img_animal[MAX_ANIMAL_NUM][2];
IMAGE img_gamestart_bg;
IMAGE img_rule_bg;
IMAGE img_win_bg;
IMAGE img_lose_bg;
int gameStatus = 0; 
int map[MAP_SIZE + 2][MAP_SIZE + 2];
static int  time = 8000;


POINT begin = { -1, -1 }, end = { -1, -1 };
enum STATE
{
	BEGIN,
	END,
};
int flag = BEGIN;


void musicPalying()
{
	mciSendString("open backmusic.mp3 alias backmusic", NULL, 0, NULL);
	mciSendString("play backmusic repeat", NULL, 0, NULL);
}

void winMusic()
{
	mciSendString("close backmusic", NULL, 0, NULL); 
	mciSendString("open win.mp3 alias win", NULL, 0, NULL); 
	mciSendString("play win", NULL, 0, NULL); 
}

void loseMusic()
{
	mciSendString("close backmusic", NULL, 0, NULL); 
	mciSendString("open lose.mp3 alias lose", NULL, 0, NULL); 
	mciSendString("play lose", NULL, 0, NULL); 
}

void startMenu()
{
	putimage(0, 0, 800, 480, &img_gamestart_bg, 0, 0);
	setbkmode(TRANSPARENT);
	settextcolor(YELLOW);
	settextstyle(30, 0, _T("隶书"));
	outtextxy(20, 400, _T("NEW GAME"));
	outtextxy(300, 400, _T("RULES"));
	settextcolor(BLACK);
	settextstyle(70, 0, _T("华文琥珀"));
	outtextxy(70, 200, _T("动物连连看"));
	rectangle(15, 400, 150, 430);
	rectangle(295, 400, 400, 430);
	
	FlushBatchDraw();
	Sleep(2);
	MOUSEMSG m;		
	while (MouseHit())  
	{
		m = GetMouseMsg();
		if (m.uMsg == WM_LBUTTONDOWN && m.x >= 20 && m.x <= 150 && m.y >= 410 && m.y <= 430)
		{
			gameStatus = 1;
		}
		else if (m.uMsg == WM_LBUTTONDOWN && m.x >= 300 && m.x <= 380 && m.y >= 410 && m.y <= 430)
		{
			gameStatus = 2;
		}
	}

}

void rules()
{
	putimage(0, 0, 800, 480, &img_rule_bg, 0, 0);
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(30, 0, _T("楷体"));
	outtextxy(20, 300, _T("相同的图片可以进行消除,"));
	outtextxy(20, 350, _T("同行,同列,转角即可消除"));
	outtextxy(20, 400, _T("R键可以使动物重置"));
	settextstyle(50, 0, _T("华文琥珀"));
	settextcolor(BLUE);
	outtextxy(20, 20, _T("START"));
	rectangle(650, 410, 780, 460);

	FlushBatchDraw();
	Sleep(2);

	MOUSEMSG m;		
	while (MouseHit()) 
	{
		m = GetMouseMsg();
		if (m.uMsg == WM_LBUTTONDOWN && m.x >= 20 && m.x <= 120 && m.y >= 20 && m.y <= 90)//鼠标点击“START”开始游戏
		{
			gameStatus = 1;
		}
	}
}

void timeCount()
{
	char temp[20] = "";
	sprintf(temp, "所剩时间: %d s", time/100);
	setbkmode(TRANSPARENT);
	outtextxy(1, 1, temp);
}

void winMenu()
{
	putimage(0, 0, &img_win_bg);	
	setbkmode(TRANSPARENT);

	settextcolor(WHITE);
	settextstyle(30, 0, _T("黑体"));
	outtextxy(WIN_SIZE * 0.1, WIN_SIZE * 0.2, "恭喜!您的时间:");
	char s[5];
	sprintf(s, "%d s", time/100);
	outtextxy(WIN_SIZE * 0.6, WIN_SIZE * 0.2, s);

	settextcolor(WHITE);
	settextstyle(20, 0, _T("黑体"));
	outtextxy(WIN_SIZE * 0.6, WIN_SIZE * 0.8, "按任意键退出!");

	FlushBatchDraw();
	Sleep(2);

}

void loseMenu()
{
	putimage(0, 0, &img_lose_bg);	
	setbkmode(TRANSPARENT);

	settextcolor(WHITE);
	settextstyle(30, 0, _T("黑体"));
	outtextxy(WIN_SIZE * 0.1, WIN_SIZE * 0.2, "失败喽!");

	settextcolor(WHITE);
	settextstyle(20, 0, _T("黑体"));
	outtextxy(WIN_SIZE * 0.6, WIN_SIZE * 0.8, "按任意键退出!");
}

void Bug()
{
	settextstyle(30, 0, _T("黑体"));
	settextcolor(BLUE);
	outtextxy(400, 5, _T("BUG"));
	MOUSEMSG j;
	while (MouseHit())
	{
		j = GetMouseMsg();
		if (j.uMsg == WM_LBUTTONDOWN && j.x >= 400 && j.x <= 500 && j.y >= 20 && j.y <= 90)
		{
			for (int i = 0; i <= 12; i++)
			{
				for (int k = 0; k <=12; k++)
				{
					map[i][k] = 0;
				}
			}
		}
	}
}

void GameInit()
{
	initgraph(WIN_SIZE, WIN_SIZE, SHOWCONSOLE);
	
	srand(GetTickCount());
	
	loadimage(&img_total[0], "./res/animal.bmp");
	loadimage(&img_total[1], "./res/bk.jfif", WIN_SIZE, WIN_SIZE);
	loadimage(&img_gamestart_bg, "./res/gameStart.jpg", WIN_SIZE, WIN_SIZE);
	loadimage(&img_rule_bg, "./res/rule.jpg", WIN_SIZE, WIN_SIZE);
	loadimage(&img_win_bg, "./res/win.jpg", WIN_SIZE, WIN_SIZE);
	loadimage(&img_lose_bg, "./res/lose.jpg", WIN_SIZE, WIN_SIZE);
	
	SetWorkingImage(&img_total[0]);
	for (int i = 0; i < MAX_ANIMAL_NUM; i++)
	{
		for (int k = 0; k < 2; k++)
		{
			getimage(&img_animal[i][k], k * IMG_SIZE, i * IMG_SIZE, IMG_SIZE, IMG_SIZE);
		}
	}
	SetWorkingImage();

	
	for (int i = 1; i <= MAP_SIZE; i++)
	{
		for (int k = 1; k <= MAP_SIZE; k++)
		{
			map[i][k] = i;
		}
	}

	
	for (int i = 1; i <= MAP_SIZE; i++)
	{
		for (int k = 1; k <= MAP_SIZE; k++)
		{
			int row = rand() % 10 + 1;
			int col = rand() % 10 + 1;
			int temp = map[i][k];
			map[i][k] = map[row][col];
			map[row][col] = temp;
		}
	}
}

void GameDraw()
{
	putimage(0, 0, &img_total[1]);
	timeCount();


	for (int i = 1; i <= MAP_SIZE; i++)
	{
		for (int k = 1; k <= MAP_SIZE; k++)
		{
			if (map[i][k] > 0)
			{
				
				putimage(k * IMG_SIZE, i * IMG_SIZE, &img_animal[map[i][k]][1], SRCAND);//遮罩图
				putimage(k * IMG_SIZE, i * IMG_SIZE, &img_animal[map[i][k]][0], SRCPAINT);//原图
			}
		}
	}

}

void GameMouse()
{
	if (MouseHit())
	{
		MOUSEMSG msg = GetMouseMsg();
		if (msg.uMsg == WM_LBUTTONDOWN)
		{
			if (flag == BEGIN)
			{
				begin.x = msg.y / IMG_SIZE;
				begin.y = msg.x / IMG_SIZE;
				flag = END;
			}
			else if (flag == END)
			{
				end.x = msg.y / IMG_SIZE;
				end.y = msg.x / IMG_SIZE;
				flag = BEGIN;
			}
			printf("begin(%d,%d),end(%d,%d)\n", begin.x, begin.y, end.x, end.y);
		}
	}
	if (kbhit())
	{
		char ch = getch();
		if (ch == 'r')
		{
			srand(GetTickCount());
			for (int i = 1; i <= MAP_SIZE; i++)
			{
				for (int k = 1; k <= MAP_SIZE; k++)
				{
					int row = rand() % 10 + 1;
					int col = rand() % 10 + 1;
					int temp = map[i][k];
					map[i][k] = map[row][col];
					map[row][col] = temp;
				}
			}
		}
	}
}

void show()
{
	for (int i = 0; i <= MAP_SIZE + 2; i++)
	{
		for (int k = 0; k <= MAP_SIZE + 2; k++)
		{
			printf("%2d ", map[i][k]);

		}
		printf("\n");
	}

}

int isBlocked(int x, int y)
{
	return map[x][y];
}

bool horizon(POINT begin, POINT end)
{
	
	if (begin.x == end.x && begin.y == end.y)
	{
		return false;
	}
	
	if (begin.x != end.x)
	{
		return false;
	}
	
	int m_min = min(begin.y, end.y);
	int m_max = max(begin.y, end.y);
	for (int i = m_min + 1; i < m_max; i++)
	{
		if (isBlocked(begin.x, i))
		{
			return false;
		}
	}
	return true;
}

bool vertical(POINT begin, POINT end)
{
	
	if (begin.x == end.x && begin.y == end.y)
	{
		return false;
	}
	
	if (begin.y != end.y)
	{
		return false;
	}
	
	int m_min = min(begin.x, end.x);
	int m_max = max(begin.x, end.x);
	for (int i = m_min + 1; i < m_max; i++)
	{
		if (isBlocked(i, begin.y))
		{
			return false;
		}
	}
	return true;
}

bool turn_ocne(POINT begin, POINT end)
{
	
	if (begin.x == end.x && begin.y == end.y)
	{
		return false;
	}
	
	POINT temp1 = { begin.x, end.y }, temp2 = { end.x, begin.y }; 
	if (!isBlocked(begin.x, end.y))
	{
		if (horizon(begin, temp1) && vertical(end, temp1))
		{
			return true;
		}

	}
	if (!isBlocked(end.x, begin.y))
	{
		if (horizon(end, temp2) && vertical(temp2, begin))
		{
			return true;
		}
	}
	return false;
}

void gameover()
{
	EndBatchDraw();
	getch();
	closegraph();
}

int main()
{
	musicPalying();
	GameInit();
	show();
	while (1)
	{
		while (gameStatus == 0)
		{
			startMenu();
		}
		while (gameStatus == 2)
		{
			rules();
		}
		BeginBatchDraw();
		
		GameDraw();
		/*Bug();*/

		FlushBatchDraw();
		GameMouse();


		if (map[begin.x][begin.y] == map[end.x][end.y])
		{

			if (horizon(begin, end))
			{
				time -= 0.1;
				map[begin.x][begin.y] = 0;
				map[end.x][end.y] = 0;
				Sleep(10);
			}
			else if (vertical(begin, end))
			{
				time -= 0.1;
				map[begin.x][begin.y] = 0;
				map[end.x][end.y] = 0;
				Sleep(10);
			}
			else if (turn_ocne(begin, end))
			{
				time -= 0.1;
				map[begin.x][begin.y] = 0;
				map[end.x][end.y] = 0;
				Sleep(10);
			}
		}
		if (time <= 0)
		{
			loseMenu();
			loseMusic();
			gameover();
		}

		int t = 0;
		for (int i = 0; i < 12; i++)
		{
			for (int k = 0; k < 12; k++)
			{
				if (map[i][k] == 0) t++;
			}
		}
		if (t == 144)
		{
			winMenu();
			winMusic();
			gameover();
		}
	
	}
	return 0;
}

`

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
7-7 简易连连看 (15分) 本题要求实现一个简易连连看游戏模拟程序。 给定一个2N×2N的方阵网格游戏盘面,每个格子中放置一些符号。这些符号一定是成对出现的,同一个符号可能不止一对。程序读入玩家给出的一对位置(x ​1 ​​ ,y ​1 ​​ )、(x ​2 ​​ ,y ​2 ​​ ),判断这两个位置上的符号是否匹配。如果匹配成功,则将两个符号消为“*”并输出消去后的盘面;否则输出“Uh-oh”。若匹配错误达到3次,则输出“Game Over”并结束游戏。或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。 输入格式: 输入在一行中给一个正整数N(<5)。随后2N行,每行2N个大英文字母(其间以1个空格分隔),表示游戏盘面。盘面之后给出一个正整数K,随后K行,每行按照格式“x ​1 ​​ y ​1 ​​ x ​2 ​​ y ​2 ​​ ”给出一个玩家的输入。注意格子的行、列编号是从1到2N。 输出格式: 根据玩家的每一步输入,输出相应的结果。输出盘面时注意,每行字符间以1个空格分隔,行末不得有多余空格。 输入样例1: 2 I T I T Y T I A T A T Y I K K T 11 1 1 1 3 4 2 4 3 3 1 4 2 2 2 1 2 3 1 2 4 4 4 3 1 2 1 3 4 3 3 1 4 4 1 2 3 2 4 3 2 1 1 2 2 输出样例1: * T * T Y T I A T A T Y I K K T * T * T Y T I A T A T Y I * * T Uh-oh * * * T Y * I A T A T Y I * * T Uh-oh * * * T Y * I A * A T Y I * * * * * * T * * I A * A T * I * * * * * * * * * I A * A * * I * * * * * * * * * * A * A * * * * * * Congratulations! 输入样例2: 2 I T I T Y T I A T A T Y I K K T 5 1 1 4 4 1 1 2 3 1 1 2 3 2 2 4 1 2 2 3 3 输出样例2: Uh-oh * T I T Y T * A T A T Y I K K T Uh-oh Uh-oh Game Over
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值