国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作

這篇具有很好參考價(jià)值的文章主要介紹了童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作

  • 魔王的介紹:??????一名雙非本科大一小白。
  • 魔王的目標(biāo):??努力趕上周圍卷王的腳步。
  • 魔王的主頁:??????大魔王.??????
    童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作
    ?????大魔王與你分享:人生人山人海人來人往,自己自尊自愛自由自在。

童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作


一、前言

小時(shí)候我們在家里剛買電腦的時(shí)候,網(wǎng)絡(luò)還不是很發(fā)達(dá)(兩三年紀(jì)吧),每次斷網(wǎng)我們都除了電腦自帶的那一點(diǎn)單機(jī)游戲外沒什么玩的,其中最好玩的便是掃雷,那么你可以用代碼實(shí)現(xiàn)掃雷嗎?這里我們添加了兩個(gè)功能:第一個(gè)是標(biāo)記功能,如果確定為雷我們可以標(biāo)記為!,如果不確定,我們可以標(biāo)記為?,第二個(gè)功能是遞歸展開:我們知道如果我們我們所點(diǎn)的那個(gè)位置一周都不是雷,那么它會(huì)自動(dòng)擴(kuò)開,如果我們點(diǎn)的地方有雷,那么會(huì)顯示出周圍雷的個(gè)數(shù),如果想嘗試玩一下,點(diǎn)擊掃雷可以跳轉(zhuǎn)過去,那么接下來就學(xué)習(xí)以下如何代碼實(shí)現(xiàn)吧!

二、文件介紹

test.c:測試文件
game.c:源文件,進(jìn)行函數(shù)的定義
game.h:頭文件(只進(jìn)行聲明)

我們用測試文件調(diào)用game.h聲明、game.c文件中實(shí)現(xiàn)的函數(shù),這就是三個(gè)文件的關(guān)系。

為了使三者聯(lián)系起來,我們需要讓兩個(gè)源文件(.c)文件都包含頭文件,這樣他們中的函數(shù)就可以一起使用了。

三、代碼實(shí)現(xiàn)

1.創(chuàng)建基本的框架

void menu()
{
	printf("************************\n");
	printf("******** 1.play ********\n");
	printf("******** 0.exit ********\n");
	printf("************************\n");
}
void test()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("開始游戲\n");
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請重新輸入\n");
		}

	} while (input);
	
}

int main()
{
	test();
	return 0;
}

2.#define定義常量

因?yàn)槲覀冊邳c(diǎn)擊一個(gè)位置后如果附近有雷,那么就需要顯示周圍有幾個(gè)雷,所以我們需要訪問這個(gè)位置一周的內(nèi)容,所以如果我們創(chuàng)建的表格大小和玩的時(shí)候打印出來的一樣大,那么當(dāng)訪問邊上那些位置周圍雷的個(gè)數(shù)時(shí),就會(huì)數(shù)組越界,所以我們?nèi)绻?×9雷盤,我們需要讓行和列都寬一個(gè)位置,也就是創(chuàng)建11×11的雷盤,不過打印的話只打印中間的9×9格。所以為了方便我們先定義常量。

#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2

#define mine_num 10

3.創(chuàng)建和初始化二維數(shù)組

和三子棋一樣,我們要實(shí)現(xiàn)選中那個(gè)位置出現(xiàn)什么效果,只能是通過二維數(shù)組,讓二位數(shù)組里的元素發(fā)生變化,在玩家視角就是自己操作了這個(gè)地方,我們需要?jiǎng)?chuàng)建兩個(gè)二維數(shù)組,一個(gè)是布置雷區(qū)的二維數(shù)組,只在后臺(tái)存在,并不顯示出來,另一個(gè)則是給玩家展示的二維數(shù)組,至于為什么是兩個(gè),有很多原因,最容易說的就是:總不能把布置的雷展示給玩家吧,這樣還怎么玩,不就開掛了。所以規(guī)定:讓埋雷區(qū)初始化為字符0,展示區(qū)初始化為字符*,字符0是因?yàn)槲覀兿胗靡粋€(gè)函數(shù)來初始化這兩個(gè)雷盤,傳的參數(shù)只需要最后傳的字符不一樣(一個(gè)是字符0,一個(gè)是字符*),其他都是一樣的,所以為了方便之后的操作(兩個(gè)雷盤間的聯(lián)系),我們把兩個(gè)數(shù)組都定義為char類型。


