C语言实训 easyx 2048小游戏(带背景音乐)

easyx2048小游戏


图片被我误删了,可以通过截图下面的自己制作一下,然后改变一下图片的大小

在使用前需要做的准备工作如下:

在这里插入图片描述

需要所用到的图片和歌曲移动到“配置”文件夹。

图片及歌曲(可根据自己的喜好进行歌曲的调整)的命名如下:(命名如需改变需要改变源代码)
在这里插入图片描述

1.主界面:如下
在这里插入图片描述
2.运行界面如下:
在这里插入图片描述

代码如下:(运行前需要下载easyx库 https://easyx.cn/ )


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <graphics.h>
#pragma comment(lib,"Winmm.lib")
#define WIDTH 480
#define HEIGHT 680
int score,score_i,sco;
int data[4][4]={0},data_old[4][4]={0};

void win();
int judge();//检查游戏是否结束 
void lent();
void lose();
void rands();
void copyData()//复制数据 
{
	int i,j;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			data_old[i][j]=data[i][j];

}
void issuccess()
{
int i,j;
	for(i=0;i<4;i++)
		{
			for(j=0;j<4;j++)
			{
				if(data[i][j]==2048)
				{
			      win();
				}
			}
		}
}
int compareData()//检查数据是否(变化/移动) 
{
	int i,j;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			if(data_old[i][j] != data[i][j])return 0; 
	return 1; 
}
int getEmptyNum()//剩余的空的位置 
{
	int i,j,n=0;
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			if(data[i][j]==0)
				n++;
	return n;
}
void show1()
{
	cleardevice();//清屏

	setfont(50,0,"方正行黑简体");//字体设置
	RECT r1={0,0,WIDTH,HEIGHT/3};
	drawtext("欢迎来到2048的世界",&r1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

		setbkcolor(RGB(251,248,241));
	setfont(30,0,"Microsoft Yahei Ul Boid");
	solidroundrect(146,140,188,170,10,10);//圆角梯形
    solidroundrect(78,140,118,170,10,10);//圆角梯形

	setfont(30,0,"微软雅黑");
	RECT r2={WIDTH/2-45,HEIGHT/3,WIDTH/2+45,HEIGHT/3+30};
	drawtext("开始游戏",&r2,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	RECT r3={WIDTH/2-45,HEIGHT/3+30,WIDTH/2+45,HEIGHT/3+60};
	drawtext("游戏介绍",&r3,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	RECT r4={WIDTH/2-45,HEIGHT/3+60,WIDTH/2+45,HEIGHT/3+90};
	drawtext("操作说明",&r4,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	RECT r5={WIDTH/2-45,HEIGHT/3+90,WIDTH/2+45,HEIGHT/3+120};
	drawtext("退出游戏",&r5,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

	setfillcolor(RGB(244,186,1));//设置当前的填充颜色

	setfont(30,0,"Microsoft Yahei UI Bold");//设置字体

	char sq[] = "作者:LYE_LYE";
     outtextxy(155, 440, sq);


	 char rq[] = "联系QQ:2703164181";
     outtextxy(115,480, rq);
	 settextcolor(RED);//字体颜色
	 	char sbq[] = "温馨提醒:此界面均用鼠标左键点击";
     outtextxy(75, 520, sbq);
	 	settextcolor(RGB(150,126,104));
	setbkcolor(RGB(244,186,1));
	solidroundrect(146,140,188,170,10,10);//圆角梯形
    solidroundrect(78,140,118,170,10,10);//圆角梯形
		 	setbkcolor(RGB(251,248,241));
	setfont(30,0,"Microsoft Yahei UI Bold");//设置字体
	 char wq[] = "音乐:   开  /   关   ";
     outtextxy(18,140, wq);


}
void show2()
{
	cleardevice();//清屏
	RECT C2={60,60,640,790};
	drawtext("\n\n\n    游戏介绍:每次可以选择\n上下左右其中一个方向去滑动,\n每滑动一次,所有数字方块都会\n往滑动方向靠拢,系统也会在\n空白地方随机出现一个数字方\n块,相同数字会在靠拢碰撞时\n相加。不断的叠加,获得更高\n的分数\n\n\n\n\n   ",&C2,DT_WORDBREAK);

	RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
	drawtext("返回",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//                       单行显示 居中显示   垂直居中显示
	MOUSEMSG m;
	while(1)
	{
		m=GetMouseMsg();
		if(m.uMsg==WM_LBUTTONDOWN)
		{
			if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
				lent();
		}
	}
}
void show3()
{
	cleardevice();//清屏
	RECT C1={60,60,640,790};
	drawtext("\n\n\n操作说明:\n\n左移:  方向键←\n\n右移:  方向键→\n\n上移:  方向键↑\n\n下移:  方向键↓\n\n", &C1, DT_WORDBREAK);
	
	RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
	drawtext("返回",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

	MOUSEMSG m;
	while(1)
	{
		m=GetMouseMsg();
		if(m.uMsg==WM_LBUTTONDOWN)
		{
			if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
				lent();
		}
	}
}

void show4()
{
	cleardevice();//清屏
	setfont(100,0,"Microsoft Yahei UI Bold");//设置字体
	settextcolor(RGB(120,116,101));
	outtextxy(15,0,"2048");
	setfont(30,0,"Microsoft Yahei UI Bold");//设置字体

	setfillcolor(RGB(141,122,105));
	solidroundrect(13,85,200,127,15,15);
	setbkcolor(RGB(141,122,105));//背景颜色
	settextcolor(RGB(248,247,241));//字体颜色
	char wq[] = "音乐:开(n)/关(f)";
     outtextxy(18,90, wq);
	 solidroundrect(13,140,200,200,10,10);
	 settextcolor(RED);//字体颜色
	 char rq[] = "温馨提示:此界面";
     outtextxy(18,140, rq);
	 char fq[] = " 均用键盘输入。";
     outtextxy(18,170, fq);

	setfillcolor(RGB(184,175,160));//设置当前填充颜色
	solidroundrect(210,10,330,80,15,15);//圆角梯形
	setfont(28,0,"Microsoft Yahei UI Bold");//设置当前字体
	setbkcolor(RGB(184,175,160));//背景颜色
	settextcolor(RGB(248,247,241));//字体颜色
	outtextxy(230,20,"单次得分");
	char str[10],str_i[10]; 

	setbkcolor(RGB(184,175,160));
	itoa(score_i,str_i,10); 
	outtextxy(265,52,str_i);//分数
	

	solidroundrect(350,10,460,80,15,15);//圆角梯形
	outtextxy(380,20,"总分");
	setbkcolor(RGB(184,175,160));
	itoa(score,str,10); 
	outtextxy(395,52,str);//分数
	sco=score;

	setfillcolor(RGB(141,122,105));
	solidroundrect(210,95,460,137,15,15);
	setbkcolor(RGB(141,122,105));//背景颜色
	setfont(33,0,"Microsoft Yahei UI Bold");
	outtextxy(248,100,"返回主页面(esc)");

	setfillcolor(RGB(141,122,105));
	solidroundrect(210,152,460,195,15,15);
	setbkcolor(RGB(141,122,105));//背景颜色
	setfont(33,0,"Microsoft Yahei UI Bold");
	outtextxy(268,160,"重新开始(t)");

	setfillcolor(RGB(187,173,160));
	solidroundrect(10,210,470,670,20,20);
		if(judge())
		lose();
		int i,j;
	for(i=0;i<4;i++)
	{
		setfillcolor(RGB(206,192,181));
		for(j=0;j<4;j++)
		{
			solidroundrect(20+110*i,220+110*j,125+110*i,325+110*j,5,5);//圆角矩形
		}
	}
	IMAGE img0,img2,img4,img8,img16,img32,img64,img128,img256,img512,img1024,img2048;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			switch(data[j][i])
			{
				case 0:loadimage(&img0,".\\配置\\0.jpg");putimage(i*110+20,j*110+220,&img0);break;
				case 2:loadimage(&img2,".\\配置\\2.jpg");putimage(i*110+20,j*110+220,&img2);break;
				case 4:loadimage(&img4,".\\配置\\4.jpg");putimage(i*110+20,j*110+220,&img4);break;
				case 8:loadimage(&img8,".\\配置\\8.jpg");putimage(i*110+20,j*110+220,&img8);break;
				case 16:loadimage(&img16,".\\配置\\16.jpg");putimage(i*110+20,j*110+220,&img16);break;
				case 32:loadimage(&img32,".\\配置\\32.jpg");putimage(i*110+20,j*110+220,&img32);break;
				case 64:loadimage(&img64,".\\配置\\64.jpg");putimage(i*110+20,j*110+220,&img64);break;
				case 128:loadimage(&img128,".\\配置\\128.jpg");putimage(i*110+20,j*110+220,&img128);break;
				case 256:loadimage(&img256,".\\配置\\256.jpg");putimage(i*110+20,j*110+220,&img256);break;
				case 512:loadimage(&img512,".\\配置\\512.jpg");putimage(i*110+20,j*110+220,&img512);break;
				case 1024:loadimage(&img1024,".\\配置\\1024.jpg");putimage(i*110+20,j*110+220,&img1024);break;
				case 2048:loadimage(&img2048,".\\配置\\2048.jpg");putimage(i*110+20,j*110+220,&img2048);break;
			}
		}
	}
}
int judge()//检查游戏是否结束 
{
	int i,j;
	for(i=0;i<4;++i)
	{
        for(j=0;j<4;++j)
		{
            if(data[i][j]==0)//任意一点为空,游戏继续
                return 0;
            if(i>0)
			{
                if(data[i-1][j]==data[i][j])//任意两个相邻的单元值相同,游戏继续
                    return 0;
            }
            if(j>0)
                if(data[i][j-1]==data[i][j])
                    return 0;
        }
    }
    return 1;
}
void rands()
{
	int x,y,temp,num;
	srand((int)time(0));
	while(1)
	{
		x=rand()%4;
		y=rand()%4;
		temp=rand()%5;
		if(temp==1)
			num=4;
		else 
			num=2;
		if(data[y][x]==0)
		{
			data[y][x]=num;
			break;
		}
	}
}
void moveUP()//向上移动操作 
{
	int i,j;
	int m=0,n=0;
	for(i=0;i<4;i++)//列
	{
		//移动操作
		j=0;n=0;		 //j为当前判定的所在行
		while(n<3 && j<3)//n为移动的次数
		{
			if(data[j][i]==0)   //若发现空白格
			{
				for(m=j;m<3;m++)//下方数据向上平移1格,覆盖空白格
					data[m][i]=data[m+1][i];	
				data[3][i]=0;	//最后一行置0
				n++;			//移动的次数+1
				
			}else j++; //否则:让当前判定的所在行+1
		}

		//合并操作
		for(j=0;j<3;j++)//行
			if(data[j][i]==data[j+1][i] && data[j][i]!=0)//相同(且不是0)则合并
			{											 // 0和0不需要合并
				data[j][i]=data[j][i]*2;//上面的保存合并后的数字
				data[j+1][i]=0;			//下面的清零
				score_i=data[j][i];//得分
				score=score+score_i;
				
			}
		//移动操作
		j=0;n=0;
		while(n<3 && j<3)
		{
			if(data[j][i]==0)
			{
				for(m=j;m<3;m++)
					data[m][i]=data[m+1][i];	
				data[3][i]=0;
				n++;	
			}else j++;
		}
	}
	if(compareData()==0)
	{
		rands();
	}
}
void moveDOWN()//向下移动操作 
{
	int i,j;
	int m=0,n=0;
	for(i=0;i<4;i++)//列
	{
		//移动操作
		j=3;n=0;
		while(n<3 && j>0)
		{
			if(data[j][i]==0)
			{
				for(m=j;m>0;m--)data[m][i]=data[m-1][i];	
				data[0][i]=0;
				n++;	
			}else j--;
		}

		//合并操作
		for(j=3;j>0;j--)//行
			if(data[j][i]==data[j-1][i] && data[j][i]!=0)//相同(且不是0)则合并
			{
				data[j][i]=data[j][i]*2;//下面的保存合并后的数字
				data[j-1][i]=0;			//上面的清零
				score_i=data[j][i];//得分
				score=score+score_i;
			}
		//移动操作
		j=3;n=0;
		while(n<3 && j>0)
		{
			if(data[j][i]==0)
			{
				for(m=j;m>0;m--)data[m][i]=data[m-1][i];	
				data[0][i]=0;
				n++;	
			}else j--;
		}
	}
	if(compareData()==0)
	{
		rands();
	}
}
void moveLEFT()//向左移动操作 
{
	int i,j;
	int m=0,n=0;
	for(i=0;i<4;i++)
	{
		//移动操作
		j=0;n=0;
		while(n<3 && j<3)
		{
			if(data[i][j]==0)
			{
				for(m=j;m<3;m++)data[i][m]=data[i][m+1];	
				data[i][3]=0;
				n++;	
			}else j++;
		}
		//合并操作
		for(j=0;j<3;j++)
			if(data[i][j]==data[i][j+1] && data[i][j]!=0)
			{
				data[i][j]=data[i][j]*2;
				data[i][j+1]=0;	
				score_i=data[i][j];//得分
				score=score+score_i;	
			}
		//移动操作
		j=0;n=0;
		while(n<3 && j<3)
		{
			if(data[i][j]==0)
			{
				for(m=j;m<3;m++)data[i][m]=data[i][m+1];	
				data[i][3]=0;
				n++;	
			}else j++;
		}
	}
	if(compareData()==0)
	{
		rands();
	}
}
void moveRIGHT()//向右移动操作 
{
	int i,j;
	int m=0,n=0;
	for(i=0;i<4;i++)
	{
		//移动操作
		j=3;n=0;
		while(n<3 && j>0)
		{
			if(data[i][j]==0)
			{
				for(m=j;m>0;m--)data[i][m]=data[i][m-1];	
				data[i][0]=0;
				n++;	
			}else j--;
		}
		//合并操作
		for(j=3;j>0;j--)
			if(data[i][j]==data[i][j-1] && data[i][j]!=0)
			{
				data[i][j]=data[i][j]*2;
				data[i][j-1]=0;	
				score_i=data[i][j];//得分
				score=score+score_i;		
			}
		//移动操作
		j=3;n=0;
		while(n<3 && j>0)
		{
			if(data[i][j]==0)
			{
				for(m=j;m>0;m--)data[i][m]=data[i][m-1];
				data[i][0]=0;
				n++;	
			}else j--;
		}
	}
	if(compareData()==0)
	{
		rands();
	}
}
void updateWithInput()//与输入有关的更新
{
	

	int keyboard;
	EndBatchDraw();//结束批量绘图
	keyboard=getch(); 

	int i,j,num=0;
	copyData();

	if(keyboard==72)//上
	{
		moveUP();
	}
	else if(keyboard==80)//下
	{
		moveDOWN();
	}
	else if(keyboard==75)//左
	{
	moveLEFT();
	}
	else if(keyboard==77)//右
	{
		moveRIGHT();
	}
	if(keyboard==27)
		lent();
	else if(keyboard=='t')
	{
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				data[i][j]=0;
			score=0;
			rands();
			rands();
	}
	else if(keyboard=='n')
	{
mciSendString("open \".\\配置\\背景音乐.mp3\" alias music ", NULL, 0, NULL);//背景音乐
	mciSendString("play music", NULL, 0, NULL);
	}
	else if(keyboard=='f')
	{
			mciSendString("close music", NULL, 0, NULL);

	}
}
void win()
{
	mciSendString("close music", NULL, 0, NULL);
	mciSendString("open \".\\配置\\胜利.mp3\" alias music ", NULL, 0, NULL);//背景音乐
	mciSendString("play music", NULL, 0, NULL);
	cleardevice();//清屏
	settextcolor(RGB(249,6,43));
	setfont(40,0,"Microsoft Yahei UI Bold");
	RECT C2={60,300,640,790};
	drawtext("恭喜你完成了,真不错啊小伙子,继续努力。",&C2,DT_WORDBREAK);
	RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
	drawtext("回到主页面",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

	MOUSEMSG m;
	while(1)
	{
		m=GetMouseMsg();
		if(m.uMsg==WM_LBUTTONDOWN)
		{
			if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
				mciSendString("close music", NULL, 0, NULL);
				lent();
		}
	}

}
void lose()
{
	mciSendString("close music", NULL, 0, NULL);
	mciSendString("open \".\\配置\\失败.mp3\" alias music ", NULL, 0, NULL);//背景音乐
	mciSendString("play music", NULL, 0, NULL);

	cleardevice();//清屏
	settextcolor(RGB(0,0,0));
	setfont(40,0,"Microsoft Yahei UI Bold");
	RECT C2={60,300,640,790};
	drawtext("就这!!!你不行啊",&C2,DT_WORDBREAK);
	RECT R1={2,HEIGHT-200,WIDTH-2,HEIGHT-2};
	drawtext("回到主页面",&R1,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

	MOUSEMSG m;
	while(1)
	{
		m=GetMouseMsg();
		if(m.uMsg==WM_LBUTTONDOWN)
		{
			if(m.x>2&&m.x<WIDTH-2&&m.y>HEIGHT-200&&m.y<HEIGHT-2)
				mciSendString("close music", NULL, 0, NULL);
				lent();
		}
	}

}
void start()
{
	
	int i,j;
	for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				data[i][j]=0;
	rands();
	rands();
	while(1)
	{
		show4();
		BeginBatchDraw();//批量画图,无闪烁
		setbkcolor(RGB(251,248,241));
		updateWithInput();//与输入有关的更新	
		issuccess();
	}
}
void lent()
{
	mciSendString("close music", NULL, 0, NULL);
	mciSendString("open \".\\配置\\背景音乐.mp3\" alias music ", NULL, 0, NULL);//背景音乐
	mciSendString("play music repeat", NULL, 0, NULL);
	initgraph(WIDTH,HEIGHT);//长宽
	setbkcolor(RGB(251,248,241));//背景
	settextcolor(RGB(150,126,104));
	  	
	MOUSEMSG m;
	while(1)
	{
		show1();
         EndBatchDraw();//结束批量绘图
     	 BeginBatchDraw();//批量绘图
		m=GetMouseMsg();//获取鼠标信息
		if(m.uMsg==WM_LBUTTONDOWN)
		{		EndBatchDraw();//结束批量绘图
			if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3&&m.y<HEIGHT/3+30)
				start();
		
			else if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3+30&&m.y<HEIGHT/3+60)
				show2();
		
			else if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3+60&&m.y<HEIGHT/3+90)
				show3();
			
			else if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3+90&&m.y<HEIGHT/3+120)
				exit(0);
			else if(m.x>78&&m.x<118&&m.y>140&&m.y<170)
			{
				mciSendString("open \".\\配置\\背景音乐.mp3\" alias music ", NULL, 0, NULL);//背景音乐
				mciSendString("play music repeat ", NULL, 0, NULL);
			}
			else if(m.x>146&&m.x<188&&m.y>140&&m.y<170)
			{
				mciSendString("close music", NULL, 0, NULL);
			}
				
		}
	}

	_getch();
}

int main (void)
{	
	lent();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值