实现一个简单的扫雷游戏,需要包含以下几个基本的功能:
- 雷随机分布;
- 第一次找到的坐标不是雷的位置(如果是,则重新输入坐标);
- 当输入坐标不是雷时,展开该坐标周围,并标明雷的数目;
- 可以对雷的位置进行标记。
-
要想使雷的位置随机分布,需要调用
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;
}
试完一把:
欧气满满,一次排出雷!
扫雷的实现大概就是这样,静等各位码农指正交流(手动比心)。