扫雷c++小程序源代码,扫雷,转载,修改了一些地方,vs2022完美运行windows10,免分0分下载

c++小程序源代码,扫雷,转载,修改了一些地方,vs2022完美运行,需要安装一个小程序EasyX Graphics Library for C++  在网页右侧红色下载Easyx并安装(辅助代码#include <graphics.h>)。

扫雷代码修改地方:

排雷后在数字处点击鼠标中间键能把所有空值的地方打开,当红旗和雷数量不一致时会提示

参考链接:

                     easyx展示图片自己电脑可以显示 别人黑屏 - CodeBus

12张图片是自己从网上裁剪出来的,图片放到工程目录里,

 Easyx辅助代码安装程序:可以在网站下载EasyX Graphics Library for C++

vs工程文件夹压缩包,含12张图片,链接在这里:https://download.csdn.net/download/ddcar/89370897

// easyx1ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

//int main()
//{
//    std::cout << "Hello World!\n";
//}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>

#define ROW 10  //行数10行
#define COL 10  //列数10列
#define MINE 10  //雷数量10
#define SIZE 50   //每个格子的长宽为50*50像素

int count = 0;	//点的格子数,已经点开的格子数量
int map[ROW + 2][COL + 2];  //数据为12*12
IMAGE img[12];	//img存放12张图片

//初始化棋盘
void initboard()
{
	int i;
	int j;
	//map数组赋值0
	for (i = 0; i < ROW + 2; i++)
	{
		for (j = 0; j < COL + 2; j++)
		{
			map[i][j] = 0;
			printf("%d,%d=%d\n",j,i, map[j][i]);
		}
	}
	//srand()函数用来设置算法的种子,time(NULL)返回当前的时间,先调用srand(time(NULL))是把当前的时间作为种子,是程序每次运行产生不同的随机数序列。
	srand((unsigned int)time(NULL));
	
	//flag小于雷数量就布雷
	int flag = 0;
	while (flag < MINE)//当flag=MINE时布雷完成
	{
		int r = rand() % ROW + 1;  //随机数0-9,加一得到1-10的随机数;
		int c = rand() % COL + 1;  //随机数0-9,加一得到1-10的随机数;

		//布雷
		if (map[r][c] == 0)
		{
			map[r][c] = -1;
			flag++;
			printf("%d,%d=%d\n",c,r, map[r][c]);

		}
	}

	//根据周边8格雷数填充数组
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			if (map[i][j] != -1)
			{
				int m = 0;
				int n = 0;

				for (m = i - 1; m <= i + 1; m++)
				{
					for (n = j - 1; n <= j + 1; n++)
					{
						if (map[m][n] == -1)
						{
							map[i][j]++;
						}
					}
				}
			}
		}
	}

	//数组值全+20变成空白图片
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			map[i][j] += 20;
		}
	}
}

//打印棋盘
void printboard()
{
	int i;
	int j;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= COL; j++)
		{
			printf("%3d,%d=%d",i,j, map[j][i]);
			printf("  ");
			if (map[i][j] == -1)						//雷图片
			{

				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[9]);
			}
			else if (map[i][j] >= 0 && map[i][j] <= 8)		//数字图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[map[i][j]]);

			}
			else if (map[i][j] >= 19 && map[i][j] <= 28)	//空白图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[10]);
			}
			else if (map[i][j] > 30)	//旗子图片
			{
				putimage((i - 1) * SIZE, (j - 1) * SIZE, &img[11]);
			}
		}
		printf("\n");
	}

}

//加载图片
void loadimg()
{
	loadimage(&img[0], L"10.jpg", SIZE, SIZE);
	loadimage(&img[1], L"1.jpg", SIZE, SIZE);
	loadimage(&img[2], L"2.jpg", SIZE, SIZE);
	loadimage(&img[3], L"3.jpg", SIZE, SIZE);
	loadimage(&img[4], L"4.jpg", SIZE, SIZE);
	loadimage(&img[5], L"5.jpg", SIZE, SIZE);
	loadimage(&img[6], L"6.jpg", SIZE, SIZE);
	loadimage(&img[7], L"7.jpg", SIZE, SIZE);
	loadimage(&img[8], L"8.jpg", SIZE, SIZE);
	loadimage(&img[9], L"9.jpg", SIZE, SIZE);	//雷
	loadimage(&img[10], L"0.jpg", SIZE, SIZE);	//空白
	loadimage(&img[11], L"11.jpg", SIZE, SIZE);	//旗子

}

