C語言:掃雷

? ? 在編程的世界里,掃雷游戲是一個經典的實踐項目。它不僅能幫助我們鞏固編程知識,還能鍛煉邏輯思維和解決問題的能力。今天,就讓我們一起用 C 語言來實現這個有趣的游戲,并且通過圖文并茂的方式,讓每一步都清晰易懂

1. 游戲功能概述?

我們要實現的掃雷游戲具備以下核心功能:

?
  1. 界面交互:通過控制臺進行交互,玩家可以看到清晰的游戲界面,包括棋盤和操作提示。
  2. 菜單系統:提供簡單的菜單,讓玩家能夠選擇開始游戲或退出游戲。
  3. 棋盤設定:游戲棋盤為 9×9 的格子,默認隨機布置 10 個雷。
  4. 排雷機制:玩家輸入坐標排查雷,如果位置不是雷,會顯示周圍雷的數量;如果選中雷,游戲結束;成功找出所有非雷位置,游戲勝利。

2. 游戲設計思路

2.1 數據結構的選擇

? ? 1. 棋盤數組:考慮到在排查雷時,棋盤邊緣位置可能會出現越界問題,我們將存放數據的數組設計為 11×11。雷布置在中間 9×9 的區域,周圍一圈不布置雷。

? ? 2. 雙數組策略:為了避免雷的信息與排查出雷的數量信息混淆,我們使用兩個數組。mine數組存放布置好的雷的信息,初始化為字符'0',布置雷時改為'1'show數組存放排查出的雷的個數信息,初始化為字符'*'

?

2.2 文件結構規劃

為了使代碼結構清晰、易于維護,我們采用多文件形式:

?
  1. test.c:負責編寫游戲的測試邏輯,控制游戲流程。
  2. game.c:實現游戲中的各種函數,如初始化棋盤、布置雷、排查雷等。
  3. game.h:定義游戲所需的數據類型和函數聲明,以及一些宏定義。

?3.?代碼實現詳解

game.h文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define EASY_COUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2// 初始化棋盤
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
// 打印棋盤
void DisplayBoard(char board[ROWS][COLS], int row, int col);
// 布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
// 排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

