C语言代码实现简单的扫雷小游戏

C语言+EASYX实现扫雷,供大家参考,具体内容如下

主要思路就是通过一个二维数组存储不同的数来代表0到8等具体的图片,再配合鼠标的位置和点击情况,来改变数组某一项的值,而显示不同的图片。

水平有限,有些地方的代码过于复杂和繁琐,有待优化;有些功能的实现也不是很完整和合理,敬请指正。

#include <stdio.h> //标准的输入输出头文件。
#include <graphics.h> //EasyX图形界面。
#include <time.h>
#include <stdlib.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")//导入静态库
int f2=0;//标志信号
int flag=0;//标志信号
int ROW = 0; //棋盘行数
int COL = 0;  //棋盘列数
int NUM = 0; //雷的个数
int size; //图片尺寸

HWND hwnd1;
int count = 0;//已掀开的数量;

void BGMPLAY(void)//播放音乐函数
{
 mciSendString(L"open ./image/XXX.mp3 alias bgm",0,0,0);//XX可替换为自己的歌曲
 mciSendString(L"play bgm repeat",0,0,0);
}

struct rayxy//地雷位置
{
 int x;
 int y;
}xy[200];//地雷位置

IMAGE img[21];//存储图像

void welcome()
{
 initgraph( 640, 480);
 loadimage(&img[9], L"./image/开始界面1.jpg", 640, 480);//开始界面
 loadimage(&img[15], L"./image/菜单界面.jpg", 640, 480);//菜单选择界面
 if (!flag)
 {
 putimage(0, 0, &img[9]);
 Sleep(1000);
 }
 cleardevice();
 putimage(0, 0, &img[15]);

 //模式选择
 MOUSEMSG msg = { 0 };
 const int x1=9,y1=8, x2=290,y2=8,x3=9,y3=330,x4=290,y4=330, h=306, w=265;

 int sx = 0, sy = 0;
 //模式选择
 while (1)
 {
 HWND hwnd;

 msg = GetMouseMsg();
 if (msg.uMsg == WM_LBUTTONDOWN)
 {
 sx = msg.x;
 sy = msg.y;
 break;
 }
 }

 if ((sx >= x1 && sy >= y1)&& (sx <= x1+w && sy <= y1+h))
 {
 ROW = 9;
 COL = 9;
 NUM = 10;
 size = 70;
 }
 if ((sx >= x2 && sy >= y2) && (sx <= x2 + w && sy <= y2 + h))
 {
 ROW = 16;
 COL = 30;
 NUM = 99;
 size = 43;
 }
 if((sx >= x3 && sy >= y3) && (sx <= x3 + w && sy <= y3 + h))
 {
 ROW = 16;
 COL = 16;
 NUM = 40;
 size = 48;
 }
 if ((sx >= x4 && sy >= y4) && (sx <= x4 + w && sy <= y4 + h))
 {
 MessageBox(hwnd1, L"敬请期待!!!", L"提示", MB_OK);
 f2 = 1;
 flag = 1;
 Sleep(1000);
 }

}//欢迎界面
int map[30][30];//棋盘地图
void imgplay(void)
{
 loadimage(&img[0], L"./image/空白.jpg",size, size);//空白
 loadimage(&img[1], L"./image/1.jpg", size, size);
 loadimage(&img[2], L"./image/2.jpg", size, size);
 loadimage(&img[3], L"./image/3.jpg", size, size);
 loadimage(&img[4], L"./image/4.jpg", size, size);
 loadimage(&img[5], L"./image/5.jpg", size, size);
 loadimage(&img[6], L"./image/6.jpg", size, size);
 loadimage(&img[7], L"./image/7.jpg", size, size);
 loadimage(&img[8], L"./image/8.jpg", size, size);//8
 loadimage(&img[16], L"./image/问号.jpg", size, size);//问号
 loadimage(&img[10], L"./image/覆盖.jpg", size, size);//覆盖
 loadimage(&img[11], L"./image/标记.jpg", size, size);//标记
 loadimage(&img[12], L"./image/地雷.jpg", size, size);//地雷
 loadimage(&img[13], L"./image/胜利.jpg", size, size);//胜利
 loadimage(&img[14], L"./image/问号.jpg", size, size);//问号
 loadimage(&img[16], L"./image/9.jpg", size, size);//9
 loadimage(&img[17], L"./image/0.jpg", size, size);//0
 loadimage(&img[18], L"./image/冒号.jpg", size, size);//冒号
 loadimage(&img[20], L"./image/标记错误.jpg", size, size);/标记错误
}
void gameinit()
{
 int i, j;
 srand((unsigned int)time(NULL));//为随机布雷提供随机数
 for (i = 0; i < ROW + 2; i++)
 {
 for (j = 0; j < COL + 2; j++)
 {
 map[i][j] = 0;
 }
 }
 int r, c, n = 0;
 while (n < NUM)
 {
 r = rand() % ROW + 1;
 c = rand() % COL + 1;
 if (map[r][c] != -1)
 {
 map[r][c] = -1;
 xy[n].x = r;
 xy[n].y = c;
 n++;
 }
 else
 {
 continue;
 }
 }
 for (i = 1; i <= ROW; i++)
 {
 for (j = 1; j <= COL; j++)
 {
 if (map[i][j] != -1)
 {
 for (r = i - 1; r <= i + 1; r++)
  for (c = j - 1; c <= j + 1; c++)
  {
  if (map[r][c] == -1)
  {
  map[i][j]++;
  }
  }
 }
 }
 }
 for (i = 1; i <= ROW; i++)
 {
 for (j = 1; j <= COL; j++)
 {
 map[i][j] += 20;
 }
 }
}