//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = a;
		}
	}
}
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化雷區(qū)
init_board(mine, ROWS,COLS,'0');
//初始化展示區(qū)
init_board(show,ROWS,COLS, '*');

4.埋雷

在上篇智能三子棋博客中已經(jīng)用到了隨機(jī)數(shù)生成函數(shù),點(diǎn)擊智能三子棋可以跳轉(zhuǎn)到該博客,里面有隨機(jī)數(shù)的講解。雷盤里我們初始化的是字符0,我們把埋雷的地方初始化為字符1,到計(jì)算的時(shí)候只需要讓某個(gè)位置一周(8個(gè))的數(shù)字字符相加減去7個(gè)字符0即可得到表示該位置有多少個(gè)雷的數(shù)字字符。

//放雷
void put_mine(char mine[ROWS][COLS], int rows, int cols)
{
	int num = 0;
	for (num = 0; num < mine_num; num++)
	{
		while (1)
		{
			int i = rand() % ROW + 1;
			int j = rand() % COL + 1;
			if (mine[i][j] == '0')
			{
				mine[i][j] = '1';
				break;
			}
		}
	}
}
//埋雷
put_mine(mine,ROWS, COLS);

5.打印雷盤

做完這些操作,我們就需要讓玩家看到雷盤了,打印的時(shí)候因?yàn)樾信c列比較多,所以我們進(jìn)行了排序,讓玩家一看就知道自己要選擇的地方的坐標(biāo)。

