1. 程式人生 > >小遊戲---掃雷(C語言實現)

小遊戲---掃雷(C語言實現)

一、分析遊戲步驟:

具體步驟如圖:

 

 

 

二、程式碼實現:

遊戲步驟想好之後,就是用程式碼把步驟一步一步的實現。具體程式碼如下:

1、遊戲主要實現: game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void game()
{
	char mine[ROW + 2][COL + 2];                  //記錄地雷的陣列
	char show[ROW + 2][COL + 2];                  //展示給玩家的陣列

	Init(mine, show, ROW + 2, COL + 2);                //初始化
	set_mine(mine, MINE_NUM);                      //佈雷

	//print_show(mine, ROW, COL);                     //列印佈雷的棋盤

	print_show(show, ROW, COL);                       //列印棋盤

	int ret = -1;                                   //用於遊戲中判斷是否是第一步

	while (1)                                        //玩家進行遊戲
	{
		int x, y;
		int num = -1;
		printf("請輸入座標< x y >:\n");
		scanf("%d%d", &x, &y);
		if (x < 1 || x>10 || y < 1 || x>10)
		{
			printf("輸入的座標有誤,請重新輸入:\n");
		}
		else
		{
			if (ret == -1 && mine[x][y] == '1')           //第一步踩雷
			{
				mine[x][y] = '0';                     //除掉這個雷
				set_mine(mine, 1);                    // 再布一顆雷
			}

			if (mine[x][y] == '0')        //沒有踩雷  
			{
				ret = 0;
				num = get_round_mine(mine, x, y);
				if (num != 0)
				{
					show[x][y] = num + '0';
				}
				else              //周圍一圈都沒有雷
				{
					open_show(mine, show, x, y);  //展開函式 (連續展開)
				}
				print_show(show, ROW, COL);                     //列印棋盤
			}

			else                                                // 踩雷了
			{
				printf("少俠,你踩到雷了!!!\n");
				print_show(mine, ROW, COL);                     //列印棋盤
				return;
			}
		}

		if (Is_win(show))
		{
			printf("恭喜!!!您勝利啦!!!\n");
			break;
		}
	}
}


void Init(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int row, int col)
{
	memset(mine, '0', row*col * sizeof(mine[0][0]));
	memset(show, '*', row*col * sizeof(show[0][0]));
}

void print_show(char show[ROW + 2][COL + 2], int row, int col)           //列印棋盤
{

	int i;
	int j;
	printf("   ");
	for (i = 1; i <= col; i++)
	{
		printf("%2d", i);
	}
	printf("\n   ");
	for (i = 0; i < col; i++)
	{
		printf("--");
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%2d|", i);
		for (j = 1; j <= col; j++)
		{
			printf("%2c", show[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

void set_mine(char mine[ROW + 2][COL + 2], int mineNumber)          //佈雷
{
	int x = -1;
	int y = -1;
	while (mineNumber)
	{
		x = rand() % ROW + 1;
		y = rand() % COL + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			--mineNumber;
		}
	}
}

int get_round_mine(char mine[ROW + 2][COL + 2], 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 + 1][y + 1]) + (mine[x + 1][y]) +
		(mine[x + 1][y - 1]) + (mine[x][y - 1]) - 8 * '0';
}

void open_show(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int x, int y)   //展開函式
{
	if (x >= 1 && x <= 10 && y >= 1 && y <= 10 && (mine[x][y] != 1) && (show[x][y] == '*'))
	{
		if (get_round_mine(mine, x, y) > 0)
		{
			show[x][y] = get_round_mine(mine, x, y) + '0';
		}
		else
		{
			show[x][y] = ' ';
			open_show(mine, show, x - 1, y - 1);
			open_show(mine, show, x - 1, y);
			open_show(mine, show, x - 1, y + 1);
			open_show(mine, show, x, y + 1);
			open_show(mine, show, x, y - 1);
			open_show(mine, show, x + 1, y - 1);
			open_show(mine, show, x + 1, y);
			open_show(mine, show, x + 1, y + 1);
		}
	}
}

int Is_win(char show[ROW + 2][COL + 2])     //判贏
{
	int count = MINE_NUM;
	int i;
	int j;
	for (i = 1; i <= ROW; i++)
	{
		for (j = 1; j <= ROW; j++)
		{
			if (show[i][j] == '*')
			{
				count--;
			}
		}
	}
	if (count == 0)        //雷全部找到
	{
		return 1;
	}
	else
	{
		return 0;
	}
}



 

2、遊戲原始檔:main.c

程式碼如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()           //選單
{
	printf("###################################\n");
	printf("#############  1.play  ############\n");
	printf("#############  0.exit  ############\n");
	printf("###################################\n");

}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 1;
	printf("請選擇遊戲程序: \n");
	do {
		menu();
		scanf("%d", &input);
		switch (input) {
		case 1:
			game();               //主遊戲 
			break;
		case 0:
			break;
		default:
			printf("選擇錯誤,客官請重新選擇:\n");
			break;
		}
	} while (input);


	system("pause");
	return 0;
}

 

3、遊戲標頭檔案:game.h

程式碼如下:

#pragma once

#ifndef _GAME_H_
#define _GAME_H_

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>


#define ROW 10               //棋盤大小
#define COL 10
#define MINE_NUM 10         //雷的個數

void game();

void Init(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int row, int col);  //初始化
void print_show(char show[ROW + 2][COL + 2], int row, int col);                 //列印棋盤
void set_mine(char mine[ROW + 2][COL + 2], int mineNumber);                     //佈雷
int get_round_mine(char mine[ROW + 2][COL + 2], int x, int y);           //獲取周圍雷的個數;
void open_show(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int x, int y);  //展開函式
int Is_win(char show[ROW + 2][COL + 2]);           //判贏

#endif