C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例
掃雷游戲
思路:先制作一個菜單讓玩家選擇是玩游戲還是退出游戲,菜單做好了,接著我們開始制作掃雷的棋盤并初始化,初始化弄完了我們下一步開始埋雷,雷埋好了就開始掃雷。
大概思路就是這樣具體實(shí)現(xiàn)看下面:
菜單的實(shí)現(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://清屏選項(xiàng)
system("cls");
break;
case 0:
printf("退出程序!\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
Sleep(1000);
system("cls");
break;
}
} while (input);
return 0;
}
這里我們用了Windows庫函數(shù)清屏,如果屏幕上顯示的東西太多了,我們可以選擇2來清屏,還有一個睡眠函數(shù),如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了。
效果展示圖:

制作好菜單那我們開始實(shí)現(xiàn)整個游戲的邏輯框架了,定義兩個二維數(shù)組,一個用于顯示,一個用于存放地雷。如果這兩個東西都只用一個二維數(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ù)封裝很麻煩。
接下來,實(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://清屏選項(xiàng)
system("cls");
break;
case 0:
printf("退出程序!\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
Sleep(1000);
system("cls");
break;
}
} while (input);
return 0;
}
到此這篇關(guān)于C語言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例的文章就介紹到這了,更多相關(guān)C語言實(shí)現(xiàn)掃雷游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)
C++入門基礎(chǔ)篇的內(nèi)容為C++的基本特性,只有在掌握C++的基本特性后,是進(jìn)入后面類和對象學(xué)習(xí)的基礎(chǔ),下面這篇文章主要給大家介紹了關(guān)于C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)的相關(guān)資料,需要的朋友可以參考下2023-01-01
C語言深入探究sizeof與整型數(shù)據(jù)存儲及數(shù)據(jù)類型取值范圍
在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細(xì)講解一下關(guān)鍵字sizeof、整型數(shù)據(jù)存儲深入、數(shù)據(jù)類型取值范圍深入2022-07-07
C語言實(shí)現(xiàn)去除字符串中空格的簡單實(shí)例
下面小編就為大家?guī)硪黄狢語言實(shí)現(xiàn)去除字符串中空格的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
C++11?nullptr實(shí)現(xiàn)初始化空指針
避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下2022-01-01