void drawgraph()
{
 int i, j;
 for (i = 1; i <= ROW; i++)
 {
 for (j = 1; j <= COL; j++)
 {
 if (map[i][j] == -1)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[12]);//地雷
 }
 else if (map[i][j] >= 0 && map[i][j] <= 8)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[map[i][j]]);//显示数字和空白
 }
 else if (map[i][j] >= 19 && map[i][j] <= 28)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[10]);//覆盖
 }
 else if (map[i][j] >= 29&&map[i][j]<=38)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[11]);//标记
 }
 else if(map[i][j]>=39&&map[i][j]<=48)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[14]);//问号
 }
 if (map[i][j] == -2)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[13]);//胜利
 }
 }
 }
}

void draw(int i, int j)
{
 if (map[i][j] == -1)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[12]);//地雷
 }
 else if (map[i][j] >= 0 && map[i][j] <= 8)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[map[i][j]]);//显示数字和空白
 }
 else if (map[i][j] >= 19 && map[i][j] <= 28)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[10]);//覆盖
 }
 else if (map[i][j] >= 29&&map[i][j]<=38)
 {
 putimage((j - 1) * size, (i - 1) * size, &img[11]);//标记
 }
 else
 {
 putimage((j - 1) * size, (i - 1) * size, &img[14]);//问号
 }
}
void blankopen(int r, int c)
{
 int a, b;
 if (map[r][c] == 20)
 {
 count++;
 map[r][c] -= 20;
 }
 for (a = r - 1; a <= r + 1; a++)
 {
 for (b = c - 1; b <= c + 1; b++)
 {
 if (a >= 1 && a <= ROW && b >= 1 && b <= COL)
 {
 if (map[a][b] >= 20 && map[a][b] <= 28)
 {
  map[a][b] -= 20;
  count++;
 }
 }
 }
 }
}
int playgame()
{
 MOUSEMSG msg = { 0 };
 int r, c;
 //while (1)
 //{
 msg = GetMouseMsg();
 switch (msg.uMsg)
 {
 case WM_LBUTTONDOWN:
 c = msg.x / size + 1;
 r = msg.y / size + 1;
 if (map[r][c] >= 29&&map[r][c]<=38)
 {
 map[r][c] -= 10;
 }
 if (map[r][c] >= 39 && map[r][c] <= 48)
 {
 map[r][c] -= 20;
 }
 if (map[r][c] >= 19 && map[r][c] <= 28)
 {
 if (map[r][c] == 20)
 {
  blankopen(r, c);
 }
 else
 {
  if (map[r][c] != 19)
  count++;
  map[r][c] -= 20;
 }
 }
 if (map[r][c] == 0)
 blankopen(r, c);
 draw(r, c);
 return map[r][c];
 //break;
 case WM_RBUTTONDOWN:
 c = msg.x / size + 1;
 r = msg.y / size + 1;
 if (map[r][c] >= 19 && map[r][c] <= 28)
 {
 map[r][c] += 10;
 }
 else if (map[r][c] >= 29&&map[r][c]<=38)
 {
 map[r][c] += 10;
 }
 else
 {
 map[r][c] -= 20;
 }
 draw(r, c);
 return map[r][c];
 //break;

 }
 //}
}
int timerec(void)
{
 time_t timep;
 struct tm p;
 time(&timep);
 gmtime_s(&p, &timep);
 int t = p.tm_min * 60 + p.tm_sec;
 return t;
}

