C語言 掃雷游戲

代碼在一個項目里完成,分成三個.c.h文件(game.c,game.h,main.c)
在Clion軟件中通過運行調試。

/大概想法/
主函數main.c里是大框架(菜單,掃雷棋盤初始化,隨機函數生成雷,玩家掃雷)
game.h函數聲明(除main函數和游戲函數外的一些函數聲明)
game.c函數實現(除main函數和游戲函數外的一些函數實現)

/game.c實現/

①先對掃雷棋盤進行初始化(使用兩個大小一樣的字符數組作為掃雷棋盤
1.存儲雷 2.展示給玩家的掃雷棋盤。為了避免在遍歷中出現越界訪問,棋盤尺寸設置為11*11,在9*9的尺寸里布置雷,展示給玩家的也是9*9的尺寸。相當于隱藏了第一行和最后一行,第一列和最后一列。)
1棋盤初始化為0 2棋盤初始化為*

②初始化完棋盤,顯示棋盤
③隨機函數生成雷存儲到第一個字符數組里
④玩家掃雷實現包括 :玩家輸入坐標位置是否是雷。坐標不是雷情況下周圍一圈是否有雷。該坐標不是雷且周圍也沒有雷的情況下利用遞歸顯示這些坐標為空。

以下是部分函數實現:

//判斷周圍多少雷(除輸入坐標外一圈的八個位置獲取雷數信息。
對于字符,某個字符-'0’就是整數.八個坐標減去八個’0’就是八個坐標里有幾個雷)

//判斷周圍多少雷,返回雷數
int BombNumber(char mine[ROWS][COLS],int row,int col){return mine[row -1][col-1] + mine[row - 1][col] + mine[row - 1][col+1] + \mine[row][col-1] + mine[row][col+1] + \mine[row+1][col - 1] + mine[row+1][col] + mine[row+1][col+1] -8*'0';
}

本來在玩家輸入的坐標不是雷,且周圍八個坐標不是雷的情況下,想在函數里列舉把九個坐標存為空再顯示出來的。但是在學習視頻里提到可以利用遞歸呈現出一片空白的棋盤。在網上查閱別人的代碼學習到了如何使用遞歸呈現一片棋盤。

//假設是3*3的棋盤show[row - 1][col - 1] = ' ';//第一行show[row - 1][col] = ' ';show[row - 1][col + 1] = ' ';show[row][col - 1] = ' ';//第二行show[row][col] = ' ';show[row][col + 1] = ' ';show[row + 1][col - 1] = ' ';//第三行show[row + 1][col] = ' ';show[row + 1][col + 1] = ' ';

遞歸呈現一片棋盤
//在這個代碼里遞歸思想是1.該坐標不是雷 2.周圍的八個坐標也不是雷
對玩家輸入的坐標進行九次循環 判斷每個坐標是否合法且沒有雷也沒有展示給玩家
坐標滿足條件以后就調用判斷一圈是否有雷的函數 假如循環中的某個坐標一圈沒有雷就再次進入遞歸函數 再將該坐標的一圈坐標進行循環遍歷 繼續以上過程 假如坐標不滿足條件時會結束遞歸 進入else語句 直到九次循環完事。

