C语言------扫雷

实现一个简单的扫雷游戏,需要包含以下几个基本的功能:

  1. 雷随机分布;
  2. 第一次找到的坐标不是雷的位置(如果是,则重新输入坐标);
  3. 当输入坐标不是雷时,展开该坐标周围,并标明雷的数目;
  4. 可以对雷的位置进行标记。
  • 要想使雷的位置随机分布,需要调用rand()函数;

  • 当第一次输入的坐标是雷的位置时,则重新输入。

  • 当你输入一个坐标的时候,判定周围有没有雷,有雷的显示一个数字,没有雷的话显示0。当继续遇到0的时候将0直接展开,数字的话依然显示数字。最后循环,当周围全部为大于0的数字时停止展开。

送上代码,必要的地方会进行一定的解释。

Mines.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 11
#define COL 11
#define COUNT 10

void menu();
void Choose();//选择
void Game();
void Init_board(char mine[ROW][COL], char show[ROW][COL]);//初始化
void Set_mine(char mine[ROW][COL]);//设置雷的位置
void Show_board(char mine[ROW][COL]);//展示
void Player(char mine[ROW][COL], char show[ROW][COL]);//玩家走棋
 int Get_mine(char mine[ROW][COL], int i, int j);//查雷
void Open_board(char mine[ROW][COL], char show[ROW][COL], int i, int j);//遇雷展开
void Move_mine(char mine[ROW][COL], int i, int j);//第一次走棋遇雷移开

Mine.c

#define _CRT_SECURE_NO_DEPRECATE

#include"Mines.h"

void menu()    
{
	printf("************************************\n");
	printf("****          Welcome Game      ****\n");
	printf("************************************\n");
	printf("****          1.Play            ****\n");
	printf("****          0.Exit            ****\n");
	printf("************************************\n");
}

void Game()
{
	char show[ROW][COL];
	char mine[ROW][COL];
	Init_board(mine, show);
	Set_mine(mine);
	Player(mine, show);
}

void Init_board(char mine[ROW][COL], char show[ROW][COL])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW-1; i++)
	{
		for (j = 0; j < COL-1; j++)
		{
			mine[i][j] = '0';
			show[i][j] = '*';
		}
	}
}

void Set_mine(char mine[ROW][COL])
{
	int i = 0;
	int j = 0;
	int count = COUNT;
	srand((unsigned)time(NULL));
	while (count--)
	{	
		i = rand() % 9 + 1;
		j = rand() % 9 + 1;
		if (mine[i][j] == '0')
		{
			mine[i][j] = '1';
		}
	}
}

//显示输入坐标后的界面
void Show_board(char mine[ROW][COL])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW - 1; i++)
	{
		printf(" %d", i);
	}
	for (i = 1; i < ROW - 1; i++)
	{
		printf("\n");
		printf(" %d", i);
		for (j = 1; j < COL - 1; j++)
		{
			printf(" %c", mine[i][j]);
		}
	}
	printf("\n");
}

void Player(char mine[ROW][COL], char show[ROW][COL])
{
	int i = 0;
	int j = 0;
	int count = 0;
	while (count != ((ROW - 2)*(COL - 2) - COUNT))
	{
		printf("Please enter coordinate:\n");
		scanf("%d%d", &i, &j);

		if (mine[i][j]=='1')
		{
			Move_mine(mine, i, j);
			break;
		}
		else
		{
			int ret = Get_mine(mine, i, j);
			show[i][j] = ret + '0';
			Open_board(mine, show, i, j);
			Show_board(show);
			count++;
		}
	}
	printf("Successfully Minesweeping!\n");
	Show_board(mine);
}

int Get_mine(char mine[ROW][COL], int i, int j)
{
	int count = 0;
	if (mine[i - 1][j - 1] == '1')//左上方
	{
		count++;
	}
	if (mine[i][j - 1] == '1')    //上方
	{
		count++;
	}
	if (mine[i + 1][j - 1] == '1')//右上方
	{
		count++;
	}
	if (mine[i - 1][j] == '1')    //左方
	{
		count++;
	}
	if (mine[i + 1][j] == '1')    //右方
	{
		count++;
	}
	if (mine[i - 1][j + 1] == '1')//左下方
	{
		count++;
	}
	if (mine[i][j + 1] == '1')    //下方
	{
		count++;
	}
	if (mine[i + 1][j + 1] == '1')//右下方
	{
		count++;
	}
	return count;
}

