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

C語言數(shù)組超詳細(xì)講解下篇掃雷

 更新時(shí)間:2022年04月13日 17:15:48   作者:初學(xué)C語言者  
數(shù)組是一組有序的數(shù)據(jù)的集合,本篇將帶你結(jié)合數(shù)組來實(shí)現(xiàn)掃雷小游戲,上手實(shí)練更快的能夠掌握數(shù)組使用,感興趣的朋友來看看吧

前言

本文接著復(fù)習(xí)前面所學(xué)知識(shí),以掃雷游戲?yàn)槔?/p>

1、掃雷是什么?

百度百科:《掃雷》是一款大眾類的益智小游戲,于1992年發(fā)行。游戲目標(biāo)是在最短的時(shí)間內(nèi)根據(jù)點(diǎn)擊格子出現(xiàn)的數(shù)字找出所有非雷格子,同時(shí)避免踩雷,踩到一個(gè)雷即全盤皆輸。

在這里插入圖片描述

2、程序框架

程序整體的框架可以搬用上篇三子棋的,這種框架也可以當(dāng)作一種通用的形式,加以運(yùn)用。

2.1 主函數(shù)

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//產(chǎn)生隨機(jī)數(shù)
	do
	{
		menu();//菜單提示
		printf("請輸入 ==> ");//輸入1或0,
		scanf("%d", &input);
		switch (input)//根據(jù)輸入選擇是否玩游戲
		{
		case 1:
			game();//玩游戲的具體實(shí)現(xiàn)
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯(cuò)誤,重新選擇!\n");
			break;
		}
	} while (input);

	return 0;
}

2.2 函數(shù)menu

輸出提示菜單,提醒玩家,1是玩游戲,0是退出游戲

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

2.3 函數(shù)game

數(shù)組mine,初始化后放入字符 ‘0’

  • mine數(shù)組后續(xù)放入10個(gè)雷,有雷的位置用字符 ‘1’ 表示,沒有雷的位置仍然是字符 ‘0’
  • 10個(gè)雷的位置隨機(jī)生成

數(shù)組show,初始化后放入字符 ‘*’

  • 字符 ‘*’ 是將生成雷的位置遮擋住,不讓玩家看見
  • show數(shù)組放入棋盤中關(guān)于具體坐標(biāo)周圍的雷的信息
  • 如果坐標(biāo)周圍有雷,將統(tǒng)計(jì)雷的個(gè)數(shù),并顯示在這個(gè)坐標(biāo)上
void game()
{
	printf("開始玩游戲!\n");
	//掃雷游戲的實(shí)現(xiàn)
	//mine數(shù)組是用來存放布置好的雷的信息
	//就10個(gè)雷在什么位置
	char mine[ROWS][COLS] = { 0 };//'0'
	//show數(shù)組是用來存放排查出的雷的信息
	//坐標(biāo)周圍有幾個(gè)雷
	char show[ROWS][COLS] = { 0 };//'*'

	//初始化棋盤
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
	//打印棋盤
	//show_board(mine, ROW, COL);//全是字符'0'
	//show_board(mine, ROW, COL);//全是'*'
	//布置雷
	set_mine(mine, ROW, COL);//雷的數(shù)組
	//show_board(mine, ROW, COL);這是顯示10個(gè)雷在哪里
	show_board(show, ROW, COL);//輸出*暫時(shí)掩蓋雷在哪里
	//排查雷
	find_mine(mine, show, ROW, COL);
}

2.3.1 函數(shù)init_board

init_board初始化參數(shù)是將棋盤初始化,讓整個(gè)棋盤顯示字符 ‘0’ 和 ‘*’

//初始化棋盤    參數(shù):行數(shù) 列數(shù)  行數(shù) 列數(shù) 字符0或* 
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{//set表示初始化傳進(jìn)來的字符是0 還是 *
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

2.3.2 函數(shù)show_board

show_board是展示棋盤的,可以看到棋盤里面雷的信息,以及后續(xù)掃雷時(shí),棋盤的具體狀態(tài)

//展示棋盤
void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("------------掃雷------------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);//列號(hào),棋盤首先打印列數(shù)
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);//行前面的數(shù)字,行號(hào)
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);//打印棋盤每個(gè)元素
		}
		printf("\n");
	}
	printf("------------掃雷------------\n");
}