//打印
void print_board(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	printf("   ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
	for (i = 1; i < cols-1; i++)//打印每列的下標(biāo)
	{
		printf("%d ", i);
	}
	printf("\n");
	printf("   ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
	for (i = 1; i < cols-1; i++)//讓每列的下標(biāo)和其下面的元素隔開
	{
		printf("- ");
	}
	printf("\n");
	for (i = 1; i < rows-1; i++)
	{
		printf("%d| ", i);//標(biāo)記每行
		int j = 0;
		for (j = 1; j < cols-1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
//打印雷盤
//print_board(mine, ROWS, COLS);//上帝視角,打印雷區(qū)
//printf("\n");
print_board(show, ROWS, COLS);

6.玩家標(biāo)記

顯示出展示區(qū)后玩家就開始下棋了,每次玩家在下棋前,我們都要問是否進(jìn)行標(biāo)記,然后標(biāo)記一次后繼續(xù)問是要標(biāo)記還是要退出標(biāo)記進(jìn)行掃雷。標(biāo)記的時(shí)候我們需要先判斷玩家選擇的位置是否在范圍內(nèi)(1~9),然后還要判斷是否該位置已經(jīng)被掃過了(如果沒被掃過,該位置坐標(biāo)只能是’*‘,’!‘,’?')

//玩家標(biāo)記
void mark_board(char show[ROWS][COLS], int rows, int cols)
{
	int flag = 0;
	while (1)
	{
		printf("選擇標(biāo)記方式:按1標(biāo)記為雷(!),按2標(biāo)記為不確定(?),按3取消標(biāo)記(*),選擇4進(jìn)入排雷環(huán)節(jié)\n");
		printf("請玩家選擇標(biāo)記方式:> ");
		scanf("%d", &flag);
		if (flag == 1)
		{
			int i = 0;
			int j = 0;
			printf("玩家選擇標(biāo)記位置:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*'&&show[i][j]!='?')
				{
					printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
					continue;
				}
				show[i][j] = '!';
			}
		}
		else if (flag == 2)
		{
			int i = 0;
			int j = 0;
			printf("玩家選擇:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*' && show[i][j] != '!')
				{
					printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
					continue;
				}
				show[i][j] = '?';
			}
		}

		else if (flag == 3)//取消標(biāo)記,變?yōu)樵瓉淼?
		{
			int i = 0;
			int j = 0;
			printf("玩家選擇:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] == '?' || show[i][j] == '!')
				{
					show[i][j] = '*';
				}
				else
				{
					printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
					continue;
				}
			}
		}

		else if (flag == 4)
			return;
		else
			printf("選擇錯(cuò)誤,請重新選擇\n");
		system("cls");
		print_board(show, ROWS, COLS);
	}
}
mark_board(show, ROWS, COLS);//每次輸入前的標(biāo)記環(huán)節(jié)

7.玩家下棋

因?yàn)橥婕蚁缕搴瓦f歸展開、判斷周圍雷個(gè)數(shù)以及輸贏是連起來的,所以這個(gè)部分比較多。

  • 當(dāng)掃的雷的個(gè)數(shù)等于(玩家看到的整個(gè)雷盤的個(gè)數(shù)減去雷的個(gè)數(shù))的時(shí)候,如果程序還沒有結(jié)束(也就是這期間沒被炸死),那么就說明玩家掃雷成功,游戲勝利。
  • 玩家在進(jìn)行選擇排雷位置時(shí),選擇的位置需要合理(1~9),然后還需要沒被掃過。
  • 當(dāng)玩家選擇的位置一周都沒有雷時(shí),該位置由*變?yōu)榭崭瘢ㄒ簿褪钦f只有這個(gè)位置一周都沒有雷,才變?yōu)榭崭?,并且展開一周,否則變?yōu)橹車椎膫€(gè)數(shù)),并且周圍全部展開(每展開一個(gè)都要讓掃雷的個(gè)數(shù)+1,否則就不能勝利了),然后繼續(xù)判斷,直到附近有雷時(shí),顯示出雷的個(gè)數(shù)。
  • 當(dāng)玩家選擇的坐標(biāo)正好是雷時(shí),游戲結(jié)束,掃雷失敗。
  • 我們第三個(gè)所提到的展開一片所用到的就是遞歸:當(dāng)我們輸入的坐標(biāo)周圍不是雷時(shí),展開周圍的全部然后再在周圍的這八個(gè)里面依次判斷是否符合,如果符合就變?yōu)榭崭癫⑶依^續(xù)展開一篇,如果周圍有雷,就不再展開,該位置變?yōu)橹車椎膫€(gè)數(shù)。
  • 上面的這個(gè)如果不經(jīng)處理就會(huì)導(dǎo)致死循環(huán),因?yàn)槲覀冞x的這個(gè)如果周圍沒雷,就會(huì)展開一片,那么這一片又與我們選的這個(gè)相鄰,那么又會(huì)回去判斷我們選擇的這個(gè)位置,然后就這樣重復(fù),最終會(huì)導(dǎo)致內(nèi)存崩了。所以我們在進(jìn)行遞歸時(shí)加一個(gè)限制條件,它必須是!、?或*才可以,因?yàn)槿绻菙?shù)字字符或空格,說明這個(gè)地方已經(jīng)判斷過了,那么就不能再判斷這個(gè)位置。
    判斷周圍雷的個(gè)數(shù)時(shí),因?yàn)槲覀冏罱K想要的是一個(gè)數(shù)字字符形式,所以我們在讓要判斷的這個(gè)位置周圍雷的個(gè)數(shù)時(shí),我們需要讓周圍相加減去7個(gè)字符0,而不是8個(gè)。
  • 我們在表達(dá)某個(gè)位置一周的坐標(biāo)的時(shí)候,采取的是遍歷法,用兩個(gè)for循環(huán)找到這個(gè)位置一周的坐標(biāo)并判斷他們是顯示數(shù)字還是再展開一片。
  • 遞歸展開是根據(jù)安 度 因的掃雷博客自己寫出來的,點(diǎn)擊安度因可以跳轉(zhuǎn)過去。

//周圍雷個(gè)數(shù)
char around_mine(char mine[ROWS][COLS], int i, int j)
{
	return mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j] + mine[i - 1][j] + mine[i - 1][j - 1] + mine[i + 1][j + 1] + mine[i - 1][j + 1] + mine[i + 1][j - 1] - 7 * '0';
	//一共是8個(gè)字符0,但因?yàn)槲覀円玫揭粋€(gè),所以減掉7個(gè),用的那一個(gè)是因?yàn)槲覀兿胍宰址麛?shù)字的形式賦過去,因?yàn)閿?shù)組是字符類型的
}

