C 언어 는 지뢰 제거 게임 에 대한 상세 한 설명 을 실현 한다.

본 논문 의 사례 는 C 언어 가 지뢰 제거 게임 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
기능 설계
천둥 을 치 는 것 은 모두 가 해 봤 을 것 이다.이것 은 매우 전형 적 인 게임 이다.오늘 나 는 모두 에 게 어떻게 C 언어 로 천둥 을 치 는 지 설명 할 것 이다.나의 이 천둥 을 치 는 것 은 다음 과 같은 몇 가지 기능 이 있다.
1.이 점 주위 의 천둥 개 수 를 표시 합 니 다.
2.첫 번 째,폭사 하지 않 음
3.좌표 주위 에 천둥 이 없 으 면 전개 가능
4、게임 종료 후 유저 용 전시 시
효과 전시
말 이 많 지 않 으 면 먼저 효과 도 를 첨부 합 니 다.



디자인 아이디어
우 리 는 좌 표를 입력 하면 천둥 을 칠 수 있 습 니 다.재 미 있 죠?
사실 이것 을 실현 하 는 것 도 어렵 지 않다.우 리 는 몇 개의 알고리즘 모듈 로 게임 규칙 을 모 의 하려 면 함수 로 각 모듈 을 호출 하여 게임 을 뛰 게 해 야 한다.
그러면 첫 번 째 단계 에서 우 리 는 바둑판 을 구상 해 야 한다.위의 첫 번 째 그림 을 보 았 느 냐?게임 을 시작 하 는 화면 에서 나 는 두 개의 바둑판 을 인쇄 했다.0 과 1 의 바둑판 은 우리 디자이너 에 게 보 여 준 것 이다.이것 은 현재 천둥 의 진실 한 분 포 를 나 타 낼 수 있다.이것 은 우리 가 코드 의 정확성 을 테스트 하 는 데 유리 하고 모두*의 바둑판 은 게이머 에 게 천둥 을 치 우 는 데 쓰 인 다.
그러면 우 리 는 2 차원 배열 로 두 개의 바둑판 을 인쇄 해 야 합 니 다.만약 에 우리 가 10X 10 의 바둑판 을 인쇄 하려 면 우리 의 2 차원 배열 요소 도 10X 10 개 여야 합 니까?안 됩 니 다.우리 가 알고리즘 을 디자인 할 때 좌표 주위 의 8 개의 방위 뢰 의 개 수 를 통계 해 야 하기 때 문 입 니 다.만약 에 경계 좌표 주위 의 뢰 의 개 수 를 통계 하려 면 배열 이 경 계 를 넘 는 문제 가 있 을 것 입 니 다.그러면 우 리 는 10X 10 의 경계 에 한 바퀴 요 소 를 더 해 야 합 니 다.그리고 12X 12 의 배열 요 소 를 정의 해 야 합 니 다.이런 요 소 는 우리 가 인쇄 하지 않 고 마음 속 에 숫자 가 있 으 면 됩 니 다.다음 과 같은 그림 입 니 다.

#define row 12
#define col 12
show_mine[row][col];//    
real_mine[row][col];//     

우 리 는 한 항목 에 세 개의 원본 파일 을 만 듭 니 다.다음 과 같 습 니 다.

1.우 리 는 디자이너 바둑판 을 인쇄 할 때 배열 realmine,플레이어 바둑판 인쇄 는 수조 showmine,두 배열 은 시작 할 때 초기 화 되 어야 합 니 다.디자이너 바둑판 에서 문자 0 은 레이 가 아니 라 문자 1 은 레이 를 대표 합 니 다.먼저 두 배열 을 초기 화 합 니 다.
코드 는 다음 과 같 습 니 다:

void init_mine()//       
{
 int i = 0;
 int j = 0;
 for (int i = 0; i < row; i++) 
 {
 for (j = 0; j < col; j++)
 {
 show_mine[i][j] = '*';
 real_mine[i][j] = '0';
 }
 }
}
2.두 개의 뇌 진 을 인쇄 합 니 다.(좌 표를 확인 하기 위해 가로 와 세로 번 호 를 인쇄 하 는 것 을 잊 지 마 세 요)