2.3.3 函數(shù)set_mine

函數(shù)set_mine是布置雷的,會(huì)在棋盤內(nèi)隨機(jī)在10個(gè)坐標(biāo)位置產(chǎn)生雷

//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;//布置10個(gè)雷
	int x = 0;//行坐標(biāo)
	int y = 0;//列坐標(biāo)
	while (count)//直到10個(gè)雷布置完成,退出循環(huán)
	{
		x = rand() % row + 1;//取模是0-8,加1就是1-9
		y = rand() % col + 1;
		if (mine[x][y] == '0')//是空的,就放雷,否則重新隨機(jī)產(chǎn)生坐標(biāo)位置
		{
			mine[x][y] = '1';//布置雷
			count--;
		}
	}
}

2.3.4 函數(shù)find_mine

函數(shù)find_mine是排查雷,每次玩家排雷都先輸入一個(gè)坐標(biāo),然后判斷坐標(biāo)上的字符是否為1:

  • 1為雷,游戲結(jié)束
  • 不是1,統(tǒng)計(jì)坐標(biāo)周圍8個(gè)位置雷的個(gè)數(shù),以字符放入形式顯示在坐標(biāo)上
//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;//代表玩家排雷的次數(shù)
	while (win < row*col - EASY_COUNT)//小于雷的個(gè)數(shù),說明雷還沒排完
	{
		printf("請輸入要排查的坐標(biāo) ==> ");
		scanf("%d %d", &x, &y);//玩家輸入坐標(biāo)
		if (x >= 1 && x <= row && y >= 1 && y <= col)//在1-9的坐標(biāo)范圍內(nèi)
		{
			if (mine[x][y] == '1')//確定坐標(biāo)為字符'1',就是雷
			{
				printf("很遺憾,被炸死了\n");
				show_board(mine, ROW, COL);//顯示所有雷的位置
				break;
			}
			else//不是字符1,坐標(biāo)就不是雷,顯示坐標(biāo)周圍有雷的個(gè)數(shù)
			{
				int count = get_mine_count(mine, x, y);//函數(shù)計(jì)算類的個(gè)數(shù)
				show[x][y] = count + '0';//周圍有雷的個(gè)數(shù)+'0'就轉(zhuǎn)換成字符了
				show_board(show, ROW, COL);//打印出來,每次掃雷后的棋盤
				win++;//掃了一次雷就++
			}
		}
		else//超過坐標(biāo)范圍
		{
			printf("坐標(biāo)非法,重新輸入\n");
		}
	}
	if (win == row * col - EASY_COUNT)//掃雷次數(shù)==9*9-10 71次就結(jié)束
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine, ROW, COL);//顯示雷的信息
	}
}

2.3.5 函數(shù)get_mine_count

函數(shù)get_mine_count統(tǒng)計(jì)雷的個(gè)數(shù):

  • 字符 ’1‘代表有雷,字符 ’0‘代表沒有, ’1‘- ’0‘為數(shù)字1,代表1個(gè)雷
  • 坐標(biāo)周圍8個(gè)坐標(biāo)上的字符相加 - 8 * ‘0’,結(jié)果就是有雷的個(gè)數(shù),是整形
//統(tǒng)計(jì)坐標(biāo)周圍有雷的個(gè)數(shù)
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//坐標(biāo)周圍的8個(gè)地方減去'0',再相加的個(gè)數(shù)就是類的個(gè)數(shù)
	return mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1] - 8 * '0';
}

3、頭文件.h

#include <stdio.h>
#include <stdlib.h>//庫函數(shù)
#include <time.h>//與系統(tǒng)時(shí)間相關(guān)

#define ROW 9//棋盤真實(shí)的行數(shù)
#define COL 9
#define ROWS ROW+2 //棋盤放大范圍,便于棋盤邊的位置遍歷
#define COLS COL+2
#define EASY_COUNT 10 //10個(gè)雷的個(gè)數(shù)
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
//打印
void show_board(char arr[ROWS][COLS], int row, int col);
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);

4、游戲試玩

運(yùn)行結(jié)果見下圖,基本滿足了游戲功能。

在這里插入圖片描述

完整代碼放在gitee中:

掃雷完整代碼

總結(jié)

