整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

C语言项目实战:《拼图游戏》零基础项目!250 行源

C语言项目实战:《拼图游戏》零基础项目!250 行源码注释示例

篇文章主要为大家详细介绍了C语言实现——《拼图游戏项目》,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

网图

游戏介绍:

对刚开始接触拼图的玩家而言,所谓入门级的拼图主要是取决于图案的一些特征。那些图案内容比较丰富的,也就是说,在整幅画面的各个角落里也有内容相对完整的子画面的,且色彩和轮廓反差较大的,这样的拼图玩起来就相对容易一些。因为在拼组的局部,想要寻找合适的零片,可选的零片总能被限制在比较小的范围内

项目技术:

1.二维数组

2.可视化编程

2.1 动态制作

3.切割技术

3.1 实现图片的自动切割

4.鼠标操作

4.1 玩游戏的内容

对逻辑也是有一定的要求,但是这些在我们项目源码里面都会有注释,大家到时候学习的时候千万不要忽略注释,注释可以更好地帮你理解代码,尤其是C语言初学者。

本项目编译环境:VS2019/VS2013;

插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;

效果图展示

配套讲解教程:游戏教程——哔哩哔哩

源代码示例:

#include <graphics.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
/******************************************/
//			全局变量的定义
IMAGE img, blank;			//美女和空的
int array2D[4][4];
int array1D[15]={ 0 };
struct pos
{
	int i;
	int j;
}mypos={0,0};
struct pos searchPos(int array2D[][4], int i,int j)
{
	for (i=0; i <=3; i++)
	{
		for (j=0; j <=3; j++)
		{
			if (array2D[i][j]==15)
			{
				mypos.i=i;
				mypos.j=j;
				return mypos;
			}
		}
	}
	return mypos;
}
/******************************************/
//			绘制开始菜单
void drawMenu()
{
	initgraph(640, 450);
	setbkcolor(WHITE);		//设置窗口颜色为白色
	cleardevice();			//刷新显示
	setfillcolor(LIGHTBLUE);	//设置填充颜色为淡蓝色
	settextstyle(30, 0, "字魂24号-镇魂手书");
	setbkmode(TRANSPARENT);			//透明方式去掉文字背景
	//画矩形
	fillrectangle(240, 100, 380, 150);
	fillrectangle(240, 100+60, 380, 150 + 60);

	//文字输出
	outtextxy(240 + 20, 100 + 13, "开始游戏");
	outtextxy(240 + 20, 100 + 13 + 60, "退出游戏");
	settextcolor(RED);		//设置文字颜色为红色
	outtextxy(130, 280, "顿开教育莫影拼图游戏 v1.0版本");

	MOUSEMSG m;
	//鼠标操作
	while (1)
	{
		m=GetMouseMsg();
		//当鼠标放到矩形区域,画一个矩形
		if (m.x >=240 && m.x <=380 && m.y >=100 && m.y <=150)
		{
			setlinecolor(RED);
			rectangle(240 - 5, 100 - 5, 380 + 5, 150 + 5);
			if (m.uMsg==WM_LBUTTONDOWN)
			{
				break;
			}
		}
		else if (m.x >=240 && m.x <=380 && m.y >=160 && m.y <=210)
		{
			setlinecolor(RED);
			rectangle(240 - 5, 160 - 5, 380 + 5, 210 + 5);
			if (m.uMsg==WM_LBUTTONDOWN)
			{
				exit(0);
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(240 - 5, 100 - 5, 380 + 5, 150 + 5);
			rectangle(240 - 5, 160 - 5, 380 + 5, 210 + 5);
		}
	}
	closegraph();
}
/******************************************/
//			加载资源
void loadResource()
{
	srand((unsigned int)time(NULL));
	int length=15;
	int pos=0;
		int i, j;
	//1.给一维数组初始化0-15
	for (i=0; i < 15; i++)
	{
		//0-14
		array1D[i]=i;
	}

	//2.随机出来一个下表
	for (i=0; i < 4; i++)
	{
		for (j=0; j < 4; j++)
		{
			//单独处理最后一个位置
			if (i==3 && j==3)
			{
				array2D[3][3]=15;
				break;
			}
			pos=rand() % length;
			array2D[i][j]=array1D[pos];
			for (int k=pos; k < length; k++)
			{
				array1D[k]=array1D[k + 1];
			}
			length--;
		}
		if (i==3 && j==3)
		{
			array2D[3][3]=15;
			break;
		}
	}
	//缩放加载
	loadimage(&img, "Love.jpg", 800, 800);
	loadimage(&blank, "blank.jpg", 200, 200);
}
/******************************************/
//			绘图过程
void drawMap()
{
	//根据打乱顺序的二维数组中的值去拿照片中相应的位置
	for (int i=0; i < 4; i++)
	{
		for (int j=0; j < 4; j++)
		{
			int x=j * 200;
			int y=i * 200;
			switch (array2D[i][j])
			{
			case 0:
			case 1:
			case 2:
			case 3:
				putimage(x, y, 200, 200, &img, array2D[i][j] * 200, 0);
				break;
			case 4:
			case 5:
			case 6:
			case 7:
				putimage(x, y, 200, 200, &img, (array2D[i][j]-4) * 200, 200);
				break;
			case 8:
			case 9:
			case 10:
			case 11:
				putimage(x, y, 200, 200, &img, (array2D[i][j] - 8) * 200, 400);
				break;
			case 12:
			case 13:
			case 14:
				putimage(x, y, 200, 200, &img, (array2D[i][j] - 12) * 200, 600);
				break;
			case 15:
				putimage(x, y, &blank);
				break;
			}
		}
	}
}
/******************************************/
//			游戏过程
void playGame()
{
	MOUSEMSG m;
			//白块在数组那个位置
	int j_Mouse, i_Mouse;	//鼠标点在数组那个位置
	while (1)
	{
		drawMap();			//第一次显示
		//换之前定位 白块在哪里
		int i=0, j=0;
		searchPos(array2D, 3, 3);
		i=mypos.i;
		j=mypos.j;

		m=GetMouseMsg();
		switch (m.uMsg)
		{
		case WM_LBUTTONDOWN:
			j_Mouse=m.x / 200;
			i_Mouse=m.y / 200;
			if (i >=0 && j < 4&&i<4&&j>=0)
			{
				if (i_Mouse==i + 1&&i+1<=3 && j_Mouse==j)
				{
					array2D[i][j]=array2D[i_Mouse][j_Mouse];
					array2D[i_Mouse][j_Mouse]=15;
					break;
				}
				if (i_Mouse==i - 1 && i - 1 >=0 && j_Mouse==j)
				{
					array2D[i][j]=array2D[i_Mouse][j_Mouse];
					array2D[i_Mouse][j_Mouse]=15;
					break;
				}
				if (i_Mouse==i  && j_Mouse==j - 1&&j-1>=0)
				{
					array2D[i][j]=array2D[i_Mouse][j_Mouse];
					array2D[i_Mouse][j_Mouse]=15;
					break;
				}
				if (i_Mouse==i  && j_Mouse==j + 1&&j+1<=3)
				{
					array2D[i][j]=array2D[i_Mouse][j_Mouse];
					array2D[i_Mouse][j_Mouse]=15;
					break;
				}
			}
			break;
		}
	}
}
/******************************************/
//			游戏过程
void GameOve()
{
	int flag=1;
}
int main()
{
	drawMenu();
	loadResource();
	initgraph(800, 800);
	playGame();

	closegraph();
	return 0;
}

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

最亲爱的伙计们,经过了一个漫长的51假期,鄙人宣布正式上班啦~

做自媒体的朋友肯定知道,有时候需要将视频一张张的截取出来,图片少的还好,真遇上多的,确实是挺累的。

还真是不巧,最近鄙人也在郁闷这个事。网上倒是有这样子的软件,不过需要花钱,像我这种一年半载用不到几次的人,充毛线钱?但不买吧,你一张张的截图那麻烦死,于是呢就有了今天的文章。

效果图:

环境拓扑:

系统:windows7

openCV:2.4.X

语言:C++

工具:Visual Studio 2013

注:opencv的环境变量配置:

鄙人的opencv安装路径为:D:\opencv\opencv,大家按实际情况来,把bin目录添加进去。

添加环境变量:

D:\opencv\opencv\build\x64\vc12\bin;D:\opencv\opencv\build\x86\vc12\bin;(不要忘记“;”)

VS工程文件:

打开Visual Studio 2013然后点击“文件”--“新建”--“项目”,创建一个“wind32控制台应用程序”

创建完毕之后就开始我们的配置开发环境,这很重要!

点项目-进入属性页,修改几个地方:

1.包含目录配置:

注:这个地方的路径填三个同样用;号分割:

(1)OpenCV安装目录下的...\include目录

(2)OpenCV安装目录下的...\include\opencv目录

(3)OpenCV安装目录下的...\include\opencv2目录

2.库目录配置:

OpenCV目录下的...x64\vc12\lib

注:此处的x64表示电脑是64位,32位选择x86,无论是32还是64,路径下的目录都是一样的。

拓扑:vc10表示VS是2010,vc11对应VS2012,vc12对应VS2013,vc14对应VS2015

3.链接器配置:

连接器就是OpenCV安装目录下的库,直接复制过来就行。

注:末尾带d的为debug,不带d的为release,如opencv_core249d.lib/opencv_core249.lib分别为debug/release

参考路径:D:\opencv\opencv\build\x64\vc12\lib

你只需要把上面的这些乱七八糟的东西做完就可以进入正规了,看起来也不是特别麻烦嘿嘿嘿。

代码部分:

鄙人因为讲究“体面”,写的程序是带图形化界面的,当然这些都不是精华,我们今天只做一个控制台的程序就OK,都一样用~

几个小知识:

1.为什么char *xx=new char[x]最后需要delete[],而平时用的char *x=“xxxx”却不需要?

在C++中new出的空间是创建在堆上,系统不会清除,由人工干预;而第二种创建的空间在栈上,由系统自动清理。

2.sprintf跟printf有什么区别?

sprintf函数会将内容打印到某个指定字符串中,而printf函数是打印输出到屏幕上。sprintf函数多用在完成其他数据类型转换成字符串类型的操作中。

测试效果:

我们把代码写完,点编译。

注:鄙人这里直接编译运行,cmd黑框会一闪而过,目前原因不明,只能去工程的debug目录在cmd下运行。

我们找一个10秒的视频放在debug的目录下面,也就是我们编译好的exe文件的根目录,然后cmd运行我们变异好的程序,我们可以发现在指定的图片保存目录下生成了296张图片。

这个1.MP4的时长为12秒,296/12=24.4计算结果为24帧每秒,效果还是不错的~

好嘞,今天的文章就写到这了。

源码明天微头条公布~

用VS2013实现加载页,包括加载进度条和加载字样,详细代码如下:

LoadingLayer.h:

#include <stdio.h>

#include "cocos2d.h"

#include "OnlyOneShotUtils.h"

using namespace cocos2d;

class LoadingLayer : public Scene {

public:

static Scene* createScene();

CREATE_FUNC(LoadingLayer);

void callback();

public:

virtual bool init();

static Sprite* getSprite(std::string pStr);

}