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

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("請(qǐng)輸入 ==> ");//輸入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("請(qǐng)輸入要排查的坐標(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í)后,可以對(duì)掃雷游戲進(jìn)行完善。掃雷游戲整體編寫思路完全可以參考三子棋來實(shí)現(xiàn)。

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

相關(guān)文章

  • C語言中的四種常量詳解

    C語言中的四種常量詳解

    本篇文章是c語言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說明)請(qǐng)大家持續(xù)關(guān)注腳本之家
    2021-10-10
  • 基于Windows C++ 應(yīng)用程序通用日志組件的使用詳解

    基于Windows C++ 應(yīng)用程序通用日志組件的使用詳解

    眾所周知,在調(diào)試、跟蹤和執(zhí)行應(yīng)用程序的過程中,程序的日志能為這些工作提供大量有價(jià)值的運(yùn)行信息。因此,程序的日志對(duì)應(yīng)用程序的運(yùn)行、維護(hù)至關(guān)重要
    2013-05-05
  • Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解

    Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解

    Prim算法能夠在帶權(quán)的圖中搜索出最小生成樹,這也是各大ACM和面試及考研題目中的熱點(diǎn),下面我們就來詳細(xì)看一下Prim(普里姆)算法求最小生成樹的思想及C語言實(shí)例講解
    2016-06-06
  • C++ 算法精講之貪心算法

    C++ 算法精講之貪心算法

    貪心算法(又稱貪婪算法)是指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解
    2022-03-03
  • C++實(shí)現(xiàn)簡(jiǎn)單班級(jí)成績(jī)管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單班級(jí)成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單班級(jí)成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言繪制雷達(dá)圖的示例代碼

    C語言繪制雷達(dá)圖的示例代碼

    常用的統(tǒng)計(jì)圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,其中還有一種雷達(dá)圖的繪制也較難,本文為大家提供了雷達(dá)圖的繪制方法,需要的可以參考下
    2024-02-02
  • C++類與對(duì)象的詳細(xì)說明

    C++類與對(duì)象的詳細(xì)說明

    這篇文章主要為大家詳細(xì)介紹了C++的類與對(duì)象,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言輸出教學(xué)日歷表的方法實(shí)例

    C語言輸出教學(xué)日歷表的方法實(shí)例

    最近幫朋友做一些C語言的練習(xí)題,期間遇到了個(gè)比較有意思的題目,下面這篇文章主要給大家介紹了關(guān)于C語言輸出教學(xué)日歷表的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 詳解C++中vector的理解以及模擬實(shí)現(xiàn)

    詳解C++中vector的理解以及模擬實(shí)現(xiàn)

    vector是表示可變大小數(shù)組的序列容器。這篇文章主要為大家詳細(xì)介紹了vector的理解以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-03-03
  • c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例

    c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例

    這篇文章主要介紹了c++利用windows函數(shù)實(shí)現(xiàn)計(jì)時(shí)示例,需要的朋友可以參考下
    2014-05-05

最新評(píng)論