本文只涉及了較為基礎(chǔ)的掃雷游戲,等后面學(xué)習(xí)更復(fù)雜的知識(shí)后,可以對掃雷游戲進(jìn)行完善。掃雷游戲整體編寫思路完全可以參考三子棋來實(shí)現(xiàn)。

到此這篇關(guān)于C語言數(shù)組超詳細(xì)講解下篇掃雷的文章就介紹到這了,更多相關(guān)C語言 三子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中深度優(yōu)先搜索(DFS)算法的示例詳解

    C語言中深度優(yōu)先搜索(DFS)算法的示例詳解

    這篇文章主要通過兩個(gè)簡單的示例為大家詳細(xì)介紹一下C語言中深度優(yōu)先搜索(DFS)算法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • C語言數(shù)組超詳細(xì)講解上

    C語言數(shù)組超詳細(xì)講解上

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • C++實(shí)現(xiàn)關(guān)機(jī)功能詳細(xì)代碼

    C++實(shí)現(xiàn)關(guān)機(jī)功能詳細(xì)代碼

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)關(guān)機(jī)功能詳細(xì)代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言中的斷言函數(shù)assert詳解

    C語言中的斷言函數(shù)assert詳解

    assert?是一個(gè)非常有用的工具,可以幫助開發(fā)人員在早期發(fā)現(xiàn)和糾正程序中的邏輯錯(cuò)誤,在調(diào)試階段通過斷言可以驗(yàn)證程序中的假設(shè)條件是否成立,提高代碼的可靠性和可維護(hù)性,這篇文章主要介紹了C語言中的斷言函數(shù)assert,需要的朋友可以參考下
    2024-07-07
  • C++線程間的互斥和通信場景分析

    C++線程間的互斥和通信場景分析

    很多朋友對C++線程間的互斥和通信知識(shí)掌握不是多牢靠,今天小編通過模擬車站賣票應(yīng)用場景給大家詳細(xì)解析C++線程間的互斥和通信知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C++重載的奧義之運(yùn)算符重載詳解

    C++重載的奧義之運(yùn)算符重載詳解

    函數(shù)的重載是指利用相同的函數(shù)名設(shè)計(jì)一系列功能相近,但是功能細(xì)節(jié)不一樣的函數(shù)接口;因此運(yùn)算符重載也是指對于同一個(gè)運(yùn)算符來說,它可以用于實(shí)現(xiàn)不同的功能。下面就一起來理解下運(yùn)算符重載的應(yīng)用吧
    2023-04-04
  • C++14 新特性之函數(shù)返回值類型推導(dǎo)

    C++14 新特性之函數(shù)返回值類型推導(dǎo)

    本文主要介紹了C++14 新特性之函數(shù)返回值類型推導(dǎo),在模板編程和一些返回類型復(fù)雜或不易直接指明的情況下非常有用,下面就來具體介紹一下,感興趣的可以了解一下
    2024-05-05
  • C++傳值、傳址、傳引用的區(qū)別和選擇小結(jié)

    C++傳值、傳址、傳引用的區(qū)別和選擇小結(jié)

    參數(shù)傳遞有傳值、傳址和傳引用這三種,本文主要介紹了C++傳值、傳址、傳引用的區(qū)別和選擇小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • C++-操作符重載、并實(shí)現(xiàn)復(fù)數(shù)類詳解

    C++-操作符重載、并實(shí)現(xiàn)復(fù)數(shù)類詳解

    這篇文章主要介紹了C++-操作符重載、并實(shí)現(xiàn)復(fù)數(shù)類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C++實(shí)現(xiàn)LeetCode(155.最小棧)

    C++實(shí)現(xiàn)LeetCode(155.最小棧)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(155.最小棧),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

晋城| 玉田县| 贵州省| 梅州市| 凌源市| 建平县| 建瓯市| 苏尼特右旗| 滕州市| 弋阳县| 简阳市| 怀化市| 宣汉县| 大冶市| 那曲县| 武冈市| 龙口市| 满洲里市| 淮滨县| 虹口区| 大宁县| 陇南市| 武鸣县| 遵义县| 鄂尔多斯市| 岳普湖县| 益阳市| 科技| 景德镇市| 贺州市| 涡阳县| 内江市| 武安市| 江山市| 崇仁县| 永平县| 集贤县| 贵州省| 筠连县| 南江县| 堆龙德庆县|