【C語言】掃雷游戲詳解及完整代碼-創(chuàng)新互聯(lián)

文章目錄
  • 前言
  • 一、程序環(huán)境配置
  • 二、各種功能的實現(xiàn)以及邏輯關(guān)系的整理
    • 2.1 創(chuàng)建游戲初始界面(進(jìn)入\退出 游戲)
    • 2.2 創(chuàng)建并初始化二維數(shù)組board[][] mine[][] (board存放棋盤的信息 mine存放雷的信息)
    • 2.3 初始化棋盤
    • 2.4 打印棋盤
    • 2.5 設(shè)置雷區(qū)
    • 2.6 掃雷
  • 三、完整代碼展示
    • 3.1 game.h板塊
    • 3.2 game.c板塊
    • 3.3 test.c板塊
  • 四、代碼運(yùn)行結(jié)果展示
  • 總結(jié)

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)、玉龍網(wǎng)絡(luò)推廣、微信小程序開發(fā)、玉龍網(wǎng)絡(luò)營銷、玉龍企業(yè)策劃、玉龍品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供玉龍建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn前言

大家好,相信大家對掃雷小游戲已經(jīng)不陌生了。
這篇文章將分享利用C語言實現(xiàn)掃雷的全過程講解及其完整代碼。初學(xué)C語言的朋友們也能看懂學(xué)會哦!覺得有幫助的小伙伴記得點個免費(fèi)的小贊支持一下哦。

一、程序環(huán)境配置

本項目將會用到三個文件存儲代碼,分別為兩個源文件test.c game.c 和一個頭文件 game.h。

test.c文件是整個程序的主題,game.c文件中存放實現(xiàn)游戲功能的代碼,game.h文件中存放整個程序所需要的頭文件。
這樣 有利于后期調(diào)試,也提升了代碼整體的可讀性。

二、各種功能的實現(xiàn)以及邏輯關(guān)系的整理 2.1 創(chuàng)建游戲初始界面(進(jìn)入\退出 游戲)

打印菜單
代碼如下:

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

玩家選擇1進(jìn)入游戲,選擇0退出游戲菜單。
代碼如下:

void test()
{int input = 0;
	do
	{menu();
		printf("請選擇:>");
		scanf("%d", &input);
		switch (input)
		{case 1:
			game();
			break;
		case 0:
			printf("退出游戲!\n");
			break;
		default:
			printf("輸入錯誤,請重新選擇!\n");
			break;
		}
	} while (input);
}
2.2 創(chuàng)建并初始化二維數(shù)組board[][] mine[][] (board存放棋盤的信息 mine存放雷的信息)

這里我們使用 宏定義 的方式來創(chuàng)建棋盤行和列以及雷的數(shù)量,方便我們后期對棋盤以及雷數(shù)的修改。
代碼如下:

#define ROW 9  //棋盤行數(shù)
#define COL 9  //棋盤列數(shù)
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10  //雷的數(shù)量

創(chuàng)建并初始化二維數(shù)組,實現(xiàn)游戲大體框架
char mine[ROWS][COLS] = { 0 }; 存放雷的信息
char show[ROWS][COLS] = { 0 };存放排查出的雷的信息
代碼如下:

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;
	while (count)
	{int x = rand() % row + 1;  //1--9
		int y = rand() % col + 1;  //1--9
		if (board[x][y] == '0')
		{	board[x][y] = '1';//布置雷
			count--;
		}
	}
}
2.3 初始化棋盤

在game.c文件中搭建并初始化棋盤。
代碼如下:

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;
	int j = 0;
	for (i = 0; i< rows; i++)
	{for (j = 0; j< cols; j++)
		{	board[i][j] = set;
		}
	}
}

之后在test.c文件中調(diào)用即可
init_board(mine, ROWS, COLS, ‘0’);
init_board(show, ROWS, COLS, ‘*’);

2.4 打印棋盤

代碼如下:

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("\n");
	int i, j;
	//打印列號
	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 ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

注:在打印棋盤還應(yīng)考慮打印間隙、行號以及列號,便于觀察結(jié)果。

2.5 設(shè)置雷區(qū)

布置雷是一個隨機(jī)過程,要用到rand()函數(shù),并在代碼中設(shè)置界限,使得隨機(jī)值產(chǎn)生的坐標(biāo)在合法坐標(biāo)范圍之內(nèi)
代碼如下:

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;
	while (count)
	{int x = rand() % row + 1;  //1--9
		int y = rand() % col + 1;  //1--9
		if (board[x][y] == '0')
		{	board[x][y] = '1';//布置雷
			count--;
		}
	}
}
2.6 掃雷

掃出所有雷即為勝利,“踩”倒雷即為失敗

