前言:
相信大家很多人都玩过扫雷,下面我将通过用C语言来实现简单的扫雷程序。
分析:
1.首先我们需要设置两个二维数组mine_board和show_board,这两个数组分别为埋雷数组和展示面板数组,同时都设置为12 *12的数组,其次我们要对数组初始化。但我们要明白一点,虽然我们设置为12 *12的数组,但是我们只用10 *10的空间,设为12 *12的目的是因为我们每下一步都要计算当前这步的周围埋雷个数,当计算四个角和边的时候不方便计算,所以设置为12 *12的数组。
2.mine_board和show_board数组分别初始化为全0和全*
3.mine_board数组中0代表无地雷,1代表有雷
4.我们要求最后要是玩家输了将要展示mine_board面板,以验证正确性
5.在进行函数实现时要注意下标的应用,面板中我们的下标应为1~10
多文件编程:(三个文件)
main.c //主函数
mine.c //放函数的实现
mine.h //放函数的声明
效果图:
具体实现:
mine.h头文件:
#ifndef _MINE_H_
#define _MINE_H_
#include<stdio.h> //这些都为库函数
#include<windows.h>
#include<string.h>
#include<time.h>
#pragma warning(disable:4996)
#define ROW 12 //行
#define COL 12 //列
#define MINES 12 //我们设置埋雷个数20个
void Menu(); //菜单函数,提供玩家进行选择
void Game();
void SetMine(char mine_board[][COL], int row, int col); //埋雷函数
void ShowBoard(char show_bord[][COL], int row, int col); //显示面板函数
void PlayGame(char show_bord[][COL], char mine_board[][COL], int row, int col);
int GetMineNum(char mine_board[][COL], int i, int j); //得到每步的周围雷的个数
#endif
mine.c源文件:
#include "mine.h"
void Menu() //提供玩家进行选择的函数
{
printf("***************************\n");
printf("****** 1.Play ******\n");
printf("****** 2.Exit ******\n");
printf("***************************\n");
}
static int GetIndex(int start, int end) //static定义的函数只能在本文件进行使用
{
return rand() % (end - start + 1) + start; //产生的随机坐标为1-10 rand()产生随机数函数
}
void SetMine(char mine_board[][COL], int row, int col) //埋雷函数
{
srand((unsigned long)time(NULL)); //使用rand()函数生成随机数必须有这个随机数种子
int mine_num = MINES;
while (mine_num) //循环20次,设置20个雷
{
int i_index = GetIndex(1, col - 2); //雷的行坐标
int j_index = GetIndex(1, col - 2); //雷的纵坐标
if (mine_board[i_index][j_index] == '0') //为0说明此处可以附雷
{
mine_board[i_index][j_index] = '1';
mine_num--;
}
}
}
int GetMineNum(char mine_board[][COL], int i, int j) //得到每步周围雷的个数的函数
{
return mine_board[i - 1][j - 1] + mine_board[i - 1][j] + \ //共8个位置
mine_board[i - 1][j + 1] + mine_board[i][j - 1] + \
mine_board[i][j + 1] + mine_board[i + 1][j - 1] + \
mine_board[i + 1][j] + mine_board[i][j + 1] - 8 * '0';
}
void Game() //玩游戏函数
{
char mine_board[ROW][COL];
char show_board[ROW][COL];
memset(mine_board, '0', sizeof(mine_board)); //初始化mine_board
memset(show_board, '*', sizeof(show_board)); //初始化show_board
SetMine(mine_board, ROW, COL);
PlayGame(show_board, mine_board, ROW, COL); //开始玩游戏了
}
void ShowBoard(char show_board[][COL], int row, int col) //显示面板函数
{
int i = 1, j = 1;
printf(" ");
for (i; i <= col - 2; i++) //第一行显示1-10个数字
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < col - 2; i++) //显示下划线
printf("-----");
printf("\n");
for (i = 1; i <= row - 2; i++)
{
printf("%2d|", i);
for (j = 1; j <= col - 2; j++)
{
printf(" %c |", show_board[i][j]);
}
printf("\n");
int k = 1;
for (k; k< col - 2; k++)
printf("-----");
printf("\n");
}
}
void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col)
{
int i = 0, j = 0;
int total = (ROW - 2)*(COL - 2); //总共100个空间
while (1)
{
ShowBoard(show_board, row, col);
printf("Please enter Pos(x,y):"); //输入所下的位置
scanf("%d %d", &i, &j);
if (i >= 1 && i <= row - 2 && j >= 1 && j <= col - 2) //合法下标
{
if (mine_board[i][j] == '0') //此位置没有地雷
{
int num = GetMineNum(mine_board, i, j); //计算周围雷的个数
show_board[i][j] = num + '0'; //在此位置显示周围雷的个数
total--;
}
else
{
ShowBoard(mine_board, row, col); //显示雷的面板
printf("You Lose!\n"); //只要碰到雷就算输
break;
}
}
else
{
printf("Enter Error!Please Again\n"); //输入的位置不合适
continue;
}
if (total == MINES) //最后刚好只剩20个全部都为雷则获胜
{
printf("You Win!\n");
break;
}
}
}
main.c头文件:
#include "mine.h"
int main()
{
int select = 0, quiz = 0;
while (!quiz)
{
Menu(); //提供玩家进行选择的函数:1玩游戏,2退出游戏
printf("Plese select:>");
scanf("%d", &select);
switch (select)
{
case 1:
Game();
break;
case 2:
quiz = 1;
printf("Exit\n");
break;
default:
printf("Select error!Please again\n");
break;
}
}
return 0;
}
总结:
拿到问题要进行分析,懂得函数的功能模块化,然后去不断调用并实现。