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

C語言實現(xiàn)掃雷游戲詳細代碼實例

 更新時間:2021年02月26日 11:52:34   作者:貧僧愛用飄柔  
這篇文章主要介紹了C語言實現(xiàn)掃雷游戲詳細代碼實例,有感興趣的同學可以借鑒參考下

掃雷游戲

思路:先制作一個菜單讓玩家選擇是玩游戲還是退出游戲,菜單做好了,接著我們開始制作掃雷的棋盤并初始化,初始化弄完了我們下一步開始埋雷,雷埋好了就開始掃雷。

大概思路就是這樣具體實現(xiàn)看下面:

菜單的實現(xiàn)代碼:

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("**************************\n");
		printf("*** 1. play 0. exit ***\n");
		printf("*** 2. clear ***\n");
		printf("**************************\n");
		printf("請選擇:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();//游戲?qū)崿F(xiàn)
			break;
		case 2://清屏選項
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

這里我們用了Windows庫函數(shù)清屏,如果屏幕上顯示的東西太多了,我們可以選擇2來清屏,還有一個睡眠函數(shù),如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了。

效果展示圖:

image-20210213182334643

制作好菜單那我們開始實現(xiàn)整個游戲的邏輯框架了,定義兩個二維數(shù)組,一個用于顯示,一個用于存放地雷。如果這兩個東西都只用一個二維數(shù)組的話后面的實現(xiàn)邏輯會比較麻煩所以我選擇使用兩個二維數(shù)組。

char mine[ROWS][COLS] = { 0 };//用于埋雷
char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示

有這兩個二維數(shù)組我們開始初始化

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			mine[i][j] = val;
		}
	}
}

我遍歷整個二維數(shù)組來初始化,val這個參數(shù)是用于接收這兩個二維數(shù)組的初始化的內(nèi)容,如果不用這個val參數(shù)我就要再寫一個函數(shù)封裝很麻煩。

接下來,實現(xiàn)個打印棋盤函數(shù)來看看我們的初始化是否正確的初始化成我想要的內(nèi)容

打印棋盤代碼:

//顯示棋盤
void Display_board(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("  掃雷游戲\n");
	printf("---------------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}

	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}

		printf("\n");

	}
}

接下來看看我們初始化的是否正確:

image-20210213183529411

可以看到它正確的初始化了,全0代表埋雷的二維數(shù)組,而*代表的是用戶看到的,正常來說,這個埋雷是不需要顯示出來的,但是我們需要確認是否正確初始化所以打印出來看看,下一步我們開始埋雷。

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASILY;

	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')//用于判斷是否正確的埋雷,只有我們這沒被埋過的雷我們才自減
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

埋好雷的效果:

image-20210213184318663

1代表是雷,0代表步是雷,埋好的雷會被賦值成字符1

埋雷我采用隨機函數(shù)來幫我埋下雷,弄好這步接來的就是掃雷這很關(guān)鍵。

掃雷代碼:

//掃雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;

	while (count < row * col - EASILY)
	{
		system("cls");
		Display_board(show, COL, ROW);
		printf("請輸入坐標:>");
		scanf("%d %d", &x, &y);

		if ((1 <= x && x <= row) && (1 <= y && y <= col))
		{
			if (mine[x][y] == '0')
			{
				int leng = statistics_mine(mine, x, y);
				show[x][y] = leng + '0';
				count++;
			}
			else
			{
				printf("很遺憾你被炸死了\n");
				Display_board(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("請輸入有效數(shù)字!\n");
		}
	}

	if (count == row * col - EASILY)
	{
		printf("恭喜你掃雷成功!\n");
		Display_board(mine, ROW, COL);
	}
}

如果玩家輸入的坐標是合法的我們就統(tǒng)計它周圍有多少雷,統(tǒng)計雷的功能我做成了一個內(nèi)部函數(shù)防止重名。

如果全部沒有雷的地方都排查完了,我們就停止循環(huán)。然后打印下雷的棋盤讓玩家知道哪有雷,如果被炸死了,我們也打印下雷的二維數(shù)組讓玩家死得瞑目。

image-20210213185315518

image-20210213185338283

統(tǒng)計雷的函數(shù):

//統(tǒng)計周圍雷的個數(shù)
static int statistics_mine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y - 1] +
		mine[x][y + 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] - 8 * '0';
}

根據(jù)ASCII碼字符1減去字符0就是整形1,所以根據(jù)此方法我們就只用把周圍的雷全部加起來減去字符零就可以得到周圍雷的個數(shù)并返回 。

統(tǒng)計雷效果圖:

image-20210213185148661

周圍沒有雷就是0,如果有就顯示個數(shù)。

通關(guān)也會打印所有雷的位置并提示你是否通關(guān)

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-m4tO2ZuP-1613214039851)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\image-20210213185535958.png)]

頭文件:

#pragma once
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>

#define ROW 9
#define COL 9
#define ROWS ROW + 2
#define COLS COL + 2
#define EASILY 0//雷的數(shù)量

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val);

//顯示棋盤
void Display_board(char mine[ROWS][COLS], int row, int col);

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col);

//掃雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

游戲?qū)崿F(xiàn)代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

int count = 0;//統(tǒng)計還剩多少格子沒被掃


void game()//游戲?qū)崿F(xiàn)
{
	char mine[ROWS][COLS] = { 0 };//用于埋雷
	char show[ROWS][COLS] = { 0 };//用于游戲的畫面顯示

	//初始化
	initzeboard(show, ROWS, COLS, '*');
	initzeboard(mine, ROWS, COLS, '0');

	//顯示棋盤
	Display_board(show, ROW, COL);
	//Display_board(mine, ROW, COL);

	//埋雷
	random_mine(mine, ROW, COL);
	//Display_board(mine, ROW, COL);
	
	//掃雷
	mine_sweeping(mine, show, ROW, COL);
}

