国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[ C語言 ] 掃雷 ------> 用C語言實現(xiàn)game2

I_Am / 3613人閱讀

摘要:函數(shù)游戲菜單請選擇掃雷游戲退出游戲選擇錯誤解析函數(shù)內(nèi)部利用時間戳,形成隨機數(shù),主要目的是實現(xiàn)游戲中地雷的隨機埋放。


前言

本篇文章使用C語言實現(xiàn)簡單小游戲---掃雷。(文章最后有完整代碼鏈接

想必大多數(shù)人都玩過或者了解過掃雷的游戲規(guī)則,但是在這里,我們在一起重溫一下掃雷的游戲規(guī)則,也更好的讓我們了解程序的實現(xiàn)目的。

掃雷:掃雷就是要把所有非地雷的格子揭開即勝利;踩到地雷格子就算失敗。游戲主區(qū)域由很多個方格組成。使用鼠標(biāo)左鍵隨機點擊一個方格,方格即被打開并顯示出方格中的數(shù)字;方格中數(shù)字則表示其周圍的8個方格隱藏了幾顆雷。

在了解游戲規(guī)則后,我們就用C語言來實現(xiàn)這個簡單小游戲。

這是我們解決資源管理器內(nèi)所創(chuàng)建的文件,下來我們就進入代碼內(nèi)部。


一,游戲使用到的頭文件和游戲聲明

1.頭文件的包含

#include #include #include 

2.符號的聲明

#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10

3.函數(shù)的聲明

初始化棋盤

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 mine[ROWS][COLS], int row, int col);

排查雷

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col);

二,游戲測試

1. 主函數(shù)

和三子棋一樣,主函數(shù)仍然簡單,函數(shù)內(nèi)部調(diào)用test()測試函數(shù)。

int main(){?? ?test();?? ?return 0;}

2.test()函數(shù)

void test(){	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);}

解析test()函數(shù)內(nèi)部:

A.?srand((unsigned int )time(NULL))??

利用時間戳,形成隨機數(shù),主要目的是實現(xiàn)游戲中地雷的隨機埋放。

B.menu() 游戲菜單

void menu()// 游戲菜單{	printf("********************/n");	printf("****  1. play  *****/n");	printf("****  0. exit  *****/n");	printf("********************/n");}

創(chuàng)建菜單,實現(xiàn)效果演示:

?C:switch case 選擇語句:

使用此語句實現(xiàn)玩家的自主選擇,當(dāng)輸入1時進行掃雷游戲,當(dāng)輸入0時,退出游戲。顯示效果如下:

? ? ?

3.game()函數(shù)

game()函數(shù)是主要游戲?qū)崿F(xiàn)函數(shù),以下是game函數(shù)主要是實現(xiàn)邏輯圖和實現(xiàn)順序

?這里先讓大家看一下完整代碼,實現(xiàn)順序如上所示:

下面主要進入我們的游戲?qū)崿F(xiàn)邏輯當(dāng)中......劃重點

三,游戲?qū)崿F(xiàn)

1.創(chuàng)建棋盤

// 創(chuàng)建數(shù)組	// 創(chuàng)建雷的數(shù)組(mine)   顯示的數(shù)組(show)    兩個數(shù)組一樣規(guī)模 一樣類型	char mine[ROWS][COLS] = { 0 }; // 存放布置好的雷的信息	char show[ROWS][COLS] = { 0 }; // 存放排查出的雷的信息

在這里我們需要創(chuàng)建2個相同大小,相同類型的二維數(shù)組。

問:我們?yōu)槭裁匆獎?chuàng)建2個相同的數(shù)組呢?
答:是因為我們在玩掃雷的時候我們首先看到的是一個未知得棋盤,不知道哪里埋放著雷,如果我們觸碰到雷結(jié)束游戲后,我們需要給玩家呈現(xiàn)這局游戲所有點位的情況,這樣以便于玩家清楚所有雷都在那里,為什么死,因此我們需要兩個棋盤才能完成這項任務(wù)。

在這里我們創(chuàng)建了11X11大小的棋盤,但是只顯示9X9大小的棋盤也就是81個格子,打算埋放10顆雷,玩家可以在頭文件自行更改雷的個數(shù)。

問:我們顯示9X9大小的棋盤,為什么創(chuàng)建11X11大小的棋盤?

答:這是因為掃雷游戲規(guī)則中,我們在排雷的過程中,會顯示周圍8個格子的雷的個數(shù),如果創(chuàng)建一個9X9的格子,那當(dāng)我們在邊角的時候,我們周圍的格子不夠8個,但是我們還要訪問周圍8個格子,這時候我們必然會造成數(shù)組越界問題,具體情況如下圖所示,這時候我們?nèi)绻麆?chuàng)建11X11的棋盤,對11X11的棋盤都初始化為字符" 0 ", 我們只顯示內(nèi)部的9X9的格子,我們依然不會影響游戲,并且也解決了數(shù)組越界的問題。

