扫雷源程序

原创 2006年05月30日 21:00:00

#include "graphics.h"
#include "stdio.h"

#define ROW 16
#define COL 16
#define STARTX 50
#define STARTY 50
#define SIZEX 20
#define SIZEY 20

#define UNFLAG 0
#define FLAGED 1
#define QUESTION 2
#define OPEN 3
#define EXPLORE 4
#define NULL 0

#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ENTER 0x1c0d
#define SPACE 0x3920
#define UPPERF 0x2146
#define LOWERF 0x2166
#define UPPERQ 0x1051
#define LOWERQ 0x1071
#define UPPERA 0x1e41
#define LOWERA 0x1e61
#define UPPERN 0x314e
#define LOWERN 0x316e
#define UPPERY 0x1559
#define LOWERY 0x1579
#define ESC 0x11b

int table[ROW][COL];
int flag[ROW][COL];
int num[ROW][COL];
int di[8]={-1,0,1,-1,1,0,1,-1};
int dj[8]={1,1,1,0,0,-1,-1,-1};
int pi,pj;
int gameRes;

void initGraph()
{
 int gdriver,gmod;
 detectgraph(&gdriver,&gmod);
 initgraph(&gdriver,&gmod,"F://Program//TC");
}

void generateMine()
{
 int i,j;
 int totleMine;
 int ri,rj;
 int ni,nj;

 totleMine=ROW*COL/6;
 memset(table,0,sizeof(table));
 memset(num,0,sizeof(num));

 srand((unsigned)time(NULL));
 for(i=0;i<totleMine;i++)
 {
  do{
   ri=rand()%ROW;
   rj=rand()%COL;
  }while(table[ri][rj]);
  table[ri][rj]=1;
  for(j=0;j<8;j++)
  {
   ni=ri+di[j];
   nj=rj+dj[j];
   if(ni>=0&&ni<ROW&&nj>=0&&nj<COL)
   {
    num[ni][nj]++;
   }
   memset(flag,UNFLAG,sizeof(flag));
  }

 }

}

int autoMine(){
 int i;
 int ai,aj;
 int autoRes=0;
 if(flag[pi][pj]==OPEN){
   for(i=0;i<8;i++){
    ai=pi+di[i];
    aj=pj+dj[i];
    if(ai>=0&&ai<ROW&&aj>=0&&aj<COL&&flag[ai][aj]!=FLAGED){
     if(openMine(ai,aj))
      autoRes=-1;
     }
    }
  }
 return autoRes;
}

void drawBlock(int i,int j)
{
 int x=0;
 int y=0;
 int xx=0;
 int yy=0;
 int tx,ty;
 int color;
 char ifMined,buf[3];

 itoa(num[i][j],buf,10);


 x=STARTX+i*SIZEX;
 y=STARTY+j*SIZEY;
 xx=x+SIZEX-1;
 yy=y+SIZEY-1;

 tx=x+5;
 ty=y+5;

 color=flag[i][j]==0?LIGHTGRAY:DARKGRAY;
 setcolor(WHITE);
 rectangle(x,y,xx,yy);
 setfillstyle(SOLID_FILL,color);
 floodfill(x+1,y+1,WHITE);

 if(pi==i&&pj==j){
  setcolor(RED);
  rectangle(x+1,y+1,xx-1,yy-1);
 }

 switch(flag[i][j]){
  case FLAGED:
   outtextxy(tx,ty,"F");
   break;
  case QUESTION:
   outtextxy(tx,ty,"Q");
   break;
  case OPEN:
   outtextxy(tx,ty,buf);
   break;
  case EXPLORE:
   outtextxy(tx,ty,"*");
   break;
 }
}

void moveDown(){
 if(pj<COL-1){
  pj++;
  drawBlock(pi,pj);
  drawBlock(pi,pj-1);
  }
}

void moveUp(){
 if(pj>=1){
   pj--;
 drawBlock(pi,pj);
 drawBlock(pi,pj+1);
 }
}

void moveLeft(){
 if(pi>=1){
  pi--;
  drawBlock(pi,pj);
  drawBlock(pi+1,pj);
 }
}

void moveRight(){
 if(pi<ROW-1){
  pi++;
  drawBlock(pi,pj);
  drawBlock(pi-1,pj);
 }
}

void flagBlock(){
 if(flag[pi][pj]==FLAGED)
   flag[pi][pj]=UNFLAG;
 else if(flag[pi][pj]==UNFLAG)
   flag[pi][pj]=FLAGED;
 drawBlock(pi,pj);
}
void questBlock(){
 if(flag[pi][pj]==QUESTION)
  flag[pi][pj]=UNFLAG;
 else if(flag[pi][pj]==UNFLAG)
  flag[pi][pj]=QUESTION;
 drawBlock(pi,pj);
}

int openMine(int pi,int pj){
 if(flag[pi][pj]==OPEN)
  return 0;
 else{
  if(table[pi][pj]==0){
   flag[pi][pj]=OPEN;
   drawBlock(pi,pj);
   return 0;
  }else{
   flag[pi][pj]=EXPLORE;
   drawBlock(pi,pj);
   gameRes=-1;
   return -1;
  }
 }
}

drawTable()
{
 int i,j;
 for(i=0;i<ROW;i++)
  for(j=0;j<COL;j++)
   drawBlock(i,j);
}

