📄 mine.cpp
字号:
# 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 + -