void Open_board(char mine[ROW][COL], char show[ROW][COL], int i, int j)
{
	if (mine[i][j] == '0'&&i >= 0 && j >= 0 && show[i][j] == '*')
	{
		show[i][j] = Get_mine(mine, i, j) + '0';
	}
	if (mine[i][j - 1] == '0'&&i >= 0 && j - 1 >= 0 && show[i][j - 1] == '*')
	{
		show[i][j - 1] = Get_mine(mine, i, j - 1) + '0';
		if (Get_mine(mine, i, j - 1) == 0)
		{
			Open_board(mine, show, i, j - 1);
		}
	}
	if (mine[i][j + 1] == '0'&&i >= 0 && j + 1 >= 0 && show[i][j + 1] == '*')
	{
		show[i][j + 1] = Get_mine(mine, i, j + 1) + '0';
		if (Get_mine(mine, i, j + 1) == 0)
		{
			Open_board(mine, show, i, j + 1);
		}
	}
	if (mine[i - 1][j] == '0'&&i - 1 >= 0 && j >= 0 && show[i - 1][j] == '*')
	{
		show[i - 1][j] = Get_mine(mine, i - 1, j) + '0';
		if (Get_mine(mine, i - 1, j) == 0)
		{
			Open_board(mine, show, i - 1, j);
		}
	}
	if (mine[i - 1][j - 1] == '0'&&i - 1 >= 0 && j - 1 >= 0 && show[i - 1][j - 1] == '*')
	{
		show[i - 1][j - 1] = Get_mine(mine, i - 1, j - 1) + '0';
		if (Get_mine(mine, i - 1, j - 1) == 0)
		{
			Open_board(mine, show, i - 1, j - 1);
		}
	}
	if (mine[i - 1][j + 1] == '0'&&i - 1 >= 0 && j + 1 >= 0 && show[i - 1][j + 1] == '*')
	{
		show[i - 1][j + 1] = Get_mine(mine, i - 1, j + 1) + '0';
		if (Get_mine(mine, i - 1, j + 1) == 0)
		{
			Open_board(mine, show, i - 1, j + 1);
		}
	}
	if (mine[i + 1][j + 1] == '0'&&i + 1 >= 0 && j + 1 >= 0 && show[i + 1][j + 1] == '*')
	{
		show[i + 1][j + 1] = Get_mine(mine, i + 1, j + 1) + '0';
		if (Get_mine(mine, i + 1, j + 1) == 0)
		{
			Open_board(mine, show, i + 1, j + 1);
		}
	}
	if (mine[i + 1][j] == '0'&&i + 1 >= 0 && j >= 0 && show[i + 1][j] == '*')
	{
		show[i + 1][j] = Get_mine(mine, i + 1, j) + '0';
		if (Get_mine(mine, i + 1, j) == 0)
		{
			Open_board(mine, show, i + 1, j);
		}
	}
	if (mine[i + 1][j - 1] == '0'&&i + 1 >= 0 && j - 1 >= 0 && show[i + 1][j - 1] == '*')
	{
		show[i + 1][j - 1] = Get_mine(mine, i + 1, j - 1) + '0';
		if (Get_mine(mine, i + 1, j - 1) == 0)
		{
			Open_board(mine, show, i + 1, j - 1);
		}
	}
}

void Move_mine(char mine[ROW][COL], int i, int j)
{
	srand((unsigned int)time(NULL));
	while (1)
	{
		if (mine[i][j] = '1')
		{
			int x = rand() % 8 + 1;
			int y = rand() % 8 + 1;
			mine[i][j] = '0';
			mine[x][y] = '1';
			break;
		}
	}
}

void Choose()
{
	int input = 0;
	do
	{
		menu();
		printf("Please enter option:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 0:
			printf("Please exit!\n");
			break;
		case 1:
			printf("Games Start!\n");
			Game();
			break;
		default:
			printf("Input error,please enter again!\n");
			break;
		}
	} while (input);
}

main.c

#include"Mines.h"

int main()
{
	Choose();
	return 0;
}

试完一把:
在这里插入图片描述
在这里插入图片描述
欧气满满,一次排出雷!
扫雷的实现大概就是这样,静等各位码农指正交流(手动比心)。

猜你喜欢

转载自blog.csdn.net/Hb_key/article/details/83511180
今日推荐