C語言實現掃雷遊戲詳細代碼實例

掃雷遊戲

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

大概思路就是這樣具體實現看下面:

菜單的實現代碼:

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();//遊戲實現
			break;
		case 2://清屏選項
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

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

效果展示圖:

image-20210213182334643

制作好菜單那我們開始實現整個遊戲的邏輯框架瞭,定義兩個二維數組,一個用於顯示,一個用於存放地雷。如果這兩個東西都隻用一個二維數組的話後面的實現邏輯會比較麻煩所以我選擇使用兩個二維數組。

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

有這兩個二維數組我們開始初始化

//初始化
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;
		}
	}
}

我遍歷整個二維數組來初始化,val這個參數是用於接收這兩個二維數組的初始化的內容,如果不用這個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");

	}
}

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

image-20210213183529411

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

//埋雷
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

埋雷我采用隨機函數來幫我埋下雷,弄好這步接來的就是掃雷這很關鍵。

掃雷代碼:

//掃雷
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("請輸入有效數字!\n");
		}
	}

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

如果玩傢輸入的坐標是合法的我們就統計它周圍有多少雷,統計雷的功能我做成瞭一個內部函數防止重名。

如果全部沒有雷的地方都排查完瞭,我們就停止循環。然後打印下雷的棋盤讓玩傢知道哪有雷,如果被炸死瞭,我們也打印下雷的二維數組讓玩傢死得瞑目。

image-20210213185315518

image-20210213185338283

統計雷的函數:

//統計周圍雷的個數
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';
}

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

統計雷效果圖:

image-20210213185148661

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

通關也會打印所有雷的位置並提示你是否通關

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(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//雷的數量

//初始化
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);

遊戲實現代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Game.h"

int count = 0;//統計還剩多少格子沒被掃


void game()//遊戲實現
{
	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--;
		}
	}
}

//統計周圍雷的個數
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("請輸入有效數字!\n");
		}
	}

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

主函數代碼:

#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();//遊戲實現
			break;
		case 2://清屏選項
			system("cls");
			break;
		case 0:
			printf("退出程序!\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入!\n");
			Sleep(1000);
			system("cls");
			break;
		}
	} while (input);

	return 0;
}

到此這篇關於C語言實現掃雷遊戲詳細代碼實例的文章就介紹到這瞭,更多相關C語言實現掃雷遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: