C++语言实现拼图游戏详解

目录
  • 开发环境:Visual Studio 2019,easyx图形库。
    • 游戏功能列表:
    • 游戏效果
    • 一.头文件和基本量
    • 二.封面
    • 三.数据初始化
    • 四.封面规则按钮
    • 五.构造拼图
    • 六.绘图函数
    • 七.背景音乐
    • 八.数据更新
    • 九.通关判断
    • 十.完整程序
  • 总结

开发环境:Visual Studio 2019,easyx图形库。

easyx下载官网:

EasyX Graphics Library for C++

https://easyx.cn/

easyx使用文档:

EasyX 文档 - 函数说明

https://docs.easyx.cn/zh-cn/reference

游戏功能列表:

其主要功能描述如下:

1.图片尺寸自适应

2.图片动态分割

3.查看原图

4.随机切换图片

5.鼠标拖动拼图<——>交换拼图块

6.自动判断拼图成功

拓展功能:

  • 背景音乐(开,关)
  • 游戏中Esc键返回桌面
  • 游戏规则窗口

游戏效果

封面(音乐按钮有点拉跨~)

游戏初始图(我的心是冰冰的)

通关图

一.头文件和基本量

#include<conio.h>
#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<Windows.h>
#include<mmsystem.h>    //音乐
#pragma comment(lib,"Winmm.lib")    //静态库,调用音乐
using namespace std;
constexpr auto N = 3;    //3*3拼图
IMAGE img[4], imgs[9];     //img存整张图片,imgs暂存拼图块
int aim_c, aim_r;          //拼图块坐标
int map[3][3] = { 0 };     //存拼图块
int NUM = 0;          //关卡数计数

二.封面

//开始界面
void start()
{
	loadimage(NULL, L"cover.jpg");
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(60, 0, _T("楷体"),0,0,4,false,false,false);
	outtextxy(180, 120, L"拼图游戏");                    //游戏名称
	settextstyle(30, 0, _T("微软雅黑"));
	setfillcolor(BROWN);
	setlinestyle(BS_SOLID, 5);
	setlinecolor(RED);
	fillroundrect(220, 220, 370, 270, 10, 10);
	settextstyle(30, 0, _T("宋体"), 0, 0, 6, false, false, false);  //开始按钮
	outtextxy(270, 230, L"开始");
	fillroundrect(220, 300, 370, 350, 10, 10);
	outtextxy(240, 310, L"游戏规则");
	setfillcolor(BROWN);
	setlinestyle(BS_SOLID, 5);
	setlinecolor(BLACK);
	fillcircle(490, 440, 30);  //音乐控制按钮:开
	fillcircle(560, 440, 30);  //音乐控制按钮:关
	outtextxy(380, 430, L"音乐:");
	setfillcolor(BLACK);
	POINT pts[] = { {481,425},{481,455},{507,440} };
	fillpolygon(pts, 3);
	fillrectangle(546, 425, 554, 455);
	fillrectangle(566, 425, 574, 455);
	rules();
}

三.数据初始化

//游戏初始化
void init()
{
	//加载资源图片,4张图4个关卡
	loadimage(&img[0], L"picture1.jpg",  600, 600);
	loadimage(&img[1], L"picture2.jpg", 600, 600);
	loadimage(&img[2], L"picture3.jpg", 600, 600);
	loadimage(&img[3], L"picture4.jpg", 600, 600);
	//设置最后一张图片为空白图片,作为目标图片
	loadimage(&imgs[8], L"white.jpg", 200, 200);
	//设置随机种子
	srand((unsigned)time(NULL));
}

四.封面规则按钮

//封面规则函数
int rules()
{
	  ExMessage Mou;    //鼠标消息
	  while (1)
	  {
		  Mou = getmessage(EM_MOUSE);
		  switch (Mou.message)    //对鼠标信息进行匹配
		  {
		  case WM_LBUTTONDOWN:            //按下左键
			  if (Mou.x >= 220 && Mou.x <= 370 && Mou.y >= 300 && Mou.y <= 350)
			  {
				  HWND hwnd = GetHWnd();
				  MessageBox(NULL, L"1.鼠标左键点击空白图处周围图片交换位置\n2.鼠标右键任意处按下显示参照图片\n3.鼠标中键更换背景图片\n4.按Esc键返回封面", L"游戏规则", MB_OKCANCEL);
				  break;                     //规则按钮
			  }
			  if (Mou.x >= 220 && Mou.x <= 370 && Mou.y >= 220 && Mou.y <= 270)
			  {
				  return 0;                  //开始按钮
			  }
			  if (Mou.x >= 460 && Mou.x <= 520 && Mou.y >= 410 && Mou.y <= 470)
			  {
				  BGM();                     //音乐播放按钮
				  break;
			  }
			  if (Mou.x >= 530 && Mou.x <= 590 && Mou.y >= 410 && Mou.y <= 470)
			  {
				  mciSendString(L"close back", 0, 0, 0);     //音乐关闭按钮
				  break;
			  }
		  }
	  }
 }