//遞歸展開
void recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* p)
{
	int x = 0;
	int y = 0;
	for (x = -1; x <= 1; x++)
	{
		for (y = -1; y <= 1; y++)
		{
			if (x + i > 0 && x + i <= ROW && y + j > 0 && y + j <= COL)//防止越界
			{
				if (mine[i + x][j + y] == '0' && (show[i + x][j + y] == '*' || show[i + x][j + y] == '?' || show[i + x][j + y] == '!'))
				{
					(*p)++;
					if (around_mine(mine, i + x, j + y) == '0')
					{
						show[i + x][j + y] = ' ';
						recursion(mine, show, i + x, j + y, p);
					}
					else
					{
						show[i + x][j + y] = around_mine(mine, i + x, j + y);
						//recursion(mine, show, i + x, j + y, p);
					}
				}
				else
					continue;

			}
		}
	}
}

//玩家選擇坐標(biāo)
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols,int* p)
{
	int i = 0;
	int j = 0;
	printf("玩家選擇:> ");
	scanf("%d %d", &i, &j);
	if (i > 0 && i <= ROW && j > 0 && j <= COL)
	{
		if (mine[i][j] == '1')
		{
			return 0;
		}
		if (show[i][j] == '*'||show[i][j]=='!'||show[i][j]=='?')
		{
			(*p)++; 
			show[i][j] = around_mine(mine, i, j);
			if (show[i][j] == '0')
			{
				show[i][j] = ' ';
				recursion(mine, show, i, j, p);//遞歸展開
			}
			/*else
				recursion(mine, show, i, j, p);*/
			return 1;
		}
		else
		{
			printf("該位置已經(jīng)排過,請重新選擇位置\n");
			Sleep(1500);
			return 1;
		}
	}
}

//玩家進(jìn)行標(biāo)記和排雷
int num = 0;
int ret = 0;
while (num<ROW*COL-mine_num)//當(dāng)重復(fù)的次數(shù)為所有非雷個(gè)數(shù)后跳出循環(huán),勝利
{
	mark_board(show, ROWS, COLS);//每次輸入前的標(biāo)記環(huán)節(jié)
	ret = player_option(mine, show, ROWS, COLS, &num);
	system("cls");
	print_board(show, ROWS, COLS);
	if (ret == 0)
	{
		printf("很遺憾,你被炸死了,雷區(qū)如下:\n");
		print_board(mine, ROWS, COLS);//讓玩家死后看到這盤掃雷游戲中雷都在哪里
		break;
	}
	//print_board(show, ROWS, COLS);
}
if (num == ROW * COL - mine_num)
	printf("恭喜你掃除了全部的雷?。。n");

四、總代碼如下

game.h

#pragma once

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2

#define mine_num 10

//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a);

//埋雷
void put_mine(char mine[ROWS][COLS],int rows, int cols);

//打印
void print_board(char board[ROWS][COLS], int rows, int cols);

//玩家選擇坐標(biāo)
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);

//玩家標(biāo)記
void mark_board(char show[ROWS][COLS], int rows, int cols);

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = a;
		}
	}
}

//放雷
void put_mine(char mine[ROWS][COLS], int rows, int cols)
{
	int num = 0;
	for (num = 0; num < mine_num; num++)
	{
		while (1)
		{
			int i = rand() % ROW + 1;
			int j = rand() % COL + 1;
			if (mine[i][j] == '0')
			{
				mine[i][j] = '1';
				break;
			}
		}
	}
}