//递归展开一片
void open(int r, int c)
{
	printf("jin ru da kai open \n");
	printf("%d,%d=%d\n", c, r, map[r][c]);
	map[r][c] -= 20;
	printf("%d,%d=%d\n", c, r, map[r][c]);
	count++;

	for (int m = r - 1; m <= r + 1; m++)
	{
		for (int n = c - 1; n <= c + 1; n++)
		{
			if (m >= 1 && m <= ROW && n >= 1 && n <= COL)
			{
				if (map[m][n] >= 19 && map[m][n] <= 28)
				{
					if (map[m][n] != 20)
					{
						
						map[m][n] -= 20;
						count++;
					}
					else
					{
						printf("kai shi da kai");
						printf("%3d,%d=%d", n, m, map[m][n]);
						open(m, n);
					}
				}
			}
		}

	}
}

//鼠标操作
int play()
{
	MOUSEMSG msg = { 0 };
	int r;
	int c;

	while (1)
	{
		msg = GetMouseMsg();

		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:	//扫雷 19~28
			printf("%5d\n%5d\n", msg.x, msg.y);
			r = msg.x / SIZE + 1;

			c = msg.y / SIZE + 1;
			printf("%5d\n%5d\n", r, c);
			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				if (map[r][c] == 20)	//点的位置是0
				{
					open(r, c);
				}
				else
				{
					map[r][c] -= 20;	//-1~8
					count++;
					//char count1_char = count;

					printf("%d\n", count);

				}

			}
			return map[r][c];
			break;
		case WM_RBUTTONDOWN:	//标雷或取消标记
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;

			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				map[r][c] += 50;
				printf("%d,%d=%d\n", c, r, map[r][c]);
				printf("qi zi\n");
			}
			else if (map[r][c] > 30)
			{
				map[r][c] -= 50;
				printf("%d,%d=%d\n", c, r, map[r][c]);
				printf("qu xiao qi zi\n", c, r, map[r][c]);
			}
			return map[r][c];
			break;
		case WM_MBUTTONDOWN:
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;
			printf("66666\n");
			int a = 0;
			int b = 0;
			int mine11 = 0;
			for (a = r-1; a <= r + 1; a++)
			{
				for (b = c-1; b <= c + 1; b++)
				{
					if (map[a][b] > 30)
					{
						mine11++;
					}
				}
			}
			printf("jinrujisuan mine11\n");
			printf("%d\n",mine11);
			if (mine11 < map[r][c])
			{
				HWND hWnd = GetActiveWindow();
				MessageBox(hWnd, L"请确认排出雷的数量是否正确", L"", MB_OK);
				return map[r][c];
				break;
				//THIS.msg("标志数小于雷数");
			}
			for (int m = r - 1; m <= r + 1; m++)
			{
				printf("jin ru zhongjiananjian\n");
				for (int n = c - 1; n <= c + 1; n++)
					{
					printf("jin ru xun huan2\n");
					if (m >= 1 && m <= ROW && n >= 1 && n <= COL)
					{

						if (map[m][n] >= 19 && map[m][n] <= 28)
						{
						//if (map[m][n] == 19|| map[m][n] == 20)//思考中
						//{
						map[m][n] -= 20;
						count++;
						printf("fa xian lei zhongjian\n");
						printf("%3d,%d=%d", n, m, map[m][n]);
						if (map[m][n] == -1) {
							return map[m][n];
							break;
						}
						//}
						//else {



						//}

						;
					}
					else
					{
						printf("else\n");
						if (map[m][n] <= 8 && map[m][n] >= 0)
						{

							printf("wu lei zhongjian\n");
							printf("%3d,%d=%d", n, m, map[m][n]);
							//map[m][n] -= 20;
							//count++;
							printf("%3,%=%\n", n, m, map[m][n]);

						}
					}
				}
			}

		}
			return map[r][c];
			break;
		}

		
	}
}



int main()
{
	//打开一个图形窗口
	HWND hwnd = initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);
	//hwnd;
	//initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);//显示控制台

	loadimg();//加载图片
	initboard();//初始化棋盘


	while (1)
	{
		printboard();
		if (play() == -1)
		{
			printboard();
			MessageBox(hwnd, L"你输了", L"", MB_OK);
			break;
		}
		if (ROW * COL - MINE == count)
		{
			printboard();
			MessageBox(hwnd, L"你赢了", L"", MB_OK);
			break;
		}
	}
	return 0;
}

控制台打印调试,10*10数组坐标1,1=map[1][1]数值,以及打印自己想查看的数值 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值