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