//打印
void print_board(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	printf("   ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
	for (i = 1; i < cols-1; i++)//打印每列的下標(biāo)
	{
		printf("%d ", i);
	}
	printf("\n");
	printf("   ");//為了對其每行,因?yàn)槊啃械拈_頭加了下標(biāo),所以要先空出來下標(biāo)所占的位置
	for (i = 1; i < cols-1; i++)//讓每列的下標(biāo)和其下面的符號隔開
	{
		printf("- ");
	}
	printf("\n");
	for (i = 1; i < rows-1; i++)
	{
		printf("%d| ", i);//標(biāo)記每行
		int j = 0;
		for (j = 1; j < cols-1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

//周圍雷個(gè)數(shù)
char around_mine(char mine[ROWS][COLS], int i, int j)
{
	return mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j] + mine[i - 1][j] + mine[i - 1][j - 1] + mine[i + 1][j + 1] + mine[i - 1][j + 1] + mine[i + 1][j - 1] - 7 * '0';
	//一共是8個(gè)字符0,但因?yàn)槲覀円玫揭粋€(gè),所以減掉7個(gè),用的那一個(gè)是因?yàn)槲覀兿胍宰址麛?shù)字的形式賦過去,因?yàn)閿?shù)組是字符類型的
}

//遞歸展開
void recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* p)
{
	int x = 0;
	int y = 0;
	for (x = -1; x <= 1; x++)
	{
		for (y = -1; y <= 1; y++)
		{
			if (x + i > 0 && x + i <= ROW && y + j > 0 && y + j <= COL)//防止越界
			{
				if (mine[i + x][j + y] == '0' && (show[i + x][j + y] == '*' || show[i + x][j + y] == '?' || show[i + x][j + y] == '!'))
				{
					(*p)++;
					if (around_mine(mine, i + x, j + y) == '0')
					{
						show[i + x][j + y] = ' ';
						recursion(mine, show, i + x, j + y, p);
					}
					else
					{
						show[i + x][j + y] = around_mine(mine, i + x, j + y);
						//recursion(mine, show, i + x, j + y, p);
					}
				}
				else
					continue;

			}
		}
	}
}


//玩家選擇坐標(biāo)
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols,int* p)
{
	int i = 0;
	int j = 0;
	printf("玩家選擇:> ");
	scanf("%d %d", &i, &j);
	if (i > 0 && i <= ROW && j > 0 && j <= COL)
	{
		if (mine[i][j] == '1')
		{
			return 0;
		}
		if (show[i][j] == '*'||show[i][j]=='!'||show[i][j]=='?')
		{
			(*p)++; 
			show[i][j] = around_mine(mine, i, j);
			if (show[i][j] == '0')
			{
				show[i][j] = ' ';
				recursion(mine, show, i, j, p);//遞歸展開
			}
			/*else
				recursion(mine, show, i, j, p);*/
			return 1;
		}
		else
		{
			printf("該位置已經(jīng)排過,請重新選擇位置\n");
			Sleep(1500);
			return 1;
		}
	}
}

//玩家標(biāo)記
void mark_board(char show[ROWS][COLS], int rows, int cols)
{
	int flag = 0;
	while (1)
	{
		printf("選擇標(biāo)記方式:按1標(biāo)記為雷(!),按2標(biāo)記為不確定(?),按3取消標(biāo)記(*),選擇4進(jìn)入排雷環(huán)節(jié)\n");
		printf("請玩家選擇標(biāo)記方式:> ");
		scanf("%d", &flag);

		if (flag == 1)
		{
			int i = 0;
			int j = 0;
			printf("玩家選擇標(biāo)記位置:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*'&&show[i][j]!='?')
				{
					printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
					continue;
				}
				show[i][j] = '!';
			}
		}
		else if (flag == 2)
		{
			int i = 0;
			int j = 0;
			printf("玩家選擇:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*' && show[i][j] != '!')
				{
					printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
					continue;
				}
				show[i][j] = '?';
			}
		}

		else if (flag == 3)
		{
			int i = 0;
			int j = 0;
			printf("玩家選擇:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] == '?' || show[i][j] == '!')
				{
					show[i][j] = '*';
				}
				else
				{
					printf("該位置已經(jīng)掃過或者已經(jīng)被標(biāo)記了該種符號,請重新選擇\n");
					continue;
				}
			}
		}

		else if (flag == 4)
			return;
		else
			printf("選擇錯(cuò)誤,請重新選擇\n");
		system("cls");
		print_board(show, ROWS, COLS);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("************************\n");
	printf("******** 1.play ********\n");
	printf("******** 0.exit ********\n");
	printf("************************\n");
}
void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];

	//初始化雷區(qū)
	init_board(mine, ROWS,COLS,'0');
	//初始化展示區(qū)
	init_board(show,ROWS,COLS, '*');
	
	//埋雷
	put_mine(mine,ROWS, COLS);

	//打印雷盤
	//print_board(mine, ROWS, COLS);//上帝視角,打印雷區(qū)
	//printf("\n");
	print_board(show, ROWS, COLS);

	//玩家進(jìn)行標(biāo)記和排雷
	int num = 0;
	int ret = 0;
	while (num<ROW*COL-mine_num)//當(dāng)重復(fù)的次數(shù)為所有非雷個(gè)數(shù)后跳出循環(huán),勝利
	{
		mark_board(show, ROWS, COLS);//每次輸入前的標(biāo)記環(huán)節(jié)
		ret = player_option(mine, show, ROWS, COLS, &num);
		system("cls");
		print_board(show, ROWS, COLS);
		if (ret == 0)
		{
			printf("很遺憾,你被炸死了,雷區(qū)如下:\n");
			print_board(mine, ROWS, COLS);//讓玩家死后看到這盤掃雷游戲中雷都在哪里
			break;
		}
		//print_board(show, ROWS, COLS);
	}
	if (num == ROW * COL - mine_num)
		printf("恭喜你掃除了全部的雷?。?!\n");
}