如圖所示,我們假設(shè)要查找坐標(biāo)為(9,9)格子周圍8個格子的雷的個數(shù),如果我們還只是9X9的格子,我們圖中的紅色陰影區(qū)域就處于數(shù)組的范圍之外,因為我們需要創(chuàng)建11X11的棋盤,就可以輕松化解這個問題。

2.初始化棋盤

    // 初始化mine數(shù)組為全"0"	InitBoard(mine,ROWS,COLS,"0");//初始化--->棋盤函數(shù)	// 初始化show數(shù)組為全"*"	InitBoard(show,ROWS,COLS,"*");//初始化--->棋盤函數(shù)

和三子棋一樣,我們依然自定義函數(shù)InitBoard(),具體代碼如下:

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){	int i = 0, j = 0;	for (i = 0; i < rows; i++)	{		for (j = 0; j < cols; j++)		{			board[i][j] = set;		}	}}

在這里我們對第一塊mine棋盤全部初始化為字符 " 0 "?(注意這里是字符0,不是數(shù)字0),我們對第二塊show棋盤全部初始化為字符" * " ,最終玩家首先會看到一幅全是字符" * "的棋盤,這樣也符合游戲規(guī)則。

3.打印棋盤

自定義函數(shù)DisplayBoard(),具體代碼如下:

