效果图
源代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>//这里调用了Easyx,需要安装
#pragma comment(lib,"winmm.lib")
#define SIZE 50//图片的大小
#define NUM 10//地雷的数量
#define ROW 10//行数
#define COL 10//列数
int map[ROW + 2][COL + 2];//地图
int count = 0;
IMAGE img[12];//定义图像对象
//游戏初始化
void GameInit()
{
srand((unsigned int)time(NULL));//创建一个随机数种子
//将数组初始化为0
for (int i = 0; i < ROW + 2; i++)
{
for (int j = 0; j < COL + 2; j++)
{
map[i][j] = 0;
}
}
//制作地雷
int n = 0;
while (n < NUM)
{
int r = rand() % ROW + 1;//随机获取行值
int c = rand() % COL + 1;//随机获取列值
if (map[r][c] == 0)//防止重复
{
map[r][c] = -1;
n++;
}
}
//判断格子周围雷的数量
for (int i = 1; i <= ROW; i++) {
for (int j = 1; j <= COL; j++) {
if (map[i][j] != -1) {
for (int m = i - 1; m <= i + 1; m++) {
for (int n = j - 1; n <= j + 1; n++) {
if (map[m][n] == -1) {
map[i][j]++;
}
}
}
}
}
}
for (int i = 1; i < ROW + 1; i++) {
for (int j = 1; j < COL + 1; j++) {
map[i][j] += 20;
}
}
}
void DrawMap()
{
for (int i = 1; i < ROW + 1; i++) {
for (int j = 1; j < COL + 1; j++) {
printf("%4d", map[i][j]);
if (map[i][j] == -1) {
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[10]);//雷
}
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[9]);//空白图
}
else if
(map[i][j] > 30) {
putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[11]);//标记
}
}
printf("\n");
}
}
void OpenZero(int r, int c)
{
map[r][c] -= 20;
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 {
OpenZero(m, n);
}
}
}
}
}
}
int PlayGame()
{
MOUSEMSG msg = { 0 };//定义一个鼠标
int r, c;
while (1)
{
msg = GetMouseMsg();//获取鼠标消息
switch (msg.uMsg) {
case WM_LBUTTONDOWN://当左键按下
r = msg.x / SIZE + 1;
c = msg.y / SIZE + 1;
if (map[r][c] >= 19 && map[r][c] <= 28)
{
if (map[r][c] == 20)
{
OpenZero(r, c);
}
else
{
map[r][c] -= 20;
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;
}
else if (map[r][c] > 30)
{
map[r][c] -= 50;
}
return map[r][c];
break;
}
}
}
int main() {
HWND hwnd = initgraph(ROW*SIZE, COL*SIZE);//创建绘图窗口,加上参数SHOWCONSOLE可以看见控制台
mciSendString(L"open music.mp3 alias music", 0, 0, 0);//打开音乐文件
mciSendString(L"play music", 0, 0, 0);//播放音乐,我这里是告白之夜的BGM
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);
GameInit();
while (1) {
DrawMap();
if (PlayGame() == -1)
{
DrawMap();
MessageBox(hwnd, L"很遗憾,你输了!!!", L"", MB_OK);//制作一个消息弹窗
break;
}
if (ROW*COL - NUM == count)
{
DrawMap();
MessageBox(hwnd, L"真棒,你赢了!!!",L"", MB_OK);
break;
}
}
closegraph();//关闭绘图环境
return 0;
}
源文件及资源
链接:https://pan.baidu.com/s/1iRrU4zIkvgWqslX8QTgIBg
提取码:8k4f