현재 위치 - 주공해몽공식사이트 - 랜덤 번호 뽑기 점술 - C 언어 게임 코드

C 언어 게임 코드

지뢰 제거 # 포함

# 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);

}

}

}