亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言編程之掃雷小游戲空白展開算法優(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)//分支語句
	{
	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ōu)化的詳細(xì)內(nèi)容,更多關(guān)于C語言空白展開算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++取得本機(jī)IP的方法

    C++取得本機(jī)IP的方法

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

    C語言實(shí)現(xiàn)學(xué)生獎(jiǎng)學(xué)金評(píng)定系統(tǒng)

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

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

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

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

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

    C++如何采用Daemon進(jìn)行后臺(tái)程序的部署

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論