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

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

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

前言

本文接著復習前面所學知識,以掃雷游戲為例。

1、掃雷是什么?

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

在這里插入圖片描述

2、程序框架

程序整體的框架可以搬用上篇三子棋的,這種框架也可以當作一種通用的形式,加以運用。

2.1 主函數(shù)

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//產(chǎn)生隨機數(shù)
	do
	{
		menu();//菜單提示
		printf("請輸入 ==> ");//輸入1或0,
		scanf("%d", &input);
		switch (input)//根據(jù)輸入選擇是否玩游戲
		{
		case 1:
			game();//玩游戲的具體實現(xiàn)
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯誤,重新選擇!\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個雷,有雷的位置用字符 ‘1’ 表示,沒有雷的位置仍然是字符 ‘0’
  • 10個雷的位置隨機生成

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

  • 字符 ‘*’ 是將生成雷的位置遮擋住,不讓玩家看見
  • show數(shù)組放入棋盤中關于具體坐標周圍的雷的信息
  • 如果坐標周圍有雷,將統(tǒng)計雷的個數(shù),并顯示在這個坐標上
void game()
{
	printf("開始玩游戲!\n");
	//掃雷游戲的實現(xiàn)
	//mine數(shù)組是用來存放布置好的雷的信息
	//就10個雷在什么位置
	char mine[ROWS][COLS] = { 0 };//'0'
	//show數(shù)組是用來存放排查出的雷的信息
	//坐標周圍有幾個雷
	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個雷在哪里
	show_board(show, ROW, COL);//輸出*暫時掩蓋雷在哪里
	//排查雷
	find_mine(mine, show, ROW, COL);
}

2.3.1 函數(shù)init_board

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

//初始化棋盤    參數(shù):行數(shù) 列數(shù)  行數(shù) 列數(shù) 字符0或* 
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{//set表示初始化傳進來的字符是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ù)掃雷時,棋盤的具體狀態(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);//列號,棋盤首先打印列數(shù)
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);//行前面的數(shù)字,行號
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);//打印棋盤每個元素
		}
		printf("\n");
	}
	printf("------------掃雷------------\n");
}

2.3.3 函數(shù)set_mine

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

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

2.3.4 函數(shù)find_mine

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

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

  • 字符 ’1‘代表有雷,字符 ’0‘代表沒有, ’1‘- ’0‘為數(shù)字1,代表1個雷
  • 坐標周圍8個坐標上的字符相加 - 8 * ‘0’,結(jié)果就是有雷的個數(shù),是整形
//統(tǒng)計坐標周圍有雷的個數(shù)
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//坐標周圍的8個地方減去'0',再相加的個數(shù)就是類的個數(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)時間相關

#define ROW 9//棋盤真實的行數(shù)
#define COL 9
#define ROWS ROW+2 //棋盤放大范圍,便于棋盤邊的位置遍歷
#define COLS COL+2
#define EASY_COUNT 10 //10個雷的個數(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、游戲試玩

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

在這里插入圖片描述

完整代碼放在gitee中:

掃雷完整代碼

總結(jié)

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

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

相關文章

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

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

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

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

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

    C++實現(xiàn)關機功能詳細代碼

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

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

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

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

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

    C++重載的奧義之運算符重載詳解

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

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

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

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

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

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

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

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

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

最新評論

顺义区| 桂平市| 昆明市| 保定市| 乌苏市| 左权县| 洪雅县| 城市| 无棣县| 九台市| 泸溪县| 嫩江县| 桑植县| 甘洛县| 嵊州市| 漳州市| 合江县| 新安县| 兴化市| 新建县| 札达县| 柏乡县| 芮城县| 柳河县| 鄯善县| 阜阳市| 大悟县| 永定县| 柳林县| 五家渠市| 辽阳市| 墨玉县| 秦安县| 大化| 讷河市| 大同县| 大城县| 金昌市| 大方县| 汝南县| 陵水|