五.构造拼图

//拼图构造函数
void GameInit()
{
	//把拼图贴上去
	putimage(0, 0, &img[NUM]);
	//设置绘图目标为img对象   对拼图图片进行切割
	SetWorkingImage(&img[NUM]);
	for (int y = 0, n = 0; y < N; y++)
	{
		for (int x = 0; x < N; x++)
		{
			if (n == 8)	break;
			//获取100*100像素图片,存储在img中;
			getimage(&imgs[n++], x * 200, y * 200, (x + 1) * 200, (y + 1) * 200);
		}
	}
	//设置绘图目标为绘图窗口
	SetWorkingImage();
	//初始化地图0~15
	for (int i = 0, k = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			map[i][j] = k++;
		}
	}
	//打乱地图
	for (int k = 0; k <= 1000; k++)
	{
		//得到目标所在的行和列
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				if (map[i][j] == 8)  //空白图片作为交换目标
				{
					aim_r = i;
					aim_c = j;
					break;
				}
			}
		}
		//一千次打乱顺序之后需要将空白图片转移到右下角
		//可以封装成函数下面这个代码
		if (k == 1000)
		{
			//将空白图片循环转移到右下角
			while (aim_r < 2)
			{
				//保证空白目标在最下
				map[aim_r][aim_c] = map[aim_r + 1][aim_c];
				map[aim_r + 1][aim_c] = 8;
				aim_r++;
			}
			while (aim_c < 2)
			{
				//保证空白目标在最右
				map[aim_r][aim_c] = map[aim_r][aim_c + 1];
				map[aim_r][aim_c + 1] = 8;
				aim_c++;
			}
			return;
		}
		int dir = rand() % 4;   //随机一个方向
		switch (dir)
		{
		case 0:  //向上交换
			if (aim_r >= 1)
			{
				//空白图片和空白处上面的图片交换
				map[aim_r][aim_c] = map[aim_r - 1][aim_c];
				map[aim_r - 1][aim_c] = 8;
				break;
			}
		case 1:  //向下交换
			if (aim_r < 2)
			{
				//空白图片和空白处下面的图片交换
				map[aim_r][aim_c] = map[aim_r + 1][aim_c];
				map[aim_r + 1][aim_c] = 8;
				break;
			}
		case 2:  //向左交换
			if (aim_c >= 1)
			{
				//空白图片和空白处左边的图片交换
				map[aim_r][aim_c] = map[aim_r][aim_c - 1];
				map[aim_r][aim_c - 1] = 8;
				break;
			}
		case 3:  //向右交换
			if (aim_c < 2)
			{
				//空白图片和空白处右边的图片交换
				map[aim_r][aim_c] = map[aim_r][aim_c + 1];
				map[aim_r][aim_c + 1] = 8;
				break;
			}
		}
	}
}

六.绘图函数

//绘图函数
void DrawMap()
{
	FlushBatchDraw();  //开始渲染图片
	for (int y = 0; y < N; y++)
	{
		for (int x = 0; x < N; x++)
		{
			putimage(x * 200, y * 200, &imgs[map[y][x]]);
		}
	}
	EndBatchDraw();
}

七.背景音乐

//背景音乐函数
void BGM()
{
	//打开音乐,播放音乐
	mciSendStringW(L"open ./Thrills.mp3 alias back", NULL, 0, NULL);
	mciSendStringW(_T("play back repeat"), 0, 0, 0);
}

八.数据更新

