简单的扫雷游戏代码(c++)

扫雷游戏

在这里插入图片描述
图片素材找的有点丑大佬勿怪

废话不多说上代码

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

#define ROW 10   //行
#define COL 10   //列
#define NUM 10  //雷的个数
#define SIZE 30
int map[ROW + 2][COL + 2]; //这里的+2是为了增加外围一圈的一个缓存区使得游戏区内的元素更合理
IMAGE img[12];

void load()
{
	loadimage(&img[0], L"0.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"10.jpg", SIZE, SIZE);//加謎
	loadimage(&img[11], L"11.jpg", SIZE, SIZE);//標記
}
//游戏初始化
void gameinit()
{
	//随机数
	srand(time(0));//根据时间改变随机
	for (int i = 0; i < ROW + 2; i++)
	{
		for (int j = 0; j < COL + 2; j++)
		{
			map[i][j] = 0;
		}
	}
	//让某一部分元素变成雷(随机每一行列为雷用-1表示雷)
	int n = NUM;
	while (n--)
	{
		int row = rand() % ROW + 1;//1到10
		int col = rand() % COL + 1;//随机在某一行某一列

		if (map[row][col] == 0)//这行没有埋雷
			map[row][col] = -1;//改成雷

	}
	for (int i = 1; i <= ROW; i++)
	{
		for (int j = 1; j <= COL; j++)
		{
			if (map[i][j] != -1) //以这个不为-1的数为中心的几个数中-1的个数
			{
				for (int i1 = i - 1; i1 <= i + 1; i1++)
				{
					for (int j1 = j - 1; j1 <= j + 1; j1++)
					{
						if (map[i1][j1] == -1)
							map[i][j]++;
					}
				}
			}
		}
	}
	//每一个元素都+20 游戏
	for (int i = 1; i <= ROW; i++)
	{//这样做是为了让扫雷时只要减去20就可以知道里面的数
		for (int j = 1; j <= COL; j++)
		{
			map[i][j] += 20;
		}
	}
}

//游戏的绘制函数
void gamepaint()
{
	for (int i = 1; i <= ROW; i++)//行
	{
		for (int j = 1; j <= COL; j++)//列
		{
			if (map[i][j] >= 0 && map[i][j] <= 8)//数字
			{
				putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[map[i][j]]);
				 //(j-1)表示列的坐标 ,(i-1)表示行的坐标(坐标从零开始)
			}
			else if (map[i][j] == -1)//雷
			{
				putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[9]);
			}
			else if (map[i][j] >= 19 && map[i][j] <= 28)//加密
			{
				//这里就是把打印变成了更换图片的操作,(及用图片代替)
				putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[10]);
				//在这里插入img[10]这张图
				//(j-1)表示列的坐标 ,(i-1)表示行的坐标(坐标从零开始)
			}
			else if (map[i][j] >= 40)//标记
			{
				putimage((j - 1) * SIZE, (i - 1) * SIZE, &img[11]);
			}
		}
		printf("\n");
	}
}

//游戏的规则
int gameplay()
{
	//最前面加密的格子
	//从零到八的数字
	//小旗子(用来标记雷)
	//雷
	MOUSEMSG msg = { 0 };//鼠标操作
	msg = GetMouseMsg();
	if (msg.uMsg == WM_LBUTTONDOWN)//鼠标左键操作
	{
		//现在数字是加密的为19到28,左键解密操作
		int r = msg.y / SIZE + 1;//得到行
		int c = msg.x / SIZE + 1;//列
		if(map[r][c]>=19&&map[r][c]<=28)//只有在元素是被加密时才进行解码操作
		map[r][c] -= 20;//解码
		return map[r][c];//-1 点到雷了
	}
	else if (msg.uMsg == WM_RBUTTONDOWN)
	{
		int r = msg.y / SIZE + 1;//得到行
		int c = msg.x / SIZE + 1;//列
		if (map[r][c] >= 19 && map[r][c] <= 28)//只有在元素是被加密
			map[r][c] += 100;//加密到旗子
		else if (map[r][c] >= 40)
			map[r][c] -= 40;
		return map[r][c];
		
	}
}
int main()
{
	initgraph(COL*SIZE,ROW*SIZE);  //整个大盒子
	load();     //输入图片数据
	gameinit();   //初始化操作
	while(1)      //多次遍历直到点到雷为止
	{
	gamepaint();
	if (gameplay()==-1)  //点到雷了
	{
		gamepaint();  //最后再显示一下;
		break;
	}
	}
	getchar();  //显示点到雷的图片
	return 0;
}

