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

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

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

寫代碼前,掃雷需要什么

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

進行主函數文件的代碼

void option(int input)
{
	switch (input)//分支語句
	{
	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);//選項判斷
	} while (input);
	
}

game文件以及函數步驟

#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);//初始布置棋盤內容
void showboard(char board[ROWS][COLS], int rows, int cols);//負責打印棋盤
//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);//計算周圍雷數

在主函數文件中使用game函數

void game()
{
	char board[ROWS][COLS];
	char mine[ROWS][COLS];
	setboard(mine, ROWS, COLS,'0');//創(chuàng)建初始棋盤
	setmine(mine, ROW, COL);//布雷要在一次游戲開始時就布好雷,只布一次雷
	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;//可以用一個函數進行封裝
		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;
		}
	}
}

打印棋盤函數

每次將棋盤重新定義后就可以打印,但是我們設置的棋盤要比打印的大兩行,為了保證之后計算雷數的循環(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;
}

計算雷數的函數

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就代表返回的雷數
}

空白遞歸算法

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函數去測試某個元素周圍8個元素是不是雷,如果不是,就進入函數進行遞歸,里面用來循環(huán)來表示各個方向的元素

在這里插入圖片描述

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

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

相關文章

  • 使用C語言判斷棧的方向實例

    使用C語言判斷棧的方向實例

    下面小編就為大家?guī)硪黄褂肅語言判斷棧的方向實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • C++ map詳解

    C++ map詳解

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

    電腦開機時間的計算代碼

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

    C語言實現的順序表功能完整實例

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

    C語言實現單鏈表逆序與逆序輸出實例

    這篇文章主要介紹了C語言實現單鏈表逆序與逆序輸出,是數據結構與算法中比較基礎的重要內容,有必要加以牢固掌握,需要的朋友可以參考下
    2014-08-08
  • c++中的自增/自減操作方式

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

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

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

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

    C語言非遞歸后序遍歷二叉樹

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

    C語言數據結構之隊列算法詳解

    這篇文章介紹了C語言數據結構之隊列的算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 基礎C語言編程時易犯錯誤有哪些

    基礎C語言編程時易犯錯誤有哪些

    基礎C語言編程時易犯錯誤有哪些?這篇文章主要介紹了C語言編程時常見的錯誤,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論

辽阳市| 大竹县| 察哈| 崇明县| 博乐市| 堆龙德庆县| 凤台县| 平泉县| 屏东市| 屯昌县| 潞西市| 林周县| 偃师市| 安平县| 宜昌市| 长子县| 南川市| 怀化市| 廉江市| 黔东| 竹山县| 辛集市| 道孚县| 广河县| 咸阳市| 沿河| 诸暨市| 蕉岭县| 科技| 嘉善县| 卢氏县| 玉林市| 沭阳县| 军事| 漠河县| 长宁区| 井冈山市| 汽车| 绥中县| 北京市| 洛宁县|