C语言项目 微信小游戏《羊了个羊》

C/C++
281
0
0
2023-05-05

需求

C语言项目

图形库:easyX

image:背景图bk.jpg,卡片图lingdang.png,shu.png,cao.png

miss:背景音乐yang.mp3

img

img

img

img

思路

首先需要导入图片

定义图片

三板斧:1.定义 2.加载 3.渲染

C

#include<stdio.h>
#include<easyx.h>
#include<windows.h>//导入音乐和图片时用到
#pragma comment(lib,"Winmm.lib")

//导入图片前先定义图片
IMAGE img_bk;//背景图片
IMAGE img_item[3];//三维数组

//定义宽高
const int WIDTH  = 400;
const int HEIGHT = 760;


void loadImag(){
	//加载
	loadimage(&img_bk,"images/bk.jpg", WIDTH, HEIGHT);
	loadimage(img_item + 0,"images/cao.png", 48, 48);//48是图片的大小 
	loadimage(img_item + 1,"images/lingdang.png", 48, 48);
	loadimage(img_item + 2,"images/shu.png", 48, 48);
}


int main(){
	


	return 0;
}

PS:

若在使用VS编写代码时使用loadimage()函数报错则可以在项目->项目属性 ->常规->字符集 中将Unicode更改为使用多字节字符集。

img

C

#include<stdio.h>
#include<easyx.h>
#include<windows.h>//播放音乐 的头文件
#pragma comment(lib,"Winmm.lib")//播放音乐 的库文件

//导入图片前先定义图片
IMAGE img_bk;//背景图片
IMAGE img_item[3];//三维数组

//定义宽高
const int WIDTH  = 400;
const int HEIGHT = 760;


void loadImg(){
	//加载
	loadimage(&img_bk,"images/bk.jpg", WIDTH, HEIGHT);
	loadimage(img_item + 0,"images/cao.png", 48, 48);//48是图片的大小 
	loadimage(img_item + 1,"images/lingdang.png", 48, 48);
	loadimage(img_item + 2,"images/shu.png", 48, 48);
}


int main(){
	
	//创建窗口
	initgraph(WIDTH,HEIGHT);
	//加载图片函数
	loadImg();

	//播放音乐
	mciSendString(_T("open micc/yang.mp3"), 0, 0, 0);
	mciSendString(_T("play micc/yang.mp3"), 0, 0, 0);

	return 0;
}

C

#include<stdio.h>
#include<easyx.h>
#include<windows.h>//播放音乐 的头文件
#pragma comment(lib,"Winmm.lib")//播放音乐 的库文件

//导入图片前先定义图片
IMAGE img_bk;//背景图片
IMAGE img_item[3];//三维数组

//定义宽高
const int WIDTH  = 400;
const int HEIGHT = 760;


void loadImg(){
	//加载
	loadimage(&img_bk,"images/bk.jpg", WIDTH, HEIGHT);
	loadimage(img_item + 0,"images/cao.png", 48, 48);//48是图片的大小 
	loadimage(img_item + 1,"images/lingdang.png", 48, 48);
	loadimage(img_item + 2,"images/shu.png", 48, 48);
}


int main(){
	
	//创建窗口
	initgraph(WIDTH,HEIGHT);
	//加载图片函数
	loadImg();

	//播放音乐
	mciSendString(_T("open micc/yang.mp3"), 0, 0, 0);
	mciSendString(_T("play micc/yang.mp3"), 0, 0, 0);
	
	//创建头数组
	// 初始化
	int map = [3][3] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			map[i][j] = i + 1;
		}
	}
	//创建尾数组

	return 0;
}

img

间隔

const int INTERVAL = 48;

img

C

#include<stdio.h>
#include<easyx.h>
#include<windows.h>//播放音乐 的头文件
#pragma comment(lib,"Winmm.lib")//播放音乐 的库文件

//导入图片前先定义图片
IMAGE img_bk;//背景图片
IMAGE img_item[3];//三维数组

//定义宽高
const int WIDTH  = 400;
const int HEIGHT = 760;
const int INTERVAL = 48;


