1. 程式人生 > >用C語言寫一個掃雷程式

用C語言寫一個掃雷程式

執行環境:win10   vs2013

      本程式所有設計思路均已註釋行為標記在程式中,為了方便起見,將不在部落格中進行書寫,想要學的朋友複製下面的原始碼可進行學習,也可將程式進行修改獲取不同的遊戲體驗

程式原始截圖

執行結果:

附上原始碼

#include<stdint.h>
#include<stdlib.h>
#include<string.h>
int  Menu(){
	
	printf("1.開始遊戲\n");
	printf("0.結束遊戲\n");
	printf("請輸入您的選擇!: 0-1\n");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
#define MINE_COUNT 10
#define  ROW  9   //設定為巨集後期可直接修改此處來改變地圖大下
#define  COL   9
//使用二維陣列來表示掃雷的地圖,此處需要使用兩個二維陣列
//第一個二維陣列表示地雷的雷陣
//第二個二維陣列表示使用者看到的地圖
//掃雷的地圖大小是9x9,但是我們準備把這個二維陣列定義成11x11
//此時,我們的地圖有效範圍[1,ROW]和[1,COL]
//對於mine_map.使用'0'表示不是地雷,使用'1'表示地雷
char mine_map[ROW + 2][COL + 2];
//對於show_map使用'*'表示未開啟的方塊,對於開啟的方塊就用具體的數字表示
char show_map[ROW + 2][COL + 2];
void Init(char mine_map[ROW + 2][COL + 2], char show_map[ROW + 2][COL + 2]){
	//1.那陣列進行初始化
	//對於mine_map,先把裡面所有的元素都設定為'0'
	memset(mine_map,'0',(ROW+2)*(COL+2));
	//對於show_map,先把所有的元素都設定成'*'
	memset(show_map, '*', (ROW + 2)*(COL + 2));
	//2.隨機佈置雷陣
	srand(time(0)); //取隨機種子
	int mine_count = MINE_COUNT;
	while (mine_count > 0){
		//在這個迴圈中隨機設定地雷,沒次設定完成一個地雷,mine_count--
		int row = rand()%9+1; //模9得到數字0-8
		int col = rand() % 9 + 1;
		if (mine_map[row][col] == '0'){
			mine_map[row][col] = '1'; 
			--mine_count;
		}
	}
}
void DisplayMap(char map[ROW+2][COL+2]){
	printf("    ");
	//列印第一行的內容 .列的座標
	for (int col = 1; col <= COL; ++col){
		printf("%d ", col);
	}
	printf("\n");
	//列印具體的地圖
	//列印第二行,地圖的上邊框
	for (int col = 1; col <= COL; ++col){
		printf("---");
	}
	printf("\n");
	//按行列印地圖中的具體內容
	for (int row = 1; row <= ROW; ++row){
		//先列印行號
		printf("%02d| ",row);
		for (int col = 1; col <= COL; ++col){
			printf("%c ", map[row][col]);
		}
		printf("\n");
	}
}
void  UpdateShowMap(char show_map[ROW + 2][COL + 2],char mine_map[ROW+2][COL+2]
,int row,int col	){
	int mine_count = 0;
	mine_count = (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');
	show_map[row][col] = '0' + mine_count;   //為了使結果為字元型+'0'
	//需要統計row,col位置的元素周圍有幾個雷,並且把結果更新到show_map中
}
void Game(){
	//1.初始化地圖(mine_map,show_map),佈置雷陣
	int not_mine_count = 0;  //不是地雷的個數
	Init(mine_map, show_map);
	//2.先列印show_map
	DisplayMap(show_map);
	while (1){
		//3.提示使用者進行輸入座標[1,ROW][1,COL]
		int row = 0;
		int col = 0;
		printf("請輸入要翻開的方塊座標(row,col):");
		scanf("%d %d", &row, &col);
		//4.對使用者輸入的合法性進行判定,如果不合理提示使用者重新輸入
		if (row <= 0 || row > ROW || col <= 0 || col > COL){
			printf("輸入不合法!請重新輸入\n");
			continue;
		}
		//5.判定玩家當前是否踩雷,如果踩雷,遊戲結束,並且列印
		if (mine_map[row][col] == '1'){
			printf("遊戲結束!\n");
			DisplayMap(mine_map);
			break;
		}
		//6/如果沒踩雷,判斷玩家是否勝利(條件,已經翻開的方塊數達到了  地圖方塊總數-地雷的個數)
		++not_mine_count;
		if (not_mine_count == ROW*COL - MINE_COUNT){
			printf("掃雷成功!\n");
			DisplayMap(mine_map);
			break;
		}
		//7.如果遊戲沒有勝利,就需要統計當前位置有幾個雷,列印show_map,回到第三步
		UpdateShowMap(show_map,mine_map,row,col);
		DisplayMap(show_map);
	}
}
void Start(){
	while (1){
		int choice = Menu();
		if (choice == 0){
			printf("退出遊戲!\n");
		}
		Game();
	}
}
int  main(){
	Start();
	system("pause");
	return  0;
}