C 언어 는 지뢰 제거 게임 에 대한 상세 한 설명 을 실현 한다.
19045 단어 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;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.