void loadImg(){
	//加载
	loadimage(&img_bk,"images/bk.jpg", WIDTH, HEIGHT);
	loadimage(img_item + 0,"images/cao.png", 48, 48);//48是图片的大小 
	loadimage(img_item + 1,"images/lingdang.png", 48, 48);
	loadimage(img_item + 2,"images/shu.png", 48, 48);
}


int main(){
	
	//创建窗口
	initgraph(WIDTH,HEIGHT);
	//加载图片函数
	loadImg();

	//播放音乐
	mciSendString(_T("open micc/yang.mp3"), 0, 0, 0);
	mciSendString(_T("play micc/yang.mp3"), 0, 0, 0);
	
	//创建头数组
	// 初始化
	int map [3][3] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			map[i][j] = i + 1;
		}
	}

	//打乱数组,创造随机的图片分布
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			//数组当中的行和列随机打乱
			int i1 = rand() % 3;
			int j2 = rand() % 3;
			//打乱行和列 交换打乱
			int temp = map[i1][j2];
			map[i1][j2] = map[i][j];
			map[i][j] = temp;
		}
	}
	//算一下数组的位置在哪里
	//找到图片x
	int offsetX = (WIDTH - (2 * INTERVAL + 3 * 48)) / 2;
	//找到y的位置
	int offsetY = (HEIGHT - (2 * INTERVAL + 3 * 48)) / 2;

	//定义逻辑部分的下面的数组:7个卡槽
	int store[7] = { 0 };

	//绘制地图 定义,加载,绘制
	while (1)
	{
		//绘制背景地图
		putimage(0,0,&img_bk);
		//渲染 绘制
		for (int i = 0; i < 3; i++)
		{
			for (int j = 0; j < 3; j++)
			{
				//开始渲染
				if (map[i][j])//判断一下,如果map里有值就开始渲染
					//渲染需要萨格参数x,y,图片
					putimage(offsetX + j * (48 + INTERVAL), offsetY + i * (48 + INTERVAL),img_item + (map[i][j]));

			}
		}
		//点击了创建下面的数组,图片往下掉,进入卡槽
		ExMessage msg = {0};//鼠标点击的消息
		//点击鼠标后是否有消息,消息是WM_LBUTTONDOWN 左键
		if (peekmessage(&msg)&&msg.message == WM_LBUTTONDOWN){
			for (int i = 0; i < 3; i++){
				for (int j = 0; j < 3; j++){
					//鼠标坐标得X
					int x = offsetX + j * (48 + INTERVAL);
					//鼠标坐标Y
					int y = offsetY + i * (48 + INTERVAL);
					//判断鼠标是否点击了图片
					if (msg.x > x && msg.x< x + 48 && msg.y > y && msg.y < y + 48)
					{
						//求出图片对应的数组的位置
						int col = (msg.x - offsetX) / (48 + INTERVAL);
						int row = (msg.x - offsetX) / (48 + INTERVAL);

						//点击到图片渲染得到下面的数组
						for (int  i = 0; i < 7; i++)
						{
							//下面的数组没有
							if (store[i] == 0)
							{
								//上面的数组给下面的数组图片
								store[i] = map[row][col];
								break;
							}

						}
						//记录一下给的次数
						int cnt = 0;
						for (int i = 0; i < 7; i++)
						{
							if (store[i] == map[row][col]) {
								cnt++;
							}

						}
						if (cnt == 3) {
							//消除操作
							for (int i = 0; i < 7; i++)
							{
								
								if (store[i] == map[row][col]) {
									store[i] = 0;
								}
							}
						}
						map[row][col] = 0;
					}

				}
			}
		}

	}



	//创建尾数组

	return 0;
}

产生了两个问题:

1.图片闪烁

2.下面槽中美誉图片

C

#include<stdio.h>
#include<easyx.h>
#include<windows.h>//播放音乐 的头文件
#pragma comment(lib,"Winmm.lib")//播放音乐 的库文件

//导入图片前先定义图片
IMAGE img_bk;//背景图片
IMAGE img_item[3];//三维数组

//定义宽高
const int WIDTH  = 400;
const int HEIGHT = 760;
const int INTERVAL = 48;


void loadImg(){
	//加载
	loadimage(&img_bk,"images/bk.jpg", WIDTH, HEIGHT);
	loadimage(img_item + 0,"images/cao.png", 48, 48);//48是图片的大小 
	loadimage(img_item + 1,"images/lingdang.png", 48, 48);
	loadimage(img_item + 2,"images/shu.png", 48, 48);
}