//数据更新函数
void play()
{
	int col, row;  //鼠标点击的位置
	ExMessage msg;    //鼠标消息
	msg = getmessage(EM_MOUSE|EM_KEY);   //获取鼠标消息
	switch (msg.message)      //对鼠标消息进行匹配
	{
	case WM_LBUTTONDOWN:  //当鼠标消息是左键按下时
		//获取鼠标按下所在列
		col = msg.x / 200;
		if (msg.x == 600)
			col = 2;
		//获取鼠标按下所在行
		row = msg.y / 200;
		if (msg.y == 600)
			row = 2;
		//得到目标所在行和列
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				if (map[i][j] == 8)    //空白处为交换目标
				{
					aim_r = i;
					aim_c = j;
				}
			}
		}
		//判断鼠标点击位置和目标是否相邻,相邻交换数据
		if (row == aim_r && col == aim_c + 1 ||
			row == aim_r && col == aim_c - 1 ||
			row == aim_r + 1 && col == aim_c ||
			row == aim_r - 1 && col == aim_c)
		{
			//鼠标点击图片和空白目标图片交换
			map[aim_r][aim_c] = map[row][col];
			map[row][col] = 8;
		}
		DrawMap();
		break;
	case WM_RBUTTONDOWN: //当鼠标消息是右键按下时
		putimage(0, 0, &img[NUM]);   //将关卡图片贴到窗口上
		break;
	case WM_RBUTTONUP:  //当鼠标消息是右键抬起时
		DrawMap();
		break;
	case WM_MBUTTONDOWN:
		NUM++;
		if (NUM == 4)
			NUM = 0;   //返回第一张图
		//重新开始游戏
		GameInit(); //游戏初始化
		DrawMap();  //渲染地图
		break;
	case WM_KEYDOWN:
		if (msg.vkcode == VK_ESCAPE)    //按Esc键返回封面
		{
			start();
			break;
		}
	}
}

九.通关判断

//通关判断函数
void Judge()
{
	//判断当前每张图片是否在对应位置
	if (map[0][0] == 0 && map[0][1] == 1 && map[0][2] == 2 &&
		map[1][0] == 3 && map[1][1] == 4 && map[1][2] == 5 &&
		map[2][0] == 6 && map[2][1] ==7 && map[2][2] == 8 )
	{
		//挑战成功之后将全图贴上
		putimage(0, 0, &img[NUM++]);
		//四个关卡都胜利之后退出程序
		if (NUM == 4)
		{
			MessageBox(GetHWnd(), L"挑战成功", L"Vectory", MB_OK);
			exit(0);
			return;
		}
		//每过一个关卡判断是否进入下一个关卡
		if (MessageBox(GetHWnd(), L"是否进入下一关", L"Vectory", MB_YESNO) == IDYES)
		{
			//重新开始游戏
			GameInit(); //游戏初始化
			DrawMap();  //渲染地图
		}
		//退出游戏
		else exit(0);
	}
}

十.完整程序

