C++간단 한 지뢰 제거 게임 실현(콘 솔 버 전)

C++초보 자의 코드 를 많이 양해 해 주 십시오.
C++로 쓴 간단 한 콘 솔 버 전 지뢰 제거 게임유 저 는 사각형 의 좌 표를 입력 하여 사각형 을 펼 칩 니 다.
단지 하나의 초기 형태 로 게이머 들 이 사각형 을 펼 치 는 조작 을 수행 하고 승 패 를 판단 할 수 있 으 며 사각형,게임 메뉴,게임 시간 기록,한 판 재 개 등 기능 을 추가 하지 않 았 다.
유 저 는 좌 표를 입력 하 는 방식 으로 사각형 을 펼 치 는 것 은 작은'뇌 구'에 만 적용 되 며,'뇌 구'가 크 면 좌 표를 사용 하 는 것 이 불편 합 니 다.
코드 세 션 지뢰 제거 V 1.1

#include<stdio.h>
#include<Windows.h>
 
#define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define ORANGE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY
#define PURPLE FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY
 
using namespace std;
 
const int STARTX = 30;
const int STARTY = 6;
const int MAXX = 9;//    
const int MAXY = 9;//    
const int BOMBNUMBER = 10;//    
 
class Cube{
private:
 bool ifHaveBomb;//         
 bool ifOpen;//          
 int nearBombNumber;//     8            
public:
 void setOpen() {
 // Open    true
 ifOpen = true;
 }
 bool getOpen() {
 //  ifOpen  
 return ifOpen;
 }
 void setNearBombNumber(int number) {
 // nearBombNumber  
 nearBombNumber = number;
 }
 void haveBomb() {
 //       
 ifHaveBomb = true;
 }
 bool getIfHaveBomb() {
 //  ifHaveBomb  
 return ifHaveBomb;
 }
 int getNearBombNumber() {
 //  nearBombNumber  
 return nearBombNumber;
 }
 void resetCube(bool ifhavebomb = false, bool ifopen = false, int nearbombnumber = 0){
 //       
 ifHaveBomb = ifhavebomb;
 ifOpen = ifopen;
 nearBombNumber = nearbombnumber;
 }
};
Cube cube[MAXX][MAXY];
 
void GoTo(int x, int y);//    
void setBomb(int bombNumber);//  bombNumber             
void show();//     
int checkAndSetNearBombNumber(int x, int y);//            
void gameStart();//     
void showXY();//      
bool player(bool &life);//          
void message(bool life);//            
void autoOpen(int x,int y);//                    ,           
bool ifWin();//          
void showBomb();//           
 
int main() {
 
 gameStart();
 show();
 bool life = true, win = true;
 while (player(life) && !ifWin()) {
 }
 message(life && ifWin());
 return 0;
}
 
