C语言小白适合入门的项目——扫雷

编译软件:VS/VC
安装图形库 www.easyx.cn
素材  几张图片
1.分析代码需要
   呈现一个效果
   响应点击的位置 翻开合适的区域
   判断当前游戏是否结束

2.数据存储
    地图 --->每个元素视为一个数字--->多个数字--->数组
            二维地图--->二维数组  整数数组

    输赢 --> 输  踩到雷  输
            所有的雷排除  游戏赢  存一下当前走的步数 方便判断游戏输赢    
3. 游戏的步骤
        3.1 初始化界面
        3.2 等待用户点击 根据点击的内容做不同的操作
            点击到空白  翻开周围的一片
            点击到数字 那么翻开这个就行
            点击的雷  游戏直接结束(输)
        3.3 翻开一个之后 重新画图
            判断游戏是否结束
            要么等待下一次点击 要么 游戏结束 

            地图当中有数字  0 1 2 3 4 5表示周围雷的个数
            表示雷 换一个数字 避免冲突
            9表示一个雷
            对于这个游戏而言  刚刚开始的时候 全部是没有翻开的状态  贴图都贴 空白图
            翻开之后 才会贴12 34
            0~9  视为没有翻开的状态
            翻开之后  0+10  10
           1+10   11  表示翻开之后的1

4.程序源代码:

#include
#include//需要安装图形库
#include	//随机数函数 srand rand
#include	//随机数种子 需要用到的time函数
int map[10][10] = { 0 };//全局数组  存放游戏地图的全局数据
IMAGE img[10];//多张图片 所以用数组来存
//只有一张定义一个IMAGE变量就行

//准备给数组赋值
void init()
{
	//赋初值  随机往里面放几个雷 
	//用一个数字 代表雷  9表示雷
	//随机一个行一个列 随机数  得到随机数 可能超过范围  使用求余运算符

	//rand()%10  得到0~9之间的随机数
	int x, y;
	for (int i = 0; i < 10; )	//循环次数 表示放了几次
	{
		x = rand() % 10;
		y = rand() % 10;
		if (map[x][y] != 9)
		{
			map[x][y] = 9;//给一个随机的位置赋值为9
			++i;	//统计雷的个数
		}
	}

	//得到雷周围的数字 两种方式
	//给雷周围的元素加1  找到一个元素看周围几个雷  那么这个值就是多少
	for ( i = 0; i < 10; ++i)
	{
		for ( int j = 0; j < 10; ++j)
		{
			if ( 9==map[i][j] )//找到一个雷
			{
				//周围的几个位置加1
				//if (i - 1 >= 0 && j - 1 >= 0 && map[i - 1][j - 1] != 9)map[i - 1][j - 1]++;//左上
				//if (i - 1 >= 0  && map[i - 1][j] != 9)map[i - 1][j]++;//上方
				//需要做的事情  判断是否越界  然后是否是雷  看需不需要加1

				//遍历周围的元素 加1
				for (int m = i - 1; m <= i + 1; ++m)
				{
					for (int n = j - 1; n <= j + 1; ++n)
					{
						if (m >= 0 && m < 10 && n >= 0 && n < 10 && map[m][n] != 9)//判断是否越界 判断是否是雷
						{
							map[m][n]++;
						}
					}
				}

			}
		}
	}
	

	//加载所有素材的图片
	loadimage(&img[0], "res/0.jpg", 60, 60);
	loadimage(&img[1], "res/1.jpg", 60, 60);
	loadimage(&img[2], "res/2.jpg", 60, 60);
	loadimage(&img[3], "res/3.jpg", 60, 60);
	loadimage(&img[4], "res/4.jpg", 60, 60);
	loadimage(&img[5], "res/5.jpg", 60, 60);
	loadimage(&img[6], "res/6.jpg", 60, 60);
	loadimage(&img[7], "res/标记.jpg", 60, 60);
	loadimage(&img[8], "res/空.jpg", 60, 60);
	loadimage(&img[9], "res/雷.jpg", 60, 60);
}

