扫雷的埋雷

好奇,想用二维数组实现扫雷的埋雷和统计周围雷的数目,刚开始用一个二维数组(相对小的那个,后文称:小数组)保存数据,发现统计的时候边缘情况有点麻烦,就又定义了一个比原来列行都大2的二维数组(后文称:大数组)。把原来的保存的数据放到大数组中间,然后统计大数组,统计结果放回小数组。

代码:

#include<stdio.h>
#include<time.h>
#define ROW 16
#define COL 30
#define TROW 18
#define TCOL 32
#define MINE_NUM 99
#define MINE_FLAG 9 

void initMine(int rec[][COL],int m,int n);
void initTmp(int rec[][TCOL],int m,int n);
void showMine(int rec[][COL],int m,int n);
void showTmp(int rec[][TCOL],int m,int n);
void setMine(int rec[][COL],int recTmp[][TCOL],int m,int n);
void sniffeMine(int rec[][COL],int recTmp[][TCOL],int m,int n);
int  isMine(int rec[][TCOL],int m,int n);

int main(){
  int mineRec[ROW][COL];
  int tmpRec[TROW][TCOL];
  initMine(mineRec,ROW,COL);
  initTmp(tmpRec,TROW,TCOL);
  setMine(mineRec,tmpRec,ROW,COL);
  sniffeMine(mineRec,tmpRec,ROW,COL);
  showMine(mineRec,ROW,COL);
}

/* ------- function defination --------------- */
void initMine(int rec[][COL],int m,int n){
  int i,j;
  for(i=0;i<m;i++)
     for(j=0;j<n;j++)
       rec[i][j] = 0;
}
void initTmp(int rec[][TCOL],int m,int n){
  int i,j;
  for(i=0;i<m;i++)
     for(j=0;j<n;j++)
       rec[i][j] = 0;
}

void showMine(int rec[][COL],int m,int n){
   int i,j;
   for(i=0;i<m;i++){
     for(j=0;j<n;j++){
        printf("%d ",rec[i][j]);
     }
     printf("\n");
   }
   printf("\n");
}
void showTmp(int rec[][TCOL],int m,int n){
   int i,j;
   for(i=0;i<m;i++){
     for(j=0;j<n;j++){
        printf("%d ",rec[i][j]);
     }
     printf("\n");
   }
   printf("\n");
}
void setMine(int rec[][COL],int recTmp[][TCOL],int m,int n){
   srand((int)time(0));
   int mc = 0;
   while( mc < MINE_NUM){
     int row = rand()%m;
     int col = rand()%n;
     if( rec[row][col] != MINE_FLAG ){
        rec[row][col] = MINE_FLAG;
        recTmp[row+1][col+1] = MINE_FLAG;
        mc++;
     }
  }
}

void sniffeMine(int rec[][COL],int recTmp[][TCOL],int m,int n){
   int i,j,row,col;
   for(i=0;i<m;i++)
     for(j=0;j<n;j++)
        if( rec[i][j] != MINE_FLAG ){
           row = i+1;
           col = j+1;
           rec[i][j] = isMine(recTmp,row-1,col-1) +
                       isMine(recTmp,row-1,col)   +
                       isMine(recTmp,row-1,col+1) +
                       isMine(recTmp,row,col-1)   +
                       isMine(recTmp,row,col+1)   +
                       isMine(recTmp,row+1,col-1) +
                       isMine(recTmp,row+1,col)   +
                       isMine(recTmp,row+1,col+1);
        }
}

int isMine(int rec[][TCOL],int m,int n){
   return rec[m][n] == MINE_FLAG ? 1:0;
}

运行结果( 9为雷,其它的为雷的数目):

扫雷的埋雷

时间: 2024-10-10 00:33:42

扫雷的埋雷的相关文章

扫雷 思路 与源代码 二

