扫雷游戏
图片素材找的有点丑大佬勿怪
废话不多说上代码
#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