C語言開發(fā)實(shí)現(xiàn)掃雷游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
簡(jiǎn)單描述:
輸入要要掃的位置.
如果是雷,則游戲失敗.
如果將所有不是雷的位置都掃了一遍,則游戲勝利.
主要細(xì)節(jié)
1、初始化(玩家掃雷圖,地雷布局圖)
展示出來的地圖(玩家能看到的地圖)showMap
for (int row = 0; row < ROW; row++){
for (int col = 0; col < COL; col++){
showMap[row][col] = '*';
}
}
地雷的布局地圖(玩家看不到的地圖)mineMap
for (int row = 0; row < ROW; row++){
for (int col = 0; col < COL; col++){
mineMap[row][col] = '*';
}
}
int count = 0;
while (count<MINECOUNT){
int row = rand() % 9;
int col = rand() % 9;
mineMap[row][col] = 'L';
count++;
}
}
3、打印地圖
void print(char Map[ROW][COL]){
printf(" |0|1|2|3|4|5|6|7|8|\n");
for (int row = 0; row < ROW; row++){
printf("%d |", row);
for (int col = 0; col < COL; col++){
printf("%c ", Map[row][col]);
}
printf("\n");
}
}
5、玩家輸入要掃的位置信息(9*9格子中某一特定位置)
void Input(char showMap[ROW][COL], char mineMap[ROW][COL], int* row, int* col){
while (1){
printf("請(qǐng)輸入您要點(diǎn)的位置坐標(biāo):");
scanf("%d %d", row, col);
if (((*row) < 0) || ((*row) >= ROW)
|| ((*col) < 0) || ((*col) >= COL)){
printf("輸入有誤 ");
continue;
}
if (showMap[*row][*col] == '*'){
showMap[*row][*col] = ' ';
break;
}
}
}
7、判斷某一位置是不是地雷
//返回1表示雷;返回0表示不是雷
int isMine(char mineMap[ROW][COL], int row, int col){
if (mineMap[row][col] == 'L'){
return 1;
}
return 0;
}
9、某一位置附近地雷的個(gè)數(shù)
int MineNerborhood(char mineMap[ROW][COL], int row, int col){
if (row < 0 || row >= ROW
|| col < 0 || col >= COL){
return '0';
}
int count = 0;
for (int r = row - 1; r <= row + 1; r++){
for (int c = col - 1; c <= col + 1; c++){
if (mineMap[r][c] == 'L'){
count++;
}
}
}
return count + '0';
}
源代碼:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ROW 9
#define COL 9
#define MINECOUNT 10
void Input(char showMap[ROW][COL], char mineMap[ROW][COL], int* row, int* col){
while (1){
printf("請(qǐng)輸入您要點(diǎn)的位置坐標(biāo):");
scanf("%d %d", row, col);
if (((*row) < 0) || ((*row) >= ROW)
|| ((*col) < 0) || ((*col) >= COL)){
printf("輸入有誤 ");
continue;
}
if (showMap[*row][*col] == '*'){
showMap[*row][*col] = ' ';
break;
}
}
}
//返回1表示雷;返回0表示不是雷
int isMine(char mineMap[ROW][COL], int row, int col){
if (mineMap[row][col] == 'L'){
return 1;
}
return 0;
}
//
void init(char showMap[ROW][COL], char mineMap[ROW][COL]){
for (int row = 0; row < ROW; row++){
for (int col = 0; col < COL; col++){
showMap[row][col] = '*';
}
}
for (int row = 0; row < ROW; row++){
for (int col = 0; col < COL; col++){
mineMap[row][col] = '*';
}
}
int count = 0;
while (count<MINECOUNT){
int row = rand() % 9;
int col = rand() % 9;
mineMap[row][col] = 'L';
count++;
}
}
void print(char Map[ROW][COL]){
printf(" |0|1|2|3|4|5|6|7|8|\n");
for (int row = 0; row < ROW; row++){
printf("%d |", row);
for (int col = 0; col < COL; col++){
printf("%c ", Map[row][col]);
}
printf("\n");
}
}
//(row,col)附近格子地雷的個(gè)數(shù)
int MineNerborhood(char mineMap[ROW][COL], int row, int col){
if (row < 0 || row >= ROW
|| col < 0 || col >= COL){
return '0';
}
int count = 0;
for (int r = row - 1; r <= row + 1; r++){
for (int c = col - 1; c <= col + 1; c++){
if (mineMap[r][c] == 'L'){
count++;
}
}
}
return count + '0';
}
//一局游戲
void game(){
srand(time(0));
//展示給玩家的地圖
char showMap[ROW][COL];
//雷的布局圖
char mineMap[ROW][COL];
//對(duì)兩個(gè)地圖進(jìn)行初始化
init(showMap, mineMap);
//print(mineMap);
//玩家已經(jīng)掃到的不是雷的格子的數(shù)目
int notMineCount = 0;
printf("掃雷游戲開始啦!\n");
while (1){
//打印地圖
print(showMap);
//輸入地點(diǎn)
int row, col;
Input(showMap, mineMap, &row, &col);
//判斷是否是雷區(qū)
if (isMine(mineMap, row, col) == 1){
printf(" 大兄弟,踩雷咧!\n給您看看雷的布局\n");
print(mineMap);
break;
}
//判斷附近雷的情況
showMap[row][col]=MineNerborhood(mineMap, row, col);
notMineCount++;
//判斷是否贏了
if (notMineCount == ROW*COL - MINECOUNT){
print(mineMap);
printf("恭喜您贏啦!\n");
break;
}
}
}
int menu(){
printf("===================\n");
printf("1.開始游戲\n");
printf("0.結(jié)束游戲\n");
printf("===================\n");
printf("請(qǐng)輸入您的選擇:");
int choice;
scanf("%d", &choice);
return choice;
}
int main(){
while (1){
int choice = menu();
if (choice == 1){
game();
}else if (choice==0){
break;
}else{
printf("輸入有誤,請(qǐng)重新輸入\n");
}
}
system("pause");
return 0;
}
運(yùn)行結(jié)果:



更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C++實(shí)現(xiàn)線程同步的四種方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線程同步的四種方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定的幫助,需要的可以參考一下2022-11-11
用C語言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖
這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2023-02-02
C++中的移動(dòng)構(gòu)造函數(shù)及move語句示例詳解
這篇文章主要給大家介紹了關(guān)于C++中移動(dòng)構(gòu)造函數(shù)及move語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10

