C語言實現(xiàn)簡易的掃雷游戲
本文實例為大家分享了C語言實現(xiàn)簡易的掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下

在正式講內(nèi)容之前先說一說掃雷游戲的規(guī)則
游戲規(guī)則很簡單,點(diǎn)擊方格,如果是地雷,游戲失敗,找到所有地雷游戲勝利

.剛開始需要碰運(yùn)氣,只要點(diǎn)開一個區(qū)域,就可以正式開始了。

3.根據(jù)現(xiàn)有情況,判斷出一定有雷的位置。

4.進(jìn)一步計算,因為“2”右邊的“1”已經(jīng)有從屬的雷了,所以右邊的“2”的正下方?jīng)]有雷,因此可以判斷出左邊有兩顆雷,滿足兩個“2”。

5.紅圈表明的“1”已經(jīng)有一顆確定的雷了,這時只需要把鼠標(biāo)放在“1”上,按住右鍵不放,再點(diǎn)一下左鍵,“1”周圍的其他方塊就全被點(diǎn)開了。這個小技巧對于提升速度非常有幫助。

6.左上角的“1”旁邊必須有一顆雷,可能在紅圈圈住的兩個塊中,目前還無法確定。但是不論在兩個中的哪一個,都從屬于“3”,因此“3”周圍已經(jīng)有了三顆雷,“3”左下角的方塊可以確定沒有雷。

7.紅圈框住的位置肯定有一顆雷,因為“3”周圍必須有三顆雷。不論在兩個中的哪一個,都從屬于“3旁邊的“2”,這樣“2”就滿足兩顆雷的條件了。因此“2”左下角的塊是沒有雷的。

8.這樣一來,“3”下面的兩個塊可以確定都是有雷的。

9.把這些有雷的地方標(biāo)出來,就打開了一片新天地。

10.再根據(jù)現(xiàn)有的條件把確定有雷的地方表明,點(diǎn)開其他的地方。這時我們發(fā)現(xiàn)剛才左上角遺留的問題解決了。

11.重復(fù)上面的各種方法,不斷推理出,最后就能完成掃雷

好了,規(guī)則已經(jīng)講完了,現(xiàn)在來說一說怎么實現(xiàn)的吧:
首先還是得創(chuàng)建三個文件夾,分別為game.c 游戲需要的具體函數(shù)的實現(xiàn) game.h (所要用的頭文件)test.c(游戲的邏輯,菜單,以及函數(shù)順序調(diào)用)。
首先看一下test.c:
游戲大概的邏輯就是布置雷,把棋盤打印出來,然后玩家自己掃雷,這部分代碼不是很難理解
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
char mine[ROWS][COLS] = { 0 };//存放布置雷的信息 0無雷 1有雷
char show[ROWS][COLS] = { 0 };//展示給用戶看并且存放排查出的雷的信息
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//布置雷
SetMine(mine, ROW, COL);
//打印棋盤
//DisplayBoard(mine, ROW, COL);
DisplayBoard(show, ROW, COL);
//排雷
FindMine(mine,show, ROW, COL);
}
//游戲菜單界面
void menu()
{
printf("************\n");
printf("***1.開始***\n");
printf("***0.退出***\n");
printf("************\n");
}
//選擇玩或不玩
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇->;");
scanf_s("%d", &input);
switch (input)
{
case 1:
//掃雷
game();
break;
case 0:
printf("%d\n",input);
printf("即將退出游戲\n");
break;
default:
printf("輸入錯誤,請重新輸入:\n");
break;
}
} while (input);
}
int main(void)
{
test();
return 0;
}
接下來是game.h:
我將所使用到的函數(shù)和代碼段都寫入了代碼里應(yīng)該不難理解
#pragma once #include<stdio.h> #include<time.h> #include<Windows.h> #define ROW 9//打印出來的棋盤大小 #define COL 9//打印出來的棋盤大小 #define ROWS ROW+2//實際棋盤大小,為了防止越界 #define COLS COL+2//實際棋盤大小,為了防止越界 #define EASY_COUNT 10//簡單模式10個雷然后根據(jù)自己的需要調(diào)整大小 //初始化棋盤 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); //打印棋盤 void DisplayBoard(char mine[ROWS][COLS], int row, int col); //布置雷 void SetMine(char mine[ROWS][COLS], int row, int col); //找雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
接下來是game.c:
掃雷游戲有一個功能是,點(diǎn)開一個位置,如果周圍都沒有雷的話就會展開那一片,我們這里用遞歸來實現(xiàn):
//將棋盤展開的函數(shù)
void Open(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
{
int n = get_mine_count(mine, x, y);
if (n != 0)
{
show[x][y] = '0' + n;
}
else if (show[x][y] != ' ')
{
show[x][y] = ' ';
int i = 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <= y + 1; j++)
{
Open(mine, show, i, j);
}
}
}
else
{
return;
}
}
完整代碼:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盤:全部為'*'
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
// 顯示應(yīng)該給用戶顯示的界面‘*'
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
printf("%d|", i);
}
printf("\n");
for (i = 0; i < 10; i++)
{
printf("-|");
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d|", i );
for (j = 1; j <= col; j++)
{
printf("%c|", board[i][j]);
}
printf("\n");
for (j = 0; j <col+1; j++)
{
printf("-|");
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
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--;
}
}
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return mine[x + 1][y] +
mine[x - 1][y] +
mine[x][y + 1] +
mine[x][y - 1] +
mine[x - 1][y - 1] +
mine[x - 1][y + 1] +
mine[x + 1][y - 1] +
mine[x + 1][y + 1] -
8 * '0';
}
//將棋盤展開的函數(shù)
void Open(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
{
int n = get_mine_count(mine, x, y);
if (n != 0)
{
show[x][y] = '0' + n;
}
else if (show[x][y] != ' ')
{
show[x][y] = ' ';
int i = 0;
for (i = x - 1; i <= x + 1; i++)
{
int j = 0;
for (j = y - 1; j <= y + 1; j++)
{
Open(mine, show, i, j);
}
}
}
else
{
return;
}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("請輸入你要查詢的坐標(biāo)->");
scanf("%d%d", &x, &y);
Sleep(500);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if ('1' == mine[x][y])
{
printf("很遺憾,你無了\n");
Sleep(500);
DisplayBoard(mine, row, col);
break;
}
else
{
//計算坐標(biāo)x,y周圍有幾個雷
Open(mine,show,x,y);
DisplayBoard(show, row, col);
}
}
else
{
printf("輸入坐標(biāo)非法,無法排雷,請重新輸入\n");
}
int i = 0;
int j = 1;
int flag = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (show[i][j] == '*')
{
flag++;
}
}
}
if (flag == EASY_COUNT)//棋盤全部展開后掃描玩家找的雷的個數(shù)是否復(fù)合實際雷的個數(shù)
{
printf("恭喜你,你贏了!\n");
DisplayBoard(mine, row, col);
break;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Qt/C++實現(xiàn)WGS84,高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化
這篇文章主要為大家詳細(xì)介紹了如何使用Qt實現(xiàn)WGS84、高德GCJ-02與百度BD-09坐標(biāo)系間相互轉(zhuǎn)化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
關(guān)于C語言 const 和 define 區(qū)別
這篇文章主要介紹了關(guān)于C語言 const 和 define 區(qū)別 的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容2021-09-09

