扫雷源程序

原创 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());

}

相关文章推荐

扫雷游戏源程序

  • 2014年08月25日 09:05
  • 2.96MB
  • 下载

扫雷源程序

  • 2012年08月06日 15:17
  • 17KB
  • 下载

最详细易懂的CRC-16校验原理(附源程序)

原文地址:http://wenku.baidu.com/view/25383108581b6bd97f19ead1.html   最详细易懂的CRC-16校验原理(附源程序) 1、...

小游戏扫雷源程序

  • 2014年01月05日 22:24
  • 11KB
  • 下载

java扫雷有源程序

  • 2012年12月22日 19:36
  • 31KB
  • 下载

如何在Idea中获取git上的源程序

我一步步的截图: 1.File-->Settings-->Version Control-->GitHub: 在这一步中你要输入自己的git账户名和密码(所以一定要注册哦,否则点击下面的S...

linux下扫雷源程序代码

  • 2013年03月16日 09:07
  • 4KB
  • 下载

扫雷源程序及exe

  • 2014年04月07日 19:01
  • 58KB
  • 下载

一个matlab遗传算法源程序

对于初学者,尤其是还没有编程经验的非常有用的一个文件 遗传算法实例 % 下面举例说明遗传算法 % % 求下列函数的最大值 % % f(x)=10*sin(5x)+7*cos(4x) x∈[...

Windows扫雷源程序

  • 2002年08月21日 00:00
  • 42KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:扫雷源程序
举报原因:
原因补充:

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