C++코드 지뢰 제거 게임 실현

머리말
알림:본 고 는 easyX 그래 픽 라 이브 러 리 를 바탕 으로 이 루어 진 것 이 고 일부 기능 도 추가 할 수 있 으 며 초보 자 에 게 만 참고 할 수 있 습 니 다.
제시:다음은 본 글 의 본문 내용 이 고 다음 사례 는 참고 할 수 있 습 니 다.
1.지뢰 해제 게임 모드
크기 가 확 정 된 사각형 뇌 구 에 일정 수량의 지뢰 를 무 작위 로 배치 합 니 다.유 저 는 지뢰 가 아 닌 모든 사각형 을 빨리 찾 아야 합 니 다.지뢰 를 밟 지 마 세 요.
게임 의 기본 동작 은 왼쪽 클릭 과 오른쪽 클릭 을 포함한다.그 중에서 왼쪽 단 추 는 안전 한 칸 을 열 고 게임 진 도 를 추진 하 는 데 사용 된다.오른쪽 단 추 를 누 르 면 지뢰 를 표시 하여 판단 을 보조 합 니 다.
왼쪽 단 추 를 누 르 면 뇌 가 아 닌 사각형 을 판단 하 는 데 왼쪽 단 추 를 누 르 면 이 사각형 을 열 수 있 습 니 다.사각형 에 숫자 가 나 오 면 이 숫자 는 주변 3 을 나타 낸다.×3 구역 의 지뢰 수(보통 8 칸,가장자리 에 5 칸,모서리 에 3 칸.그래서 지뢰 해제 중 가장 큰 숫자 는 8);만약 에 사각형 이 비어 있다 면(0 에 해당 하 는)빈 칸 과 인접 한 사각형 을 재 귀적 으로 열 수 있다.불행 하 게 도 천둥 을 치면 게임 이 끝난다.
오른쪽 단 추 를 누 르 면 지뢰 로 판단 되 는 사각형 에서 오른쪽 단 추 를 누 르 면 지뢰(작은 붉 은 깃발 로 표시)를 표시 할 수 있 습 니 다.한 번 또는 두 번 반복 하면 표 시 를 취소 할 수 있 습 니 다.
코드 구현
1.맵 필드 그리 기
각 지역 의 데이터 에 따라 도형 출력 을 한다.
코드 는 다음 과 같 습 니 다(예시).

void drawmap(int map[][12],IMAGE *img)
{
 int i, j;
 for (i = 1; i <= 10; i++)
 {
 for (j = 0; j <= 10; j++)
 {
 int x = 50 * (i - 1);//    
 int y = 50 * (j - 1);
 if (map[i][j]>25)
 {
 putimage(x, y, &img[9]);//  flag
 }
 else
 {
 switch (map[i][j])
 {
 case 9:
  putimage(x, y, &img[11]);//     
  break;
 case 10:
  putimage(x, y, &img[0]);//0
  break;
 case 11:
  putimage(x, y, &img[1]);//1
  break;
 case 12:
  putimage(x, y, &img[2]);//2
  break;
 case 13:
  putimage(x, y, &img[3]);//3
  break;
 case 14:
  putimage(x, y, &img[4]);//4
  break;
 case 15:
  putimage(x, y, &img[5]);//5
  break;
 case 16:
  putimage(x, y, &img[6]);//6
  break;
 case 17:
  putimage(x, y, &img[7]);//7
  break;
 case 18:
  putimage(x, y, &img[8]);//8
  break;
 default:
  putimage(x, y, &img[10]);//  
  break;
 }
 }
 }
 }
}
2.마우스 클릭
마우스 왼쪽 단 추 를 눌 러 칸 을 열 고,오른쪽 단 추 를 눌 러 플래그 를 표시 하고,다시 클릭 하면 취소 할 수 있다.
sum 은 칸 을 펼 치 는 수량 을 기록 하고 클릭 한 후 각 위치의 데 이 터 를 가감 합 니 다.
코드 는 다음 과 같 습 니 다(예시).

int mousedown(int map[][12])
{
 MOUSEMSG m; //        
 while (1)
 {
 //      
 m = GetMouseMsg();
 int mi = m.x / 50 + 1;
 int mj = m.y / 50 + 1;

 //      
 switch (m.uMsg)
 {
 case WM_LBUTTONDOWN:
 if (map[mi][mj] > 9) //      
 {
 continue;
 }
 if (map[mi][mj] == 0) //     0,     。
 {
 //      
 swap(map, mi, mj);
 }
 else
 {
 map[mi][mj] += 10;
 sum += 1;
 }
 return map[mi][mj];
 break;
 case WM_RBUTTONDOWN:
 if (map[mi][mj] > 9&& map[mi][mj] < 25) //      
 {
 continue;
 }
 if (map[mi][mj] > 25) //      flag
 {
 map[mi][mj] -= 30;
 }
 else
 {
 map[mi][mj] += 30;
 }
 return map[mi][mj];
 break;
 }
 }
}
3.귀속
우리 가 0 인 지역 에 점 을 찍 었 을 때,주위 의 일부 지역 을 열 것 이다.외곽 은 0 이 아니 거나 경계 에 도달 할 것 이 며,내 부 는 0 이다.
그림:

