国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言】掃雷小游戲(遞歸展開版)

這篇具有很好參考價(jià)值的文章主要介紹了【C語言】掃雷小游戲(遞歸展開版)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

哈嘍,大家好,上次我們已經(jīng)學(xué)習(xí)了三子棋小游戲,今天我們來學(xué)習(xí)掃雷小游戲了。

目錄

1.游戲介紹

2.函數(shù)部分

2.1菜單

2.2game()函數(shù)

2.3mian()函數(shù)

2.4初始化棋盤

2.5打印棋盤

2.6布置雷

2.7排查雷

2.8統(tǒng)計(jì)雷

2.9遞歸,展開一片區(qū)域

3.完整代碼展示?


1.游戲介紹

想必大家都玩過掃雷這款小游戲吧?

在一個(gè)棋盤上隨機(jī)擺放數(shù)個(gè)雷,這些雷用戶無法看見,只能一個(gè)個(gè)將雷排查出來,用戶點(diǎn)擊一個(gè)格子,如果這個(gè)格子含有雷,游戲就以失敗告終,如果這個(gè)格子不是雷,就會(huì)在這個(gè)格子上顯示周圍8個(gè)格子共有多少個(gè)雷,如下圖:

c語言掃雷遞歸展開,C語言,c語言

?今天我們就用C語言來實(shí)現(xiàn)這個(gè)掃雷小游戲

2.函數(shù)部分

下面是游戲要用到的函數(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 board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//統(tǒng)計(jì)雷
int GetMineCount(char mine[ROWS][COLS], int x, int y);
//遞歸,展開一片區(qū)域
void DfsMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int row, int col);

2.1菜單

菜單非常簡(jiǎn)潔,用戶輸入1表示開始游戲,輸入0則退出小游戲

void menu()
{
	printf("********************\n");
	printf("*****  1.play  *****\n");
	printf("*****  0.exit  *****\n");
	printf("********************\n");
}

2.2game()函數(shù)

game()函數(shù)包含一個(gè)游戲的執(zhí)行過程,將一些函數(shù)組合了起來,形成游戲的完整過程。在這兒我們定義了兩個(gè)數(shù)組,mine數(shù)組表示存放的雷,show數(shù)組表示存放排查出雷的信息。

void game()
{
	char mine[ROWS][COLS];//存放的雷
	char show[ROWS][COLS];//存放盤查出雷的信息
	//初始化棋盤
	//mine數(shù)組最開始全是‘0’
	//show數(shù)組最開始全是‘*’
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	DisPlayBoard(show, ROW, COL);
	
	//布置雷
	SetMine(mine, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
}

2.3mian()函數(shù)

main函數(shù)是整個(gè)程序中必不可少的一個(gè)部分。

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("請(qǐng)選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			system("cls");
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯(cuò)誤,重新選擇\n");
			break;
		}
	} while (input);
}

2.4初始化棋盤

初始化棋盤將兩個(gè)數(shù)組初始化。mine數(shù)組全部初始化為‘0’,表示最開始還沒有存放雷。show數(shù)組最開始初始化為‘*’。

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

2.5打印棋盤

打印棋盤這個(gè)步驟很簡(jiǎn)單,但為了方便玩家,我們順便把棋盤的行號(hào)和列號(hào)也打印出來。如下圖:

c語言掃雷遞歸展開,C語言,c語言

void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("--------掃雷--------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

2.6布置雷

布置雷就是讓電腦隨機(jī)生成10個(gè)不重復(fù)的坐標(biāo),這些坐標(biāo)就是雷的位置

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置十個(gè)雷
	//隨機(jī)生成坐標(biāo)
	int count = ESAY_COUNT;
	while(count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

2.7排查雷

用戶輸入要排查的雷的坐標(biāo),如果該坐標(biāo)是雷,就輸出"很遺憾,你被炸死了“,否則統(tǒng)計(jì)這個(gè)位置周圍的八個(gè)位置雷的數(shù)量,存到show數(shù)組對(duì)應(yīng)坐標(biāo)位置里。同時(shí)這里擴(kuò)展了一個(gè)遞歸展開,可以展開一片非雷區(qū)域。

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int win = 0;
	while (win < row * col - ESAY_COUNT)
	{
		system("cls");
		DisPlayBoard(show, ROW, COL);
		printf("請(qǐng)輸入要排查雷的坐標(biāo):>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遺憾,你被炸死了\n");
				break;
			}
			else
			{
				//該位置不是雷,就統(tǒng)計(jì)這個(gè)坐標(biāo)周圍有幾個(gè)雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				if (count == 0)
				{
					//遞歸,展開一片區(qū)域
					DfsMine(mine, show, x, y, ROW, COL);
				}
				show[x][y] = count + '0';
				DisPlayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐標(biāo)非法,重新輸入\n");
		}
	}
	if (win == row * col - ESAY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
	DisPlayBoard(mine, ROW, COL);
}

2.8統(tǒng)計(jì)雷

這個(gè)函數(shù)只要返回坐標(biāo)(x,y)周圍雷的數(shù)量即可。

c語言掃雷遞歸展開,C語言,c語言

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return (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] + mine[x - 1][y] - 8 * '0');
}