这里我是用visual studio 写的个人觉得这个是真的好 最早在这里写的时候#include<graphics.h>一直报错,查了一下
是少了EasyX “https://easyx.cn/”可以到这里下载而visual studio 最好也用开发者的版本

这是扫雷要插入的素材
在这里插入图片描述
如果看不懂可以看一下这个老师的讲解,讲的不错https://www.bilibili.com/video/BV15z4y1y7no?p=2&t=3608

  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,我可以回答这个问题。以下是一个简单扫雷游戏代码示例: #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLS 10 #define MINES 10 void init_board(char board[ROWS][COLS], int rows, int cols, char ch); void print_board(char board[ROWS][COLS], int rows, int cols); void set_mines(char board[ROWS][COLS], int rows, int cols, int num_mines); void set_numbers(char board[ROWS][COLS], int rows, int cols); void play_game(char board[ROWS][COLS], char show_board[ROWS][COLS], int rows, int cols); int main() { char board[ROWS][COLS]; char show_board[ROWS][COLS]; srand(time(NULL)); init_board(board, ROWS, COLS, '*'); init_board(show_board, ROWS, COLS, '-'); set_mines(board, ROWS, COLS, MINES); set_numbers(board, ROWS, COLS); print_board(show_board, ROWS, COLS); play_game(board, show_board, ROWS, COLS); return ; } void init_board(char board[ROWS][COLS], int rows, int cols, char ch) { int i, j; for (i = ; i < rows; i++) { for (j = ; j < cols; j++) { board[i][j] = ch; } } } void print_board(char board[ROWS][COLS], int rows, int cols) { int i, j; printf(" "); for (i = ; i < cols; i++) { printf("%d ", i); } printf("\n"); for (i = ; i < rows; i++) { printf("%d ", i); for (j = ; j < cols; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void set_mines(char board[ROWS][COLS], int rows, int cols, int num_mines) { int i, j, count = ; while (count < num_mines) { i = rand() % rows; j = rand() % cols; if (board[i][j] != '*') { board[i][j] = '*'; count++; } } } void set_numbers(char board[ROWS][COLS], int rows, int cols) { int i, j, count; for (i = ; i < rows; i++) { for (j = ; j < cols; j++) { if (board[i][j] == '*') { continue; } count = ; if (i > && j > && board[i-1][j-1] == '*') { count++; } if (i > && board[i-1][j] == '*') { count++; } if (i > && j < cols-1 && board[i-1][j+1] == '*') { count++; } if (j > && board[i][j-1] == '*') { count++; } if (j < cols-1 && board[i][j+1] == '*') { count++; } if (i < rows-1 && j > && board[i+1][j-1] == '*') { count++; } if (i < rows-1 && board[i+1][j] == '*') { count++; } if (i < rows-1 && j < cols-1 && board[i+1][j+1] == '*') { count++; } board[i][j] = count + ''; } } } void play_game(char board[ROWS][COLS], char show_board[ROWS][COLS], int rows, int cols) { int i, j, x, y, count = ; char ch; while (count < rows * cols - MINES) { printf("请输入坐标(x,y)和操作(扫雷:S 标记:M):"); scanf("%d%d %c", &x, &y, &ch); if (x < || x >= rows || y < || y >= cols) { printf("坐标不合法,请重新输入!\n"); continue; } if (show_board[x][y] != '-') { printf("该位置已经操作过,请重新输入!\n"); continue; } if (ch == 'S') { if (board[x][y] == '*') { printf("你踩到地雷了,游戏结束!\n"); print_board(board, rows, cols); return; } else { show_board[x][y] = board[x][y]; count++; } } else if (ch == 'M') { show_board[x][y] = 'M'; } else { printf("操作不合法,请重新输入!\n"); continue; } print_board(show_board, rows, cols); } printf("恭喜你,扫雷成功!\n"); print_board(board, rows, cols); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lioushuishoushou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值