코드 는 다음 과 같 습 니 다(예시).

void swap(int map[][12],int mi,int mj)
{
 map[mi][mj] = 10;
 sum += 1;
 for (int i = mi - 1; i <= mi + 1; i++)
 {
 for (int j = mj - 1; j <= mj + 1; j++)
 {
 //        
 if (i >= 1 && i <= 10 && j >= 1 && j <= 10)
 {
 //        
 if (map[i][j] < 9)
 {
  //   0,     。
  if (map[i][j] == 0)
  {
  swap(map, i, j);
  }
  else
  {
  map[i][j] += 10;
  sum += 1;
  }
 }
 }
 }
 }
}
4.게임 초기 화
코드 는 다음 과 같 습 니 다(예시).

void startgame()
{
 initgraph(500, 500); //     500x500
 int map[12][12] = { 0 };
 int i,j,m,n;
 //      
 srand((unsigned int)time(NULL));
 //    10  
 for (n = 0; n < 10;)
 {
 i = rand() % 10 + 1; //[1,10]
 j = rand() % 10 + 1;
 if (map[i][j] == 0) //          
 {
 map[i][j] = -1; //-1    
 n++;
 }
 }
 //    
 for (i = 1; i <= 10; i++)
 {
 for (j = 1; j <= 10; j++)
 {
 //       
 if (map[i][j] != -1)
 {
 for (m = i - 1; m <= i + 1; m++) //        
 {
  for (n = j - 1; n <= j + 1; n++)
  {
  if (map[m][n] == -1)
  {
  map[i][j]++;
  }
  }
 }
 }
 }
 }
 IMAGE img[12]; //      
 loadimage(&img[0], "E:\\C++ project\\minesweeping\\0.jpg", 50, 50);
 loadimage(&img[1], "E:\\C++ project\\minesweeping\\1.gif", 50, 50);//    
 loadimage(&img[2], "E:\\C++ project\\minesweeping\\2.gif", 50, 50);
 loadimage(&img[3], "E:\\C++ project\\minesweeping\\3.gif", 50, 50);
 loadimage(&img[4], "E:\\C++ project\\minesweeping\\4.gif", 50, 50);
 loadimage(&img[5], "E:\\C++ project\\minesweeping\\5.gif", 50, 50);
 loadimage(&img[6], "E:\\C++ project\\minesweeping\\6.gif", 50, 50);
 loadimage(&img[7], "E:\\C++ project\\minesweeping\\7.gif", 50, 50);
 loadimage(&img[8], "E:\\C++ project\\minesweeping\\8.gif", 50, 50);
 loadimage(&img[9], "E:\\C++ project\\minesweeping\\flag.gif", 50, 50);
 loadimage(&img[10], "E:\\C++ project\\minesweeping\\  .gif", 50, 50);
 loadimage(&img[11], "E:\\C++ project\\minesweeping\\ .gif", 50, 50);
 while (1)
 {
 drawmap(map, img);
 //    
 if (mousedown(map)==9)
 {
 sum = 0; //      
 drawmap(map, img);
 MessageBox(hwnd,"     !","Game Over",MB_OK);
 return;
 }
 //      
 if (sum == 90)
 {
 sum = 0; //      
 drawmap(map, img);
 MessageBox(hwnd, "        !", "Game Over", MB_OK);
 return;
 }
 }
}
5.main
코드 는 다음 과 같 습 니 다(예시).

#include<iostream>
#include<time.h>
#include<graphics.h> //       easyx
#include <conio.h> //  _getch  
using namespace std;
HWND hwnd;
int sum = 0;//              
//    
void drawmap(int map[][12], IMAGE* img);
int mousedown(int map[][12]);
void swap(int map[][12], int mi, int mj);
//     

//    

//    

//    

int main()
{
 while (1)
 {
 startgame();
 if (MessageBox(hwnd, "    ", "    ", MB_YESNO)==IDNO)
 break;
 }
 //_getch(); //    
 closegraph();
 return 0;
}
총괄 및 운행
알림:이 코드 는 참고 만 가능 합 니 다.컴 파일 러 는 visual studio 입 니 다.
사진 자원 은 인터넷 에서 찾 아 대응 하 는 디 렉 터 리 에 넣 으 면 된다.
실행 결 과 는 그림 과 같 습 니 다.


이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기