2.9遞歸,展開一片區(qū)域

這塊可以說是一個(gè)擴(kuò)展的內(nèi)容了,當(dāng)我們點(diǎn)到一個(gè)周圍沒有地雷的格子,這些區(qū)域就會(huì)自動(dòng)展開。

c語言掃雷遞歸展開,C語言,c語言

?這里需要用到函數(shù)遞歸來實(shí)現(xiàn),可以將其看作是一個(gè)深度優(yōu)先搜索

void DfsMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int row, int col)
{
	int count= GetMineCount(mine, x, y);
	show[x][y] = count + '0';
	if (count != 0)
	{
		return;
	}
	int xx[] = { 1,1, 1 ,-1,-1,-1,0, 0 };
	int yy[] = { 1,0,-1, 0, 1, -1 ,1,-1};
	int i = 0;
	for (i = 0; i < 8; i++)
	{
		int dx = x + xx[i];
		int dy = y + yy[i];
		if (dx >= 1 && dx <= row && dy >= 1 && dy <= col && mine[dx][dy]=='0' && show[dx][dy] == '*')
		{
			DfsMine(mine, show, dx, dy, ROW, COL);
		}
	}
}

3.完整代碼展示?

game.h文件

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>


#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define ESAY_COUNT 10 //布置雷的個(gè)數(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 board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//統(tǒng)計(jì)雷
int GetMineCount(char mine[ROWS][COLS], int x, int y);
//遞歸,展開一片區(qū)域
void DfsMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int row, int col);

game.c文件

#include"game.h"

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

//打印棋盤
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("--------掃雷--------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}


//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置十個(gè)雷
	//隨機(jī)生成坐標(biāo)
	int count = ESAY_COUNT;
	while(count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int win = 0;
	while (win < row * col - ESAY_COUNT)
	{
		system("cls");
		DisPlayBoard(show, ROW, COL);
		printf("請(qǐng)輸入要排查雷的坐標(biāo):>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遺憾,你被炸死了\n");
				break;
			}
			else
			{
				//該位置不是雷,就統(tǒng)計(jì)這個(gè)坐標(biāo)周圍有幾個(gè)雷
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				if (count == 0)
				{
					//遞歸,展開一片區(qū)域
					DfsMine(mine, show, x, y, ROW, COL);
				}
				show[x][y] = count + '0';
				DisPlayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐標(biāo)非法,重新輸入\n");
		}
	}
	if (win == row * col - ESAY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
	DisPlayBoard(mine, ROW, COL);
}

//遞歸,展開一片區(qū)域
void DfsMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int row, int col)
{
	int count= GetMineCount(mine, x, y);
	show[x][y] = count + '0';
	if (count != 0)
	{
		return;
	}
	int xx[] = { 1,1, 1 ,-1,-1,-1,0, 0 };
	int yy[] = { 1,0,-1, 0, 1, -1 ,1,-1};
	int i = 0;
	for (i = 0; i < 8; i++)
	{
		int dx = x + xx[i];
		int dy = y + yy[i];
		if (dx >= 1 && dx <= row && dy >= 1 && dy <= col && mine[dx][dy]=='0' && show[dx][dy] == '*')
		{
			DfsMine(mine, show, dx, dy, ROW, COL);
		}
	}
}

//統(tǒng)計(jì)雷
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return (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] + mine[x - 1][y] - 8 * '0');
}

test.c文件

#include"game.h"

