C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷小游戲
這是一個(gè)用C語(yǔ)言實(shí)現(xiàn)的控制臺(tái)掃雷小游戲,實(shí)現(xiàn)了隨機(jī)布置炸彈、掃描炸彈、標(biāo)記炸彈、百分百第一次不被炸死等功能。
編譯器:vs2015
功能模塊圖

源代碼
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void show(int cbd[10][10],int u[10][10]) ?//界面輸出函數(shù)
{
? ? int i, j;
? ? //for (i = 0; i < 10; i++) ?//輸出全部炸彈信息(上帝視角,調(diào)試用)
? ? //{
? ? // ?for (j = 0; j < 10; j++)
? ? // ?{
? ? // ? ? ?printf("%2d ", cbd[i][j]);
? ? // ?}
? ? // ?printf("\n");
? ? //}
? ? printf(" ? ? 1 2 3 4 5 6 7 8 9 10\n"); //行標(biāo)
? ? printf(" ? ?--------------------\n");
? ? for (i = 0; i<10; i++) ?//根據(jù)u數(shù)組和cbd數(shù)組的值選擇輸出
? ? { ? ? ? ? ? ?//■:未掃描,□:周圍無(wú)炸彈,◇:炸彈標(biāo)記
? ? ? ? for (j = 0; j<10; j++)
? ? ? ? {
? ? ? ? ? ? if (j == 0)printf("%2d║ ", i+1);
? ? ? ? ? ? if (u[i][j] == 0)printf("■");
? ? ? ? ? ? else if (u[i][j] == 1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (cbd[i][j] == 0)printf("□");
? ? ? ? ? ? ? ? else printf("%2d", cbd[i][j]);
? ? ? ? ? ? }
? ? ? ? ? ? else if (u[i][j] == -1)?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? printf("◇");
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? printf("\n");
? ? }
}
int find(int cbd[10][10], int i, int j) ?//掃描周圍炸彈數(shù)目
{
? ? int l, c,lmin,cmin, lmax, cmax, num = 0;
? ? l = lmin = (i - 1) >= 0 ? (i - 1) : 0; ?//計(jì)算行、列起點(diǎn)
? ? c = cmin = (j - 1) >= 0 ? (j - 1) : 0;
? ? lmax = ((i + 1) < 10 ? (i + 1) : 9); ?//計(jì)算行、列終點(diǎn)
? ? cmax = ((j + 1) < 10 ? (j + 1) : 9);
? ? for (l = lmin; l <= lmax; l++)
? ? {
? ? ? ? for (c = cmin; c <= cmax; c++)
? ? ? ? {
? ? ? ? ? ? if (l == i&&c == j)continue; ?//跳過(guò)自身
? ? ? ? ? ? if (cbd[l][c] == -1)num++; ?//炸彈計(jì)數(shù)
? ? ? ? }
? ? }
? ? return num;
}
void init(int cbd[10][10]) ? //cbd數(shù)組初始化(隨機(jī)布置炸彈并填充各個(gè)格子的數(shù)目)
{
? ? int n = 10, l, c, i, j;
? ? srand(time(NULL)); ? ?//隨機(jī)數(shù)種子設(shè)置
? ? for (i = 0; i< 10; i++)
? ? {
? ? ? ? for (j = 0; j< 10; j++)
? ? ? ? {
? ? ? ? ? ? cbd[i][j] = 0; ?//全0填充
? ? ? ? }
? ? }
? ? while (n--) ? //隨機(jī)行列放置炸彈
? ? {
? ? ? ? l = rand() % 10;
? ? ? ? c = rand() % 10;
? ? ? ? if (cbd[l][c] != -1)cbd[l][c] = -1; ? //炸彈重復(fù)處理
? ? ? ? else n++;
? ? }
? ? for (i = 0; i< 10; i++)
? ? {
? ? ? ? for (j = 0; j< 10; j++)
? ? ? ? {
? ? ? ? ? ? if (cbd[i][j] != -1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cbd[i][j] = find(cbd, i, j); //炸彈數(shù)目填充
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
void open(int cbd[10][10],int u[10][10], int i, int j) ?//周圍無(wú)炸彈時(shí)的展開函數(shù)(遞歸展開)
{
? ? u[i][j] = 1;
? ? if (cbd[i][j] == 0)
? ? {
? ? ? ? if(i - 1 >= 0 && u[i - 1][j] != 1)open(cbd, u, i - 1, j); ? //上
? ? ? ? if(j - 1 >= 0 && u[i][j - 1] != 1)open(cbd, u, i, j - 1); ? //左
? ? ? ? if (i + 1 <= 9 && u[i + 1][j] != 1)open(cbd, u, i + 1, j); ?//下
? ? ? ? if (j + 1 <= 9 && u[i][j + 1] != 1)open(cbd, u, i, j + 1); ?//右
? ? }
}
int judge(int u[10][10]) //判斷游戲是否通關(guān)
{
? ? int i, j, num = 0;
? ? for (i = 0; i < 10; i++)
? ? {
? ? ? ? for (j = 0; j < 10; j++)
? ? ? ? {
? ? ? ? ? ? if (u[i][j] == 0 || u[i][j] == -1)num++;
? ? ? ? }
? ? }
? ? if (num == 10)return 1;
? ? else return 0;
}
void fail(int cbd[10][10], int u[10][10]) ?//游戲失敗函數(shù)
{
? ? int i, j;
? ? for (i = 0; i < 10; i++) ? //輸出全部炸彈信息
? ? {
? ? ? ? for (j = 0; j < 10; j++)
? ? ? ? {
? ? ? ? ? ? if (cbd[i][j] == 0)printf(" ?");
? ? ? ? ? ? else if (cbd[i][j] != -1)printf("%2d", cbd[i][j]);?
? ? ? ? ? ? else printf("●");
? ? ? ? }
? ? ? ? printf("\n");
? ? }
? ? printf("請(qǐng)大俠重新來(lái)過(guò)~\n");
}
void menu(int cbd[10][10],int u[10][10]) ?//菜單函數(shù)
{
? ? int chs,i,j;
? ? int boom = 10; ?//剩余炸彈數(shù)
? ? int num = 0; ? //步數(shù)
? ? while (1) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? {
? ? ? ? system("cls");
? ? ? ? show(cbd,u);
? ? ? ? printf("還有%d個(gè)炸彈\n",boom);
? ? ? ? printf("1.掃描 ? ?2.標(biāo)記 ? ?3.取消標(biāo)記\n");
? ? ? ? printf("請(qǐng)輸入選項(xiàng):>");
? ? ? ? scanf("%d", &chs);
? ? ? ? if (chs > 3 || chs < 1) {
? ? ? ? ? ? printf("請(qǐng)輸入正確選項(xiàng)!\n");
? ? ? ? ? ? system("pause");
? ? ? ? ? ? continue;
? ? ? ? }
? ? ? ? printf("請(qǐng)輸入坐標(biāo):>");
? ? ? ? scanf("%d %d", &i, &j);
? ? ? ? if (i < 1 || i>10)
? ? ? ? {
? ? ? ? ? ? printf("請(qǐng)輸入正確坐標(biāo)!\n");
? ? ? ? ? ? system("pause");
? ? ? ? ? ? continue;
? ? ? ? }
? ? ? ? i--; ?//輸入行列數(shù)處理(適用數(shù)組下標(biāo))
? ? ? ? j--;
? ? ? ? if (chs == 1)
? ? ? ? {
? ? ? ? ? ? if (cbd[i][j] == -1) {
? ? ? ? ? ? ? ? if (num == 0) { //若第一步掃描到炸彈,就重新初始化棋盤
? ? ? ? ? ? ? ? ? ? init(cbd);
? ? ? ? ? ? ? ? ? ? show(cbd, u);
? ? ? ? ? ? ? ? ? ? open(cbd, u, i, j);
? ? ? ? ? ? ? ? ? ? num++;
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? fail(cbd, u); ?//否則游戲失敗,循環(huán)跳出
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if (u[i][j] == 1) ?//重復(fù)掃描時(shí)的處理
? ? ? ? ? ? {
? ? ? ? ? ? ? ? printf("該位置已經(jīng)掃描過(guò)了!\n");
? ? ? ? ? ? ? ? system("pause");
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }
? ? ? ? ? ? open(cbd, u, i, j);
? ? ? ? ? ? num++;
? ? ? ? }
? ? ? ? else if(chs == 2)
? ? ? ? {
? ? ? ? ? ? if (u[i][j] == 1) {
? ? ? ? ? ? ? ? printf("該位置已經(jīng)掃描過(guò)了!\n"); //只能標(biāo)記未掃描到的
? ? ? ? ? ? ? ? system("pause");
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }
? ? ? ? ? ? u[i][j] = -1;
? ? ? ? ? ? boom --; ? ? ? ? ? ?
? ? ? ? }
? ? ? ? else if (chs == 3)
? ? ? ? {
? ? ? ? ? ? if (u[i][j] != -1) {
? ? ? ? ? ? ? ? printf("該位置沒(méi)有標(biāo)記!\n"); //只能取消標(biāo)記過(guò)的
? ? ? ? ? ? ? ? system("pause");
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }
? ? ? ? ? ? u[i][j] = 0;
? ? ? ? ? ? boom++;
? ? ? ? }
? ? ? ? if (judge(u)) ?//判斷游戲是否通關(guān)
? ? ? ? {
? ? ? ? ? ? printf("Old Fe 666!\n"); //老鐵666!,循環(huán)跳出
? ? ? ? ? ? break;
? ? ? ? }
? ? }
}
int main()
{
? ? int cbd[10][10] = { 0 }; //保存炸彈信息的二維數(shù)組
? ? int u[10][10] = { 0 }; ?//保存是否翻開信息的二維數(shù)組
? ? init(cbd); ? //數(shù)組初始化
? ? menu(cbd, u); ?//進(jìn)入菜單
? ? return 0;
}Tips:在掃描到周圍無(wú)炸彈的格子時(shí),要將此格子周圍的部分依次打開,直到上下左右都出現(xiàn)炸彈數(shù)字為止,這里要用到遞歸的方法,我的順序?yàn)橐来芜f歸處理上、左、下、右的格子,這里順序可以任意。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C語(yǔ)言掃雷排雷小游戲?qū)崿F(xiàn)全程
- C語(yǔ)言實(shí)現(xiàn)經(jīng)典掃雷小游戲完整代碼(遞歸展開?+?選擇標(biāo)記)
- 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(擴(kuò)展版)
- C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)流程
- C語(yǔ)言實(shí)現(xiàn)自定義掃雷游戲(遞歸版)
- C語(yǔ)言實(shí)現(xiàn)第一次防死版掃雷游戲
- C語(yǔ)言實(shí)現(xiàn)遞歸版掃雷游戲?qū)嵗?/a>
- C語(yǔ)言詳細(xì)講解通過(guò)遞歸實(shí)現(xiàn)掃雷的展開
相關(guān)文章
C語(yǔ)言 OutputDebugString與格式化輸出函數(shù)OutputDebugPrintf案例詳解
這篇文章主要介紹了C語(yǔ)言 OutputDebugString與格式化輸出函數(shù)OutputDebugPrintf案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
c語(yǔ)言中用字符串?dāng)?shù)組顯示菜單的解決方法
本篇文章是對(duì)c語(yǔ)言中用字符串?dāng)?shù)組顯示菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
在C/C++與Python之間實(shí)現(xiàn)通信的常見方法
在C/C++與Python之間實(shí)現(xiàn)通信的方式有很多,本文給大家介紹了一些常見的方法,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12
C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程
本文主要介紹了C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Qt圖形圖像開發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例
這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫(kù)縮放/平移詳細(xì)方法與實(shí)例,需要的朋友可以參考下2020-03-03
深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指針)
本篇文章是對(duì)const int *p與int * const p的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C語(yǔ)言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解
函數(shù)就是一段封裝好的,可以重復(fù)使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。這篇文章主要介紹了c語(yǔ)言是如何處理函數(shù)調(diào)用的?需要的朋友可以參考下2023-02-02

