C語言陣列應用例項2: 掃雷遊戲

Josvin發表於2020-11-03

實現示例

在這裡插入圖片描述

實現程式碼

game.h

#ifndef  _GAME_H_
#define _GAME_H_

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<windows.h>


#define ROW 12
#define COL 12
#define NUMS 20 //設定雷的個數,可以用來控制遊戲的難度

#pragma warning(disable:4996)

void Menu();
void Game();



#endif

main.c

#include "game.h"

int main() {
	int quit = 0;
	int select = 0; //  控制使用者選擇開始遊戲還是退出遊戲
	while (!quit) {
		Menu();
		scanf("%d", &select);
		switch(select){
			case  1:
				Game();
				break;

			case 2:
				quit = 1;
				break;
			default:
				printf("輸入有誤,請重新選擇!\n");
				break;
		}
	}

	printf("BeyBey!\n");
	system("pause");
	return 0;
}

game.c

#include  "game.h"
void Menu() {
	printf("###################################\n");
	printf("###################################\n");
	printf("####    1.Play       2.Exit    ####\n");
	printf("###################################\n");
	printf("###################################\n");
	printf("請輸入#\n");
}

void SetMines(char board[][COL], int row, int col) {
	int num = NUMS;
	while (num) {
		//  隨機生成下標放置雷,注意+1
		int x = rand() % 10 + 1;
		int y = rand() % 10 + 1;
		if (board[x][y] == '0') {
			board[x][y] = '1';
			num--;// 注意 num-- 位置,有可能會生成相同的座標
		}
	}
}


int GetNums(char board[][COL], int row, int col,int x,int y) {
	return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] - 8 * '0';
}

void ShowBoard(char board[][COL], int row, int col)
{
	printf("  ");
	for (int i = 1; i < col - 1; i++){
		printf(" %2d ", i);
	}
	printf("\n");
	printf("-------------------------------------------\n");
	for (int i = 1; i < row - 1; i++){
		printf("%2d|", i);
		for (int j = 1; j < col - 1; j++){
			printf(" %c |", board[i][j]);
		}
		printf("\n");
		printf("-------------------------------------------\n");
	}
}
void Game() {
	system("cls");
	srand((unsigned long)time(NULL));
	char show_board[ROW][COL];// 展示的陣列
	char mine_board[ROW][COL];// 掃描陣列

	memset(show_board, '*', sizeof(show_board));
	memset(mine_board, '0', sizeof(mine_board));

	SetMines(mine_board, ROW, COL);// 佈雷

	int count = (ROW -  2)*(COL - 2) - NUMS; //多少沒有雷的
	int x = 0;
	int y = 0;

	do {
		ShowBoard(show_board, ROW, COL);// 列印顯示給使用者的陣列
		printf("請輸入你要掃的座標#");
		scanf("%d %d", &x, &y);
		//  情況一:輸入座標位置不合法
		if (x < 1 || x > ROW - 2 || y  < 1 || y > COL - 2) {
			printf("輸入位置越界,請重新輸入!\n");
			continue;
		}
		// 情況二:輸入的座標位置已經排除,不能重新掃雷
		if (show_board[x][y] != '*') {
			printf("該位置已經被排除!\n");
			continue;
		}

		//  情況三:mine_board[x][y]  裡邊是'1',說明踩到雷了,被炸死遊戲結束
		if (mine_board[x ][y] == '1') {
			break;
		}
		// 計算(x,y)附近的雷的個數
		int  num = GetNums(mine_board, ROW, COL,x,y);
		show_board[x][y] = num + '0';// 注意陣列型別是  char型別
		count--;// 要排除的空位置減1
		system("cls");
	} while (count);// 只要沒有排完那麼就一直迴圈
	// 跳出迴圈有兩種可能   1、排完了 count ==0   2、被炸死了
	if (count > 0) {
		printf("你被炸死了!\n");
		ShowBoard(mine_board, ROW, COL);
	}
	else {
		printf("恭喜,你通過遊戲!\n");

	}



}

相關文章