void menu()
{
	printf("********************\n");
	printf("*****  1.play  *****\n");
	printf("*****  2.exit  *****\n");
	printf("********************\n");
}

void game()
{
	char mine[ROWS][COLS];//存放的雷
	char show[ROWS][COLS];//存放盤查出雷的信息
	//初始化棋盤
	//mine數(shù)組最開始全是‘0’
	//show數(shù)組最開始全是‘*’
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	DisPlayBoard(show, ROW, COL);
	
	//布置雷
	SetMine(mine, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("請(qǐng)選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			system("cls");
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯(cuò)誤,重新選擇\n");
			break;
		}
	} while (input);
	
}

游戲效果展示:(為了方便截圖,已注釋了清屏的代碼)

c語言掃雷遞歸展開,C語言,c語言

?哈哈哈,這次游戲疏忽大意導(dǎo)致游戲失敗了~

總結(jié):今天我們學(xué)習(xí)了掃雷小游戲,再次使用多文件編程的形式,同時(shí)也體驗(yàn)了玩自己所寫的游戲,如果我寫的有什么的不好之處,請(qǐng)?jiān)谖恼孪路浇o出你寶貴的意見。如果覺得我寫的好的話請(qǐng)點(diǎn)個(gè)贊贊和關(guān)注哦~??文章來源地址http://www.zghlxwxcb.cn/news/detail-533429.html

