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