#include<conio.h>
#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<Windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
using namespace std;
constexpr auto N = 3;
IMAGE img[4], imgs[9];
int aim_c, aim_r;
int map[3][3] = { 0 };
int NUM = 0;
//游戏规则,开始界面设计
void start();
//封面按钮
int rules();
//加载资源
void init();
//游戏数据初始化
void GameInit();
//游戏渲染
void DrawMap();
//播放音乐
void BGM();
//玩家操作
void play();
//判断输赢
void Judge();
int main()
{
	//设置窗口大小
	initgraph(6 * 100, 6 * 100);
	//设置图片
	start();
	init();
	GameInit();
	DrawMap();
	while (1)
	{
		play();
		Judge();
	}
	system("pause");//等待用户按键
	closegraph();
	return 0;
}
//开始界面
void start()
{
	loadimage(NULL, L"cover.jpg");
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);
	settextstyle(60, 0, _T("楷体"),0,0,4,false,false,false);
	outtextxy(180, 120, L"拼图游戏");                    //游戏名称
	settextstyle(30, 0, _T("微软雅黑"));
	setfillcolor(BROWN);
	setlinestyle(BS_SOLID, 5);
	setlinecolor(RED);
	fillroundrect(220, 220, 370, 270, 10, 10);
	settextstyle(30, 0, _T("宋体"), 0, 0, 6, false, false, false);  //开始按钮
	outtextxy(270, 230, L"开始");
	fillroundrect(220, 300, 370, 350, 10, 10);
	outtextxy(240, 310, L"游戏规则");
	setfillcolor(BROWN);
	setlinestyle(BS_SOLID, 5);
	setlinecolor(BLACK);
	fillcircle(490, 440, 30);  //音乐控制按钮:开
	fillcircle(560, 440, 30);  //音乐控制按钮:关
	outtextxy(380, 430, L"音乐:");
	setfillcolor(BLACK);
	POINT pts[] = { {481,425},{481,455},{507,440} };
	fillpolygon(pts, 3);
	fillrectangle(546, 425, 554, 455);
	fillrectangle(566, 425, 574, 455);
	rules();
}
//游戏初始化
void init()
{
	//加载资源图片,4张图4个关卡
	loadimage(&img[0], L"picture1.jpg",  600, 600);
	loadimage(&img[1], L"picture2.jpg", 600, 600);
	loadimage(&img[2], L"picture3.jpg", 600, 600);
	loadimage(&img[3], L"picture4.jpg", 600, 600);
	//设置最后一张图片为空白图片,作为目标图片
	loadimage(&imgs[8], L"white.jpg", 200, 200);
	//设置随机种子
	srand((unsigned)time(NULL));
}
//封面选项函数
int rules()
{
	  ExMessage Mou;    //鼠标消息
	  while (1)
	  {
		  Mou = getmessage(EM_MOUSE);
		  switch (Mou.message)    //对鼠标信息进行匹配
		  {
		  case WM_LBUTTONDOWN:            //按下左键
			  if (Mou.x >= 220 && Mou.x <= 370 && Mou.y >= 300 && Mou.y <= 350)
			  {
				  HWND hwnd = GetHWnd();
				  MessageBox(NULL, L"1.鼠标左键点击空白图处周围图片交换位置\n2.鼠标右键任意处按下显示参照图片\n3.鼠标中键更换背景图片\n4.按Esc键返回封面", L"游戏规则", MB_OKCANCEL);
				  break;                     //规则按钮
			  }
			  if (Mou.x >= 220 && Mou.x <= 370 && Mou.y >= 220 && Mou.y <= 270)
			  {
				  return 0;                  //开始按钮
			  }
			  if (Mou.x >= 460 && Mou.x <= 520 && Mou.y >= 410 && Mou.y <= 470)
			  {
				  BGM();                     //音乐播放按钮
				  break;
			  }
			  if (Mou.x >= 530 && Mou.x <= 590 && Mou.y >= 410 && Mou.y <= 470)
			  {
				  mciSendString(L"close back", 0, 0, 0);     //音乐关闭按钮
				  break;
			  }
		  }
	  }
 }
