溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用C語言如何實現(xiàn)一個掃雷游戲

發(fā)布時間:2021-02-26 16:28:02 來源:億速云 閱讀:150 作者:Leah 欄目:開發(fā)技術(shù)

利用C語言如何實現(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ù),如果輸出錯誤會短暫的提示你一秒,告訴你選擇錯誤了。

效果展示圖:

利用C語言如何實現(xiàn)一個掃雷游戲

制作好菜單那我們開始實現(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");

	}
}

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

利用C語言如何實現(xiàn)一個掃雷游戲

可以看到它正確的初始化了,全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--;
		}
	}
}

埋好雷的效果:

利用C語言如何實現(xiàn)一個掃雷游戲

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ù)組讓玩家死得瞑目。

利用C語言如何實現(xiàn)一個掃雷游戲

利用C語言如何實現(xiàn)一個掃雷游戲

統(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)計雷效果圖:

利用C語言如何實現(xiàn)一個掃雷游戲

周圍沒有雷就是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)一個掃雷游戲問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI