C語言實現(xiàn)掃雷游戲詳細(xì)代碼實例
掃雷游戲
思路:先制作一個菜單讓玩家選擇是玩游戲還是退出游戲,菜單做好了,接著我們開始制作掃雷的棋盤并初始化,初始化弄完了我們下一步開始埋雷,雷埋好了就開始掃雷。
大概思路就是這樣具體實現(xiàn)看下面:
菜單的實現(xiàn)代碼:
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();//游戲?qū)崿F(xiàn) break; case 2://清屏選項 system("cls"); break; case 0: printf("退出程序!\n"); break; default: printf("輸入錯誤,請重新輸入!\n"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
這里我們用了Windows庫函數(shù)清屏,如果屏幕上顯示的東西太多了,我們可以選擇2來清屏,還有一個睡眠函數(shù),如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了。
效果展示圖:
制作好菜單那我們開始實現(xiàn)整個游戲的邏輯框架了,定義兩個二維數(shù)組,一個用于顯示,一個用于存放地雷。如果這兩個東西都只用一個二維數(shù)組的話后面的實現(xiàn)邏輯會比較麻煩所以我選擇使用兩個二維數(shù)組。
char mine[ROWS][COLS] = { 0 };//用于埋雷 char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示
有這兩個二維數(shù)組我們開始初始化
//初始化 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; } } }
我遍歷整個二維數(shù)組來初始化,val這個參數(shù)是用于接收這兩個二維數(shù)組的初始化的內(nèi)容,如果不用這個val參數(shù)我就要再寫一個函數(shù)封裝很麻煩。
接下來,實現(xiàn)個打印棋盤函數(shù)來看看我們的初始化是否正確的初始化成我想要的內(nèi)容
打印棋盤代碼:
//顯示棋盤 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代表埋雷的二維數(shù)組,而*
代表的是用戶看到的,正常來說,這個埋雷是不需要顯示出來的,但是我們需要確認(rè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--; } } }
埋好雷的效果:
1代表是雷,0代表步是雷,埋好的雷會被賦值成字符1
埋雷我采用隨機(jī)函數(shù)來幫我埋下雷,弄好這步接來的就是掃雷這很關(guān)鍵。
掃雷代碼:
//掃雷 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("請輸入坐標(biāo):>"); 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("請輸入有效數(shù)字!\n"); } } if (count == row * col - EASILY) { printf("恭喜你掃雷成功!\n"); Display_board(mine, ROW, COL); } }
如果玩家輸入的坐標(biāo)是合法的我們就統(tǒng)計它周圍有多少雷,統(tǒng)計雷的功能我做成了一個內(nèi)部函數(shù)防止重名。
如果全部沒有雷的地方都排查完了,我們就停止循環(huán)。然后打印下雷的棋盤讓玩家知道哪有雷,如果被炸死了,我們也打印下雷的二維數(shù)組讓玩家死得瞑目。
統(tǒng)計雷的函數(shù):
//統(tǒng)計周圍雷的個數(shù) 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'; }
根據(jù)ASCII碼字符1減去字符0就是整形1,所以根據(jù)此方法我們就只用把周圍的雷全部加起來減去字符零就可以得到周圍雷的個數(shù)并返回 。
統(tǒng)計雷效果圖:
周圍沒有雷就是0,如果有就顯示個數(shù)。
通關(guān)也會打印所有雷的位置并提示你是否通關(guān)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(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//雷的數(shù)量 //初始化 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);
游戲?qū)崿F(xiàn)代碼:
#define _CRT_SECURE_NO_WARNINGS 1 #include "Game.h" int count = 0;//統(tǒng)計還剩多少格子沒被掃 void game()//游戲?qū)崿F(xiàn) { 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--; } } } //統(tǒng)計周圍雷的個數(shù) 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("請輸入坐標(biāo):>"); 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("請輸入有效數(shù)字!\n"); } } if (count == row * col - EASILY) { printf("恭喜你掃雷成功!\n"); Display_board(mine, ROW, COL); } }
主函數(shù)代碼:
#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();//游戲?qū)崿F(xiàn) break; case 2://清屏選項 system("cls"); break; case 0: printf("退出程序!\n"); break; default: printf("輸入錯誤,請重新輸入!\n"); Sleep(1000); system("cls"); break; } } while (input); return 0; }
到此這篇關(guān)于C語言實現(xiàn)掃雷游戲詳細(xì)代碼實例的文章就介紹到這了,更多相關(guān)C語言實現(xiàn)掃雷游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 中dynamic_cast<>的使用方法小結(jié)
將一個基類對象指針(或引用)cast到繼承類指針,dynamic_cast會根據(jù)基類指針是否真正指向繼承類指針來做相應(yīng)處理2013-03-03C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法
這篇文章主要介紹了C++ STL關(guān)聯(lián)式容器自定義排序規(guī)則的2種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03