⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mine.cpp

📁 有点类似于Windows的扫雷小游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
# include <time.h>
# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
# include <iostream.h>
# include <graphics.h>
//# include "hz.h"
# include "mouse.h"
# include "ini.h"
# include "number.cpp"
# define  OK              1
# define  ERROR           0
# define  BOMB            10
# define  NORMAL          1
# define  PRESSED         2
# define  MARKED          3
# define  UNDECIDED       4
# define  NUM1            5
# define  NUM2            6
# define  NUM3            7
# define  NUM4            8
# define  NUM5            9
# define  NUM6            10
# define  NUM7            11
# define  NUM8            12
# define  NUM0            13
# define  BOMBED          14
# define  CLICKBOMB       15
# define  CHAHAO          16
class BOARD{
    public:
	int  **chess_fore;
	int  **chess_back;
	int  offset_x;
	int  offset_y;
	int  width;
	int  height;
	int  interval;
	int  color;
	int  back_color;
	int  bomb_num;
	int  leftover;
	int  correct;
    public:
	     BOARD();
	    ~BOARD();
	int  SetCoordinate();
	int  DrawBoard();
	int  Get_X(int x);
	int  Get_Y(int x);
	int  CalcuPos_X(int x);
	int  CalcuPos_Y(int y);
	int  DrawChess(int x,int y);
	int  DrawAllChess();
	int  GenerateMine();
	int  ReflectChess(int x,int y);
	int  ReflectAllChess();
	int  Edge(int x,int y);
	int  TurnBack(int x,int y);
};
class FACE{
   public:
	int offx;
	int offy;
	int width;
	int height;
	int status;
   public:
	FACE();
   int  DrawFace();
   int  FaceEvent();
   int  SetCoordinate();
};
class COUNTER{
  public:
     int  offx;
     int  offy;
     int  width;
     int  height;
     int  count;
     long now_time;
     long old_time;
  public:
 int SetCoordinate();
 int CounterEvent();
 int DrawCounter();
 int ClearCounter();
};
class BOMB_COUNTER{
  public:
     int  offx;
     int  offy;
     int  width;
     int  height;
     int  count;
     long now_num;
     long old_num;
  public:
 int SetCoordinate();
 int CounterEvent();
 int DrawCounter();
 int ClearCounter();
};
/*-----------------------------------------------------------------------*/
int** Alloc2dArray(int hang,int lie);
int   Delete2dArray(int **a,int hang,int lie);
int   Fill(int left,int top,int right,int bottom,int color);
void  box3d(int left,int top,int right,int bottom,int main_color,int state);
void  frame3d(int left,int top,int right,int bottom,int thick,int color,int status);
void  DrawFlag(int x,int y);
void  DrawMine(int x,int y);
void  GameInit();
/*-----------------------------------------------------------------------*/
BOARD        board;
FACE         face;
COUNTER      counter;
BOMB_COUNTER b_counter;
int          died=FALSE;
int          win=FALSE;
int          MAINCOLOR=7;
int          level;
/*-----------------------------------------------------------------------*/
BOARD::BOARD()
{
 offset_x=0;offset_y=0;
 height=0;width=0;
 interval=16;
 color=0;
 back_color=2;
 bomb_num=0;
 leftover=0;
 correct=0;
}
BOARD::~BOARD()
{
 Delete2dArray(chess_fore,height,width);
 Delete2dArray(chess_back,height,width);
}
int BOARD::SetCoordinate()
{
 int i,j;
 offset_x=ReadINI_int("OFFSETX");
 offset_y=ReadINI_int("OFFSETY");;
 width=ReadINI_int("WIDTH");
 height=ReadINI_int("HEIGHT");
  chess_fore=Alloc2dArray(height,width);
 chess_back=Alloc2dArray(height,width);
 for(i=0;i<height;i++)
  for(j=0;j<width;j++)
   {chess_fore[i][j]=NORMAL;chess_back[i][j]=0;}
 return OK;
}
int BOARD::DrawBoard()
{
 int i;
 Fill(offset_x,offset_y,offset_x+width*interval,offset_y+height*interval,back_color);
 setcolor(color);
 for(i=0;i<=width;i++)
   line(offset_x+i*interval,offset_y,offset_x+i*interval,offset_y+height*interval);
 for(i=0;i<=height;i++)
   line(offset_x,offset_y+i*interval,offset_x+interval*width,offset_y+i*interval);
 return OK;
}
int BOARD::Get_X(int x)
{
 int i;
 if(x<=offset_x||x>=offset_x+width*interval)return -1;
 i=(x-offset_x)/interval;
 return i;
}
int BOARD::Get_Y(int y)
{
 int i;
 if(y<=offset_y||y>=offset_y+height*interval)return -1;
 i=(y-offset_y)/interval;
 return i;
}
int BOARD::CalcuPos_X(int x)
{
 if(x==-1)
  return ERROR;
 else
  return offset_x+x*interval;
}
int BOARD::CalcuPos_Y(int y)
{
 if(y==-1)
  return ERROR;
 else
  return offset_y+y*interval;
}
int BOARD::DrawChess(int x,int y)
{
 int draw_x,draw_y,end_x,end_y;
 draw_x=CalcuPos_X(y)+1;draw_y=CalcuPos_Y(x)+1;
 end_x=draw_x+interval-2;end_y=draw_y+interval-2;
 switch(chess_fore[x][y])
 {
  case NORMAL:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,1);break;
  case PRESSED:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);break;
  case UNDECIDED:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,1);setcolor(15);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"?");break;
  case MARKED:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,1);DrawFlag(draw_x+(interval-8)/2,draw_y+(interval-8)/2);break;
  case NUM0:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);break;
  case NUM1:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(10);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"1");break;
  case NUM2:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(12);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"2");break;
  case NUM3:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(13);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"3");break;
  case NUM4:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(14);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"4");break;
  case NUM5:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(15);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"5");break;
  case NUM6:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(11);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"6");break;
  case NUM7:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(9);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"7");break;
  case NUM8:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);setcolor(10);outtextxy(draw_x+(interval-8)/2,draw_y+(interval-8)/2,"8");break;
  case BOMBED:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);DrawMine(draw_x,draw_y);break;
  case CLICKBOMB:box3d(draw_x,draw_y,end_x,end_y,12,0);DrawMine(draw_x,draw_y);break;
  case CHAHAO:box3d(draw_x,draw_y,end_x,end_y,MAINCOLOR,0);DrawCha(draw_x+1,draw_y+1,MAINCOLOR);break;
 }
 return OK;
}
int BOARD::DrawAllChess()
{
 int i,j;
 for(i=0;i<height;i++)
  for(j=0;j<width;j++)
   DrawChess(i,j);
 return OK;
}
int BOARD::GenerateMine()
{
 int i,j,t,b=0;
 bomb_num=0;
 for(i=0;i<height;i++)
  for(j=0;j<width;j++)
   {
     chess_fore[i][j]=NORMAL;
     if(random(level)==1)
      {chess_back[i][j]=BOMB;bomb_num++;}
     else
      chess_back[i][j]=0;
   }
 leftover=bomb_num;
 correct=0;
 for(i=1;i<height-1;i++)
  for(j=1;j<width-1;j++)
   {
     b=0;
     if(chess_back[i][j]!=BOMB)
      {
       if(chess_back[i][j-1]==BOMB)b++;
       if(chess_back[i][j+1]==BOMB)b++;
       if(chess_back[i-1][j]==BOMB)b++;
       if(chess_back[i+1][j]==BOMB)b++;
       if(chess_back[i+1][j+1]==BOMB)b++;
       if(chess_back[i-1][j-1]==BOMB)b++;
       if(chess_back[i+1][j-1]==BOMB)b++;
       if(chess_back[i-1][j+1]==BOMB)b++;
       chess_back[i][j]=b;
      }
   }
 for(i=1;i<width-1;i++)
 {
  b=0;
  if(chess_back[0][i]!=BOMB)
   {
    if(chess_back[0][i-1]==BOMB)b++;
    if(chess_back[0][i+1]==BOMB)b++;
    if(chess_back[1][i]==BOMB)b++;
    if(chess_back[1][i-1]==BOMB)b++;
    if(chess_back[1][i+1]==BOMB)b++;
    chess_back[0][i]=b;
   }
 }
 for(i=1;i<width-1;i++)
  {
   b=0;
   if(chess_back[height-1][i]!=BOMB)
    {
     if(chess_back[height-1][i-1]==BOMB)b++;
     if(chess_back[height-1][i+1]==BOMB)b++;
     if(chess_back[height-2][i]==BOMB)b++;
     if(chess_back[height-2][i-1]==BOMB)b++;
     if(chess_back[height-2][i+1]==BOMB)b++;
     chess_back[height-1][i]=b;
    }
  }
  for(i=1;i<height-1;i++)
  {
   b=0;
   if(chess_back[i][0]!=BOMB)
    {
     if(chess_back[i-1][0]==BOMB)b++;
     if(chess_back[i+1][0]==BOMB)b++;
     if(chess_back[i-1][1]==BOMB)b++;
     if(chess_back[i+1][1]==BOMB)b++;
     if(chess_back[i][1]==BOMB)b++;
     chess_back[i][0]=b;
    }
  }
  for(i=1;i<height-1;i++)
  {
   b=0;
   if(chess_back[i][width-1]!=BOMB)
    {
     if(chess_back[i-1][width-1]==BOMB)b++;
     if(chess_back[i+1][width-1]==BOMB)b++;
     if(chess_back[i-1][width-2]==BOMB)b++;
     if(chess_back[i+1][width-2]==BOMB)b++;
     if(chess_back[i][width-2]==BOMB)b++;
     chess_back[i][width-1]=b;
    }
  }
 if(chess_back[0][0]!=BOMB)
  {b=0;
   if(chess_back[0][1]==BOMB)b++;
   if(chess_back[1][1]==BOMB)b++;
   if(chess_back[1][0]==BOMB)b++;
   chess_back[0][0]=b;
  }
 if(chess_back[0][width-1]!=BOMB)
  {b=0;
   if(chess_back[0][width-2]==BOMB)b++;
   if(chess_back[1][width-1]==BOMB)b++;
   if(chess_back[1][width-2]==BOMB)b++;
   chess_back[0][width-1]=b;
  }
 if(chess_back[height-1][0]!=BOMB)
  {b=0;
   if(chess_back[height-2][0]==BOMB)b++;
   if(chess_back[height-2][1]==BOMB)b++;
   if(chess_back[height-1][1]==BOMB)b++;
   chess_back[height-1][0]=b;
  }
 if(chess_back[height-1][width-1]!=BOMB)
  {b=0;
   if(chess_back[height-2][width-1]==BOMB)b++;
   if(chess_back[height-2][width-2]==BOMB)b++;
   if(chess_back[height-1][width-2]==BOMB)b++;
   chess_back[height-1][width-1]=b;
  }
 return OK;
}
int BOARD::ReflectChess(int i,int j)
{
   if(chess_fore[i][j]!=MARKED)
    switch(chess_back[i][j])
     {
      case 0:chess_fore[i][j]=NUM0;break;
      case 1:chess_fore[i][j]=NUM1;break;
      case 2:chess_fore[i][j]=NUM2;break;
      case 3:chess_fore[i][j]=NUM3;break;
      case 4:chess_fore[i][j]=NUM4;break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -