利用C語言如何實現一個掃雷游戲?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
int main() { int input = 0; srand((unsigned int)time(NULL)); do { printf("**************************\n"); printf("*** 1. play 0. exit ***\n"); printf("*** 2. clear ***\n"); printf("**************************\n"); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game();//游戲實現 break; case 2://清屏選項 system("cls"); break; case 0: printf("退出程序!\n"); break; default: printf("輸入錯誤,請重新輸入!\n"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
這里我們用了Windows庫函數清屏,如果屏幕上顯示的東西太多了,我們可以選擇2來清屏,還有一個睡眠函數,如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了。
效果展示圖:
制作好菜單那我們開始實現整個游戲的邏輯框架了,定義兩個二維數組,一個用于顯示,一個用于存放地雷。如果這兩個東西都只用一個二維數組的話后面的實現邏輯會比較麻煩所以我選擇使用兩個二維數組。
char mine[ROWS][COLS] = { 0 };//用于埋雷 char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示
有這兩個二維數組我們開始初始化
//初始化 void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { mine[i][j] = val; } } }
我遍歷整個二維數組來初始化,val這個參數是用于接收這兩個二維數組的初始化的內容,如果不用這個val參數我就要再寫一個函數封裝很麻煩。
接下來,實現個打印棋盤函數來看看我們的初始化是否正確的初始化成我想要的內容
打印棋盤代碼:
//顯示棋盤 void Display_board(char mine[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf(" 掃雷游戲\n"); printf("---------------------------------\n"); for (j = 0; j <= col; j++) { printf("%d ", j); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", mine[i][j]); } printf("\n"); } }
接下來看看我們初始化的是否正確:
可以看到它正確的初始化了,全0代表埋雷的二維數組,而*
代表的是用戶看到的,正常來說,這個埋雷是不需要顯示出來的,但是我們需要確認是否正確初始化所以打印出來看看,下一步我們開始埋雷。
//埋雷 void random_mine(char mine[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int count = EASILY; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0')//用于判斷是否正確的埋雷,只有我們這沒被埋過的雷我們才自減 { mine[x][y] = '1'; count--; } } }
埋好雷的效果:
1代表是雷,0代表步是雷,埋好的雷會被賦值成字符1
埋雷我采用隨機函數來幫我埋下雷,弄好這步接來的就是掃雷這很關鍵。
掃雷代碼:
//掃雷 void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; while (count < row * col - EASILY) { system("cls"); Display_board(show, COL, ROW); printf("請輸入坐標:>"); scanf("%d %d", &x, &y); if ((1 <= x && x <= row) && (1 <= y && y <= col)) { if (mine[x][y] == '0') { int leng = statistics_mine(mine, x, y); show[x][y] = leng + '0'; count++; } else { printf("很遺憾你被炸死了\n"); Display_board(mine, ROW, COL); break; } } else { printf("請輸入有效數字!\n"); } } if (count == row * col - EASILY) { printf("恭喜你掃雷成功!\n"); Display_board(mine, ROW, COL); } }
如果玩家輸入的坐標是合法的我們就統計它周圍有多少雷,統計雷的功能我做成了一個內部函數防止重名。
如果全部沒有雷的地方都排查完了,我們就停止循環。然后打印下雷的棋盤讓玩家知道哪有雷,如果被炸死了,我們也打印下雷的二維數組讓玩家死得瞑目。
統計雷的函數:
//統計周圍雷的個數 static int statistics_mine(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; }
根據ASCII碼字符1減去字符0就是整形1,所以根據此方法我們就只用把周圍的雷全部加起來減去字符零就可以得到周圍雷的個數并返回 。
統計雷效果圖:
周圍沒有雷就是0,如果有就顯示個數。
通關也會打印所有雷的位置并提示你是否通關
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-m4tO2ZuP-1613214039851)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\image-20210213185535958.png)]
頭文件:
#pragma once #include <stdio.h> #include <Windows.h> #include <time.h> #include <stdlib.h> #define ROW 9 #define COL 9 #define ROWS ROW + 2 #define COLS COL + 2 #define EASILY 0//雷的數量 //初始化 void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val); //顯示棋盤 void Display_board(char mine[ROWS][COLS], int row, int col); //埋雷 void random_mine(char mine[ROWS][COLS], int row, int col); //掃雷 void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
游戲實現代碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include "Game.h" int count = 0;//統計還剩多少格子沒被掃 void game()//游戲實現 { char mine[ROWS][COLS] = { 0 };//用于埋雷 char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示 //初始化 initzeboard(show, ROWS, COLS, '*'); initzeboard(mine, ROWS, COLS, '0'); //顯示棋盤 Display_board(show, ROW, COL); //Display_board(mine, ROW, COL); //埋雷 random_mine(mine, ROW, COL); //Display_board(mine, ROW, COL); //掃雷 mine_sweeping(mine, show, ROW, COL); } //初始化 void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { mine[i][j] = val; } } } //顯示棋盤 void Display_board(char mine[ROWS][COLS], int row, int col) { int i = 0; int j = 0; printf(" 掃雷游戲\n"); printf("---------------------------------\n"); for (j = 0; j <= col; j++) { printf("%d ", j); } printf("\n"); for (i = 1; i <= row; i++) { printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", mine[i][j]); } printf("\n"); } } //埋雷 void random_mine(char mine[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int count = EASILY; while (count) { x = rand() % row + 1; y = rand() % col + 1; if (mine[x][y] == '0') { mine[x][y] = '1'; count--; } } } //統計周圍雷的個數 static int statistics_mine(char mine[ROWS][COLS], int x, int y) { return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; } //掃雷 void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; while (count < row * col - EASILY) { system("cls"); Display_board(show, COL, ROW); printf("請輸入坐標:>"); scanf("%d %d", &x, &y); if ((1 <= x && x <= row) && (1 <= y && y <= col)) { if (mine[x][y] == '0') { int leng = statistics_mine(mine, x, y); show[x][y] = leng + '0'; count++; } else { printf("很遺憾你被炸死了\n"); Display_board(mine, ROW, COL); break; } } else { printf("請輸入有效數字!\n"); } } if (count == row * col - EASILY) { printf("恭喜你掃雷成功!\n"); Display_board(mine, ROW, COL); } }
主函數代碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include "Game.h" extern void game(); int main() { int input = 0; srand((unsigned int)time(NULL)); do { printf("**************************\n"); printf("*** 1. play 0. exit ***\n"); printf("*** 2. clear ***\n"); printf("**************************\n"); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game();//游戲實現 break; case 2://清屏選項 system("cls"); break; case 0: printf("退出程序!\n"); break; default: printf("輸入錯誤,請重新輸入!\n"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
關于利用C語言如何實現一個掃雷游戲問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。