扫雷步骤2: 首先第一步:随机埋雷, 定义一个随机埋雷的对象,循环,取得一个整数范围的数量(0- 格子的数)如果这个格子有地雷为真,那么循环+1第二步:计算每个格子周边的格子的数量 用循环所有格子,其次在用一个cell类型的数组,并在周围格子的占内存中查找来存放当前方格周边所有的方格 并用int unm来记录 (传一个对象给我,然后统计当前的地雷)如果在周围格子中发现了地雷,记录下来并将值传给cell数组第三步:定义一个周边格子的的数组类将当前格子传给它. 先计算左右.上下.四个角,并返回一个值

Qt小游戏开发:扫雷

继续把Qt小游戏写一下~ 预览 步骤 整体的代码结构,游戏逻辑类和游戏界面类分离,采用MVC的思想. 1 定义游戏数据结构 游戏地图实际上是由一个个方块组成的二维矩阵,没个方块存储数字.雷或者标记的情况,另外还要定义一些游戏的运行状态枚举 // ---------------- 全局定义变量 ---------------- // // 方块的状态,未挖掘,翻开,标记,雷出现,错误标记 enum BlockState { UN_DIG, DIGGED, MARKED, BOMB, WRONG_

C语言实现扫雷

实现用C语言编写一个扫雷游戏 大家想必都玩过扫雷,无论那个版本都有难度供已选择,下面来分享一个自己用C语言编写的扫雷游戏吧! 编写语言:C语言 编写软件:visual studio 2017 1.首先是将游戏的测试模块写好,要有提示玩家进入的菜单函数以及选择函数等各种需要编写的函数想出一个整体框架来 //测试模块test.c #include "game.h" void Menu() { printf("************************************

bzoj1088[SCOI2005]扫雷

bzoj1088[SCOI2005]扫雷 题意: 有一个n×2的棋盘,第一列里面某些格子是雷,而第二列没有雷.由于第一列的雷可能有多种方案满足第二列的信息的限制,求根据第二列的信息第一列雷有多少种摆放方案. 题解: 水题,因为每个第一行的格子可以根据前一个第二行的格子里的信息唯一确定是否有雷,所以只要枚举第一个格子有没有雷就行. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #

洛谷P2670 扫雷游戏

题目描述 扫雷游戏是一款十分经典的单机小游戏.在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开一个非地雷格时,该格将会出现一个数字--提示周围格子中有多少个是地雷格.游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格. 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数. 注:一个格子的周围格子包括其上.下.左.右.左上.右上.左下.右下八个方向上与之直接相邻的格子. 输入输出格式 输入格式: 输入文件第一行是用一个

Vijos 1193 扫雷 【动态规划】

扫雷 描述 相信大家都玩过扫雷的游戏.那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目.现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:o 1* 2* 3* 2o 2* 2* 2 ('*'代表有雷,'o'代表无雷)由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案.

扫雷C++实现

1 #include <iostream> 2 #include<fstream> 3 #include <ctime> 4 #include <cmath> 5 #include <stdlib.h> 6 #include<stdio.h> //时间 //文件 7 #include <string> 8 #define random(x)(rand()%x) 9 using namespace std; 10 void

微信QQ红包埋雷控制尾数避雷软件

 如果你没用软件 那你一定是输微信咨询 fys620418 下面小编详细介绍一下这个软件.什么,这位朋友问这款全自动QQ抢红包埋雷扫软件-APP解码,到底有什么玩法,听小编详细说,绝对让您玩得高兴痛快.微信红包控制尾数,固定数字,固定金额,红包控三公玩法,制尾数.固定数字,固定金额,适合玩单双,欢乐十分,尾数玩法?QQ红包控制尾数,各种各样的接龙玩法,牛牛玩法,大小单双玩法,快乐十分玩法,暗宝玩法,各行玩法等等.还有七星彩玩法,控制尾数玩法.当然了,全自动QQ抢红包埋雷扫软件-APP解码,它的功

VB一键扫雷

XP游戏,扫描内存,然后模拟鼠标点击 Private Sub Command1_Click() Dim lhwnd As Long Dim lpid As Long Dim lRet As Long Dim lhProcess As Long Dim bData(1024) As Byte Dim bXY(8) As Byte Dim x As Long Dim y As Long Dim temp As Long Dim k As Long '其中8F就表示雷,0F表示非雷,当非雷区被点击后如