void DisplayBoard(char board[ROWS][COLS], int row, int col){	int i = 0, j = 0;	//列號的打印	for (i = 0; i <= col; i++)	{		printf("%d ", i);	}	printf("/n");	for (i = 1; i <= row; i++)	{		printf("%d ", i);//打印行號		for (j = 1; j <= col; j++)		{			printf("%c ", board[i][j]);		}		printf("/n");	}}

這樣通過調(diào)用DisplayBoard()函數(shù)我們可以檢查一下,我們剛才所創(chuàng)建和初始化的棋盤是否符合我們的要求,我們打印棋盤演示如下:

?我們發(fā)現(xiàn),打印出來的棋盤也完全符合我們的要求,我們也只需要最終將show棋盤顯示給玩家即可。

4.布置雷

在這里我們自定義函數(shù)SetMine()函數(shù),具體代碼如下:

// 布置雷void SetMine(char mine[ROWS][COLS], int row, int col){	int count = EASY_COUNT;	while (count) 	{		int x = rand() % row + 1;		int y = rand() % col + 1;		if (mine[x][y] == "0")		{			mine[x][y] = "1";			count--;		}	}}

我們對此代碼進行分析:

A:如何實現(xiàn)隨機布雷?

答:我們創(chuàng)建rand函數(shù),利用時間戳生成隨機數(shù),因為我們所創(chuàng)建的棋盤大小是9X9大小,我們我們只需要給生成的隨機數(shù)模上row(col)即可得到0~row-1 ,因此我們再 +1?即可得到一個在0~row(col)的隨機數(shù),從而實現(xiàn)隨機布雷。

我們設(shè)定count個雷,如果我們埋下一顆雷,我們就count-1,同時我們將初始化的字符" 0 " 變成字符" 1 " , 只有我們識別到目標(biāo)格子是字符 " 0 " 時才會埋雷,這也解決了在同一位置重復(fù)埋雷的問題。?

假設(shè)我們隨機埋下10顆雷,演示一下棋盤:

?我們發(fā)現(xiàn),我們隨機埋下了10顆雷,并且也改成了字符" 1 "

5.排雷

自定義函數(shù)FindMine(),具體代碼如下所示:

// 排查雷void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){	int x = 0, y = 0;	int win = 0;	while (win");		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			{				//計算x,y坐標(biāo)周圍有幾個雷				int n = get_mine_count(mine,x,y);				show[x][y] = n+"0"; // 數(shù)字+"0"可以轉(zhuǎn)換成對應(yīng)的ASCII				DisplayBoard(show, row, col);				win++;			}		}		else		{			printf("輸入坐標(biāo)非法,無法排雷,請重新輸入/n");		}	}	if (win == row * col - EASY_COUNT)	{		printf("恭喜你,排雷成功/n");		DisplayBoard(mine, row,col);	}}

其中調(diào)用了get_mine_count函數(shù),其代碼如下:

static int get_mine_count(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";}

接下來對這兩段代碼進行分析:

當(dāng)我們輸入需要排查的坐標(biāo)的時候,我們所輸入的坐標(biāo)也必須合法,必須在1~row(col)之間的數(shù)字,如果在此之外,我們將會提醒玩家“輸入坐標(biāo)非法,無法排雷,請重新輸入”字樣。

當(dāng)我們輸入正確的坐標(biāo)時候,我們需要對這個坐標(biāo)下所對應(yīng)的字符進行判斷,如果是字符" 1 " ,說明踩中雷,說明游戲結(jié)束,這時候我們將完整棋盤打印出來,玩家也可以了解本局游戲的情況。

如果是字符 " 0 " ,說明玩家沒有踩中雷,根據(jù)游戲規(guī),我們需要顯示這個格子周圍8個格子中存在雷的個數(shù),這時候我們調(diào)用了get_mine_count函數(shù),我們先看一下統(tǒng)計周圍雷的個數(shù)的代碼:

	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";

我們發(fā)現(xiàn),此代碼將周圍8個格子的字符全部加了起來,我們知道如果是字符 " 0 " 和字符 " 1 "所對應(yīng)的ASCII碼值相差1,我們可以通過ASCII碼值來進行判斷,我們將周圍8個字符相加,然后再減去8個字符" 0 " 的和,這樣,我們就可以得到周圍8個格子中有多少個字符 " 1 " 的格子,也就是雷的個數(shù)。

為了方便大家理解,我們假定有10個雷,我們將Mine棋盤和show棋盤都顯示,我們根據(jù)棋盤制定輸入,看是否可以得到我們想要的結(jié)果:

如果我們排除萬難,最終將81個格子排完,我們將會獲得勝利,具體判斷代碼如下:

if (win == row * col - EASY_COUNT)	{		printf("恭喜你,排雷成功/n");		DisplayBoard(mine, row,col);	}

我們這里假定有80個雷,我們顯示一下:

?至此,我們掃雷小游戲也寫完了,完整代碼我也放在我的Gitee倉庫,鏈接如下:

C語言: C語言代碼學(xué)習(xí)-練習(xí) - Gitee.com

其中這3個對應(yīng)資源管理器3個文件



總結(jié)

本節(jié)內(nèi)容主要用C語言實現(xiàn)了小游戲---> 掃雷,大家可以拷貝到編譯器里面玩一玩,如果大家覺得還不錯有收獲的話,點贊收藏走一波唄~?

由于我的個人技術(shù)水平有限,各位大佬發(fā)現(xiàn)錯誤及時指出哦~

這里是 用C語言實現(xiàn)《三子棋?》 小游戲的鏈接,大家有興趣也可以看看哦:

[ C語言 ] 用C語言實現(xiàn)小游戲 ---- 三子棋 代碼 + 解析_小白又菜的博客-CSDN博客

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123367.html

相關(guān)文章

  • 掃雷1.0(遞歸實現(xiàn)

    摘要:頭文件部分進行符號常量的聲明,宏定義等源文件和用時需要引用。包括布置雷區(qū),埋雷,掃雷,判斷輸贏等。游戲規(guī)則掃雷就是要把所有非地雷的格子揭開即勝利踩到地雷格子就算失敗。一次就可以完成兩次函數(shù)調(diào)用的實現(xiàn)。這是因為防止在掃雷的時候數(shù)組越界。 ...

    CoderDock 評論0 收藏0
  • C語言實現(xiàn)入門級小游戲——掃雷

    摘要:上一期咱們用語言實現(xiàn)了三子棋的小游戲語言實現(xiàn)三子棋今天我們再來寫個掃雷的游戲,說起掃雷,相信大家都不陌生,可能許多朋友還是玩掃雷的高手。 ? ? ?上一期咱們用C語言實現(xiàn)了三子棋的小游戲? C語言實現(xiàn)三子棋? ? ? ?今天我們再來寫個掃雷的游戲,說起掃雷,相信大家都不陌生,可能許多朋友還是...

    nevermind 評論0 收藏0
  • C語言初階學(xué)習(xí)——掃雷小游戲(遞歸)

    摘要:目錄前言前言前期的準(zhǔn)備前期的準(zhǔn)備游戲代碼的具體實現(xiàn)游戲代碼的具體實現(xiàn)完整版的掃雷小游戲代碼完整版的掃雷小游戲代碼總結(jié)總結(jié)前言掃雷是一款大眾類的益智小游戲,于年發(fā)行。 目錄 前言 前期的準(zhǔn)備 游戲代碼的具體實現(xiàn) 1、text.c 2、game.h 3、game.c 完整版的掃雷小游戲代碼: 1...

    zhonghanwen 評論0 收藏0
  • 掃雷C語言版)

    摘要:展示雷盤和初始化雷盤不一樣,展示雷盤只需要用即可,并不需要將都展示出來,只是為了我們更好的計算掃雷的位置周圍的雷的數(shù)量。 目錄 1、需求分析 2、程序架構(gòu) 3、代碼實現(xiàn)(分函數(shù)呈現(xiàn)) (1)主函數(shù)代碼實現(xiàn) 分析: 異常處理: (2)游戲主函數(shù)實現(xiàn) 分析: (3)初始化函數(shù)的實現(xiàn) 分析: (4...

    EscapedDog 評論0 收藏0
  • 掃雷連爆(望大佬也可以幫忙優(yōu)化或提出意見)(C語言版)------上

    摘要:新人小白的第一篇博客,有什么不好之處望多提意見。這個掃雷小游戲主要是基于二維數(shù)組,循環(huán)與基本的函數(shù)知識等。請輸入坐標(biāo)提示玩家輸入坐標(biāo)。換行是為了看著好看,要不然打印出來的數(shù)組會變形的。用來接收判斷輸贏的函數(shù)的返回值。 ???????新人小白的第一篇博客,有什么不好之處望多提意見。 ? ? ?...

    incredible 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<