void drawMap()	//之前 printf-->换成贴图
{
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 0; j < 10; ++j)
		{
			//printf("%d\t", map[i][j]);
			if (map[i][j] <= 9)
			{
				putimage(j * 60, i * 60, &img[8]);
				continue;
			}
			switch (map[i][j])
			{
			case 10:putimage(j * 60, i * 60, &img[0]); break;
			case 11:putimage(j * 60, i * 60, &img[1]); break;
			case 12:putimage(j * 60, i * 60, &img[2]); break;
			case 13:putimage(j * 60, i * 60, &img[3]); break;
			case 14:putimage(j * 60, i * 60, &img[4]); break;
			case 15:putimage(j * 60, i * 60, &img[5]); break;
			case 16:putimage(j * 60, i * 60, &img[6]); break;
			case 19:putimage(j * 60, i * 60, &img[9]); break;	//雷
			}

		}
		//printf("\n");
	}
}

//数组 0 1 2 --6 直接贴数字
// 9 贴雷

void play()//鼠标点击
{
	MOUSEMSG msg;// 定义变量 存放鼠标信息

	msg = GetMouseMsg();//接受鼠标消息
	switch (msg.uMsg)//判断鼠标消息
	{
	case WM_LBUTTONDOWN://表示左键按下
		//判断按下的位置是什么
		int i = msg.y / 60;
		int j = msg.x / 60;//对应的数组下标

		if (map[i][j] >= 10) break;//翻开过 直接结束
		else if (map[i][j] == 9)
		{
			//雷
			map[i][j] += 10;
		}
		else if (map[i][j] == 0)
		{
			//翻开周围的一片
			for (int m = i - 1; m <= i + 1; ++m)
			{
				for (int n = j - 1; n <= j + 1; ++n)
				{
					if (m >= 0 && m < 10 && n >= 0 && n < 10 && map[m][n] <= 9)
					{
						map[m][n] += 10;//翻开
					}
				}
			}
		}
		else
		{
			map[i][j] += 10;
		}

		break;
	}
}

//判断输赢  输赢 判断结果  0 表示输  1表示赢  2表示可以继续
int win()
{
	//输表示出现一个翻开的雷
	//判断有没有存在没有翻开的数字
	int nums = 0;//统计没有翻开的数字的个数
	for (int i = 0; i < 10; ++i)
	{
		for (int j = 0; j < 10; ++j)
		{
			if (map[i][j] == 19) return 0;//表示有翻开的雷 游戏结束
			if (map[i][j] <= 6) nums++;//每次遇到没有翻开的数字  nums加1
		}
	}
	if (nums == 0) return 1;//所有的数字已经翻开并且没有踩到雷
	return 2;
}
int main()
{
	//图形库 做界面
	initgraph(600,600);	//新建窗口  图片大小 60*60
	srand((unsigned)time(NULL));//设置随机数种子  保证生成的数字随机

	//rand();//生成随机数 没有负数
	init();
	drawMap();
	int wins;
	while (1)
	{
		play();
		drawMap();
		wins = win();
		if (wins == 1)
		{
			//赢
			MessageBox(GetHWnd(), "Good", "GG", MB_OK);
			break;
		}
		else if (wins == 0)
		{
			//输
			MessageBox(GetHWnd(), "SORRY", "BAD", MB_OK);
			break;
		}
	}
	
	//getchar();
	closegraph();//关闭窗口
	return 0;
}

5.显示效果及运用的图片:

C语言小白适合入门的项目——扫雷_第1张图片

C语言小白适合入门的项目——扫雷_第2张图片

6.总结:

   这款扫雷游戏非常适合刚刚入门的小白朋友们,它能使小白更加了解循环以及数组的运用。希望这个小项目对大家有帮助,这里我加用了图形库,是界面更加优化与美观,需要完成的朋友们请在做项目前先下好C语言的图形库哦!即:EasyX。如果各位小白朋友们想进一步了解C/C++的话,欢迎大家进群交流哦!群号我会在评论下方给出。

你可能感兴趣的:(C语言,编程语言,C++,编程游戏,入门小白,C语言,编程,C语言编程游戏,小游戏,入门小白)