1. 程式人生 > >用C語言寫一個簡單的掃雷小遊戲

用C語言寫一個簡單的掃雷小遊戲

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <time.h>
/*
	用 C 語言寫一個簡單的掃雷遊戲
*/
// 1.寫一個遊戲選單 Menu()
// 2.開始遊戲
	// 1.初始化二維陣列 Init_Interface()
	// 2.列印遊戲介面 Print_Interface()
	// 3.玩家掀起指定位置 Play() --> 指定輸入座標(判斷合法性)
		// 1.判斷該位置是否是雷
		// 2.判斷是否掀掉所有空地
		// 3.如果掀開的是空地,則判斷該空地周圍是否有雷
			// 1.如果周圍有雷,則統計周圍雷的個數
			// 2.如果周圍沒有雷,則掀開周圍除了雷的所有空地,並且統計所掀開空地周圍雷的個數
		// 4.更新地圖
		// 5.繼續 3 的迴圈

//定義全域性變數:
//定義掃雷地圖的長和寬
#define MAX_ROW 9
#define MAX_COL 9
//定義預設的雷數
#define DEFAULT_MINE 9
//定義兩個二維陣列,分別存放初始地圖和雷陣
char show_map[MAX_ROW + 2][MAX_COL + 2];
char mine_map[MAX_ROW + 2][MAX_COL + 2];

//寫一個遊戲選單
int Menu() {
	printf("=========\n");
	printf("1.開始遊戲\n");
	printf("0.結束遊戲\n");
	printf("=========\n");
	printf("請選擇遊戲選單選項:");
	int choice = 0;
	while (1) {
		scanf("%d", &choice);
		if (choice != 0 && choice != 1) {
			printf("您的輸入有誤, 請重新輸入\n");
			continue;
		}
		break;
	}
	return choice;
}

//開始遊戲
//初始化陣列
void Init_Interface() {
	for (int row = 0; row < MAX_ROW + 2; row++) {
		for (int col = 0; col < MAX_COL + 2; col++) {
			show_map[row][col] = '*';
		}
	}
	for (int row = 0; row < MAX_ROW + 2; row++) {
		for (int col = 0; col < MAX_COL + 2; col++) {
			mine_map[row][col] = '0';
		}
	}
	int mine_count = DEFAULT_MINE;
	while (mine_count > 0) {
		int row = rand() % MAX_ROW + 1;
		int col = rand() % MAX_COL + 1;
		if (mine_map[row][col] == '1') { //將雷設定為 1
			//此處已經有雷
			continue;
		}
		mine_count--;
		mine_map[row][col] = '1';
	}
}
//列印初始介面
void Print_Interface(char map[MAX_ROW + 2][MAX_COL + 2]) {
	printf("    ");
	for (int col = 1; col <= MAX_COL; col++) {
		printf("%d ", col);
	}
	printf("\n    ");
	for (int col = 1; col <= MAX_COL; col++) {
		printf("--");
	}
	printf("\n");
	for (int row = 1; row <= MAX_ROW ; row++) {
		printf("%02d |", row);
		for (int col = 1; col <= MAX_COL; col++) {
			printf("%c ", map[row][col]);
		}
		printf("\n");
	}
}
//寫一個統計周圍雷數個數的函式
int Around_Mine_count(int row, int col) {
	return	(mine_map[row - 1][col - 1] - '0'
		+ mine_map[row - 1][col] - '0'
		+ mine_map[row - 1][col + 1] - '0'
		+ mine_map[row][col - 1] - '0'
		+ mine_map[row][col + 1] - '0'
		+ mine_map[row + 1][col - 1] - '0'
		+ mine_map[row + 1][col] - '0'
		+ mine_map[row + 1][col + 1] - '0');
}
//寫一個判斷該位置周圍是否有雷的函式
int No_Mine(int row, int col) {
	if (Around_Mine_count(row, col) == 0) {
		return 1;
	}
	return 0;
}
//寫一個掀開該位置周圍空地的函式
void Open_Blank(int row, int col) {
	show_map[row - 1][col - 1] = '0' + Around_Mine_count(row - 1, col - 1);
	show_map[row - 1][col] = '0' + Around_Mine_count(row - 1, col);
	show_map[row - 1][col + 1] = '0' + Around_Mine_count(row - 1, col + 1);
	show_map[row][col - 1] = '0' + Around_Mine_count(row, col - 1);
	show_map[row][col + 1] = '0' + Around_Mine_count(row, col + 1);
	show_map[row + 1][col - 1] = '0' + Around_Mine_count(row + 1, col - 1);
	show_map[row + 1][col] = '0' + Around_Mine_count(row + 1, col);
	show_map[row + 1][col + 1] = '0' + Around_Mine_count(row + 1, col + 1);
}
//寫一個判斷遊戲結束的函式
int Success_Sweep(char show_map[MAX_ROW + 2][MAX_COL + 2]) {
	int count = 0;
	for (int row = 1; row <= MAX_ROW; row++) {
		for (int col = 1; col <= MAX_COL; col++) {
			if (show_map[row][col] == '*') {
				count++;
			}
		}
	}
	if (count == DEFAULT_MINE) {
		return 1;
	}
	return 0;
}
//開始遊戲
void StartGame() {
	while (1) {
		printf("請輸入您要掀開的座標:");
		int row = 0;
		int col = 0;
		while (1) {
			scanf("%d %d", &row, &col);
			if (row < 1 || row > MAX_ROW || col < 1 || col > MAX_COL) {
				printf("您的輸入有誤,請重新輸入!\n");
				continue;
			}
			if (show_map[row][col] != '*') {
				printf("該位置已被掀開,請重新選擇\n");
				continue;
			}
			break;
		}
		//判斷該地方是否有雷
		if (mine_map[row][col] == '1') {
			Print_Interface(mine_map);
			printf("該地方有雷,遊戲結束!!!\n");
			break;
		}
		if (No_Mine(row, col)) {
			show_map[row][col] = '0';
			Open_Blank(row, col);
		}
		show_map[row][col] = '0' + Around_Mine_count(row, col);
		//判斷是否掀開所有空地
		if (Success_Sweep(show_map) == 1) {
			Print_Interface(mine_map);
			printf("您已成功掃雷!!!\n");
			break;
		}
		system("cls");
		//更新地圖
		Print_Interface(show_map);
	}
}

int main() {
	if (Menu() == 0) {
		exit(0);
	}
	srand((unsigned int)time(NULL));
	Init_Interface();
	Print_Interface(show_map);
	StartGame();

	system("pause");
	return 0;
}

術後在這裡插入圖片描述
數字代表周圍雷的個數