void print_player()//      
{
 int i = 0;
 int j = 0;
 printf("0 ");
 for (i = 1; i <row-1; i++)
 {
 printf("%d ", i);//    (0--10)
 }
 printf("
"); for (i = 1; i <row-2; i++)// (1--10) { printf("%d ", i); for (j = 1; j < col-1; j++) { printf("%c ", show_mine[i][j]);// } printf("
"); } printf("10 ");// for (i = 1; i < row-1; i++) { printf("%c ", show_mine[10][i]); } printf("
"); } void print_mine()// { int i = 0; int j = 0; printf("0 "); for (i = 1; i <row - 1; i++) { printf("%d ", i);// (0--10) } printf("
"); for (i = 1; i <row - 2; i++)// (1--10) { printf("%d ", i); for (j = 1; j < col - 1; j++) { printf("%c ", real_mine[i][j]); } printf("
"); } printf("10 ");// for (i = 1; i < row - 1; i++) { printf("%c ", real_mine[10][i]); } printf("
"); }
3.우리 가 매번 놀 때 디자이너 바둑판 의 천둥 분 포 는 반드시 같 지 않 아야 한다.무 작위 수 를 사용 하여 가로 세로 좌 표를 생 성하 여 천둥 좌 표를 확정한다.코드 는 다음 과 같다.

void set_mine()//        
{
 int x = 0;
 int y = 0;
 int count = COUNT;//   
 while (count)//        
 {
 int x = rand() % 10 + 1;//  1 10    ,      1 10      
 int y = rand() % 10 + 1;//  1 10    ,      1 10      
 if (real_mine[x][y] == '0')//         
 {
 real_mine[x][y] = '1';
 count--;
 }
 }
}
4.현재 좌표 주위 의 천둥 개 수 를 통계 하기 위해 함수 의 실현 을 정의 합 니 다.

int count_mine(int x, int y)//    8       
{
 int count = 0;
 if (real_mine[x - 1][y - 1] == '1')
 count++;
 if (real_mine[x - 1][y] == '1')
 count++; 
 if (real_mine[x - 1][y + 1] == '1')
 count++;
 if (real_mine[x][y - 1] == '1')
 count++; 
 if (real_mine[x][y + 1] == '1')
 count++; 
 if (real_mine[x + 1][y - 1] == '1')
 count++; 
 if (real_mine[x + 1][y] == '1')
 count++; 
 if (real_mine[x + 1][y + 1] == '1')
 count++;
 return count;
}
5.첫 번 째 뇌 에 의 해 폭사 되 지 않도록 함 수 를 정의 하여 실현 해 야 합 니 다.만약 에 첫 번 째 뇌 를 선택 하면 이 뇌 를 다른 뇌 가 아 닌 곳 에 두 고 코드 는 다음 과 같 습 니 다.

void safe_mine()//       
{
 int x = 0;
 int y = 0;
 char ch = 0;
 int count = 0;
 int ret = 1;
 printf("      
"); while (1) { scanf("%d%d", &x, &y);// 1 10, if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))// { if (real_mine[x][y] == '1')// { real_mine[x][y] = '0'; char ch = count_mine(x, y); show_mine[x][y] = ch + '0';// ASCII ASCII 48, '0' ASCII open_mine(x, y); while (ret)// { int x = rand() % 10 + 1;// 1 10 , 1 10 int y = rand() % 10 + 1;// 1 10 , 1 10 if (real_mine[x][y] == '0')// { real_mine[x][y] = '1'; ret--; break; } }break;// } if (real_mine[x][y] == '0') { char ch = count_mine(x, y); show_mine[x][y] = ch + '0';// ASCII ASCII 48, '0' ASCII open_mine(x, y); break; } } else// { printf("
"); } } }
6.전개 기능 을 실현 하기 위해 함수 모듈 을 전개 해 야 합 니 다(펼 친 좌 표 는 좌표 주위 의 뇌 수 를 표시 해 야 합 니 다).다음 과 같 습 니 다.

void open_mine(int x, int y)//        
{
 if (real_mine[x - 1][y - 1]== '0')
 {
 show_mine[x - 1][y - 1] = count_mine(x - 1, y - 1) + '0';//         
 }
 if (real_mine[x - 1][y] == '0')
 {
 show_mine[x - 1][y] = count_mine(x - 1, y) + '0';//         
 }
 if (real_mine[x - 1][y + 1] == '0')
 {
 show_mine[x - 1][y + 1] = count_mine(x - 1, y + 1) + '0';//         
 }
 if (real_mine[x][y - 1] == '0')
 {
 show_mine[x][y - 1] = count_mine(x, y - 1) + '0';//         
 }
 if (real_mine[x][y + 1] == '0')
 {
 show_mine[x][y + 1] = count_mine(x, y + 1) + '0';//         
 }
 if (real_mine[x + 1][y - 1] == '0')
 {
 show_mine[x + 1][y - 1] = count_mine(x + 1, y - 1) + '0';//         
 }
 if (real_mine[x + 1][y] == '0')
 {
 show_mine[x + 1][y] = count_mine(x + 1, y) + '0';//         
 }
 if (real_mine[x + 1][y + 1] == '0')
 {
 show_mine[x + 1][y + 1] = count_mine(x + 1, y + 1) + '0';//         
 }
}
7.지뢰 제거 함 수 는 중요 한 모듈 로 코드 는 다음 과 같다.

int sweep_mine()//    ,     1,       0
{
 int x = 0;
 int y = 0;
 int count = 0;
 printf("      
"); scanf("%d%d", &x, &y);// 1 10 if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))// , { if (real_mine[x][y] == '0')// { char ch = count_mine(x,y); show_mine[x][y] = ch+'0';// ASCII ASCII 48, '0' ASCII open_mine(x, y); if (count_show_mine() == COUNT)// , { print_mine(); printf(" !

"); return 0; } } else if (real_mine[x][y]=='1')// { return 1; } } else { printf("
"); } return 0;// }
마지막 으로 게임 승리 의 조건 을 확정 해 야 합 니 다.우 리 는 현재 상태 에 있 는 게이머 바둑판 에 표 시 된 나머지*의 개 수 를 통계 해 야 합 니 다.만약 에 개수 가 총 뇌 수 와 같 을 때 소 뇌 완성,게임 승 리 를 설명 하고 함수 실현 을 정의 해 야 합 니 다.

int count_show_mine()//           ,         
{
 int count = 0;
 int i = 0;
 int j = 0;
 for (i = 1; i <= row - 2; i++)
 {
 for (j = 1; j <= col - 2; j++)
 {
 if (show_mine[i][j] == '*')
 {
 count++;
 }
 }

 }
 return count;
}
우 리 는 이상 함수 의 정 의 를 game.c 파일 에 두 었 습 니 다.
이상 은 우리 가 지뢰 를 제거 하 는 모듈 입 니 다.이 모듈 들 을 통합 하여 실행 하려 면 게임 실행 함수 가 이 모듈 을 호출 하고 game()함수 가 실현 되도록 정의 해 야 합 니 다.코드 는 다음 과 같 습 니 다.

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
double start, finish;
void game()
{
 
 int ret = 0;
 init_mine();//             
 set_mine();//        
 print_mine();//       (    )
 printf("
"); print_player();// start = clock(); safe_mine();// if (count_show_mine() == COUNT)// { print_mine(); printf(" !

"); return ; }print_player(); while (1)// { int ret=sweep_mine();// , 1, 0 if (count_show_mine() == COUNT)// '*' , , { print_mine();// printf(" !

"); finish = clock();// printf(" %d
",(int) (finish - start) / CLOCKS_PER_SEC); break; } if (ret)// { printf(" \t"); finish = clock();// printf(" %d
", (int)(finish - start) / CLOCKS_PER_SEC); print_mine();// break; }print_player();// } } int main() { srand((unsigned int)time(NULL));// int input = 0; muen();// do { scanf("%d", &input); switch (input) { case 1:game(); break; case 0:exit(1);// break; default: printf(" ,
"); break; } muen(); printf("contiue?
"); } while (1);// system("pause"); return 0; }
헤더 파일 game.h 에서 각종 함 수 를 설명 합 니 다:
game.h

#ifndef __GAME_H__
#define __GAME__H__

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

#define row 12
#define col 12
#define COUNT 10//       
extern char show_mine[row][col];//    
extern char real_mine[row][col];//    

void muen();//    
void init_mine();//       
void set_mine();//    
int count_mine();//        
void print_player();//      
void print_mine();//        
int sweep_mine();//    
void safe_mine();//            
void open_mine(int x, int y);//    
int count_show_mine(); ///               

#endif //__GAME_H__
이 함 수 를 main.c 파일 에 넣 으 세 요.
이상 에서 우 리 는 지뢰 를 제거 하 는 모든 C 언어 코드 를 완 성 했 습 니 다.다음 에 우 리 는 테스트 를 해 보 겠 습 니 다.
1,첫 번 째 폭사 하지 않 을 수 있 는 지 검사
2、주변 에 천둥 이 쳐 지지 않 는 것 을 확인

총결산
테스트 는 우리 의 코드 에 문제 가 없다 는 것 을 보 여 줍 니 다.우 리 는 이 프로그램의 어 려 운 점 은 전개 와 첫 번 째 폭발 로 죽지 않도록 하 는 것 입 니 다.만약 에 상기 프로그램 을 자세히 이해 하면 그 중의 원 리 를 알 게 될 것 입 니 다.왜 배열 요소 주 위 를 한 바퀴 더 둘 러 야 하 는 지 를 포함 합 니 다.이 모듈 들 은 모두 게임 의 핵심 입 니 다.이 프로그램 을 파악 하면당신 의 논리 적 사고력 이 크게 향상 될 것 입 니 다!
game.c 파일 원본 첨부:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
char show_mine[row][col] = { 0 };
char real_mine[row][col] = { 0 };


void muen()
{
 printf("*******************************
"); printf("*****1.play 0.exit*******
"); printf("*******************************
"); } void init_mine()// { int i = 0; int j = 0; for (int i = 0; i < row; i++) { for (j = 0; j < col; j++) { show_mine[i][j] = '*'; real_mine[i][j] = '0'; } } } void print_player()// { int i = 0; int j = 0; printf("0 "); for (i = 1; i <row-1; i++) { printf("%d ", i);// (0--10) } printf("
"); for (i = 1; i <row-2; i++)// (1--10) { printf("%d ", i); for (j = 1; j < col-1; j++) { printf("%c ", show_mine[i][j]);// } printf("
"); } printf("10 ");// for (i = 1; i < row-1; i++) { printf("%c ", show_mine[10][i]); } printf("
"); } void print_mine()// { int i = 0; int j = 0; printf("0 "); for (i = 1; i <row - 1; i++) { printf("%d ", i);// (0--10) } printf("
"); for (i = 1; i <row - 2; i++)// (1--10) { printf("%d ", i); for (j = 1; j < col - 1; j++) { printf("%c ", real_mine[i][j]); } printf("
"); } printf("10 ");// for (i = 1; i < row - 1; i++) { printf("%c ", real_mine[10][i]); } printf("
"); } void set_mine()// { int x = 0; int y = 0; int count = COUNT;// while (count)// { int x = rand() % 10 + 1;// 1 10 , 1 10 int y = rand() % 10 + 1;// 1 10 , 1 10 if (real_mine[x][y] == '0')// { real_mine[x][y] = '1'; count--; } } } int count_mine(int x, int y)// 8 { int count = 0; if (real_mine[x - 1][y - 1] == '1') count++; if (real_mine[x - 1][y] == '1') count++; if (real_mine[x - 1][y + 1] == '1') count++; if (real_mine[x][y - 1] == '1') count++; if (real_mine[x][y + 1] == '1') count++; if (real_mine[x + 1][y - 1] == '1') count++; if (real_mine[x + 1][y] == '1') count++; if (real_mine[x + 1][y + 1] == '1') count++; return count; } void safe_mine()// { int x = 0; int y = 0; char ch = 0; int count = 0; int ret = 1; printf("
"); while (1) { scanf("%d%d", &x, &y);// 1 10, if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))// { if (real_mine[x][y] == '1')// { real_mine[x][y] = '0'; char ch = count_mine(x, y); show_mine[x][y] = ch + '0';// ASCII ASCII 48, '0' ASCII open_mine(x, y); while (ret)// { int x = rand() % 10 + 1;// 1 10 , 1 10 int y = rand() % 10 + 1;// 1 10 , 1 10 if (real_mine[x][y] == '0')// { real_mine[x][y] = '1'; ret--; break; } }break;// } if (real_mine[x][y] == '0') { char ch = count_mine(x, y); show_mine[x][y] = ch + '0';// ASCII ASCII 48, '0' ASCII open_mine(x, y); break; } } else// { printf("
"); } } } int sweep_mine()// , 1, 0 { int x = 0; int y = 0; int count = 0; printf("
"); scanf("%d%d", &x, &y);// 1 10 if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))// , { if (real_mine[x][y] == '0')// { char ch = count_mine(x,y); show_mine[x][y] = ch+'0';// ASCII ASCII 48, '0' ASCII open_mine(x, y); if (count_show_mine() == COUNT)// , { print_mine(); printf(" !

"); return 0; } } else if (real_mine[x][y]=='1')// { return 1; } } else { printf("
"); } return 0;// } void open_mine(int x, int y)// { if (real_mine[x - 1][y - 1]== '0') { show_mine[x - 1][y - 1] = count_mine(x - 1, y - 1) + '0';// } if (real_mine[x - 1][y] == '0') { show_mine[x - 1][y] = count_mine(x - 1, y) + '0';// } if (real_mine[x - 1][y + 1] == '0') { show_mine[x - 1][y + 1] = count_mine(x - 1, y + 1) + '0';// } if (real_mine[x][y - 1] == '0') { show_mine[x][y - 1] = count_mine(x, y - 1) + '0';// } if (real_mine[x][y + 1] == '0') { show_mine[x][y + 1] = count_mine(x, y + 1) + '0';// } if (real_mine[x + 1][y - 1] == '0') { show_mine[x + 1][y - 1] = count_mine(x + 1, y - 1) + '0';// } if (real_mine[x + 1][y] == '0') { show_mine[x + 1][y] = count_mine(x + 1, y) + '0';// } if (real_mine[x + 1][y + 1] == '0') { show_mine[x + 1][y + 1] = count_mine(x + 1, y + 1) + '0';// } } int count_show_mine()// , { int count = 0; int i = 0; int j = 0; for (i = 1; i <= row - 2; i++) { for (j = 1; j <= col - 2; j++) { if (show_mine[i][j] == '*') { count++; } } } return count; }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기