int main(){
	
	//创建窗口
	initgraph(WIDTH,HEIGHT);
	//加载图片函数
	loadImg();

	//播放音乐
	mciSendString(_T("open micc/yang.mp3"), 0, 0, 0);
	mciSendString(_T("play micc/yang.mp3"), 0, 0, 0);
	
	//创建头数组
	// 初始化
	int map [3][3] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			map[i][j] = i + 1;
		}
	}

	//打乱数组,创造随机的图片分布
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			//数组当中的行和列随机打乱
			int i1 = rand() % 3;
			int j2 = rand() % 3;
			//打乱行和列 交换打乱
			int temp = map[i1][j2];
			map[i1][j2] = map[i][j];
			map[i][j] = temp;
		}
	}
	//算一下数组的位置在哪里
	//找到图片x
	int offsetX = (WIDTH - (2 * INTERVAL + 3 * 48)) / 2;
	//找到y的位置
	int offsetY = (HEIGHT - (2 * INTERVAL + 3 * 48)) / 2;

	//定义逻辑部分的下面的数组:7个卡槽
	int store[7] = { 0 };

	//绘制地图 定义,加载,绘制
	while (1)
	{
		//缓存机制
		BeginBatchDraw();
		//绘制背景地图
		putimage(0,0,&img_bk);
		//渲染 绘制
		for (int i = 0; i < 3; i++)
		{
			for (int j = 0; j < 3; j++)
			{
				//开始渲染
				if (map[i][j])//判断一下,如果map里有值就开始渲染
					//渲染需要萨格参数x,y,图片
					putimage(offsetX + j * (48 + INTERVAL), offsetY + i * (48 + INTERVAL),img_item + (map[i][j]));

			}
		}


		//绘制下面的图片
		for (int i = 0; i < 7; i++)
		{
			if (store[i])
			{
				putimage((i * 50) + 26, 620, img_item + (store[i] - 1));
			}
		}


		EndBatchDraw();
		//点击了创建下面的数组,图片往下掉,进入卡槽
		ExMessage msg = {0};//鼠标点击的消息
		//点击鼠标后是否有消息,消息是WM_LBUTTONDOWN 左键
		if (peekmessage(&msg)&&msg.message == WM_LBUTTONDOWN){
			for (int i = 0; i < 3; i++){
				for (int j = 0; j < 3; j++){
					//鼠标坐标得X
					int x = offsetX + j * (48 + INTERVAL);
					//鼠标坐标Y
					int y = offsetY + i * (48 + INTERVAL);
					//判断鼠标是否点击了图片
					if (msg.x > x && msg.x< x + 48 && msg.y > y && msg.y < y + 48)
					{
						//求出图片对应的数组的位置
						int col = (msg.x - offsetX) / (48 + INTERVAL);
						int row = (msg.y - offsetX) / (48 + INTERVAL);

						//点击到图片渲染得到下面的数组
						for (int  i = 0; i < 7; i++)
						{
							//下面的数组没有
							if (store[i] == 0)
							{
								//上面的数组给下面的数组图片
								store[i] = map[row][col];
								break;
							}

						}
						//记录一下给的次数
						int cnt = 0;
						for (int i = 0; i < 7; i++)
						{
							if (store[i] == map[row][col]) {
								cnt++;
							}

						}
						if (cnt == 3) {
							//消除操作
							for (int i = 0; i < 7; i++)
							{
								
								if (store[i] == map[row][col]) {
									store[i] = 0;
								}
							}
						}
						map[row][col] = 0;
					}

				}
			}
		}

	}



	//创建尾数组

	return 0;
}

上面代码仍有部分问题未解决:草未显示。

完整代码

可成功运行。

C

