使用C語言實(shí)現(xiàn)掃雷小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)掃雷小游戲的具體代碼,供大家參考,具體內(nèi)容如下
游戲規(guī)則
在一個(gè)9*9的地圖上一共有十個(gè)雷,翻開所有不是雷的位置 游戲即為勝利,
如果踩到雷,游戲結(jié)束
設(shè)計(jì)思路
1.創(chuàng)建地圖并初始化
2.打印地圖
兩張地圖,用一個(gè)函數(shù)就能實(shí)現(xiàn)
3.掃雷
玩家輸入要打開的位置。
4.判斷是否踩雷
踩雷的話就直接游戲結(jié)束
5.更新 showMap
顯示以當(dāng)前位置為中心,周圍一共有幾個(gè)地雷
6.判斷游戲是否勝利
如果你打開了不是地雷的所有位置,游戲勝利
源碼實(shí)現(xiàn)
// An highlighted block
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10
void init(char showMap[MAX_ROW][MAX_COL],char mineMap[MAX_ROW][MAX_COL]){
// mem => memory 內(nèi)存
// memset:把一段內(nèi)存上的每個(gè)字節(jié)都設(shè)置成一個(gè)具體的值
memset(showMap, '*', MAX_ROW * MAX_COL);
memset(mineMap, '0', MAX_ROW * MAX_COL);
//隨機(jī)產(chǎn)生十個(gè)雷
srand((unsigned int)time(0));
int mineCount = 0;
while (mineCount<MINE_COUNT) {
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (mineMap[row][col] =='1') {
continue;
}
mineMap[row][col] = '1';
mineCount++;
}
}
//打印地圖
void print(char theMap[MAX_ROW][MAX_COL]) {
system("cls");
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
printf("%c ", theMap[row][col]);
}
printf("\n");
}
}
//合法性判定
void update(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL], int row, int col) {
int count = 0;
for (int r = row - 1; r <= row + 1; r++) {
for (int c = col - 1; c <= col + 1; c++) {
if (r == row&& c == col) {
continue;
}
//這個(gè)位置不需要判斷
if (r<0 || r>MAX_ROW || c<0 || c>MAX_COL) {
continue;
}
if (mineMap[r][c] == '1') {
count++;
}
}
}
showMap[row][col] = '0' + count;
}
int main() {
//1.創(chuàng)建地圖并初始化
char showMap[MAX_ROW][MAX_COL] = { 0 };
char mineMap[MAX_ROW][MAX_COL] = { 0 };
init(showMap, mineMap);
int openedCount = 0;
while (1) {
//2.打印地圖
print(showMap);
//3.玩家輸入坐標(biāo)
int row = 0;
int col = 0;
printf("請(qǐng)輸入坐標(biāo)(row,col)\n");
scanf("%d %d", &row, &col);
//4,合法性判定
if (row<0 || row>MAX_ROW || col<0 || col>MAX_COL) {
printf("您輸入的位置有誤,請(qǐng)重新輸入\n");
continue;
}
if (showMap[row][col] != '*') {
printf("您輸入的位置重復(fù),請(qǐng)重新輸入\n");
continue;
}
//5,判定是否踩雷
if (mineMap[row][col] == '1') {
printf("您踩雷了,游戲結(jié)束\n");
break;
}
//6,更新showMap,顯示雷的個(gè)數(shù)
update(showMap, mineMap, row, col);
//7.判定游戲勝利
openedCount++;
if (openedCount == MAX_ROW * MAX_COL - MINE_COUNT) {
printf("恭喜你,游戲勝利\n");
break;
}
}
return 0;
}
心得體會(huì)
用一個(gè)函數(shù)初始化兩個(gè)地圖,這個(gè)方法比較簡便,邏輯梳理很重要,有了邏輯才知道如何著手寫代碼,在進(jìn)行勝負(fù)判斷是不要忘了一些步驟。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表
這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C語言編程數(shù)據(jù)結(jié)構(gòu)棧與隊(duì)列的全面講解示例教程
本文介紹著重介紹數(shù)據(jù)結(jié)構(gòu)-棧和隊(duì)列的知識(shí),由于本文也設(shè)計(jì)多個(gè)動(dòng)態(tài)內(nèi)存開辟函數(shù),小伙伴們?cè)趯W(xué)習(xí)本文之前,一定一定一定要把動(dòng)態(tài)內(nèi)存開辟相關(guān)知識(shí)掌握牢固,這樣學(xué)習(xí)起本文才能事半功倍2021-10-10
使用C語言順序表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)棧的代碼示例
這篇文章主要給大家介紹了如何使用C語言順序表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)棧,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09