若選中不是雷的坐標(biāo),顯示周圍8個坐標(biāo)總共有多少雷(該過程用函數(shù)get_mine_count(char mine[ROWS][COLS],int x, int y)實現(xiàn))

最終利用函數(shù)FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col)返回結(jié)果,該函數(shù)中注意設(shè)置所排坐標(biāo)的合法性,若坐標(biāo)非法需提示玩家 “輸入坐標(biāo)非法,請重新輸入!”。
代碼如下:

int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//'0' - '0' = 0
	//'1' - '0' = 1
	//'3' - '0' = 3
	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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;
	int y = 0;
	int win = 0;
	while (winprintf("請輸入要排查的坐標(biāo):>");
		scanf("%d%d", &x, &y);
		//判斷坐標(biāo)合法性
		if (x >= 1 && x<= 9 && y >= 1 && y<= 9)
		{	//1、踩雷
			if (mine[x][y] == '1')
			{		printf("很遺憾,您被炸死了!\n");
				DisplayBoard(mine, row, col);
				break;
			}
			//2、未踩雷
			else
			{		//計算x,y坐標(biāo)周圍有幾顆雷
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';  //數(shù)字轉(zhuǎn)字符
				DisplayBoard(show, row, col);
				win++;
			}
		}
		else
		{	printf("輸入坐標(biāo)非法,請重新輸入!\n");
		}
	}
	if (win = row*col - EASY_COUNT)
		printf("恭喜您,排雷成功。\n");
}
三、完整代碼展示 3.1 game.h板塊

代碼如下:

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 70

#include#include#includevoid InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);
3.2 game.c板塊

代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;
	int j = 0;
	for (i = 0; i< rows; i++)
	{for (j = 0; j< cols; j++)
		{	board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("\n");
	int i, j;
	//打印列號
	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 ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;
	while (count)
	{int x = rand() % row + 1;  //1--9
		int y = rand() % col + 1;  //1--9
		if (board[x][y] == '0')
		{	board[x][y] = '1';
			count--;
		}
	}
}

int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//'0' - '0' = 0
	//'1' - '0' = 1
	//'3' - '0' = 3
	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 FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;
	int y = 0;
	int win = 0;
	while (winprintf("請輸入要排查的坐標(biāo):>");
		scanf("%d%d", &x, &y);
		//判斷坐標(biāo)合法性
		if (x >= 1 && x<= 9 && y >= 1 && y<= 9)
		{	//1、踩雷
			if (mine[x][y] == '1')
			{		printf("很遺憾,您被炸死了!\n");
				DisplayBoard(mine, row, col);
				break;
			}
			//2、未踩雷
			else
			{		//計算x,y坐標(biāo)周圍有幾顆雷
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';  //數(shù)字轉(zhuǎn)字符
				DisplayBoard(show, row, col);
				win++;
			}
		}
		else
		{	printf("輸入坐標(biāo)非法,請重新輸入!\n");
		}
	}
	if (win = row*col - EASY_COUNT)
		printf("恭喜您,排雷成功。\n");
}
3.3 test.c板塊

代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{printf("******************************\n");
	printf("******     1. play      ******\n");
	printf("******     0. exit      ******\n");
	printf("******************************\n");
}
void game()
{//雷的信息存儲
	//1.布置雷的信息
	char mine[ROWS][COLS] = {0 };
	//2.排查出雷的信息
	char show[ROWS][COLS] = {0 };
	//初始化棋盤
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//打印棋盤
	DisplayBoard(show, ROW, COL);
	//布置雷
	SetMine(mine, ROW, COL);
	//掃雷
	FindMine(mine, show, ROW, COL);
}
void test()
{srand((unsigned int)time(NULL));
	int input = 0;
	do
	{menu();
		printf("請選擇:>");
		scanf("%d", &input);
		switch (input)
		{case 1:
			game();
			break;
		case 0:
			printf("退出游戲!\n");
			break;
		default:
			printf("輸入錯誤,請重新選擇!\n");
			break;
		}
	} while (input);
}
int main()
{test();
}
四、代碼運(yùn)行結(jié)果展示

在這里插入圖片描述在這里插入圖片描述

總結(jié)

這個簡單的小游戲非常適合C語言新手小白操作,我們可以嘗試把它的代碼完整打出來,并且當(dāng)成功運(yùn)行后我們將會有一定的成就感并從中得到鼓勵以及接下來對C語言學(xué)習(xí)的信心。最后也歡迎各位大佬指出其中的錯誤。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

分享文章:【C語言】掃雷游戲詳解及完整代碼-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://muchs.cn/article12/deiigc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、面包屑導(dǎo)航、手機(jī)網(wǎng)站建設(shè)做網(wǎng)站、微信公眾號網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管