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

C語(yǔ)言編程之掃雷小游戲空白展開算法優(yōu)化

 更新時(shí)間:2021年09月17日 11:34:27   作者:Booksort  
掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來詳解每一步分析

寫代碼前,掃雷需要什么

1,游戲需要初始選擇菜單
2,需要布置兩個(gè)棋盤,一個(gè)布置雷,一個(gè)展示給玩家看
3,打印棋盤
4,玩家要輸入選擇的坐標(biāo),并且可以多次輸入游戲坐標(biāo)
5,每次輸入后打印棋盤,同時(shí)判斷是否繼續(xù)還是輸贏。
6,玩家每次輸入坐標(biāo),都進(jìn)行一次遞歸展開。

進(jìn)行主函數(shù)文件的代碼

void option(int input)
{
	switch (input)//分支語(yǔ)句
	{
	case 1:
		game();//掃雷開始
		break;
	case 0:
		printf("Logon out the game\n");
		break;
	default:
		printf("Input error,please input again\n");
		break;
	}
}
void menu(void)
{
	printf("Welcome to game\n");
	printf("\n");
	printf("****************\n");
	printf("*----1.play----*\n");
	printf("*----0.exit----*\n");
	printf("****************\n");
}
int main(void)
{
	int input;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印游戲菜單
		printf("please input option(1/0):>");
		scanf("%d", &input);
		option(input);//選項(xiàng)判斷
	} while (input);
	
}

game文件以及函數(shù)步驟

#include <time.h>
#define ROW 9
#define COL 9
#define _CRT_SECURE_NO_WARNINGS
#define ROWS ROW+2
#define COLS COL+2
#define LEVEL 10
#include <stdio.h>
#include <stdio.h>
void game(void);//掃雷游戲
void setboard(char board[ROWS][COLS], int rows, int cols,char ret);//初始布置棋盤內(nèi)容
void showboard(char board[ROWS][COLS], int rows, int cols);//負(fù)責(zé)打印棋盤
//void player(char board[ROWS][COLS]);//玩家輸入
void setmine(char mine[ROWS][COLS], int row, int col);//布置地雷
int cleanmine(char board[ROWS][COLS], char mine[ROWS][COLS], int row, int col);
void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x,int y);//空白遞歸算法
int test(char mine[ROWS][COLS], int x, int y);//計(jì)算周圍雷數(shù)

在主函數(shù)文件中使用game函數(shù)

void game()
{
	char board[ROWS][COLS];
	char mine[ROWS][COLS];
	setboard(mine, ROWS, COLS,'0');//創(chuàng)建初始棋盤
	setmine(mine, ROW, COL);//布雷要在一次游戲開始時(shí)就布好雷,只布一次雷
	setboard(board, ROWS, COLS, '*');//給玩家看的棋盤
	while (1)
	{
		int ret;
		showboard(mine, ROW, COL);//打印布雷圖		
		showboard(board, ROW, COL);//打印玩家棋盤
		//player(board);
		ret=cleanmine(board,mine,ROW,COL);//掃雷
		//showboard(board, ROW, COL);
		int count = 0;//可以用一個(gè)函數(shù)進(jìn)行封裝
		for (int i = 1; i <= ROW; i++)
		{
			for (int j = 1; j <= COL; j++)
			{
				if (board[i][j] == '*')
					count++;
			}
		}
		if (count ==  LEVEL)
		{
			printf("you win\n");
			break;
		}
		if (ret == 0)
			break;
		system("cls");		
	}	
}

布值棋盤(雷盤和玩家棋盤)

void setboard(char board[ROWS][COLS], int rows, int cols,char ret)
{
	int i;//主要靠ret決定是布雷還是布置玩家棋盤
	for (i = 0; i < rows; i++)
	{
		int j;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = ret;
		}
	}
}

打印棋盤函數(shù)

每次將棋盤重新定義后就可以打印,但是我們?cè)O(shè)置的棋盤要比打印的大兩行,為了保證之后計(jì)算雷數(shù)的循環(huán)成立。

void showboard(char board[ROWS][COLS], int rows, int cols)
{
	for (int a = 0; a <= cols; a++)
		printf("%d ",a);
	printf("\n");
	int i;
	int a = 1;
	for (i = 1; i <= rows; i++)
	{
		printf("%d ", a++);
		int j;
		for (j = 1; j <= cols; j++)
		{
			printf("%c|", board[i][j]);
		}
		printf("\n");
	}
}

玩家排雷

int cleanmine(char board[ROWS][COLS],char mine[ROWS][COLS],int row,int col)
{
	int x, y;
	while (1)
	{
		printf("please input the coordinate:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '0')
			{
				board[x][y] = test(mine, x, y) + '0';
				//空白遞歸算法
				space(board, mine, x, y);
				//showboard(board, ROW, COL);
				break;
			}
			else if (mine[x][y] == '1')
			{
				printf("You died\n");
				return 0;
				break;
			}
		}
		else
			printf("Coordinate is illegal,please input again\n");
	}
	printf("player\n");
	//showboard(board, ROW, COL);
	return 1;
}