void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){int i=0,j=0,flag=0;show[row][col] = ' ';for(i=row-1;i<=row+1;i++) {for (j = col-1; j <=col+1; j++) {if((i>0&&i<=ROW)&&(j>0&&j<=COL)&&(mine[i][j]!='1')&&(show[i][j]=='*')) {flag = BombNumber(mine, i, j);//判斷一圈是否是雷,返回的是雷的數量if(!flag)BlankBoard(mine,show,i,j);//遞歸elseshow[i][j]=flag+'0';//將得到的非0的雷數放到展示給玩家的棋盤里}}}
}

//玩家進行游戲的核心操作

void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{char array[5]="\0";//使用字符串接收玩家輸入的信息int x,y,flag=0,win=0;while(win<(row*col-Bomb))//展示給玩家的坐標數量<整個棋盤的非雷坐標數就進入循環//直到玩家看到的非*坐標數量已經是所有非雷坐標{printf("玩家輸入坐標,坐標形式為:x,y\n");gets(array);x=array[0]-'0';//字符-'0'為整數y=array[2]-'0';if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)&&(show[x][y])=='*')//坐標合法且沒有顯示給玩家{if(mine[x][y]=='1')//在存儲雷的棋盤中'1'代表是雷{printf("很遺憾,該坐標中放了雷,玩家被炸死");printf("雷分布如下:\n");Display(mine,ROW,COL);//顯示存儲雷的棋盤break;}else{flag=BombNumber(mine, x, y);//判斷該坐標周圍一圈是否是雷if(flag>0){//周圍一圈有雷show[x][y]=flag+'0';Display(show,ROW,COL);}else{BlankBoard(mine,show,x,y);Display(show,ROW,COL);}winwin=Showboard(show,ROW,COL);}//判斷展示給玩家的坐標數}elseprintf("坐標無效,請重新輸入\n");}if(win==(row*col-Bomb)){printf("恭喜玩家排雷成功!\n");Display(mine,ROW,COL);}
}

//以下是完整代碼(本人沒玩過正常的掃雷游戲,對掃雷游戲的輸贏理解可能不太對,但大概思路沒啥問題)

//main.c


#include"game.h"//初版掃雷// 顯示菜單
void menu(){printf("*********1.game***0.退出*********\n");printf("*********輸入數字進行選擇***********\n");
}
//游戲核心
//使用兩個字符數組1->存放雷信息 2->用于輸出到屏幕
//使用隨機函數放置雷
//玩家排雷void game() {char Mine [ROWS][COLS]={0};char Show [ROWS][COLS]={0};;//數組初始化Init(Mine,ROWS,COLS,'0');Init(Show,ROWS,COLS,'*');//顯示//Display(Mine,ROWS,COLS);//顯示初始化的雷棋盤Display(Show,ROWS,COLS);//顯示玩家棋盤SetBomb(Mine,ROW,COL);//隨機生成雷//Display(Mine,ROW,COL);//顯示雷棋盤StartBomb(Mine,Show,ROW,COL);//玩家進行掃雷
}int main()
{setbuf(stdout,NULL);//及時輸出緩沖區內容int number=0;srand((unsigned int )time(NULL));//時間戳幫助生成棋盤上的隨機坐標do{menu();scanf("%d",&number);getchar();//玩家輸入的坐標使用字符串輸入的,所以此時需要用getchar取走\nswitch(number){case 1:game();break;case 0:printf("正在退出\n");break;default:printf("選擇錯誤,重新輸入\n");break;}}while(number);}

//game.h

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>#define ROW 9
#define COL 9#define ROWS (ROW+2)
#define COLS (COL+2)#define Bomb 10#ifndef TEXT1_GAME_H
#define TEXT1_GAME_Hvoid Init(char board[ROWS][COLS],int rows,int cols,char set);
void Display(char board[ROWS][COLS],int row,int col);
void SetBomb(char board[ROWS][COLS],int row,int col);
void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
int  BombNumber(char mine[ROWS][COLS],int row,int col);
void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
int Showboard(char board[ROWS][COLS],int row,int col);
#endif

//game.c

#include"game.h"//初始化
void Init(char board[ROWS][COLS],int rows,int cols,char set){int i=0,j=0;for(i=0;i<ROWS;i++){for(j=0;j<COLS;j++)board[i][j]=set;}
}//顯示函數
void Display(char board[ROWS][COLS],int row,int col)
{int i=0,j=0;//打印列數for(i=0;i<=COL;i++)printf("%d|",i);printf("\n");for(i=1;i<=ROW;i++){printf("%d|",i);//打印行數for(j=1;j<=COL;j++)printf("%c ",board[i][j]);printf("\n");}
}//放置炸彈
void SetBomb(char board[ROWS][COLS],int row,int col)
{int numberBomb=1;while(numberBomb<=Bomb){int x=(rand()%ROW)+1;int y=(rand()%COL)+1;if(board[x][y]=='0') {board[x][y] = '1';numberBomb++;}}
}void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{char array[5]="\0";int x,y,flag=0,win=0;while(win<(row*col-Bomb)){printf("玩家輸入坐標,坐標形式為:x,y\n");gets(array);x=array[0]-'0';y=array[2]-'0';if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)&&(show[x][y])=='*'){if(mine[x][y]=='1'){printf("很遺憾,該坐標中放了雷,玩家被炸死");printf("雷分布如下:\n");Display(mine,ROW,COL);break;}else{flag=BombNumber(mine, x, y);if(flag>0){show[x][y]=flag+'0';Display(show,ROW,COL);}else{BlankBoard(mine,show,x,y);Display(show,ROW,COL);}}win=Showboard(show,ROW,COL);}elseprintf("坐標無效,請重新輸入\n");}if(win==(row*col-Bomb)){printf("恭喜玩家排雷成功!\n");Display(mine,ROW,COL);}
}//判斷周圍多少雷
int BombNumber(char mine[ROWS][COLS],int row,int col){return mine[row -1][col-1] + mine[row - 1][col] + mine[row - 1][col+1] + \mine[row][col-1] + mine[row][col+1] + \mine[row+1][col - 1] + mine[row+1][col] + mine[row+1][col+1] -8*'0';
}//1.該坐標不是雷 2.周圍的八個坐標也不是雷
void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){int i=0,j=0,flag=0;show[row][col] = ' ';for(i=row-1;i<=row+1;i++) {for (j = col-1; j <=col+1; j++) {if((i>0&&i<=ROW)&&(j>0&&j<=COL)&&(mine[i][j]!='1')&&(show[i][j]=='*')) {flag = BombNumber(mine, i, j);if(!flag)BlankBoard(mine,show,i,j);elseshow[i][j]=flag+'0';
/*          show[row - 1][col - 1] = ' ';show[row - 1][col] = ' ';show[row - 1][col + 1] = ' ';show[row][col - 1] = ' ';show[row][col] = ' ';show[row][col + 1] = ' ';show[row + 1][col - 1] = ' ';show[row + 1][col] = ' ';show[row + 1][col + 1] = ' ';*/}}}
}int Showboard(char board[ROWS][COLS],int row,int col){int i=0,j=0,number=0;for(i=1;i<=row;i++){for(j=1;j<=col;j++){if(board[i][j]!='*')number++;}}return number;
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RepidJson將內容寫入文件

使用 RapidJSON 將內容寫入文件的步驟如下&#xff1a; 創建一個 rapidjson::Document 對象&#xff0c;將需要寫入文件的內容存儲到其中。創建一個 rapidjson::StringBuffer 對象來保存 JSON 字符串。將 rapidjson::Document 對象轉換為 JSON 字符串&#xff0c;并將其放入 r…

日志打印傳值 傳引用 右值引用性能測試

結論 ubuntu x86平臺qnx平臺優化傳值都是比傳引用的差 但是差距很小 測試代碼 #include <cstdint> #include <ctime> #include <string>#ifdef __linux__#define ITERATIONS 10000000 #else#define ITERATIONS 100000 #endiftemplate <typename... AR…

rust高級 異步編程 一 future

文章目錄 Async 編程簡介async/.await 簡單入門 Future 執行器與任務調度Future 特征使用 Waker 來喚醒任務構建一個定時器執行器 Executor構建執行器 完整代碼 Async 編程簡介 OS 線程, 它最簡單&#xff0c;也無需改變任何編程模型(業務/代碼邏輯)&#xff0c;因此非常適合作…

Linux設置root初始密碼

目錄 一、Linux系統中普通用戶和特權用戶&#xff08;root&#xff09; 二、Linux系統中設置root初始密碼 一、Linux系統中普通用戶和特權用戶&#xff08;root&#xff09; windows 系統中有普通用戶和特權用戶&#xff0c;特權用戶是 administer&#xff0c;普通用戶可以…

mybatisplus調用oracle存儲過程

mybatisplus調用oracle存儲過程 創建一個測試的oracle存儲過程 -- 創建攜帶返回值存儲過程 CREATE OR REPLACE PROCEDURE SP_SUM_PROC_2023(number1 IN NUMBER, number2 IN NUMBER, result OUT NUMBER,result2 OUT NUMBER) is BEGIN result : number1 number2; result2 : 99…

微服務01

筆記&#xff1a; day03-微服務01 - 飛書云文檔 (feishu.cn) 數據庫連接不上&#xff1f; 要在虛擬機啟動MySQL容器。docker start mysql 服務治理 服務提供者&#xff1a;暴露服務接口&#xff0c;供其他服務調用 服務消費者&#xff1a;調用其他服務提供的接口 注冊中心&…

Java IO流(一) 基本知識

Java IO流 一、基礎知識 IO流即存儲和讀取數據的解決方案。 &#xff08;一&#xff09;File 表示系統中的文件或者文件夾的路徑 獲取文件信息(大小&#xff0c;文件名&#xff0c;修改時間) 創建文件/文件夾 刪除文件/文件夾 判斷文件的類型 注意&#xff1a;File類只能對…

STL(五)(queue篇)

我發現之前一版在電腦上看 常用函數部分 沒有問題,由于是手打上去的,在手機上看會發生錯位問題,現已將電腦原版 常用函數部分 截圖改為圖片形式,不會再發生錯位問題,非常感謝大家的支持 ### priority_queue優先隊列出現頻率非常高,尤為重要(是一定要掌握的數據結構) 1.queue隊…

A : DS靜態查找之順序查找

Description 給出一個隊列和要查找的數值&#xff0c;找出數值在隊列中的位置&#xff0c;隊列位置從1開始 要求使用帶哨兵的順序查找算法 Input 第一行輸入n&#xff0c;表示隊列有n個數據 第二行輸入n個數據&#xff0c;都是正整數&#xff0c;用空格隔開 第三行輸入t&…

Spring-retry失敗重試機制

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、引入依賴二、主啟動類上加EnableRetry三、Server層注意 四、失敗后回調方法總結 前言 提示&#xff1a;SpringBoot項目為例 原文鏈接&#xff1a;https://…

docker全解

docker全解 一、docker的基本概念 什么是docker? docker是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中&#xff0c;然后發布到任何流行的Linux或Windows機器上&#xff0c;也可以實現虛擬化。容器是完全使用沙箱機制&#…

MIT線性代數筆記-第26講-對稱矩陣及正定性

目錄 26.對稱矩陣及正定性打賞 26.對稱矩陣及正定性 實對稱矩陣的特征值均為實數&#xff0c;并且一定存在一組兩兩正交的特征向量 這對于單位矩陣顯然成立 證明特征值均為實數&#xff1a; ? ???設一個對稱矩陣 A A A&#xff0c;對于 A x ? λ x ? A \vec{x} \lambda…

作業12.8

1. 使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數。將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是…

Matlab simulink PLL學習筆記

本文學習內容&#xff1a;【官方】2022小邁步之 MATLAB助力芯片設計系列&#xff08;一&#xff09;&#xff1a;電路仿真與模數混合設計基礎_嗶哩嗶哩_bilibili 時域模型 testbench搭建 菜單欄點擊simulink 創建空白模型 點擊庫瀏覽器 在PLL里面選擇一種架構拖拽到畫布。 如…

一文理解什么是交叉熵損失函數以及它的作用

今天看一個在深度學習中很枯燥但很重要的概念——交叉熵損失函數。 作為一種損失函數&#xff0c;它的重要作用便是可以將“預測值”和“真實值(標簽)”進行對比&#xff0c;從而輸出 loss 值&#xff0c;直到 loss 值收斂&#xff0c;可以認為神經網絡模型訓練完成。 那么這…

【Java用法】Hutool樹結構工具-TreeUtil快速構建樹形結構的兩種方式 + 數據排序

Hutool樹結構工具-TreeUtil快速構建樹形結構的兩種方式 數據排序 一、業務場景二、Hutool官網樹結構工具2.1 介紹2.2 使用2.2.1 定義結構2.2.2 構建Tree2.2.3 自定義字段名 2.3 說明 三、具體的使用場景3.1 實現的效果3.2 業務代碼3.3 實現自定義字段的排序 四、踩過的坑4.1 坑…

策略產品經理常用的ChatGPT通用提示詞模板

產品策略&#xff1a;請幫助我制定一個策略產品的產品策略。 市場調研&#xff1a;如何進行策略產品的市場調研&#xff1f; 競爭分析&#xff1a;如何進行策略產品的競爭分析&#xff1f; 用戶畫像&#xff1a;如何構建策略產品的用戶畫像&#xff1f; 產品定位&#xff1…

交換排序(冒泡排序)(快速排序(1))

目錄 1.交換排序 &#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 1.交換排序 基本思想&#xff1a;所謂交換&#xff0c;就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置&#xff0c;交換排序的特點是&#xff1a;將鍵值較大的…

ambari hive on Tez引擎一直卡住

hive on tez使用./bin/hive啟動后一直卡住&#xff0c;無法進入命令行 使用TEZ作為Hive默認執行引擎時&#xff0c;需要在調用Hive CLI的時候啟動YARN應用&#xff0c;預分配資源&#xff0c;這需要花一些時間&#xff0c;而使用MapReduce作為執行引擎時是在執行語句的時候才會…

iPaaS架構深入探討

在數字化時代全面來臨之際&#xff0c;企業正面臨著前所未有的挑戰與機遇。技術的迅猛發展與數字化轉型正在徹底顛覆各行各業的格局&#xff0c;不斷推動著企業邁向新的前程。然而&#xff0c;這一數字化時代亦衍生出一系列復雜而深奧的難題&#xff1a;各異系統之間數據孤島、…