C 언어 판 천둥 치기 게임

본 논문 의 사례 는 여러분 에 게 C 언어 판 지뢰 제거 게임 의 구체 적 인 코드 를 공유 하 였 으 며,여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
게임 기능
1.이 점 주위 의 천둥 개 수 를 표시 합 니 다.
2.첫 번 째,폭사 하지 않 음
3.좌표 주위 에 천둥 이 없 으 면 전개 가능
2.효과 전시

3.디자인 사고
이곳 은 블 로 거들 의 현재 능력 에 한계 가 있 기 때문에 좌 표를 입력 하 는 형식 으로 지뢰 를 배출한다.
위의 게임 기능 을 실현 하 는 것 도 어렵 지 않다.전체적인 사 고 는 바로 우리 가 몇 개의 알고리즘 모듈 로 게임 규칙 을 모 의 하고 위의 기능 을 실현 한 다음 에 함수 로 각 모듈 을 호출 하여 게임 을 뛰 게 하 는 것 이다.
다음은 C 언어 코드 로 게임 을 어떻게 실현 하 는 지 살 펴 보 자!
4.게임 실현 절차
1.게임 메뉴
우선 우 리 는 게임 메뉴 인 터 페 이 스 를 인쇄 하여 게이머 들 이 게임 을 시작 할 지 여 부 를 선택 하도록 해 야 한다.여기 서 우 리 는 도..while 순환 문 구 를 사용 하여 게이머 들 이 한 번 놀 고 나 서 바로 퇴장 하지 않도록 해 야 한다.
주 함수 부분:

