最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳細(xì)講解通過遞歸實(shí)現(xiàn)掃雷的展開

 更新時(shí)間:2022年05月19日 11:22:31   作者:頭發(fā)沒有代碼多  
windows自帶的游戲《掃雷》是陪伴了無數(shù)人的經(jīng)典游戲,本文將利用C語言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下

用戶選擇菜單

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

用戶按1進(jìn)入游戲

棋盤初始化

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

創(chuàng)建數(shù)組,并對(duì)其進(jìn)行初始化

布置雷(隨機(jī)布置)

void Setboard(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--;
		}
	}
}

用time函數(shù)產(chǎn)生隨機(jī)值

打印棋盤

void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int i, j;
	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");
	}
}

打印棋盤

玩家下棋

void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int count = 0;
	while (1)
	{
		printf("請(qǐng)排雷:\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			if (board[x][y] == '0')
			{
				Openboard(show, board, x, y);
				Displayboard(show, ROW, COL);
			}
			else if (board[x][y] == '1')
			{
				printf("你死了\n");
				break;
			}
		}
		else
		{
			printf("請(qǐng)重新輸入");
		}
		int i, j;
		for (i = 1; i <= row; i++)
		{
			for (j = 1; j <= col; j++)
			{
				if (show[i][j] == '*')
				{
					count++;
				}
			}
		}
		if (count == Easy_count)
		{
			printf("成功\n");   //這里的判斷條件是遍歷整個(gè)數(shù)組,統(tǒng)計(jì)雷的個(gè)數(shù),如果雷的個(gè)數(shù)等于所剩余未排的*,說明排雷成功
			break;
		}
	}
}

用戶輸入值,并進(jìn)行判斷,如果該位置沒有雷,我們進(jìn)入展開函數(shù)

棋盤展開

void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
	if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
	{
		int count=sum(board, row, col);
		if (count != 0)
		{
			show[row][col] = count + '0';
		}
		else if (show[row][col] != '_')
		{
			show[row][col] = '_';
			int i = 0, j = 0;
			for (i = row - 1; i <= row + 1; i++)
			{
				for (j = col - 1; j <= col + 1; j++)
				{
					Openboard(show, board, i,j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

如果用戶輸入的這個(gè)位置沒有雷,我們對(duì)其周圍8個(gè)位置進(jìn)行判斷是否有雷,若有雷,我們把雷的個(gè)數(shù)顯示在該位置上,若其周圍8個(gè)位置沒有雷并且不是下劃線,我們把這個(gè)位置賦值為下劃線,然后并對(duì)其8個(gè)位置進(jìn)行同樣的判斷,如果周圍沒雷,而且周圍的棋子也不是下劃線,我們對(duì)其進(jìn)行返回。

展開部分思維導(dǎo)圖

展開函數(shù)最后一個(gè)else return 作用

這里我們show棋盤有三種情況,

1.該位置是*

2.該位置是下劃線

3.該位置是雷的個(gè)數(shù)

else

return;

這里是作用:如果是下劃線,我們就返回上一層函數(shù)。因?yàn)槿绻@里不是下劃線,我們會(huì)在else return 之前的語句中進(jìn)行判斷,并對(duì)其周圍8個(gè)位置進(jìn)行操作,然后再對(duì)這8個(gè)棋子各個(gè)周圍8個(gè)位置進(jìn)行判斷并操作,如果這里是下劃線,就說明由這個(gè)位置為中心的周圍8個(gè)棋子已經(jīng)判斷過了,并且以這8個(gè)位置為中心,已經(jīng)遞歸過了,我們不需要再進(jìn)行判斷,所以直接返回就行

周圍雷個(gè)數(shù)判斷

int sum(char board[ROWS][COLS], int x, int y)
{
	return (board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y - 1] +
		board[x][y + 1] +
		board[x + 1][y - 1] +
		board[x + 1][y] +
		board[x + 1][y + 1] - 8 * '0');
}

test.c

#include"game.h"
void menu()
{
	printf("****************************\n");
	printf("********  1.play  **********\n");
	printf("********  0.exit  **********\n");
	printf("****************************\n");
}
void game()
{
	char board[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	Itnboard(board, ROWS, COLS,'0');  //初始化棋盤
	Itnboard(show, ROWS, COLS, '*');
	Setboard(board, ROW, COL);   
	Displayboard(board, ROW, COL);
	Player(board, show, ROW, COL);            //玩家輸入
}
int main()
{
	int input=1;
  srand((unsigned int)time(NULL));
	do{
		menu();
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		game();
		break;
	case 0:
		break;
	default:
		printf("輸入錯(cuò)誤請(qǐng)重新輸入:\n ");
	}
	} while (input);
}

game.c

#include"game.h"
void Itnboard(char board[ROWS][COLS], int rows, int cols,char c)
{
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j <cols; j++)
		{
			board[i][j] = c;
		}
	}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
	int i, j;
	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");
	}
}
void Setboard(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--;
		}
	}
}
int sum(char board[ROWS][COLS], int x, int y)
{
 
	return (board[x - 1][y - 1] +
		board[x - 1][y] +
		board[x - 1][y + 1] +
		board[x][y - 1] +
		board[x][y + 1] +
		board[x + 1][y - 1] +
		board[x + 1][y] +
		board[x + 1][y + 1] - 8 * '0');
}
void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int count = 0;
	while (1)
	{
		printf("請(qǐng)排雷:\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
		{
			if (board[x][y] == '0')
			{
				Openboard(show, board, x, y);
				Displayboard(show, ROW, COL);
			}
			else if (board[x][y] == '1')
			{
				printf("你死了\n");
				break;
			}
		}
		else
		{
			printf("請(qǐng)重新輸入");
		}
		int i, j;
		for (i = 1; i <= row; i++)
		{
			for (j = 1; j <= col; j++)
			{
				if (show[i][j] == '*')
				{
					count++;
				}
			}
		}
		if (count == Easy_count)
		{
			printf("成功\n");
			break;
		}
	}
}
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
 
	if (row >= 1 && row <= ROW && col >= 1 && col <= COL)
	{
		int count=sum(board, row, col);
		if (count != 0)
		{
			show[row][col] = count + '0';
		}
		else if (show[row][col] != '_')
		{
			show[row][col] = '_';
			int i = 0, j = 0;
			for (i = row - 1; i <= row + 1; i++)
			{
				for (j = col - 1; j <= col + 1; j++)
				{
					
					Openboard(show, board, i,j);
				}
			}
		}
		else
		{
			return;
		}
	}
}