//初始化
void initzeboard(char mine[ROWS][COLS], int rows, int cols, char val)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			mine[i][j] = val;
		}
	}
}

//顯示棋盤
void Display_board(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;

	printf("  掃雷游戲\n");
	printf("---------------------------------\n");
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}

	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", mine[i][j]);
		}

		printf("\n");

	}
}

//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = EASILY;

	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;

		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

//統(tǒng)計周圍雷的個數(shù)
static int statistics_mine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y - 1] +
		mine[x][y + 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] - 8 * '0';
}


//掃雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;

	while (count < row * col - EASILY)
	{
		system("cls");
		Display_board(show, COL, ROW);
		printf("請輸入坐標:>");
		scanf("%d %d", &x, &y);

		if ((1 <= x && x <= row) && (1 <= y && y <= col))
		{
			if (mine[x][y] == '0')
			{
				int leng = statistics_mine(mine, x, y);
				show[x][y] = leng + '0';
				count++;
			}
			else
			{
					printf("很遺憾你被炸死了\n");
					Display_board(mine, ROW, COL);
					break;
			}
		}
		else
		{   
				printf("請輸入有效數(shù)字!\n");
		}
	}

	if (count == row * col - EASILY)
	{
		printf("恭喜你掃雷成功!\n");
		Display_board(mine, ROW, COL);
	}
}

主函數(shù)代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

extern void game();

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		printf("**************************\n");
		printf("*** 1. play 0. exit ***\n");
		printf("*** 2. clear ***\n");
		printf("**************************\n");
		printf("請選擇:>");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();//游戲?qū)崿F(xiàn)
			break;
		case 2://清屏選項
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

到此這篇關(guān)于C語言實現(xiàn)掃雷游戲詳細代碼實例的文章就介紹到這了,更多相關(guān)C語言實現(xiàn)掃雷游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)動態(tài)煙花效果

    C++實現(xiàn)動態(tài)煙花效果

    這篇文章主要介紹了利用C++實現(xiàn)的放煙花程序,用到了EGE圖形庫,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2022-01-01
  • C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)

    C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)

    C++入門基礎(chǔ)篇的內(nèi)容為C++的基本特性,只有在掌握C++的基本特性后,是進入后面類和對象學習的基礎(chǔ),下面這篇文章主要給大家介紹了關(guān)于C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C語言深入探究sizeof與整型數(shù)據(jù)存儲及數(shù)據(jù)類型取值范圍

    C語言深入探究sizeof與整型數(shù)據(jù)存儲及數(shù)據(jù)類型取值范圍

    在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細講解一下關(guān)鍵字sizeof、整型數(shù)據(jù)存儲深入、數(shù)據(jù)類型取值范圍深入
    2022-07-07
  • C語言實現(xiàn)井字棋詳解

    C語言實現(xiàn)井字棋詳解

    這篇文章主要為大家介紹了C語言如何實現(xiàn)井字棋,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C語言實現(xiàn)去除字符串中空格的簡單實例

    C語言實現(xiàn)去除字符串中空格的簡單實例

    下面小編就為大家?guī)硪黄狢語言實現(xiàn)去除字符串中空格的簡單實例。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • C++重載的奧義之函數(shù)重載詳解

    C++重載的奧義之函數(shù)重載詳解

    函數(shù)重載是C++多態(tài)(靜態(tài)多態(tài))的特征體現(xiàn),它可以允許重復(fù)使用同一個函數(shù)名(籃子)的函數(shù),但是函數(shù)的參數(shù)列表(籃子裝的東西)是可以不一樣的。下面就簡單講講C++中函數(shù)重載的相關(guān)應(yīng)用吧
    2023-04-04
  • 關(guān)于STL中的map容器的一些總結(jié)

    關(guān)于STL中的map容器的一些總結(jié)

    對于map的學習,或者說是對STL中的容器的學習,要知道每種容器的實現(xiàn)原理,每種適合適合解決什么問題的,才是關(guān)鍵
    2013-09-09
  • 詳解C語言之文件操作下)

    詳解C語言之文件操作下)

    這篇文章主要介紹了關(guān)于C語言文件操作方法的相關(guān)資料,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • C++11?nullptr實現(xiàn)初始化空指針

    C++11?nullptr實現(xiàn)初始化空指針

    避免產(chǎn)生“野指針”最有效的方法,就是在定義指針的同時完成初始化操作,本文主要介紹了C++11?nullptr初始化空指針,感興趣的可以了解一下
    2022-01-01
  • C語言深入探究直接插入排序與希爾排序使用案例講解

    C語言深入探究直接插入排序與希爾排序使用案例講解

    算法中排序是十分重要的,而每一個學習計算機的都會在初期的時候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言直接插入排序與希爾排序使用的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論

会昌县| 黔西| 苗栗市| 大邑县| 衡山县| 夏邑县| 格尔木市| 高淳县| 江都市| 哈尔滨市| 谢通门县| 宁都县| 应城市| 沂水县| 永城市| 苍溪县| 伊宁县| 微山县| 西昌市| 黄大仙区| 巴塘县| 水城县| 顺昌县| 铁岭县| 屯留县| 正定县| 彩票| 文安县| 石屏县| 凯里市| 云阳县| 册亨县| 泰顺县| 疏附县| 曲阜市| 肥乡县| 黔江区| 呼和浩特市| 宁河县| 乌鲁木齐市| 阆中市|