void GoTo(int x, int y) {
 //    
 COORD coord = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
 
void setBomb(int bombNumber = BOMBNUMBER) {
 //  bombNumber             
 srand((unsigned)GetCurrentTime());
 while (bombNumber--) {
 int x = MAXX + 1, y = MAXY + 1;
 while ((x >= MAXX || y >= MAXY) || cube[x][y].getIfHaveBomb() == true) {
  x = rand() % MAXX;
  y = rand() % MAXY;
 }
 cube[x][y].haveBomb();
 }
}
 
void show() {
 //     
 system("cls");
 showXY();
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
 for (int i = 0;i < MAXY;i++) {
 GoTo(STARTX, STARTY + i);
 for (int j = 0;j < MAXX;j++) {
  if (cube[j][i].getOpen() == true) {
  if (cube[j][i].getIfHaveBomb() == false) {
   if (cube[j][i].getNearBombNumber() == 0) { //                     ,  0     
   printf(" ");
   } else {
   printf(" %d", cube[j][i].getNearBombNumber());
   }
  } else {
   printf("×");//           ×
  }
  } else {
  printf("■");//       ■  
  }
 }
 }
}
 
void showXY() {
 //     
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
 GoTo(STARTX - 3, STARTY + MAXY / 2);
 printf("Y");
 GoTo(STARTX + MAXX, STARTY - 2);
 printf("X");
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
 for (int i = 0;i < MAXY;i++) {
 GoTo(STARTX - 1, STARTY + i);
 printf("%d ", i);
 }
 for (int i = 0;i < 2 * MAXX;i += 2) {
 GoTo(STARTX + i + 1, STARTY - 1);
 printf("%d ", i / 2);
 }
}
 
int checkAndSetNearBombNumber(int x, int y) {
 //            
 int num = 0;
 
 if (cube[x][y].getIfHaveBomb() == true) {
 //       ,            
 return 0;
 } else {
 //           8    
 for (int i = -1; i <= 1; i++) {
  for (int j = -1; j <= 1; j++) {
  int nx = x + i;
  int ny = y + j;
  if (!(ny == y && nx == x) && (nx >= 0 && nx <= MAXX - 1) &&
   (ny >= 0 && ny <= MAXY - 1)) {
   if (cube[nx][ny].getIfHaveBomb()) {
   num++;
   }
  }
  }
 }
 cube[x][y].setNearBombNumber(num);//             
 return 0;
 }
}
 
void gameStart() {
 //     
 for (int i = 0;i < MAXY;i++) {
 for (int j = 0;j < MAXX;j++) {
  cube[j][i].resetCube();
 }
 }
 setBomb();
 for (int i = 0;i < MAXY;i++) {
 for (int j = 0;j < MAXX;j++) {
  checkAndSetNearBombNumber(j, i);
 }
 }
}
 
bool player(bool &life) {
 //          
 int x, y;
 GoTo(STARTX - 3, STARTY + MAXY + 1);
 printf("     (x,y),x y     ");
 GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
 scanf("%d%d", &x, &y);
 if ((x < 0) || (x > MAXX - 1) || (y < 0) || (y > MAXY - 1)) {
 //             
 show();
 GoTo(STARTX - 3, STARTY + MAXY + 3);
 printf("      ,       ");
 GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
 } else if (cube[x][y].getIfHaveBomb() == true) {
 //            
 cube[x][y].setOpen();
 show();
 life = false;
 return false;
 } else if (cube[x][y].getOpen() == false) {
 //           
 if (cube[x][y].getNearBombNumber() == 0) {
  autoOpen(x, y);
  cube[x][y].setOpen();
  show();
 } else {
  cube[x][y].setOpen();
  show();
 }
 } else if (cube[x][y].getOpen() == true) {
 //              
 show();
 GoTo(STARTX, STARTY + MAXY + 3);
 printf("       ,       ");
 GoTo(STARTX + MAXX / 2, STARTY + MAXY + 2);
 }
 ifWin();
 return true;
}
 
void message(bool result) {
 if (result == true) {
 //          
 showBomb();
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
 GoTo(STARTX - 1, STARTY + MAXY + 1);
 printf("   ,    !");
 GoTo(STARTX, STARTY + MAXY + 2);
 } else {
 //          
 showBomb();
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);
 GoTo(STARTX - 1, STARTY + MAXY + 1);
 printf("××      ××");
 GoTo(STARTX, STARTY + MAXY + 2);
 }
}
 
void autoOpen(int x, int y) {
 //                    ,           
 for (int i = -1; i <= 1; i++) {
 for (int j = -1; j <= 1; j++) {
  int nx = x + i;
  int ny = y + j;
  if (!(ny == y && nx == x) && (nx >= 0 && nx <= MAXX - 1) &&
  (ny >= 0 && ny <= MAXY - 1) && cube[nx][ny].getOpen() == false) {
  if (cube[nx][ny].getNearBombNumber() == 0) {
   cube[nx][ny].setOpen();
   autoOpen(nx, ny);
  } else {
   cube[nx][ny].setOpen();
  }
  }
 }
 }
}
 
bool ifWin() {
 //                  
 int num = 0;
 for (int i = 0;i < MAXX;i++) {
 for (int j = 0;j < MAXY;j++) {
  if (cube[j][i].getOpen() == false) {
  num++;
  }
 }
 }
 if (num == BOMBNUMBER) {
 return true;
 } else {
 return false;
 }
}
 
void showBomb() {
 //           
 for (int i = 0;i < MAXY;i++) {
 for (int j = 0;j < MAXX;j++) {
  if (cube[j][i].getIfHaveBomb() == true) {
  cube[j][i].setOpen();
  }
 }
 }
 show();
}
효과 그림:

C++미니 게임 에 대한 더 많은 하 이 라이트 내용 은 주 제 를 클릭 하 십시오<C++클래식 미니 게임>학습 이해
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기