#include<easyx.h>
#include<stdio.h>
#include <windows.h>
#pragma  comment (lib,"winmm.lib")
const int WIDTH = 400;   // 宽度
const int HEIGHT = 760;  // 高度
const int INTERVAL = 48; // 间隔   图标得间隔
//  定义图片
IMAGE img_bk;
IMAGE img_item[3];    // 定义一个简单得三维数组  头得数组
void loadImg()
{
	loadimage(&img_bk, "images/bk.jpg", WIDTH, HEIGHT);
	loadimage(img_item + 0, "images/cao.png", 48, 48);
	loadimage(img_item + 1, "images/lingdang.png", 48, 48);
	loadimage(img_item + 2, "images/shu.png", 48, 48);
}
int main()
{
	initgraph(WIDTH, HEIGHT);
	loadImg();
	// 播放音乐
	mciSendString(_T("open micc/yang.mp3"), 0, 0, 0);
	mciSendString(_T("play micc/yang.mp3"), 0, 0, 0);

	// 创建一个头数组
	// 初始换 
	int map[3][3] = { 0 };
	for (int r = 0; r < 3; r++)
	{
		for (int c = 0; c < 3; c++)
		{
			map[r][c] = r + 1;  //1 2  3 
		}

	}
	// 打乱这个数组
	for (int r = 0; r < 3; r++)
	{
		for (int c = 0; c < 3; c++)
		{
		  // 数组当中得行和列随机打乱  1 2 3 
			int r1 = rand() % 3;  
			int c1 = rand() % 3;
			// 打乱行和列  交换打乱
			int temp = map[r1][c1]; 2,3,
			map[r1][c1] = map[r][c];
			// 交换
			map[r][c] = temp;
		}
	}
	// 算一下  数组得位置再哪里
	// 找到图片 x
	int  offsetX = (WIDTH - (2 * INTERVAL + 3 * 48)) / 2;
	// 找到y得位置
	int offsetY = (HEIGHT - (2 * INTERVAL + 3 * 48)) / 2;
	// 7个卡位
	int store[7] = { 0 };

	// 绘制地图   1 定义  2 加载  3  绘制
	while (true)
	{
		BeginBatchDraw();
		// 绘制地图  背景地图
		putimage(0, 0, &img_bk);
		// 绘制  渲染
		for (int  r = 0; r < 3; r++)
		{
			for (int  c = 0; c < 3; c++)
			{
				if (map[r][c])
					// 开始渲染             x  , y   图片
					putimage(offsetX + c * (48 + INTERVAL), offsetY + r * (48 + INTERVAL), 
						img_item + (map[r][c] - 1));
			}
		}
		for (int  i = 0; i < 7; i++)
		{
			if (store[i])
			{
				putimage((i * 50) + 26, 620, img_item + (store[i] - 1));
			}

		}
		EndBatchDraw();
		// 就是  需要 点击了  创建  下面得数组       
		ExMessage  msg = { 0 };
		// 点击鼠标以后  是否有消息  消息是     VM_LBUTTONDOWN 左键
		if (peekmessage(&msg) && msg.message ==WM_LBUTTONDOWN)
		{
			for (int r = 0; r < 3; r++) {
			
				for (int  c = 0; c < 3; c++)
				{
					// 鼠标坐标得x
					int  x = offsetX + c*(48 + INTERVAL);
					// 鼠标坐标y
					int y = offsetY + r * (48 + INTERVAL);
					// 判断一下鼠标是否点击了图片
					if (msg.x > x && msg.x < x + 48 && msg.y>y && msg.y < y + 48)
					{
						// 求出 图片对应数组得位置 
						int col = (msg.x - offsetX) / (48 + INTERVAL);
						int row = (msg.y - offsetY) / (48 + INTERVAL);

						// 点击到得图片渲染到下面得数组

						for (int i = 0; i < 7; i++)
						{
							// 下面得数组没有
							if (store[i] == 0) {
							 //  上面得数组给下面得数组图片
								store[i] = map[row][col];
								break;
							}
						}
						// 记录一下给得次数
						int cnt = 0;
						for (int  i = 0; i < 7; i++)
						{
							if (store[i] == map[row][col]) {
								cnt++;
							}
						}
						// 如果达到了3 
						if (cnt == 3)
						{
							for (int i = 0; i < 7; i++)
							{
								if (store[i] == map[row][col])
								{
									store[i] = 0;
								}
							}
						}
						map[row][col] = 0;
					}

				}
			
			}
		}

	}

	while (1);  // 防止闪退
	return 0;
}

文章作者: CtrlX