計(jì)算雷數(shù)的函數(shù)

int test(char mine[ROWS][COLS], int x, int y)
{
	int count = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			if (mine[i][j] == '1')
				count++;
		}
	}
	return count;//count就代表返回的雷數(shù)
}

空白遞歸算法

void space(char board[ROWS][COLS], char mine[ROWS][COLS], int x, int y)
{
	int i;
	if(test(mine, x, y)==0)
	{
		board[x][y] = ' ';
		for (i = x-1; i <=x+1; i++)
		{
			int j;
			for (j = y-1; j <=y+1; j++)
			{
				if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1'&&board[i][j]=='*')
				{
					space(board, mine, i, j);
				}
			}
		} 
	}
	else
		board[x][y] = '0' + test(mine, x, y);	
}

要使用test函數(shù)去測(cè)試某個(gè)元素周圍8個(gè)元素是不是雷,如果不是,就進(jìn)入函數(shù)進(jìn)行遞歸,里面用來循環(huán)來表示各個(gè)方向的元素

在這里插入圖片描述

如果檢測(cè)出來test不為0,就代表周圍有雷,就else玩家棋盤定義為周圍雷數(shù),同時(shí)返回上一級(jí)函數(shù)。每一次遞歸都有兩個(gè)for循環(huán)來遞歸檢查各個(gè)方向上的元素。
就這些,如有問題,煩請(qǐng)大佬指點(diǎn)一二

以上就是C語(yǔ)言編程之掃雷小游戲空白展開算法優(yōu)化的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言空白展開算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

  • C++ map詳解

    C++ map詳解

    下面小編就為大家?guī)硪黄獪\談c++中的map。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-10-10
  • 電腦開機(jī)時(shí)間的計(jì)算代碼

    電腦開機(jī)時(shí)間的計(jì)算代碼

    這幾天我琢磨著一件事,那就是怎么計(jì)算我的PC從開機(jī)到現(xiàn)在的總時(shí)間。終于,看看這個(gè)函數(shù):GetTickCount();
    2013-05-05
  • C語(yǔ)言實(shí)現(xiàn)的順序表功能完整實(shí)例

    C語(yǔ)言實(shí)現(xiàn)的順序表功能完整實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的順序表功能,結(jié)合完整實(shí)例形式分析了C語(yǔ)言順序表的創(chuàng)建、添加、刪除、排序、合并等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • C語(yǔ)言實(shí)現(xiàn)單鏈表逆序與逆序輸出實(shí)例

    C語(yǔ)言實(shí)現(xiàn)單鏈表逆序與逆序輸出實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)單鏈表逆序與逆序輸出,是數(shù)據(jù)結(jié)構(gòu)與算法中比較基礎(chǔ)的重要內(nèi)容,有必要加以牢固掌握,需要的朋友可以參考下
    2014-08-08
  • c++中的自增/自減操作方式

    c++中的自增/自減操作方式

    這篇文章主要介紹了C++中的自增和自減運(yùn)算符,包括前綴和后綴形式,并通過一個(gè)具體的例子解釋了自增/自減表達(dá)式的值與函數(shù)參數(shù)傳遞的關(guān)系,文章指出,自增/自減表達(dá)式的值是在表達(dá)式求值時(shí)確定的,而不是在自增/自減運(yùn)算后
    2025-03-03
  • Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程

    Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程

    這篇文章主要介紹了Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C語(yǔ)言非遞歸后序遍歷二叉樹

    C語(yǔ)言非遞歸后序遍歷二叉樹

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言非遞歸后序遍歷二叉樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列算法詳解

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列算法詳解

    這篇文章介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的算法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 基礎(chǔ)C語(yǔ)言編程時(shí)易犯錯(cuò)誤有哪些

    基礎(chǔ)C語(yǔ)言編程時(shí)易犯錯(cuò)誤有哪些

    基礎(chǔ)C語(yǔ)言編程時(shí)易犯錯(cuò)誤有哪些?這篇文章主要介紹了C語(yǔ)言編程時(shí)常見的錯(cuò)誤,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 最新評(píng)論

    宜丰县| 电白县| 上虞市| 平武县| 班戈县| 台南县| 丽江市| 将乐县| 通州区| 娄烦县| 怀集县| 双城市| 台山市| 资兴市| 太谷县| 丹棱县| 东港市| 汕头市| 镇沅| 广东省| 峨边| 嘉兴市| 布拖县| 正定县| 安吉县| 泰安市| 鸡东县| 平原县| 海口市| 商洛市| 赤城县| 三亚市| 井研县| 浪卡子县| 淄博市| 通江县| 富源县| 屯门区| 九龙城区| 鄂托克旗| 同江市|