欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

寫代碼前,掃雷需要什么

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

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

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文件以及函數(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);//負責打印棋盤
//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);//計算周圍雷數(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);//布雷要在一次游戲開始時就布好雷,只布一次雷
	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;//可以用一個函數(shù)進行封裝
		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ù)

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

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

在這里插入圖片描述

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

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

相關(guān)文章

  • C++取得本機IP的方法

    C++取得本機IP的方法

    這篇文章主要介紹了C++取得本機IP的方法,代碼簡單功能實用,具有不錯的借鑒參考價值,需要的朋友可以參考下
    2014-10-10
  • C語言實現(xiàn)學生獎學金評定系統(tǒng)

    C語言實現(xiàn)學生獎學金評定系統(tǒng)

    這篇文章主要介紹了C語言實現(xiàn)學生獎學金評定系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c++下迭代器總結(jié)

    c++下迭代器總結(jié)

    大家好,本篇文章主要講的是c++下迭代器總結(jié),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)

    Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)

    這篇文章主要介紹了Qt股票組件之自選股列表拖拽、右鍵常用菜單功能的實現(xiàn)方法,本文通過實例文字相結(jié)合的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • C++如何采用Daemon進行后臺程序的部署

    C++如何采用Daemon進行后臺程序的部署

    這篇文章主要介紹了C++采用Daemon進行后臺程序的部署,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • C語言 圖文并茂詳解程序編譯過程

    C語言 圖文并茂詳解程序編譯過程

    C語言是一種編譯型語言,需要把源文件進行編譯之后才能運行,它的編譯過程是:預處理:展開頭文件、宏替換,去掉注釋,條件編譯;編譯:檢查語法,生成匯編;匯編:把生成的匯編文件匯編成機器碼;鏈接:鏈接到一起生成可執(zhí)行程序
    2022-04-04
  • C++中的可移植性和跨平臺開發(fā)教程詳解

    C++中的可移植性和跨平臺開發(fā)教程詳解

    這篇文章主要為大家介紹了C++中的可移植性和跨平臺開發(fā)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 一篇文章教你自己動手實現(xiàn)C語言庫函數(shù)

    一篇文章教你自己動手實現(xiàn)C語言庫函數(shù)

    這篇文章主要介紹了C語言庫函數(shù)的相關(guān)資料,小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載詳解

    C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載詳解

    這篇文章主要為大家詳細介紹了C++繼承中的對象構(gòu)造與析構(gòu)和賦值重載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 使用Qt開發(fā)實現(xiàn)字幕滾動效果

    使用Qt開發(fā)實現(xiàn)字幕滾動效果

    我們經(jīng)常能夠在外面看到那種滾動字幕,那么就拿qt來做一個吧,文章通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有有一定的參考價值,需要的朋友可以參考下
    2023-11-11

最新評論