int getKey()
{
 int key;
 while(1)
 {
  key=bioskey(0);
  switch(key){
   case ENTER:
   case UP:
   case DOWN:
   case LEFT:
   case RIGHT:
   case SPACE:
   case ESC:
   case LOWERF:
   case UPPERF:
   case LOWERA:
   case UPPERA:
   case LOWERQ:
   case UPPERQ: return key;
  }
 }
}

void newGame()
{
 cleardevice();
 generateMine();
 gameRes=0;
 pi=pj=0;
 drawTable();
 getch();
}

int confirm(){
 int k;
 char *ch;
 if(gameRes==1)
  ch="Success! Try again?(y/n)";
 else if(gameRes==-1)
  ch="Failed! Try again?(y/n)";
 else if(gameRes==2)
  ch="Quit?(y/n)";
  outtextxy(20,20,ch);

 while(1){
   k=bioskey(0);
   switch(k){
    case UPPERY:
    case LOWERY:
     if(gameRes!=2)
      return 1;
     else
      return 0;
    case UPPERN:
    case LOWERN:
     if(gameRes!=2)
      return 0;
     else
      return 1;
   }
 }
}

int checkWin(){
 int i,j;
 for(i=0;i<ROW;i++){
  for(j=0;j<COL;j++){
   if(flag[i][j]==0)
    return gameRes;
  }
 }
 return 1;
}

main()
{
 int key;
 initGraph();
 do{
  newGame();
  do{
   key=getKey();
   switch(key){
    case DOWN:
     moveDown();
     break;
    case UP:
     moveUp();
     break;
    case LEFT:
     moveLeft();
     break;
    case RIGHT:
     moveRight();
     break;
    case UPPERF:
    case LOWERF:
     flagBlock();
     break;
    case UPPERQ:
    case LOWERQ:
     questBlock();
     break;
    case ENTER:
    case SPACE:
     gameRes=openMine(pi,pj);
     break;
    case ESC:
     gameRes=2;
     break;
    case UPPERA:
    case LOWERA:
     gameRes=autoMine();
     break;
   }
   gameRes=checkWin();
   }while(!gameRes);
  }while(confirm());

}

控制台扫雷程序C++源代码(Dim版V0.10)

很久很久以前(感觉上),我们算法课上的老师就说给我们现场编个扫雷游戏看看。可过了N周后还是没见行动。郁闷了,就想自己写个出来算了,不过又还没学会编图形界面,所以只好做一个控制台的实现了。经过几个小时从...
  • mzlogin
  • mzlogin
  • 2008年11月13日 05:25
  • 1341

java扫雷游戏源代码下载

java扫雷游戏源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463791090688.htm...
  • springmvc_springdata
  • springmvc_springdata
  • 2015年06月13日 12:31
  • 1172

自动扫雷程序

很多人喜欢玩Windows的扫雷程序,去年11月份写了这个小程序,那时还在Infosys。以下是去年在我的MSN Sapce上写的:“这两天挺无聊的,Bob的扫雷战绩越来越令人惊叹,中级达到26秒,于...
  • ZeroStone
  • ZeroStone
  • 2006年10月26日 20:04
  • 2336

【matlab编程】Matlab版扫雷

我发现有些人平常闲着的时候会玩window自带的游戏,其中最常见的就是扫雷和纸牌。本来想用matlab编写全自动扫雷程序用来作弊,可是后来发现扫雷问题是NP完全问题(正如:旅行商NP难问题一样不能被解...
  • tengweitw
  • tengweitw
  • 2014年03月01日 18:36
  • 4337

(原创)用python实现自动扫雷机

先说下原理,原理其实很简单,设法获得“雷区”的数据,然后通过模拟鼠标动作,点击雷区上非地雷的的格子,就搞定了:)  所以技术难点只有三个:获得雷区数据、找到扫雷程序和模拟鼠标动作。     先说简单的...
  • YunYi
  • YunYi
  • 2008年03月10日 19:00
  • 1175

"扫雷外挂" 原理篇

1.我理解的外挂 其实我没有做过外挂,前阵子在玩"炉石传说",这游戏免费,每赢3局可以得到10金币,想做个外挂来挂着玩,无奈水平有限,只能从"扫雷外挂"做起了, =。= 外挂其实是不限语言的,当然...
  • fox64194167
  • fox64194167
  • 2014年04月08日 09:26
  • 6751

Unity实现简易扫雷

扫雷的核心思想就是递归,点击一个格子,四周八个格子都会进行检测雷的操作,直到不能检测,用的是广度搜索算法。因为不想写太长的博客,技术也有限,所以这是个简易的扫雷,可扩展性也不好,大家看看思想就好,有兴...
  • zzw8866755
  • zzw8866755
  • 2016年09月29日 19:25
  • 1163

C++扫雷代码

#include #include #include using namespace std; int map[12][12]; // 为避免边界的特殊处理,故将二维数组四周边界扩展1 ...
  • Tsaid
  • Tsaid
  • 2011年09月09日 22:56
  • 8835

java实现扫雷游戏

java 扫雷 改进 右键标记雷
  • Limbos
  • Limbos
  • 2015年08月16日 12:16
  • 4157

扫雷 unity版

以前看没想过扫雷的实现,昨天看到一个帖子发的扫雷,写的很恶心,所以自己就尝试了一下,直接新建一个cs脚本复制以下代码就可以了。 先看看效果 代码: using System.Collec...
  • Cheng624
  • Cheng624
  • 2017年02月20日 10:46
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扫雷源程序
举报原因:
原因补充:

(最多只允许输入30个字)