? ? 在game.h文件中,我們引入了必要的頭文件,定義了一些常量,如雷的數量、棋盤大小等,并聲明了游戲中用到的函數。

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 DisplayBoard(char board[ROWS][COLS], int row, int col) {int i = 0;printf("------掃雷游戲-------\n");for (i = 0; i <= col; i++) {printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++) {printf("%d ", i);int j = 0;for (j = 1; j <= col; j++) {printf("%c ", board[i][j]);}printf("\n");}
}// 布置雷函數
void SetMine(char board[ROWS][COLS], int row, int col) {// 布置10個雷int count = EASY_COUNT;while (count) {int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0') {board[x][y] = '1';count--;}}
}// 統計周圍雷的數量函數
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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {int x = 0;int y = 0;int win = 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') {printf("很遺憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;} else {int count = GetMineCount(mine, x, y);show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}} else {printf("坐標非法,重新輸入\n");}}if (win == row * col - EASY_COUNT) {printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

? game.c文件實現了游戲的主要功能函數。InitBoard函數初始化棋盤,DisplayBoard函數用于打印棋盤,SetMine函數隨機布置雷,GetMineCount函數統計周圍雷的數量,FindMine函數實現排查雷的邏輯。

test.c文件
#include "game.h"// 菜單函數
void menu() {printf("***********************\n");printf("***** 1. play *****\n");printf("***** 0. exit *****\n");printf("***********************\n");
}// 游戲函數
void game() {char mine[ROWS][COLS];char show[ROWS][COLS];// 初始化棋盤InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');// 打印棋盤DisplayBoard(show, ROW, COL);// 布置雷SetMine(mine, 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 0:printf("退出游戲\n");break;default:printf("選擇錯誤,重新選擇\n");break;}} while (input);return 0;
}

? ?test.c文件中的menu函數展示游戲菜單,game函數整合游戲流程,main函數通過循環和switch語句處理玩家的選擇,控制游戲的開始和結束。

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

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

相關文章

【論文#目標檢測】YOLO9000: Better, Faster, Stronger

目錄 摘要1.引言2.更好&#xff08;Better&#xff09;3.更快&#xff08;Faster&#xff09;4.更健壯&#xff08;Stronger&#xff09;使用 WordTree 組合數據集聯合分類和檢測評估 YOLO9000 5.結論 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …

數據庫誤更新操作 如何回滾

1.未提交 直接 rollback 2.已提交 步驟 查詢指定時間內修改前數據庫數據&#xff1a; -- 查詢誤操作前的數據&#xff08;例如 10 分鐘前&#xff09; SELECT * FROM 表名 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL 10 MINUTE) WHERE 條件;-- 將數據恢復&#xff08;需確保有…

大數據運維實戰之YARN任務內存泄露排查實戰:從節點掉線到精準定位的完整指南

1.問題背景&#xff1a;集群內存風暴引發的危機 最近某大數據集群頻繁出現節點掉線事故&#xff0c;物理內存監控持續爆紅。運維人員發現當節點內存使用率達到95%以上時&#xff0c;機器會進入不可響應狀態&#xff0c;最終導致服務中斷。這種"內存雪崩"現象往往由單…

AI+金融 應用 使用DeepSeek、Qwen等大模型輸入自然語言,得到通達信等行情軟件公式代碼,導入后使用

AI金融 應用 使用DeepSeek、Qwen等大模型輸入自然語言&#xff0c;得到通達信等行情軟件公式代碼&#xff0c;導入后使用。不會編程&#xff0c;也能行情軟件中實現個性化條件選股&#xff0c;個性化技術指標。 AIbxm低估值趨勢選股策略&#xff0c;參考提示詞&#xff1a; 編…

[Xilinx]工具篇_PetaLinux自動編譯

[Xilinx]工具篇_PetaLinux自動編譯 若該文為原創文章&#xff0c;未經允許不得轉載風釋雪QQ:627833006E-mail:hn.cyfoxmail.comCSDN博客: https://blog.csdn.net/weixin_46718879知乎&#xff1a;https://www.zhihu.com/people/abner-80-4 1.版本 日期作者版本說明2025XXXX風釋…

多語言語料庫萬卷·絲路2.0開源,數據模態全面升級,搭建文化交流互鑒AI橋梁

3月22日&#xff0c;上海人工智能實驗室&#xff08;上海AI實驗室&#xff09;聯合新華社新聞信息中心、上海外國語大學、外研在線等&#xff0c;發布全新升級的“萬卷絲路2.0”多語言語料庫&#xff0c;通過構建多語言開源數據底座&#xff0c;以人工智能賦能“一帶一路”高質…

多語言生成語言模型的少樣本學習

摘要 大規模生成語言模型&#xff0c;如GPT-3&#xff0c;是極具競爭力的少樣本學習模型。盡管這些模型能夠共同表示多種語言&#xff0c;但其訓練數據以英語為主&#xff0c;這可能限制了它們的跨語言泛化能力。在本研究中&#xff0c;我們在一個涵蓋多種語言的語料庫上訓練了…

Linux運維篇-系統io調優

目錄 磁盤文件系統虛擬文件系統 文件系統的工作原理文件系統 I/OI/O 的分類緩沖與非緩沖 I/O直接與非直接 I/O阻塞與非阻塞 I/O同步與異步 I/O 查看文件系統容量目錄項和索引節點緩存 通用塊層I/O 棧磁盤性能指標磁盤 I/O 觀測進程 I/O 觀測I/O瓶頸的排查思路思路一思路二 I/O優…

C語言筆記(鵬哥)上課板書+課件匯總(動態內存管理)--數據結構常用

動態內存管理 引言&#xff1a;將內存升起一段空間存放數據有幾種手段 創建變量&#xff1a;存放一個值創建數組&#xff1a;存放多個連續的一組值 以上開辟的內存空間是固定的&#xff0c;創建大了&#xff0c;空間浪費&#xff0c;創建小了&#xff0c;空間不夠。并且一旦…

uv - Getting Started 開始使用 [官方文檔翻譯]

文章目錄 uv亮點安裝項目腳本工具Python 版本pip 接口了解更多 入門安裝 uv安裝方法獨立安裝程序PyPICargoHomebrewWinGetScoopDockerGitHub 發布 升級 uvShell 自動補全卸載 第一次使用 uv特性Python 版本腳本項目工具pip 接口實用工具 獲取幫助幫助菜單查看版本故障排除問題在…

HarmonyOS Next~鴻蒙系統安全:構建全方位的防護體系

HarmonyOS Next&#xff5e;鴻蒙系統安全&#xff1a;構建全方位的防護體系 ? ? 在數字化飛速發展的當下&#xff0c;操作系統的安全性成為了用戶和開發者關注的焦點。華為鴻蒙系統&#xff08;HarmonyOS&#xff09;以其獨特的架構和強大的安全性能&#xff0c;在眾多操作…

本地安裝deepseek大模型,并使用 python 調用

首先進入 ollama 官網 https://ollama.com/點擊下載 下載完成后所有都是下一步&#xff0c;就可以 點擊搜索 Models &#xff1a; https://ollama.com/search然后點擊下載&#xff1a; 選擇后復制: ollama run deepseek-r1:32b例如&#xff1a; 讓它安裝完成后&#xff1…

Linux wifi driver 注冊和設備探測流程

基礎流程 wifi驅動加載&#xff08;insmod或者modprobe&#xff09; 設備驅動匹配探測&#xff08;我們常見的probe函數&#xff09; 整體流程 驅動加載 → 注冊支持設備 → 設備插入 → 匹配驅動 → 初始化硬件 → 創建網絡接口 明確兩點 兩個流程 驅動加載&#xf…

【機器人】復現 GrainGrasp 精細指導的靈巧手抓取

GrainGrasp為每個手指提供細粒度的接觸指導&#xff0c;為靈巧手生成精細的抓取策略。 通過單獨調整每個手指的接觸來實現更穩定的抓取&#xff0c;從而提供了更接近人類能力的抓取指導。 論文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

快速部署Samba共享服務器作為k8s后端存儲

由于Ceph Squid&#xff08;v19.2.1&#xff09;?不原生支持直接導出 SMB 服務器?&#xff0c;需通過手動集成 Samba 或其他第三方工具實現? 所以直接部署最簡單的 安裝軟件包 apt install samba編輯配置文件 vim /etc/samba/smb.conf在最末尾添加以下 # cp /etc/samba/sm…

【時時三省】(C語言基礎)選擇結構和條件判斷

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 選擇結構和條件判斷 在現實生活中需要進行判斷和選擇的情況是很多的。如:從北京出發上高速公路,到一個岔路口,有兩個出口,一個是去上海方向,另一個是沈陽方向。駕車者到此處必須進行判斷,根據自己的目的地…

【MYSQL】索引和事務

&#x1f970;&#x1f970;&#x1f970;來都來了&#xff0c;不妨點個關注叭&#xff01; &#x1f449;博客主頁&#xff1a;歡迎各位大佬!&#x1f448; 本期內容講解 MySQL 中的索引和事務&#xff0c;在學習的過程中&#xff0c;我們需要經常問自己為什么 文章目錄 1. 索…

計劃管理工具應該具備的能(甘特圖)

在當今快節奏的項目管理環境中&#xff0c;高效地規劃和跟蹤項目進度是至關重要的。甘特圖&#xff0c;作為項目管理領域的經典工具&#xff0c;以其直觀的時間軸和任務分配方式&#xff0c;深受項目管理者的青睞。 隨著數字化時代的到來&#xff0c;甘特圖線上編輯器應運而生&…

Redis分布式尋址算法

分布式尋址算法是分布式系統中用于確定數據應該存儲在哪個節點的算法。這些算法對于實現高效的數據存取、負載均衡和系統擴展性至關重要。以下是幾種常見的分布式尋址算法的解釋&#xff1a; 1. Hash 算法 原理&#xff1a;通過哈希函數將數據的鍵&#xff08;Key&#xff09…

CSS動畫

目錄 一、核心概念與語法 1. keyframes 關鍵幀 2. animation 屬性 二、動畫調速函數&#xff08;animation-timing-function&#xff09; 1. 預設值 2. 貝塞爾曲線 3. 步進函數&#xff08;steps()&#xff09; 三、動畫控制與交互 1. 暫停與恢復 2. JavaScript 控制…