到了這里,關(guān)于【C語言】掃雷小游戲(遞歸展開版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 掃雷小游戲【C語言】

    掃雷小游戲【C語言】

    目錄 前言 一、基本實(shí)現(xiàn)邏輯 二、實(shí)現(xiàn)步驟 1. 我們希望在進(jìn)入游戲時(shí)有一個(gè)菜單讓我們選擇 2. 我們希望可以重復(fù)的玩(一把玩完了還可以接著玩) 3. 采用多文件形式編程 ?4.要掃雷先得有棋盤(創(chuàng)建棋盤R*N) 5.初始化棋盤? 6.打印棋盤 7.設(shè)置雷 8.排查雷 三、全部源碼: 上期

    2024年02月11日
    瀏覽(88)
  • C語言:掃雷小游戲

    C語言:掃雷小游戲

    文接上一篇博文C語言:三子棋小游戲。本篇博文是使用C語言來實(shí)現(xiàn)掃雷小游戲的。這里不對(duì)掃雷的規(guī)則進(jìn)行贅述。玩家通過鍵盤輸入坐標(biāo)來探雷。博主在實(shí)現(xiàn)掃雷之前從未看過掃雷實(shí)現(xiàn)的相關(guān)視頻,所以這里實(shí)現(xiàn)的掃雷完全是博主的原生思路,具有邏輯性。下面詳細(xì)介紹一

    2024年02月09日
    瀏覽(91)
  • C語言小游戲——掃雷

    C語言小游戲——掃雷

    ????????結(jié)合前邊我們所學(xué)的C語言知識(shí),本期我們將使用C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的小游戲——掃雷 目錄 前言 總體框架設(shè)計(jì) 多文件分裝程序 各功能模塊化實(shí)現(xiàn) 初始化棋盤 ?棋盤打印 埋雷 ?判贏與排雷 游戲邏輯安排 總結(jié) ????????和三子棋相同,游戲開始時(shí)不需要任何判

    2024年02月06日
    瀏覽(92)
  • c語言小游戲之掃雷

    c語言小游戲之掃雷

    目錄 一:游戲設(shè)計(jì)理念及思路 二:初步規(guī)劃的游戲界面 三:開始掃雷游戲的實(shí)現(xiàn) 注:1.創(chuàng)建三個(gè)文件,test.c用來測(cè)試整個(gè)游戲的運(yùn)行,game.c用來實(shí)現(xiàn)掃雷游戲的主體,game.h用來函數(shù)聲明和包含頭文件 2.為方便定位坐標(biāo),在展示數(shù)組時(shí)添加行號(hào)和列號(hào) 四:謝謝觀看? 聽說看到

    2024年01月23日
    瀏覽(113)
  • C語言:輕松實(shí)現(xiàn)掃雷小游戲

    C語言:輕松實(shí)現(xiàn)掃雷小游戲

    目錄 一、前言 二、掃雷步驟 1.創(chuàng)建項(xiàng)目 2.設(shè)計(jì)整體框架 1.定義數(shù)組長(zhǎng)度和雷的個(gè)數(shù) 2.game函數(shù)功能 三、頭文件game.h代碼實(shí)現(xiàn)? 四、測(cè)試文件test.c代碼實(shí)現(xiàn) 五、game函數(shù)功能實(shí)現(xiàn) 1.初始化棋盤 2.打印棋盤 ?3.布置雷 4. 獲得雷的個(gè)數(shù) ?5.排查雷 6.game函數(shù)實(shí)現(xiàn)代碼 六、總結(jié) 大家好

    2024年02月03日
    瀏覽(90)
  • C語言小項(xiàng)目 -- 掃雷游戲完整代碼(遞歸展開 + 選擇標(biāo)記)

    C語言小項(xiàng)目 -- 掃雷游戲完整代碼(遞歸展開 + 選擇標(biāo)記)

    大家好,今天我們將一起用C語言實(shí)現(xiàn)一個(gè)經(jīng)典小游戲 – 掃雷,Let is go ! 掃雷游戲相信大家都玩過,上圖就是一個(gè)網(wǎng)頁版的掃雷,它的規(guī)則是玩家選擇一個(gè)方格,若此方格沒有地雷,那么該方格會(huì)顯示與它相鄰的八個(gè)方格中雷的個(gè)數(shù),若此方格有地雷,那么游戲失敗,當(dāng)玩

    2024年02月05日
    瀏覽(22)
  • 【C】C語言實(shí)現(xiàn)掃雷小游戲

    相信大家一定都玩過掃雷小游戲,今天我就帶大家來用C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的掃雷小游戲。 這里我們還是需要三個(gè)文件來封裝我們的寫的代碼: test.c ----- 用于我們代碼的測(cè)試,以及游戲整體框架的實(shí)現(xiàn)。 game .c ------ 用來封裝實(shí)現(xiàn)我們游戲的相關(guān)函數(shù)。 game.h ------ 主要用來

    2024年02月11日
    瀏覽(646)
  • 【C語言實(shí)現(xiàn)掃雷小游戲——可展開一片】

    【C語言實(shí)現(xiàn)掃雷小游戲——可展開一片】

    學(xué)習(xí)完了函數(shù)和數(shù)組,讓我們做個(gè)掃雷小游戲鞏固一下所學(xué)的知識(shí)把! 使用控制臺(tái)操作 通過菜單實(shí)現(xiàn)選擇 棋盤為9×9 默認(rèn)隨機(jī)布置10個(gè)雷 排查雷 如果排查的位置不是雷,就顯示周圍有幾個(gè)雷 排查位置是雷,游戲結(jié)束,玩家失敗 把10個(gè)雷全部排除,游戲結(jié)束,玩家成功 掃雷

    2024年02月08日
    瀏覽(91)
  • C語言經(jīng)典小游戲之掃雷(超詳解釋+源碼)

    C語言經(jīng)典小游戲之掃雷(超詳解釋+源碼)

    “少年氣,是歷盡千帆舉重若輕的沉淀,也是樂觀淡然笑對(duì)生活的豁達(dá)!” 今天我們學(xué)習(xí)一下掃雷游戲怎么用C語言來實(shí)現(xiàn)! 一個(gè)掃雷盤面由許多方格(cell)組成,方格中隨機(jī)分布著一定數(shù)量的雷(mine),一個(gè)格子中至多只有1雷。勝利條件是打開所有安全格(非雷格,saf

    2024年02月12日
    瀏覽(96)
  • 帶你實(shí)現(xiàn)初階掃雷小游戲—【C語言】

    帶你實(shí)現(xiàn)初階掃雷小游戲—【C語言】

    ? 目錄 1. 掃雷游戲?qū)崿F(xiàn)的思路 注意點(diǎn)1? 注意點(diǎn)2? 2. 函數(shù)實(shí)現(xiàn)掃雷功能 2.1 初始化棋盤 2.2 顯示棋盤 2.3 設(shè)置雷 2.4 排查雷 2.5 返回附近雷的個(gè)數(shù) 3.源碼 3.1 game.h 3.2 game.c? 3.3 test.c 我們這里拿9*9的棋盤(其中包含10個(gè)雷)來實(shí)現(xiàn)(這里也可以自定義棋盤大小和雷的個(gè)數(shù) 》我們這

    2024年02月05日
    瀏覽(104)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包