# include & ltstdlib.h & gt
# include & ltdos.h & gt
# leftpress 0xff0/kloc-0 정의/
# 정의 마우스 왼쪽 버튼 클릭 0xff 10
# 왼쪽 드래그 0xff 19 정의
# 마우스 이동 0xff08 정의
구조체
{
Int num/* 메쉬의 현재 상태는 무엇입니까? 1 레이 있음, 0 은 이미 숫자나 빈 칸을 표시했습니다 */
Int roundnum/* 그리드 주위에 얼마나 많은 레이 */
Int 로고 /* 붉은 깃발이 표시된 로고를 마우스 오른쪽 버튼으로 클릭합니다. 0 에는 붉은 깃발이 없고 1 붉은 깃발이 있습니다. */
} 광산 [10] [10];
Intgameagain = 0; /* 다시 시작하시겠습니까? 변수 */
Intgameplay = 0; /* 게임을 처음 하는 로고인가요? */
Int mineNUM/* 처리된 메쉬 수 계산 */
Char randminenum [3]; /* 일련의 숫자 표시 */
Int Keystate
Int MouseExist
Int MouseButton
Int MouseX
Int MouseY
Voidinit (void); /* 그래픽 드라이버 */
Void mouse on (void); /* 마우스 커서 표시 */
Void mouse off (void); /* 마우스 커서 숨기기 */
Void MouseSetXY(int, int) : /* 현재 위치 설정 */
Intleft press (void); /* 왼쪽으로 */
Intrightpress (void); /* 마우스 오른쪽 버튼을 누릅니다 */
Void mouse getxy (void) : /* 현재 위치 가져오기 */
잘못된 제어 (void); /* 게임 시작, 재시작 및 종료 */
Void GameBegain(void);); /* 게임 시작 화면 */
Void DrawSmile (유효하지 않음); /* 웃는 얼굴 그리기 */
Void DrawRedflag(int, int) : /* 붉은 깃발 표시 */
Void DrawEmpty(int, int, int, int); /* 공백 두 개 표시 */
Void gameover (void); /* 게임 종료 */
Void GameWin (유효하지 않음); /* 승리를 보여주다 */
Int MineStatistics(int, int); /* 각 메쉬 주위의 광선 수 계산 */
Int ShowWhite(int, int); /* 지뢰밭의 빈 부분 표시 */
Void 게임 (void); /* 게임 과정 */
Void Close (유효하지 않음); /* 그래픽 닫기 */
잘못된 탐색기 (잘못된 탐색기)
{
Init ();
컨트롤 ();
닫기 ();
}
Void Init(void)/* 그래픽 시작 */
{
Int gd=DETECT, GM;
Initgraph (& Gd, & ampgm, "c: \ \ TC");
}
Void Close(void)/* 그래픽 닫기 */
{
Closegraph ();
}
Void MouseOn(void)/* 마우스 커서 표시 */
{
_ ax = 0x01;
Geninterrupt (0x33);
}
Void MouseOff(void)/* 마우스 커서 숨기기 */
{
_ AX = 0x02
Geninterrupt (0x33);
}
Void MouseSetXY(int x, int y)/* 현재 위치 설정 */
{
_ CX = x;;
_ DX = y;;
_ AX = 0x04
Geninterrupt (0x33);
}
Int LeftPress(void)/* 마우스 왼쪽 버튼을 누릅니다 */
{
_ AX = 0x03
Geninterrupt (0x33);
회귀 (_ BX & amp;; 1);
}
Int RightPress(void)/* 마우스 오른쪽 버튼을 누릅니다 */
{
_ AX = 0x03
Geninterrupt (0x33);
회귀 (_ BX & amp;; 2);
}
Voidmousetxy (void)/* 현재 위치 가져오기 */
{
_ AX = 0x03
Geninterrupt (0x33);
MouseX = _ CX;;
MouseY = _ DX
}
Void 컨트롤 (void)/* 게임 시작, 재시작 및 종료 */
{
Intgameflag =1; /* 게임 실패 후 재부팅 여부를 판단하는 로고 */
While( 1)
{
If(gameFLAG)/* 게임 실패 후 게임 재시작 또는 종료를 결정하지 않은 경우 계속 판단 */
{
Gamebegain (); /* 게임 초기 화면 */
게임성 (); /* 특정 게임 */
If(gameAGAIN== 1)/* 게임에서 다시 시작 */
{
Gameagain = 0;
계속;
}
}
Mouseon ();
Gameflag = 0;
If(LeftPress())/* 다시 시작할지 여부를 결정합니다 */
{
Mousegetxy ();
If(MouseX & gt;; 280& & ampmousex & lt300 & amp & ampmousey & gt65 & amp& 마우스 & lt85)
{
Gameflag =1;
계속;
}
}
If(kbhit())/* 키를 눌러 종료할지 여부를 결정합니다 */
깨뜨리다
}
Mouseoff ();
}
Void DrawSmile(void)/* 웃는 얼굴 그리기 */
{
Setfillstyle(SOLID_FILL, 노란색);
Filllellipse (290,75, 10,10);
Setcolor (노란색);
Setfillstyle(SOLID_FILL, 검은색); /* 눈 */
Filllellipse (285,75,2,2);
Filllellipse (295,75,2,2);
Setcolor (검은색); /* 입 */
바 (287,80,293,81);
}
Void draw dflag (int I, int j)/* 빨간색 로고 표시 */
{
Setcolor (7);
Setfillstyle(SOLID_FILL, 빨강);
Bar (198+j * 20,95+I * 20,198+j * 20+5,95+I * 20
Setcolor (검은색);
라인 (198+j * 20,95+I * 20,198+j * 20,95+I * 20+/
}
Void draw empty (int I, int j, int mode, int color)/* 두 가지 공백 표시 */
{
Setcolor (색상);
Setfillstyle(SOLID_FILL, color);
If (모드 = = 0)/* 클릭되지 않은 큰 메쉬 */
Bar(200+j*20-8,100+I * 20-8,200+j * 20+8,100
기타
If (모드 = =1)/* 빈 작은 메쉬 클릭 */
Bar(200+j*20-7,100+I * 20-7,200+j * 20+7,100
}
잘못된 게임 게인 (void)/* 게임 시작 화면 */
{
Int I, j;
Cleardevice ();
만약! = 1)
{
Mousesetxy (290,70); /* 마우스의 초기 위치가 초기 좌표로 사용됩니다 */
MouseX = 290
MouseY = 70
}
게임성 =1; /* 다음에 재부팅을 누르면 마우스가 다시 초기화되지 않습니다 */
MineNUM = 0;;
Setfillstyle(SOLID_FILL, 7);
자 (190, 60, 390, 290);
For(I = 0;; 나< 10; I++)/* 그리드 그리기 */
For(j = 0;; J< 10; J++)
DrawEmpty(i, j, 0, 8);
Setcolor (7);
Drawsmile (); /* 얼굴 그리기 */
Randomize ();
For(I = 0;; 나< 10; I++)/* 100 체크 무늬 무작위 분포에 지뢰가 있는지 여부 */
For(j = 0;; J< 10; J++)
{
내 [나 ][j]. Num = random (8); /* 난수의 결과가 1 이면 이 칸에 지뢰가 있는 것입니다 */
If (내 [i][j]. Num== 1)
Minenum++;+; /* 기존 광산 수에 1*/
기타
내 [나 ][j]. Num = 2;;
내 [나 ][j]. Flag = 0;; /* 는 붉은 깃발 표시가 없음을 나타냅니다 */
}
스프린트 (randminenum,' %d', minenum); /* 이번 총 광산 수를 보여줍니다 * * * *
Setcolor (1);
Settextstyle (0,0,2);
Outtextxy (210,70, randminenum);
Minenum =100-minenum; /* 변수의 빈 셀 수 */
Mouseon ();
}
Void GameOver(void)/* 게임 종료 화면 */
{
Int I, j;
Setcolor (0);
For(I = 0;; 나< 10; I++)
For(j = 0;; J< 10; J++)
If (내 [i][j]. Num== 1)/* 모든 지뢰 표시 */
{
DrawEmpty(i, j, 0, red);
Setfillstyle(SOLID_FILL, 검은색);
Fillellipse (200+j * 20,100+I * 20,7,7);
}
}
Void GameWin(void)/* 승리 표시 */
{
Setcolor (11);
Settextstyle (0,0,2);
Outtextxy (230,30, "네가 이겼어!" " );
}
Int MineStatistics(int I, int j)/* 각 메쉬 주위의 광선 수 계산 */
{
Intnnum = 0;
If(I = = 0 & amp;; & ampJ==0)/* 왼쪽 위 그리드의 통계 */
{
If (내 [0][ 1]). Num== 1)
Nnum++;+;
If (내 [1][0]). Num== 1)
Nnum++;+;
If (내 [1][ 1]. Num== 1)
Nnum++;+;
}
기타
If(I = = 0 & amp;; & ampJ==9)/* 오른쪽 위 그리드 통계 */
{
If (내 [0][8]). Num== 1)
Nnum++;+;
If (내 [1][9]). Num== 1)
Nnum++;+;
If (내 [1][8]). Num== 1)
Nnum++;+;
}
기타
If(I = = 9 & amp;; & ampJ==0)/* 왼쪽 아래 그리드 통계 */
{
If (내 [8][0]). Num== 1)
Nnum++;+;
If (내 [9][ 1]). Num== 1)
Nnum++;+;
If (내 [8][ 1]). Num== 1)
Nnum++;+;
}
기타
If(I = = 9 & amp;; & ampJ==9)/* 오른쪽 아래 그리드 통계 */
{
만약 (내 [9][8]). Num== 1)
Nnum++;+;
만약 (내 [8][9]). Num== 1)
Nnum++;+;
만약 (내 [8][8]). Num== 1)
Nnum++;+;
}
Else if(j==0)/* 왼쪽 첫 번째 열 그리드 통계 */
{
If (내 [i][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j]. Num== 1)
Nnum++;+;
If (내 [i- 1][j]. Num== 1)
Nnum++;+;
If (내 [i- 1][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j+ 1]). Num== 1)
Nnum++;+;
}
Else if(j==9)/* 오른쪽 첫 번째 열 그리드에 대한 통계 */
{
If (내 [i][j- 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j]. Num== 1)
Nnum++;+;
If (내 [i- 1][j]. Num== 1)
Nnum++;+;
If (내 [i- 1][j- 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j- 1]). Num== 1)
Nnum++;+;
}
Else if(i==0)/* 첫 번째 그리드의 통계 */
{
If (내 [i+ 1][j]. Num== 1)
Nnum++;+;
If (내 [i][j- 1]). Num== 1)
Nnum++;+;
If (내 [i][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j- 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j+ 1]). Num== 1)
Nnum++;+;
}
Else if(i==9)/* 마지막 그리드에 대한 통계 */
{
If (내 [i- 1][j]. Num== 1)
Nnum++;+;
If (내 [i][j- 1]). Num== 1)
Nnum++;+;
If (내 [i][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i- 1][j- 1]). Num== 1)
Nnum++;+;
If (내 [i- 1][j+ 1]). Num== 1)
Nnum++;+;
}
Else/* 일반 격자 통계 */
{
If (내 [i- 1][j]. Num== 1)
Nnum++;+;
If (내 [i- 1][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j+ 1]). Num== 1)
Nnum++;+;
If (내 [i+ 1][j]. Num== 1)
Nnum++;+;
If (내 [i+ 1][j- 1]). Num== 1)
Nnum++;+;
If (내 [i][j- 1]). Num== 1)
Nnum++;+;
If (내 [i- 1][j- 1]). Num== 1)
Nnum++;+;
}
반환 (nnum); /* 그리드 주변에 얼마나 많은 번개가 있는지 반환하는 통계 결과 * * * *
}
Int ShowWhite(int I, int j)/* 지뢰밭이 없는 빈 부분 표시 */
{
If (내 [I] [j]. Flag = = 1 || | 광산 [I] [j]. Num = = 0)/* 붉은 깃발이나 메시가 이미 처리된 경우 */
반환;
Minenum-; /* 숫자나 공백을 표시하는 격자는 또 하나의 격자가 처리되었음을 나타내고, 모든 격자가 처리되면 승리를 나타낸다. */
If (내 [i][j]. Roundnum==0 입니다. & amp 내 [나 ][j]. Num! = 1)/* 공간 표시 */
{
DrawEmpty(i, j, 1, 7);
내 [나 ][j]. Num = 0;;
}
기타
If (내 [i][j]. Roundnum! =0)/* 출력 번개 수 */
{
DrawEmpty(i, j, 0, 8);
스프린트 (randminenum, "%d", Mine[i][j]. Round num);
Setcolor (빨간색);
Outtextxy (195+j * 20,95+I * 20, randminenum);
내 [나 ][j]. Num = 0;; /* 번개 수를 출력한 메시는 해당 메시가 이미 0 과 함께 사용됨을 나타냅니다 */
반환;
}
/* 8 방향의 모든 빈 메쉬를 재귀적으로 표시합니다 */
만약! = 0 & amp& amp 내 [i- 1][j]. Num! = 1)
쇼 화이트 (I-1,j);
만약! = 0 & amp& ampj! = 9 & amp& amp 내 [i- 1][j+ 1]. Num! = 1)
쇼 화이트 (I-1,j+1);
만약 (j! = 9 & amp& amp 내 [i][j+ 1]. Num! = 1)
쇼 화이트 (I, j+1);
만약 (j! = 9 & amp& amp 나! = 9 & amp& amp 내 [i+ 1][j+ 1]. Num! = 1)
쇼 화이트 (I+1,j+1);
만약! = 9 & amp& amp 내 [i+ 1][j]. Num! = 1)
쇼 화이트 (I+1,j);
만약! = 9 & amp& ampj! = 0 & amp& amp 내 [i+ 1][j- 1]. Num! = 1)
쇼 화이트 (I+1,j-1);
만약 (j! = 0 & amp& amp 내 [i][j- 1]. Num! = 1)
쇼 화이트 (I, j-1);
만약! = 0 & amp& ampj! = 0 & amp& amp 내 [i- 1][j- 1]. Num! = 1)
쇼 화이트 (I-1,j-1);
}
Void 게임 플레이 (void)/* 게임 프로세스 */
{
Int I, j, Num/*Num 은 통계 함수를 받고 그리드 주위에 몇 개의 지뢰가 있는지 반환하는 데 사용됩니다. */
For(I = 0;; 나< 10; I++)
For(j = 0;; J< 10; J++)
내 [나 ][j]. Roundnum=MineStatistics(i, j); /* 각 그리드 주위에 얼마나 많은 지뢰가 있는지 계산하십시오 */
그리고 (! Kbhit ())
{
If(LeftPress())/* 마우스 왼쪽 버튼 누르기 */
{
Mousegetxy ();
If(MouseX & gt;; 280& & ampmousex & lt300 & amp & ampmousey & gt65 & amp& 마우스 & lt85)/* 다시 시작 */
{
Mouseoff ();
Gameagain =1;
깨뜨리다
}
If(MouseX & gt;; 190 입니다. & ampmousex & lt390 & amp & ampmousey & gt90 & amp& 마우스 & lt290)/* 현재 마우스 위치는 그리드 */
{
J = (mousex-190)/20; /*x 좌표 */
I = (mousey-90)/20; /*y 좌표 */
If (내 [i][j]. Flag== 1)/* 그리드에 빨간색 플래그가 있는 경우 왼쪽 버튼은 유효하지 않습니다 */
계속;
If (내 [i][j]. Num! =0)/* 메시가 처리되지 않은 경우 */
{
If (내 [i][j]. Num== 1)/* 마우스 클릭 격자는 지뢰 */
{
Mouseoff ();
Gameover (); /* 게임 실패 */
깨뜨리다
}
Else/* 마우스 누르는 격자는 지뢰가 아닙니다 */
{
Mouseoff ();
Num=MineStatistics(i, j);
If(Num==0)/* 주변에 지뢰가 없으면 재귀 알고리즘을 사용하여 빈 메쉬 표시 */
쇼 화이트 (I, j);
Else/* 그리드를 누릅니다. 주변에 지뢰가 있어요 */
{
스프린트 (randminenum, "%d", num); /* 현재 메쉬 주위의 광선 수를 출력합니다 */
Setcolor (빨간색);
Outtextxy (195+j * 20,95+I * 20, randminenum);
Minenum-;
}
Mouseon ();
내 [나 ][j]. Num = 0;; /* 선택된 메쉬 주위의 광선 수가 0 으로 바뀌어 메쉬가 이미 사용 중임을 나타냅니다 */
If(mineNUM & lt;; 1)/* 승리 */
{
Gamewin ();
깨뜨리다
}
}
}
}
}
If(RightPress())/* 마우스 오른쪽 버튼을 클릭하고 */
{
Mousegetxy ();
If(MouseX & gt;; 190 입니다. & ampmousex & lt390 & amp & ampmousey & gt90 & amp& 마우스 & lt290)/* 현재 마우스 위치는 그리드 */
{
J = (mousex-190)/20; /*x 좌표 */
I = (mousey-90)/20; /*y 좌표 */
Mouseoff ();
If (내 [i][j]. Flag = = 0 & amp& amp 내 [나 ][j]. Num! =0)/* 원래 붉은 깃발이 없었는데 지금은 */
{
DrawRedflag(i, j) :
내 [나 ][j]. Flag =1;
}
기타
If (내 [i][j]. Flag== 1)/* 붉은 깃발 표시가 있는 경우 오른쪽 버튼을 누르면 붉은 깃발이 사라집니다 */
{
DrawEmpty(i, j, 0, 8);
내 [나 ][j]. Flag = 0;;
}
}
Mouseon ();
수면 (1);
}
}
}