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]数值,以及打印自己想查看的数值