91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么通過遞歸實現掃雷游戲

發布時間:2022-05-19 13:53:13 來源:億速云 閱讀:162 作者:iii 欄目:開發技術

這篇“C語言怎么通過遞歸實現掃雷游戲”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言怎么通過遞歸實現掃雷游戲”文章吧。

    用戶選擇菜單

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

    用戶按1進入游戲

    棋盤初始化

    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 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函數產生隨機值

    打印棋盤

    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("請排雷:\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("請重新輸入");
    		}
    		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;
    		}
    	}
    }

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

    展開部分思維導圖

    C語言怎么通過遞歸實現掃雷游戲

    展開函數最后一個else return 作用

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

    1.該位置是*

    2.該位置是下劃線

    3.該位置是雷的個數

    else

    return;

    這里是作用:如果是下劃線,我們就返回上一層函數。因為如果這里不是下劃線,我們會在else return 之前的語句中進行判斷,并對其周圍8個位置進行操作,然后再對這8個棋子各個周圍8個位置進行判斷并操作,如果這里是下劃線,就說明由這個位置為中心的周圍8個棋子已經判斷過了,并且以這8個位置為中心,已經遞歸過了,我們不需要再進行判斷,所以直接返回就行

    周圍雷個數判斷

    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("輸入錯誤請重新輸入:\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("請排雷:\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("請重新輸入");
    		}
    		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);

    以上就是關于“C語言怎么通過遞歸實現掃雷游戲”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    延安市| 昌宁县| 西乌珠穆沁旗| 黎城县| 荔浦县| 武强县| 天长市| 洛阳市| 东乌珠穆沁旗| 彭州市| 广汉市| 武义县| 赤壁市| 宁津县| 鸡西市| 尉氏县| 新闻| 霸州市| 昌江| 舞阳县| 高雄县| 湘潭市| 洛浦县| 四川省| 专栏| 哈尔滨市| 宁强县| 上犹县| 遵义市| 繁峙县| 长汀县| 金塔县| 伊通| 阳高县| 双鸭山市| 扬中市| 光山县| 汪清县| 阿巴嘎旗| 星座| 柳江县|