game.h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define Easy_count 10
void Itnboard(char board[ROWS][COLS], int rows, int cols,char c);
void Displayboard(char board[ROWS][COLS], int row, int col);
void Setboard(char board[ROWS][COLS], int row, int col);
void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col);

到此這篇關(guān)于C語言詳細(xì)講解通過遞歸實(shí)現(xiàn)掃雷的展開的文章就介紹到這了,更多相關(guān)C語言掃雷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中auto關(guān)鍵字的使用

    C++中auto關(guān)鍵字的使用

    本文主要介紹了C++中auto關(guān)鍵字的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C++中的數(shù)組你真的理解了嗎

    C++中的數(shù)組你真的理解了嗎

    這篇文章主要為大家詳細(xì)介紹了C++的數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Qt自定義Widget實(shí)現(xiàn)互斥效果詳解

    Qt自定義Widget實(shí)現(xiàn)互斥效果詳解

    在使用Qt時(shí),可能會(huì)遇到這種問題:多個(gè)控件互斥,類似于QRadiButton控件,但又不是單純的QRadioButton控件,互斥的可能是一個(gè)窗口,也可能是幾個(gè)按鈕,等等多種情況。本文將介紹利用Qt自定義Widget實(shí)現(xiàn)的互斥效果,需要的可以參考一下
    2022-01-01
  • opencv平均背景法詳解

    opencv平均背景法詳解

    這篇文章主要為大家詳細(xì)介紹了opencv平均背景法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片

    利用Qt+opencv實(shí)現(xiàn)視頻分解為圖片

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt和opencv實(shí)現(xiàn)視頻分解為圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C++超詳細(xì)講解字符串類

    C++超詳細(xì)講解字符串類

    在C++中只有一個(gè)字符串類,即basic_string,其管理著一個(gè) '\0' 結(jié)尾的字符數(shù)組。頭文件:#include <string>,string類支持兩種輸入方式:cin方式和getline()方式
    2022-06-06
  • C語言實(shí)現(xiàn)掃雷游戲簡易版

    C語言實(shí)現(xiàn)掃雷游戲簡易版

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷游戲簡易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言手把手教你實(shí)現(xiàn)貪吃蛇AI(上)

    C語言手把手教你實(shí)現(xiàn)貪吃蛇AI(上)

    這篇文章主要介紹了C語言手把手教你實(shí)現(xiàn)貪吃蛇AI,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 篩選法的C++實(shí)現(xiàn)

    篩選法的C++實(shí)現(xiàn)

    篩選法又稱篩法,是求不超過自然數(shù)N(N>1)的所有質(zhì)數(shù)的一種方法。據(jù)說是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)發(fā)明的,又稱埃拉托斯特尼篩子
    2013-10-10
  • Unreal學(xué)習(xí)之簡單三角形的繪制詳解

    Unreal學(xué)習(xí)之簡單三角形的繪制詳解

    之所以寫這個(gè)繪制簡單三角形的實(shí)例其實(shí)是想知道如何在Unreal中通過代碼繪制自定義Mesh,如果你會(huì)繪制一個(gè)三角形,那么自然就會(huì)繪制復(fù)雜的Mesh了。所以這是很多圖形工作者的第一課,快跟隨小編一起學(xué)習(xí)起來吧
    2023-02-02

最新評(píng)論

若羌县| 根河市| 民丰县| 陕西省| 社会| 江陵县| 卓尼县| 尖扎县| 若尔盖县| 康定县| 灌南县| 隆化县| 建始县| 双牌县| 乌拉特后旗| 望都县| 金溪县| 武威市| 涟源市| 株洲市| 岱山县| 兴宁市| 手机| 酒泉市| 绥江县| 静乐县| 都兰县| 承德县| 呈贡县| 全椒县| 驻马店市| 章丘市| 汉沽区| 绵竹市| 铁岭县| 长白| 乐都县| 大余县| 肃宁县| 枣阳市| 富锦市|