int main()
{
 int input = 0;
 do
 {
  menu();//       
  printf("   :>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   printf("    
"); game();// break; case 2: system("cls");// break; case 0: printf("
"); break; default: printf(" ,
"); Sleep(1000);//1000 -- system("cls"); break; } } while (input); return 0; }
여기 서 우 리 는 윈도 라 이브 러 리 함수 로 화면 을 정리 합 니 다.만약 화면 에 표 시 된 것 이 너무 많 으 면 우 리 는 2 를 선택 하여 화면 을 정리 할 수 있 습 니 다.그리고 수면 함수 도 있 습 니 다.출력 오류 가 발생 하면 1 초 동안 잘못된 것 을 알려 주 고 화면 을 정리 할 수 있 습 니 다.
메뉴 함수:

void menu()
{
 printf("**************************************************
"); printf("******* Welcome to Minesweeper *******
"); printf("********** 1. **********
"); printf("********** 2. **********
"); printf("********** 0. **********
"); printf("**************************************************
"); }
효과 그림:

2.초기 화 바둑판 만 들 기
우 리 는 게임 메뉴 가 나 오 면 선택 하고 게임 을 시작 할 수 있 습 니 다!
천둥 을 치 려 면 반드시 바둑판 이 있어 야 한다.그러면 우 리 는 위 에서 천둥 을 칠 수 있다.
여기 서 우 리 는 2 차원 배열 로 두 개의 바둑판 을 만들어 야 한다.하 나 는 게이머 에 게 보 여주 고 지뢰 정 보 를 저장 하 는 데 사용 된다.배경 에 랜 덤 으로 천둥 을 생 성하 고 저장 하 는 데 사용 된다.만약 우리 가 9X9 의 바둑판 을 인쇄 하려 고 한다 면,우리 의 2 차원 배열 크기 도 9X9 입 니까?아 닙 니 다.저희 가 알고리즘 을 디자인 할 때 이 좌표 주위 의 8 개의 방위 뢰 의 개 수 를 통계 해 야 하기 때 문 입 니 다.만약 에 경계 좌표 주위 의 뢰 의 개 수 를 통계 하려 면 배열 이 경 계 를 넘 는 문제 가 있 을 것 입 니 다.그러면 우 리 는 9X9 의 경계 에 한 바퀴 요 소 를 더 하고 11X 11 의 배열 요 소 를 정의 해 야 합 니 다.이 많은 원 소 는 우리 가 바둑판 을 인쇄 할 때 인쇄 하지 않도록 제한 하면 됩 니 다.다음 그림 과 같 습 니 다.

바둑판 만 들 기:

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

char mine[ROWS][COLS] = { 0 };//      
char show[ROWS][COLS] = { 0 };//          
바둑판 을 만 든 후에 우 리 는 두 바둑판 을 초기 화 해 야 한다.
1.배 치 된 뇌 를 저장 하 는 바둑판 에 대해 우 리 는 문자'1'로 뇌 를 표시 하고 문자'0'으로 비 뇌 를 표시 합 니 다.여기 서 우 리 는 먼저 모두 비 뇌 로 초기 화 했 습 니 다.뇌 의 배 포 는 우리 가 브 레 의 곳 에서 말 합 니 다.
2.플레이어 에 게 보 여주 고 지뢰 정 보 를 저장 하 는 바둑판 을'*'로 초기 화 합 니 다.
바둑판 함수 초기 화:

InitBoard(mine, ROWS,COLS,'0');
InitBoard(show, ROWS,COLS,'*');
함수 정의:

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
 int i = 0;
 for (i = 0; i < rows; i++)
 {
  int j = 0;
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}
3.브 레
우리 가 바둑판 을 초기 화한 후에 우 리 는 브 레 의 조작 을 진행 할 것 이다.
레이 의 분포 위치:우 리 는 지뢰 를 제거 할 때 매번 레이 의 분포 위치 가 다 르 고 무 작위 로 분포 되 어 있다 는 것 을 알 고 있 습 니 다.그래서 우 리 는 브 레 가 조작 할 때 무 작위 함수 rand()를 호출 해 야 합 니 다.무 작위 함 수 를 사용 하기 전에 우 리 는 먼저 주 함수 에서 srand()함 수 를 사용 하여 무 작위 출발점 을 만들어 야 합 니 다.그러면 매번 레이 의 위치 가 다 를 수 있 습 니 다.이 두 함수 의 사용 에 대해 서 는 MSDN 이나 cplusplus 에서 그 역할 을 조회 할 수 있 습 니 다.
그 다음 에 천둥 의 개수:분포 할 때마다 하 나 를 줄인다.
이 어 브 레 의 범위:우리 게이머 들 이 지뢰 를 제거 하 는 것 은 9X9 의 바둑판 에서 진행 되 기 때문에 우 리 는 브 레 의 범위 도 9X9 의 범위 내 에 한정 해 야 한다.
이제 어떻게 이 루어 졌 는 지 살 펴 보 자!
주 함수:

int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do
 {
  menu();//    
  printf("   :>");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();//    
   break;
  case 2:
   system("cls");//    
   break;
  case 0:
   printf("    
"); break; default: printf(" ,
"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
브 레 함수:

#define EASY_COUNT 10  //    

SetMine(mine, ROW, COL);
함수 정의:

void SetMine(char board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int count = EASY_COUNT;//    
 while (count)
 {
  //      (1~9)
  x = rand() % row + 1;
  y = rand() % col + 1;
 
  if (board[x][y] != '1')
  {
   board[x][y] = '1';
   count--;
  }

 }
}
4.바둑판 인쇄
우 리 는 위 조작 이 끝 난 후에 스크린 에 바둑판 을 인쇄 해 야 한다.그러나 여기 에는 모두 두 개의 바둑판 이 있다.우리 가 인쇄 해 야 할 바둑판 은 게이머 들 에 게 전문 적 으로 보 여주 고 지뢰 정 보 를 저장 하 는 바둑판 은 바로'*'로 초기 화 된 바둑판 이다.
그리고 우리 가 인쇄 해 야 할 크기 는 9X9 의 범위 이지 전체 범위 11X 11 의 범위 가 아니다.
그리고 우 리 는 플레이어 가 좌 표를 볼 수 있 도록 바둑판 의 줄 수 와 열 수 를 인쇄 해 야 한다.
바둑판 함수 인쇄:

DisplayBoard(show, ROW, COL);
함수 정의:

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 printf("----------------
"); for (i = 0; i <= 9; i++) { printf("%d ", i);// } printf("
"); for (i = 1; i <= row; i++) { int j = 0; printf("%d ", i);// for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("
"); } printf("----------------
"); }
5.지뢰 제거
위의 모든 조작 을 완성 한 후에 우리 가 가장 멋 지고 가장 중요 한 부분 이 될 것 이다.
요청:
1.인쇄 된 바둑판 범위 내 에 검사 좌 표를 입력 하 십시오.
2.좌표 주변 8 개의 위 치 를 조사 하 는 천둥 의 개 수 를 통계 한다.
3.첫 번 째 좌 표를 입력 하면 절대 안전 하고 폭사 하지 않 습 니 다.
4.좌표 주위 에 천둥 이 없 으 면 자동 으로 펼 쳐 집 니 다
지뢰 제거 주 논리 함수:

FindMine(mine, show, ROW, COL);
좌표 주변 8 개 위치의 천둥 개 수 를 통계 적 으로 조사 하 는 함수:

GetMineCount(char mine[ROWS][COLS], int x, int y)
첫 번 째 안전 함수:

safe(char mine[ROWS][COLS], int row,int col,int x, int y)
전개 함수

OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)
함수 정의(위 에서 아래로):
지뢰 제거 주 논리 함수:

//     
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int win = 0;//       
 int count = 0;//       
 while (win<row*col-EASY_COUNT)
 {
  printf("         ");
  scanf("%d %d", &x, &y);
  if (x >= 1 && x <= row && y >= 1 && y <= col)  //        
  {
   if (mine[x][y] == '1')
   {
    if (0 == win)//      ,    
    {
     safe(mine, ROW,COL,x, y);
     //DisplayBoard(mine, ROW, COL);
     count = GetMineCount(mine, x, y);

     if (count == 0)
     {
      show[x][y] = ' ';
      win++;
      OpenMine(mine, show, ROW, COL, x, y,&win);//       ,    
      DisplayBoard(show, row, col);
     }
     else
     {
      show[x][y] = count + '0';
      DisplayBoard(show, row, col);
     }
    }
    else
    {
     printf("   ,     
"); DisplayBoard(mine, ROW, COL); break; } } else { count = GetMineCount(mine, x, y); if (count == 0) { show[x][y] = ' '; } else { show[x][y] = count + '0'; } win++; OpenMine(mine, show, ROW, COL, x, y,&win); DisplayBoard(show, ROW, COL); } } else { printf(" ,
"); } } if (win == row*col - EASY_COUNT) { printf(" ,
"); } }
주변 뇌 개수 집계:

//                 
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return (mine[x - 1][y] +
  mine[x - 1][y - 1] +
  mine[x][y - 1] +
  mine[x + 1][y - 1] +
  mine[x + 1][y] +
  mine[x + 1][y + 1] +
  mine[x][y + 1] +
  mine[x - 1][y + 1] - 8 * '0');
}
첫 번 째,폭사 하지 않 으 면 다시 브 레:

//     
void safe(char mine[ROWS][COLS], int row,int col,int x, int y)  
{
 mine[x][y] = '0';
 int count = 1;
 while (count)
 {
  //      (1~9)
  int i = rand() % row + 1;
  int j = rand() % col + 1;
  if ((mine[i][j] != '1') && i != x && j != y)
  {
   mine[i][j] = '1';
   count--;
  }
 }
}
좌표 주위 에 천둥 이 없어 전개 가능:

//    
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y,int* p)
{
 int i = -1;
 int j = -1;
 for (i = -1; i < 2; i++)//  
 {
  for (j = -1; j < 2; j++)
  {
   if (i != 0 || j != 0) //                
   {
    if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col)
    {
     if (show[x + i][y + j] == '*' && mine[x + i][y + j] != '1')
     {
      int count = GetMineCount(mine, x + i, y + j);
      if (count != '0')
      {
       show[x + i][y + j] = count + '0';
       (*p)++;
      }
      else
      {
       show[x + i][y + j] = ' ';
       (*p)++;
       OpenMine(mine, show,ROW,COL, x + i, y + j, p);
      }
     }
    }
   }
  }
 }
}
총화
삼자 기와 마찬가지 로 전체 공 사 를 game.c,game.h,test.c 세 개의 파일 로 나 누 었 다.아래 그림

1.헤더 파일 game.h 는 주로 각 함수 의 성명 과 라 이브 러 리 함수 호출 에 필요 한 헤더 파일 과 바둑판 줄 수열 수의 매크로 정 의 를 포함 합 니 다.나중에 우리 가 줄 이나 열 수 를 수정 하려 면 매크로 정의 내용 을 직접 수정 하면 됩 니 다.
2.원본 파일 game.c 에는 각종 함수 의 실현 이 포함 되 어 있 으 며,이 파일 에 서 는 헤더 파일 game.h 를 참조 해 야 합 니 다.
3.test.c 에는 게임 시작 메뉴 의 인쇄 와 game.c 의 함수 호출 이 포함 되 어 있 습 니 다.
game.h 내용

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<Windows.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2


//    
#define EASY_COUNT 10

//     
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);

//   
void SetMine(char board[ROWS][COLS], int row, int col);

//    
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//   
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

//     
void safe(char mine[ROWS][COLS], int row, int col, int x, int y);

//                 
int GetMineCount(char mine[ROWS][COLS], int x, int y);

//        
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y,int* p);
game.c 내용

#include "game.h"
//     
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
 int i = 0;
 for (i = 0; i < rows; i++)
 {
  int j = 0;
  for (j = 0; j < cols; j++)
  {
   board[i][j] = set;
  }
 }
}

//   
void SetMine(char board[ROWS][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 int count = EASY_COUNT;
 while (count)
 {
  //      (1~9)
  x = rand() % row + 1;
  y = rand() % col + 1;

  if (board[x][y] != '1')
  {
   board[x][y] = '1';
   count--;
  }

 }
}

//    
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
 int i = 0;
 printf("----------------
"); for (i = 0; i <= 9; i++) { printf("%d ", i); } printf("
"); for (i = 1; i <= row; i++) { int j = 0; printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("
"); } printf("----------------
"); } // void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;// int count = 0;// while (win<row*col-EASY_COUNT) { printf(" "); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) // { if (mine[x][y] == '1') { if (0 == win)// , { safe(mine, ROW,COL,x, y); //DisplayBoard(mine, ROW, COL); count = GetMineCount(mine, x, y); if (count == 0) { show[x][y] = ' '; win++; OpenMine(mine, show, ROW, COL, x, y,&win);// , DisplayBoard(show, row, col); } else { show[x][y] = count + '0'; DisplayBoard(show, row, col); } } else { printf(" ,
"); DisplayBoard(mine, ROW, COL); break; } } else { count = GetMineCount(mine, x, y); if (count == 0) { show[x][y] = ' '; } else { show[x][y] = count + '0'; } win++; OpenMine(mine, show, ROW, COL, x, y,&win); DisplayBoard(show, ROW, COL); } } else { printf(" ,
"); } } if (win == row*col - EASY_COUNT) { printf(" ,
"); } } // int GetMineCount(char mine[ROWS][COLS], int x, int y) { return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0'); } // void safe(char mine[ROWS][COLS], int row,int col,int x, int y) { mine[x][y] = '0'; int count = 1; while (count) { // (1~9) int i = rand() % row + 1; int j = rand() % col + 1; if ((mine[i][j] != '1') && i != x && j != y) { mine[i][j] = '1'; count--; } } } // void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y,int* p) { int i = -1; int j = -1; for (i = -1; i < 2; i++)// { for (j = -1; j < 2; j++) { if (i != 0 || j != 0) // { if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col) { if (show[x + i][y + j] == '*' && mine[x + i][y + j] != '1') { int count = GetMineCount(mine, x + i, y + j); if (count != '0') { show[x + i][y + j] = count + '0'; (*p)++; } else { show[x + i][y + j] = ' '; (*p)++; OpenMine(mine, show,ROW,COL, x + i, y + j, p); } } } } } } }
test.c 내용

#include "game.h"
void menu()
{
 printf("**************************************************
"); printf("******* Welcome to Minesweeper *******
"); printf("********** 1. **********
"); printf("********** 2. **********
"); printf("********** 0. **********
"); printf("**************************************************
"); } void game() { char mine[ROWS][COLS] = { 0 };// char show[ROWS][COLS] = { 0 };// // InitBoard(mine, ROWS,COLS,'0'); InitBoard(show, ROWS,COLS,'*'); // SetMine(mine, ROW, COL); // //DisplayBoard(mine, ROW, COL); DisplayBoard(show, ROW, COL); // FindMine(mine, show, ROW, COL); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu();// printf(" :>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: system("cls");// break; case 0: printf("
"); break; default: printf(" ,
"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기