//拼图构造函数
void GameInit()
{
	//把拼图贴上去
	putimage(0, 0, &img[NUM]);
	//设置绘图目标为img对象   对拼图图片进行切割
	SetWorkingImage(&img[NUM]);
	for (int y = 0, n = 0; y < N; y++)
	{
		for (int x = 0; x < N; x++)
		{
			if (n == 8)	break;
			//获取100*100像素图片,存储在img中;
			getimage(&imgs[n++], x * 200, y * 200, (x + 1) * 200, (y + 1) * 200);
		}
	}
	//设置绘图目标为绘图窗口
	SetWorkingImage();
	//初始化地图0~15
	for (int i = 0, k = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			map[i][j] = k++;
		}
	}
	//打乱地图
	for (int k = 0; k <= 1000; k++)
	{
		//得到目标所在的行和列
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				if (map[i][j] == 8)  //空白图片作为交换目标
				{
					aim_r = i;
					aim_c = j;
					break;
				}
			}
		}
		//一千次打乱顺序之后需要将空白图片转移到右下角
		//可以封装成函数下面这个代码
		if (k == 1000)
		{
			//将空白图片循环转移到右下角
			while (aim_r < 2)
			{
				//保证空白目标在最下
				map[aim_r][aim_c] = map[aim_r + 1][aim_c];
				map[aim_r + 1][aim_c] = 8;
				aim_r++;
			}
			while (aim_c < 2)
			{
				//保证空白目标在最右
				map[aim_r][aim_c] = map[aim_r][aim_c + 1];
				map[aim_r][aim_c + 1] = 8;
				aim_c++;
			}
			return;
		}
		int dir = rand() % 4;   //随机一个方向
		switch (dir)
		{
		case 0:  //向上交换
			if (aim_r >= 1)
			{
				//空白图片和空白处上面的图片交换
				map[aim_r][aim_c] = map[aim_r - 1][aim_c];
				map[aim_r - 1][aim_c] = 8;
				break;
			}
		case 1:  //向下交换
			if (aim_r < 2)
			{
				//空白图片和空白处下面的图片交换
				map[aim_r][aim_c] = map[aim_r + 1][aim_c];
				map[aim_r + 1][aim_c] = 8;
				break;
			}
		case 2:  //向左交换
			if (aim_c >= 1)
			{
				//空白图片和空白处左边的图片交换
				map[aim_r][aim_c] = map[aim_r][aim_c - 1];
				map[aim_r][aim_c - 1] = 8;
				break;
			}
		case 3:  //向右交换
			if (aim_c < 2)
			{
				//空白图片和空白处右边的图片交换
				map[aim_r][aim_c] = map[aim_r][aim_c + 1];
				map[aim_r][aim_c + 1] = 8;
				break;
			}
		}
	}
}
//绘图函数
void DrawMap()
{
	FlushBatchDraw();  //开始渲染图片
	for (int y = 0; y < N; y++)
	{
		for (int x = 0; x < N; x++)
		{
			putimage(x * 200, y * 200, &imgs[map[y][x]]);
		}
	}
	EndBatchDraw();
}
//背景音乐函数
void BGM()
{
	//打开音乐,播放音乐
	mciSendStringW(L"open ./Thrills.mp3 alias back", NULL, 0, NULL);
	mciSendStringW(_T("play back repeat"), 0, 0, 0);
}
//数据更新函数
void play()
{
	int col, row;  //鼠标点击的位置
	ExMessage msg;    //鼠标消息
	msg = getmessage(EM_MOUSE|EM_KEY);   //获取鼠标消息
	switch (msg.message)      //对鼠标消息进行匹配
	{
	case WM_LBUTTONDOWN:  //当鼠标消息是左键按下时
		//获取鼠标按下所在列
		col = msg.x / 200;
		if (msg.x == 600)
			col = 2;
		//获取鼠标按下所在行
		row = msg.y / 200;
		if (msg.y == 600)
			row = 2;
		//得到目标所在行和列
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				if (map[i][j] == 8)    //空白处为交换目标
				{
					aim_r = i;
					aim_c = j;
				}
			}
		}
		//判断鼠标点击位置和目标是否相邻,相邻交换数据
		if (row == aim_r && col == aim_c + 1 ||
			row == aim_r && col == aim_c - 1 ||
			row == aim_r + 1 && col == aim_c ||
			row == aim_r - 1 && col == aim_c)
		{
			//鼠标点击图片和空白目标图片交换
			map[aim_r][aim_c] = map[row][col];
			map[row][col] = 8;
		}
		DrawMap();
		break;
	case WM_RBUTTONDOWN: //当鼠标消息是右键按下时
		putimage(0, 0, &img[NUM]);   //将关卡图片贴到窗口上
		break;
	case WM_RBUTTONUP:  //当鼠标消息是右键抬起时
		DrawMap();
		break;
	case WM_MBUTTONDOWN:
		NUM++;
		if (NUM == 4)
			NUM = 0;   //返回第一张图
		//重新开始游戏
		GameInit(); //游戏初始化
		DrawMap();  //渲染地图
		break;
	case WM_KEYDOWN:
		if (msg.vkcode == VK_ESCAPE)    //按Esc键返回封面
		{
			start();
			break;
		}
	}
}
//通关判断函数
void Judge()
{
	//判断当前每张图片是否在对应位置
	if (map[0][0] == 0 && map[0][1] == 1 && map[0][2] == 2 &&
		map[1][0] == 3 && map[1][1] == 4 && map[1][2] == 5 &&
		map[2][0] == 6 && map[2][1] ==7 && map[2][2] == 8 )
	{
		//挑战成功之后将全图贴上
		putimage(0, 0, &img[NUM++]);
		//四个关卡都胜利之后退出程序
		if (NUM == 4)
		{
			MessageBox(GetHWnd(), L"挑战成功", L"Vectory", MB_OK);
			exit(0);
			return;
		}
		//每过一个关卡判断是否进入下一个关卡
		if (MessageBox(GetHWnd(), L"是否进入下一关", L"Vectory", MB_YESNO) == IDYES)
		{
			//重新开始游戏
			GameInit(); //游戏初始化
			DrawMap();  //渲染地图
		}
		//退出游戏
		else exit(0);
	}
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++实现趣味扫雷游戏

    本文实例为大家分享了C++实现趣味扫雷游戏的具体代码,供大家参考,具体内容如下 流程设计 1.初始化阵列. 2.输入坐标点. 3.选择:挖掘,标记,取消标记,重启,退出游戏. 如果选了挖掘,判断坐标点是地雷则游戏结束,是数字则显示数字并回到2,是空格则显示周围8个元素值并直到连带的空格显示完了回到2: 如果选了标记,将该点的元素值设为-2并回到2: 如果选了取消标记,初始化该点,回到2: 如果选了重启,则初始化阵列,回到2: 如果选了退出游戏,则exit. 4.挖掘完所有非地雷点后,游戏胜利,选

  • C++实现简易贪吃蛇游戏

    C++实现建议贪吃蛇(不会闪屏幕) 使用vs2013完成.记录踏上游戏开发的道路. 效果图 代码 // 2021.7.24.1贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <list> #include <numeric> #include <algorithm> #include <Windows.h> #includ

  • C++实现拼图游戏代码(graphics图形库)

    本文实例为大家分享了C++实现拼图游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<graphics.h> #include<string.h> int map[4][3]; int num = 0; IMAGE image1, image2, image3, image4,

  • 用C++实现推箱子小游戏

    前言 推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器. 代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其实用全局变量声明会简洁很多. 头文件和main函数分享在最下面了. 提示:以下是本篇文章正文内容,下面案例可供参考 一.初始化游戏数据 void GameInit(int(*&pMap)[10][10], int index)//两张地图数据 { // static:返回静态全局区变量 static int loca

  • C/C++实现推箱子小游戏

    本文实例为大家分享了C/C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 效果演示 实现功能 如上图所示.按键控制小猪的运动,推箱子到达目的地. 如何实现 1.首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组. 2.定义小猪,箱子,墙,空地等信息在三维数组里的数值. 空地             0       墙               1  目的地           2     箱子             3  猪               4  2+4=6

  • C++实现简单贪吃蛇小游戏

    本文实例为大家分享了C++实现简单贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 1 贪吃蛇游戏原理 1.1 构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置. 1.2 移动效果:每次移动时,将每一节蛇身(蛇头除外)依次往前移动一节,去掉蛇的最后一节,确定蛇的方向 1.3 移动判断:每次移动时,判断蛇头是否触碰食物,如果碰到了食物,只进行前移蛇身和增加蛇头的操作,不进行擦除蛇尾的操作 2游戏设计 2.1 游戏首页 2.2 开始游戏 2.3 退出游戏 3.游戏实现 3.1 游戏首

  • C++语言实现拼图游戏详解

    目录 开发环境:Visual Studio 2019,easyx图形库. 游戏功能列表: 游戏效果 一.头文件和基本量 二.封面 三.数据初始化 四.封面规则按钮 五.构造拼图 六.绘图函数 七.背景音乐 八.数据更新 九.通关判断 十.完整程序 总结 开发环境:Visual Studio 2019,easyx图形库. easyx下载官网: EasyX Graphics Library for C++ https://easyx.cn/ easyx使用文档: EasyX 文档 - 函数说明 ht

  • C语言实现扫雷游戏详解(附源码)

    目录 1.游戏的功能 2.游戏实现的基本思路 2.1实现菜单给玩家选择 2.2初始化棋盘 2.3数组大小的问题 2.4对棋盘赋值 2.5打印棋盘 2.6布置雷 2.7排查雷 3.代码基本实现部分 3.1主函数部分 3.2 初始化棋盘 3.3对两个棋盘进行赋值 3.4打印棋盘 3.5布置雷 3.6排查雷  3.7函数声明 4.扫雷游戏的源代码 总结 1.游戏的功能 游戏的主要功能有 1:棋盘内有若干个雷 2:玩家输入要排查雷的坐标 3:在玩家输入的坐标处显示周围八个坐标有几个雷 3:若玩家将所有的

  • C语言实现扫雷游戏详解(附源码)

    目录 1.游戏的功能 2.游戏实现的基本思路 2.1实现菜单给玩家选择 2.2初始化棋盘 2.3数组大小的问题 2.4对棋盘赋值 2.5打印棋盘 2.6布置雷 2.7排查雷 3.代码基本实现部分 3.1主函数部分 3.2 初始化棋盘 3.3对两个棋盘进行赋值 3.4打印棋盘 3.5布置雷 3.6排查雷  3.7函数声明 4.扫雷游戏的源代码 总结 1.游戏的功能 游戏的主要功能有 1:棋盘内有若干个雷 2:玩家输入要排查雷的坐标 3:在玩家输入的坐标处显示周围八个坐标有几个雷 3:若玩家将所有的

  • C语言实现扫雷游戏详解

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 功能设计 扫雷大家应该都玩过,这是一个十分经典的游戏,今天我将给大家讲解如何用C语言实现扫雷,我的这个扫雷有如下几个功能: 1.显示该点周围雷的个数 2.第一次下子,不炸死 3.坐标周围没雷,可以实现展开 4.游戏结束后展示玩家用时 效果展示 话不多说,先附上效果图: 设计思路 我们只要输入坐标就可以扫雷了,是不是很有趣? 其实要想实现这也不难,我们要用几个算法模块来模拟游戏规则,需要用函数来调用各个模块使游戏跑起来.

  • Android实现美女拼图游戏详解

    先来看看效果: 图片切分很多份,点击交换拼成一张完整的:这样关卡也很容易设计,3 3:4 4:5 5:6 6:一直下去 加了个切换动画,效果还是不错的,其实游戏就是自定义了一个控件,下面我们开始自定义之旅. 游戏的设计 首先我们分析下如何设计这款游戏: 1.我们需要一个容器,可以放这些图片的块块,为了方便,我们准备使用RelativeLayout配合addRule实现 2.每个图片的块块,我们准备使用ImageView 3.点击交换,我们准备使用传统的TranslationAnimation来实

  • C语言实现的一个三子棋游戏详解流程

    目录 前言 一.三子棋完成程序运行结果 二.三子棋代码实现 1.创建源文件与头文件 2.整体页面的制作 3.制作并打印棋盘 1.在test.c文件中,定义函数game(); 2.在game.h 头文件中 3.在game.c源文件中 4.人机互动下棋 1.在test.c源文件中 2.在game.h头文件中 3.在game.c源文件中 4.此时打印效果 5.判断输赢 1.在test.c源文件中 2.在game.h头文件中 3.在game.c源文件中 4.最终实现结果 最后 前言 三子棋是我们先前所学

  • Java实现简单的迷宫游戏详解

    目录 前言 主要设计 功能截图 代码实现 窗口布局 核心算法 总结 前言 人类建造迷宫已有5000年的历史.在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲.困难重重的小路吃力地行走,寻找真相.迷宫类小游戏应运而生.在游戏中,迷宫被表现为冒险舞台里,藏有各式各样奇妙与谜题或宝藏的危险区域.型态有洞窟.人工建筑物.怪物巢穴.密林或山路等.迷宫内有恶徒或凶猛的生物(真实存在或想像物体都有)徘徊,其中可能会有陷阱.不明设施.遗迹等. <简单迷宫>游戏是用java语言实现,采用了sw

  • Java实现飞机大战-II游戏详解

    目录 前言 主要设计 功能截图 代码实现 启动类 玩家飞机 总结 前言 <飞机大战-II>是一款融合了街机.竞技等多种元素的经典射击手游.华丽精致的游戏画面,超炫带感的技能特效,超火爆画面让你肾上腺素爆棚,给你带来全方位震撼感受,体验飞行战斗的无限乐趣. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求: 玩家控制一台战斗机,以保证自己不被敌机消灭,消灭越多的敌机可以收取能量,补充玩家战斗机数量.玩家战斗机数量为0,则游戏结束. 主要设计 1

  • Qt利用QDrag实现拖拽拼图功能详解

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 main.cpp 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 4.3 PiecesList类 4.4 PuzzleWidget类 五.效果演示 一.项目介绍 本文介绍利用QDrag类实现拖拽拼图功能.左边是打散的图,拖动到右边进行复现,此外程序还支持手动拖入原图片. 二.项目基本配置 新建一个Qt案例,项目名称为“puzzle”,基类选择“QMainWindow”,取消选中创建

  • 基于JS脚本语言的基础语法详解

    JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱类型语言: 开始时要嵌入JS代码:<script type="text/javascript"></script>: 关于写程序是需注意的基本语法: 1.所有的字符全都是英文半角的: 2.大部分情况下每条语句结束后要加分号: 3.每一块代码结束后加换行:4.程序前呼

随机推荐