void timeplay(int t)
{
 int min=0 ,sec=0;
 printf("%d\n", t);
 min = t / 60;
 putimage((COL - 3) * size, (ROW)*size, &img[18]);
 switch (min / 10)
 {
 case 0:putimage((COL - 5) * size, (ROW ) * size, &img[17]); break;
 case 1:putimage((COL - 5) * size, (ROW ) * size, &img[1]); break;
 case 2:putimage((COL - 5) * size, (ROW ) * size, &img[2]); break;
 case 3:putimage((COL - 5) * size, (ROW ) * size, &img[3]); break;
 case 4:putimage((COL - 5) * size, (ROW ) * size, &img[4]); break;
 case 5:putimage((COL - 5) * size, (ROW ) * size, &img[5]); break;
 case 6:putimage((COL - 5) * size, (ROW ) * size, &img[6]); break;
 case 7:putimage((COL - 5) * size, (ROW ) * size, &img[7]); break;
 case 8:putimage((COL - 5) * size, (ROW ) * size, &img[8]); break;
 case 9:putimage((COL - 5) * size, (ROW ) * size, &img[16]); break;
 default:putimage((COL - 5) * size, (ROW ) * size, &img[10]); break;
 }
 switch (min % 10)
 {
 case 0:putimage((COL - 4) * size, (ROW ) * size, &img[17]); break;
 case 1:putimage((COL - 4) * size, (ROW ) * size, &img[1]); break;
 case 2:putimage((COL - 4) * size, (ROW ) * size, &img[2]); break;
 case 3:putimage((COL - 4) * size, (ROW ) * size, &img[3]); break;
 case 4:putimage((COL - 4) * size, (ROW ) * size, &img[4]); break;
 case 5:putimage((COL - 4) * size, (ROW ) * size, &img[5]); break;
 case 6:putimage((COL - 4) * size, (ROW ) * size, &img[6]); break;
 case 7:putimage((COL - 4) * size, (ROW ) * size, &img[7]); break;
 case 8:putimage((COL - 4) * size, (ROW ) * size, &img[8]); break;
 case 9:putimage((COL - 4) * size, (ROW ) * size, &img[16]); break;
 default:putimage((COL - 4) * size, (ROW ) * size, &img[10]); break;
 }
 sec = t % 60;
 switch (sec / 10)
 {
 case 0:putimage((COL - 2) * size, (ROW ) * size, &img[17]); break;
 case 1:putimage((COL - 2) * size, (ROW ) * size, &img[1]); break;
 case 2:putimage((COL - 2) * size, (ROW ) * size, &img[2]); break;
 case 3:putimage((COL - 2) * size, (ROW ) * size, &img[3]); break;
 case 4:putimage((COL - 2) * size, (ROW ) * size, &img[4]); break;
 case 5:putimage((COL - 2) * size, (ROW ) * size, &img[5]); break;
 case 6:putimage((COL - 2) * size, (ROW ) * size, &img[6]); break;
 case 7:putimage((COL - 2) * size, (ROW ) * size, &img[7]); break;
 case 8:putimage((COL - 2) * size, (ROW ) * size, &img[8]); break;
 case 9:putimage((COL - 2) * size, (ROW ) * size, &img[16]); break;
 default:putimage((COL - 2) * size, (ROW ) * size, &img[10]); break;
 }
 switch (sec % 10)
 {
 case 0:putimage((COL - 1) * size, (ROW ) * size, &img[17]); break;
 case 1:putimage((COL - 1) * size, (ROW ) * size, &img[1]); break;
 case 2:putimage((COL - 1) * size, (ROW ) * size, &img[2]); break;
 case 3:putimage((COL - 1) * size, (ROW ) * size, &img[3]); break;
 case 4:putimage((COL - 1) * size, (ROW ) * size, &img[4]); break;
 case 5:putimage((COL - 1) * size, (ROW ) * size, &img[5]); break;
 case 6:putimage((COL - 1) * size, (ROW ) * size, &img[6]); break;
 case 7:putimage((COL - 1) * size, (ROW ) * size, &img[7]); break;
 case 8:putimage((COL - 1) * size, (ROW ) * size, &img[8]); break;
 case 9:putimage((COL - 1) * size, (ROW ) * size, &img[16]); break;
 default:putimage((COL - 1) * size, (ROW ) * size, &img[10]); break;
 }
 for (int i = 0; i < COL-5; i++)
 {
 putimage((i) * size, (ROW)*size, &img[20]);
 }
}