void test()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("開始游戲\n");
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請重新輸入\n");
		}

	} while (input);
	
}

int main()
{
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

效果展示圖

童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作

五、總結(jié)

童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作

?請點(diǎn)擊下面進(jìn)入主頁關(guān)注大魔王
如果感覺對你有用的話,就點(diǎn)我進(jìn)入主頁關(guān)注我吧!文章來源地址http://www.zghlxwxcb.cn/news/detail-413157.html

到了這里,關(guān)于童年回憶--掃雷(包括標(biāo)記功能和遞歸展開)--萬字講解讓你學(xué)會(huì)掃雷制作的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語言實(shí)現(xiàn)掃雷(包含遞歸展開)

    C語言實(shí)現(xiàn)掃雷(包含遞歸展開)

    目錄 一:掃雷游戲的基礎(chǔ)邏輯 二:關(guān)于掃雷相關(guān)的信息存儲(chǔ) 三:游戲大體實(shí)現(xiàn)邏輯 四:具體實(shí)現(xiàn) (1)初始化 (2)打印 (3)布置雷 (4)查雷 五:全部代碼 (1)game.h (2)game.c (3)test.c 六:實(shí)際效果演示 掃雷游戲邏輯如下: 1. 游戲開始時(shí),玩家將看到一個(gè)方格棋盤,每個(gè)方格上有一個(gè)數(shù)

    2024年02月05日
    瀏覽(26)
  • C語言——掃雷小游戲(遞歸展開版)

    C語言——掃雷小游戲(遞歸展開版)

    哈嘍,大家好,上次我們已經(jīng)學(xué)習(xí)了三子棋小游戲,今天我們來學(xué)習(xí)掃雷小游戲了。 目錄 1.游戲介紹 2.函數(shù)部分 2.1菜單 2.2game()函數(shù) 2.3mian()函數(shù) 2.4初始化棋盤 2.5打印棋盤 2.6布置雷 2.7排查雷 2.8統(tǒng)計(jì)雷 2.9遞歸,展開一片區(qū)域 3.完整代碼展示? 想必大家都玩過掃雷這款小游戲吧

    2024年02月03日
    瀏覽(89)
  • 【C語言】掃雷小游戲(遞歸展開版)

    【C語言】掃雷小游戲(遞歸展開版)

    哈嘍,大家好,上次我們已經(jīng)學(xué)習(xí)了三子棋小游戲,今天我們來學(xué)習(xí)掃雷小游戲了。 目錄 1.游戲介紹 2.函數(shù)部分 2.1菜單 2.2game()函數(shù) 2.3mian()函數(shù) 2.4初始化棋盤 2.5打印棋盤 2.6布置雷 2.7排查雷 2.8統(tǒng)計(jì)雷 2.9遞歸,展開一片區(qū)域 3.完整代碼展示? 想必大家都玩過掃雷這款小游戲吧

    2024年02月12日
    瀏覽(93)
  • C語言300行代碼實(shí)現(xiàn)掃雷(可展開+可標(biāo)記+可更改困難級別+內(nèi)附圖形界面版本)

    C語言300行代碼實(shí)現(xiàn)掃雷(可展開+可標(biāo)記+可更改困難級別+內(nèi)附圖形界面版本)

    掃雷是一個(gè)經(jīng)典的游戲,是一個(gè)益智類小游戲,在80、90年代曾風(fēng)靡一時(shí),當(dāng)然現(xiàn)在也是十分受歡迎; 廢話不多說; 讓我們來了解一下如何用C語言去實(shí)現(xiàn)它吧?。?!(?′?`?) 運(yùn)行環(huán)境:VS2019 圖形化界面版本 先實(shí)現(xiàn)一個(gè)初級版本的: 1、我們得有一個(gè)9*9的棋盤; 2、我們在棋

    2024年01月25日
    瀏覽(23)
  • C語言之掃雷小游戲的實(shí)現(xiàn)【含遞歸展開】

    C語言之掃雷小游戲的實(shí)現(xiàn)【含遞歸展開】

    掃雷游戲是1992年發(fā)行的一款大眾類益智游戲,對于許多80后、90后來說都是童年的回憶。如今三十年過去了,這款游戲依舊受到很多網(wǎng)友的喜愛,今天我們一起來模擬實(shí)現(xiàn)一下掃雷游戲。 本文所用的編譯器是VS2022 這里我們使用模塊化設(shè)計(jì),模塊化設(shè)計(jì)就是把各個(gè)模塊的代碼分

    2024年02月02日
    瀏覽(92)
  • C語言初階之掃雷代碼詳解(含遞歸展開)

    C語言初階之掃雷代碼詳解(含遞歸展開)

    主要分為下面幾個(gè)過程: 1、建立棋盤 2、初始化棋盤 3、設(shè)置棋盤雷數(shù) 4、打印棋盤 5、玩家找雷 6、判定勝負(fù) 文件名:game.h 代碼如下: 在game頭文件中,首先包含會(huì)使用到的庫頭文件,這里的ROW以及COL是雷區(qū)的行和列大小,也就是說這是玩家實(shí)際能看到的行數(shù)及列數(shù),而RO

    2024年02月03日
    瀏覽(24)
  • 【C語言】萬字教學(xué),帶你分步實(shí)現(xiàn)掃雷游戲(內(nèi)含遞歸函數(shù)解析),劍指掃雷,一篇足矣

    【C語言】萬字教學(xué),帶你分步實(shí)現(xiàn)掃雷游戲(內(nèi)含遞歸函數(shù)解析),劍指掃雷,一篇足矣

    君兮_的個(gè)人主頁 勤時(shí)當(dāng)勉勵(lì) 歲月不待人 C/C++ 游戲開發(fā) Hello,這里是君兮_,今天更新一篇關(guān)于利用C語言實(shí)現(xiàn)掃雷游戲的博客。對于初學(xué)者來說,這也是一個(gè)非常容易上手的小項(xiàng)目,看完不妨自己試試哦! 廢話不多說,我們直接開始吧! 相信很多人在小時(shí)候都玩過掃雷游戲,但

    2024年02月11日
    瀏覽(32)
  • 火山引擎邊緣云,助你沉浸式回憶童年

    火山引擎邊緣云,助你沉浸式回憶童年

    發(fā)現(xiàn)了嗎?在抖音、西瓜視頻上能觀看4K修復(fù)的經(jīng)典港片了!得益于抖音、中國電影資料館、火山引擎共同發(fā)起的“經(jīng)典香港電影修復(fù)計(jì)劃”,我們童年時(shí)期看過的《大話西游之大圣娶親》《武狀元蘇乞兒》等22部港片以更清晰、流暢、顏色飽滿的狀態(tài)回歸了! 畫面來自《武

    2024年02月11日
    瀏覽(19)
  • 【六一兒童節(jié)】回憶一下“童年的記憶”

    【六一兒童節(jié)】回憶一下“童年的記憶”

    我們都有過童年,并且從現(xiàn)在看來,童年是我們最希望可以回去的那段時(shí)光,那時(shí)候的我們傻傻的,并且很天真可愛,我們在這個(gè)世界上充滿了生機(jī)活力,在這里要蟹蟹CSDN能夠出這個(gè)六一兒童節(jié)活動(dòng),讓我在這個(gè)快節(jié)奏的時(shí)代去思考與回憶自己的過去。 第一次接觸EasyX是前三

    2024年02月08日
    瀏覽(19)
  • 回憶童年游戲,完美利用Python制作飛機(jī)大戰(zhàn)(爺青回~)

    名字:阿玥的小東東 學(xué)習(xí):python、C/C++ 博客鏈接:阿玥的小東東的博客_CSDN博客-pythonc++高級知識,過年必備,C/C++知識講解領(lǐng)域博主 目錄 pygame包的安裝 添加python環(huán)境變量 創(chuàng)建飛機(jī)大戰(zhàn)窗口 飛機(jī)照片

    2024年02月08日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包