int main()
{
 BGMPLAY();//播放初始音乐
 int i = 0, j = 0, MAX = 0;
 srand((unsigned int)time(NULL));
loop:
loop1:
 f2 = 0;
 welcome();
 if (f2)goto loop1;
 imgplay();
 count = 0;
 hwnd1 = initgraph(COL * size, (ROW+1) * size);
 gameinit();
 MAX = ROW * COL - NUM;
 time_t timep;
 struct tm p;
 time(&timep);
 gmtime_s(&p,&timep);
 int t1 = timerec();
 while (1)
 {
 drawgraph();
 timeplay(timerec() - t1);
 if (playgame() == -1)
 {
 for (i = 0; i < NUM; i++)
 {

 map[xy[i].x][xy[i].y] = -1;

 }
 drawgraph();
 Sleep(1000);
 MessageBox(hwnd1, L"很遗憾!", L"提示", MB_OK);
 int x = MessageBox(hwnd1, L"回到主菜单", L"Minesweeper", MB_OKCANCEL);
 if (x == 1)
 {
 flag = 1;
 goto loop;
 }
 break;
 }
 if (count == MAX)
 {
 for (i = 0; i < NUM; i++)
 {

 map[xy[i].x][xy[i].y] = -2;
 }

 drawgraph();
 Sleep(1000);
 MessageBox(hwnd1, L"Very good!!!", L"提示", MB_OK);
 int y = MessageBox(hwnd1, L"回到主菜单", L"Minesweeper", MB_OKCANCEL);
 if (y)
 {
 flag = 1;
 goto loop;
 }
 else
 {
 break;
 }

 }
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现扫雷小游戏(适合初学者)

    扫雷小游戏作为初学c语言的小白有很大的帮助,其中用到了函数的定义,函数的声明,循环语句,数组思想等等知识,对于代码理解和设计代码思路有很大的帮助,本文就详细介绍了代码的各个步骤和运行结果.希望给到和我一样的小白一点帮助. //game.h头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9//定义了界面的长宽,可以直更改ROW,COL的值,避免了程序中数字重复出现 #define

  • C语言实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 主函数:main.c #include "game.h" void Menu() { printf("##########################\n"); printf("##1.play 0.exit##########\n"); printf("##########################\n"); printf("##

  • C语言实现简单扫雷小程序

    扫雷是一款大众类的益智小游戏.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. 首先带大家简单来了解一下扫雷的游戏机制: 随便点一个格子,会有一块,上面的数字就代表数字周围八个格子会有几个雷,是1他周围就只有1个雷,2就有两个雷,以此类推,直到找出全部没有雷的格子就算玩家赢.只要点到一个有雷的格子就判定玩家输. 了解了 机制之后就来编写程序.将程序分为test.c.game.c和game.h三个部分.其中test.c中编写主函数,game.c中

  • C语言代码实现扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 该游戏我们也是利用数组完成,设置俩个数组一个mine数组,一个show数组. mine数组存放雷,show数组显示棋盘并且显示该位置是否有雷或者显示该位置周围有几个雷. 数组大小有讲究,我们宏定义变量 ROW COL 为9 定义ROWS COLS为11,我们显示的是9X9的棋盘,也是将雷设置在9X9的位置内,但是我们设置数组是设置11X11,因为这样方便我们遍历9X9棋盘四边位置上某位置四周雷的数目,不然的话会发生越界错

  • C语言快速实现扫雷小游戏

    本文实例为大家分享了C语言扫雷小游戏的具体实现代码,供大家参考,具体内容如下 一.分析游戏步骤: 具体步骤如图: 二.代码实现: 游戏步骤想好之后,就是用代码把步骤一步一步的实现.具体代码如下: 1.游戏主要实现: game.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void game() { char mine[ROW + 2][COL + 2]; //记录地雷的数组 char show[ROW + 2][COL + 2

  • C语言实现简单扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <time.h> /* 用 C 语言写一个简单的扫雷游戏 */ // 1.写一个游戏菜单 Menu() // 2.开始游戏 // 1.初始化二维数组 Init_Interface() // 2.打印游戏界面 Print_Interfa

  • 基于C语言实现的扫雷游戏代码

    本文详细讲述了基于C语言实现的扫雷游戏代码,代码中备有比较详细的注释,便于读者阅读和理解.希望对学习游戏开发的朋友能有一点借鉴价值. 完整的实例代码如下: /* 模拟扫雷游戏 */ #include <graphics.h> #include <math.h> #include <stdio.h> #include <dos.h> #include <stdlib.h> #include <conio.h> #include <

  • C语言实现扫雷程序

    使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷,另外一个向外界展示. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 11 //雷 #define COL 11 #define ROWS 9 //棋盘 #define COL

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • C语言 扫雷程序的实现

    C语言 扫雷程序的实现 这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难 游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能. 定义了一个9*9的棋盘,玩家只要根据提示选择游戏,和难度: 根据提示输入 合法的坐标,如输入不合法则会进行提示: 扫雷结束则会提示:如触雷则游戏自动结束: 整个游戏设计中主要的函数为: 1.初始化地雷棋盘和显示棋盘 2.棋盘打印函数 3.扫雷函数的实现 4.游戏主函数 大家可以在宏定义中改变棋盘大小,雷的个数,以及显示的无雷区

随机推荐