一、游戏规则
二、基本思路
三、代码实现及分析
四、整体代码及结果演示
在初级9*9的的表格内排雷,等级可以任意改动,输入坐标进行排雷,输入坐标处是雷,则游戏失败,输入坐标为非雷,则会显示该坐标8个方向坐标的雷数,知道排除所有雷胜利。
---------------------------------------------------------------------------------------------------------------------------------
1.游戏选择 :进行游戏/退出游戏 - 进行游戏选择 1,退出选择 0
2.设置俩个区域,分别是雷区和显示区,雷区用于存放雷的信息,显示区用于存放排查出雷的信息
3.初始化雷区和显示区
4.布置雷区
5.进行排查雷
6.打印棋盘
---------------------------------------------------------------------------------------------------------------------------------
代码1:游戏选择
void menu()
{
printf("************************\n");
printf("*******1. game*****\n");
printf("*******0. exit*****\n");
printf("************************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入0/1:>\n");
scanf("%d",&input);
switch (input)
{
case 1: game(); break;
case 0: printf("退出游戏\n"); break;
default:printf("输入错误,请您重新输入\n"); break;
}
} while (input);
}
此处用于实现游戏选择,首先进行菜单函数menu()提示,输入0/1,输入0则退出游戏,输入1则进行game()函数,输入其他则input为非0,再次进入循环,知道输入0/1为止
---------------------------------------------------------------------------------------------------------------------------------
代码2.初始化雷区和显示区
char mine[ROWS][COLS] = {0};//存放排雷的信息
char show[ROWS][COLS] = {0};//存放排查出的雷的信息
//初始化一下棋盘
InitBoard(mine,ROWS,COLS,'0');//'0' 11*11
InitBoard(show, ROWS, COLS,'*');//'*'
雷区和显示区相当于一个棋盘,首先我们设置的是初级难度为9*9的棋盘,但是如果大小都设置为9*9,那么显示区为边上的位置(如下图)的8个方向上就会数组越界,所以我们要设置乘11*11的棋盘,但是我们运用的还是中间的1 - 9位置的棋盘。
//棋盘大小设置
#define ROW 9 //行
#define COL 9 //列
#define ROWS ROW+2 //11 * 11
#define COLS COL+2
---------------------------------------------------------------------------------------------------------------------------------
初始化棋盘代码实现:
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0;i < rows;i++)
{
for (j = 0;j < cols;j++)
{
board[i][j] = set;
}
}
}
雷区统一初始化为'0',显示区统一初始化为'*'
--------------------------------------------------------------------------------------------------------------------------------
代码3.布置雷区
//布置雷
SetMine(mine,ROW,COL);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
//在9*9表格里随机布置10个雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;//1 - 9
int y = rand() % col + 1; //每次只生成一个
//判断这个坐标是否有雷
if (board[x][y] != '1')//如果没有雷布置雷
{
board[x][y] = '1';
//布置完一个雷,雷数--
count--;
}
}
}
我们实现的是人机对战,所以电脑下棋实现的实在9*9的棋盘中随机下棋。
#define EASY_COUNT 10//定义雷的个数
代码4.排查雷
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < (row*col - EASY_COUNT))
//如果找到的不是雷的个数 < 71,那么就继续排雷,每找到一次不是雷的就win++,说明排雷成功一次,71次找的都不是雷,那说明排雷成功
{
//排查雷之前需要输入你要排查的坐标
printf("请输入您要排查的坐标:>\n");
scanf("%d%d", &x, &y);
//输入合法的情况下
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//2种情况
//1.该坐标为雷,输,然后打印出雷区
//2.该坐标无雷,显示出该坐标8个方向的雷数
if (Mine[x][y] == '1')
{
printf("很遗憾,您被炸死了\n");
DisplayBoard(Mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(Mine,x,y);//然后在显示区显示这个坐标8个方向雷的个数
Show[x][y] = count + '0';
//显示区放置的都是字符类型,而count 是int ,'3' - '0' = 数字3,所以数字3+'0' = '3';
DisplayBoard(Show, ROW, COL);//打印出显示区
win++;//进入这里说明排雷成功一次
}
}
//输入非法的情况下,重新输入,所以while()
else
{
printf("输入非法,请重新输入\n");
}
}
if (win == (row * col - EASY_COUNT))//71次找的都不是雷,那说明排雷成功
{
printf("恭喜你排雷成功!\n");
DisplayBoard(Mine, ROW, COL);//打印出显示区
}
}
首先,输入行和列都为1-9的合法坐标,不合法则提示"输入非法,请重新输入"等字样,,合法则进入,有俩种情况,一种是该坐标为雷,输掉比赛,打印雷区的现状,另一种则是该坐标不是雷,那么通过GetMineCount(Mine,x,y)函数统计该坐标8个方向的雷数,然后在显示区打印该坐标8个方向的雷数,然后进行下一次排雷,每排完一次雷,win++,因为该棋盘是9*9的棋盘,一共10个雷
,所以当win<(9*9)- 10=71,要一直排雷,当win ==71的时候,说明排完了71次雷,恭喜你排雷成功。
--------------------------------------------------------------------------------------------------------------------------------
排查雷代码中调用的GetMineCount(Mine,x,y)函数如下
//在雷区回去x,y坐标8个方向雷的个数
int GetMineCount(char Mine[ROWS][COLS], int x,int y)
{
int sum = 0;
int count = 0;
int i = 0;
int j = 0;
for (i = x-1;i <= x+1;i++)
{
for (j = y - 1;j <= y+1;j++)
{
if (Mine[i][j] != '0')//是'1'时,count++;
{
count = Mine[i][j] - '0';
sum += count;
}
}
}
return sum;
//return (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] +
// Mine[x - 1][y + 1] - 8 * '0');
}
---------------------------------------------------------------------------------------------------------------------------------
代码5.打印棋盘
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;//打印9*9
int j = 0;
printf("---------------------------\n");
for (i = 0;i <= row;i++)
{
printf("%d ",i);
}
printf("\n");
for (i = 1;i <= row;i++ )
{
printf("%d ",i);
for (j = 1;j <= col;j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
printf("---------------------------\n");
}
---------------------------------------------------------------------------------------------------------------------------------
//game.h 声明
#pragma once
#include
#include
#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows ,int cols);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col);
---------------------------------------------------------------------------------------------------------------------------------
//test.c 测试
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("************************\n");
printf("*******1. game*****\n");
printf("*******0. exit*****\n");
printf("************************\n");
}
void game()
{
char mine[ROWS][COLS] = {0};//存放排雷的信息
char show[ROWS][COLS] = {0};//存放排查出的雷的信息
//初始化一下棋盘
InitBoard(mine,ROWS,COLS,'0');//'0' 11*11
InitBoard(show, ROWS, COLS,'*');//'*'
打印棋盘
//DisplayBoard(mine,ROW,COL);//打印9*9,其他的是防止数组越界
//DisplayBoard(show, ROW, COL);
//布置雷
SetMine(mine,ROW,COL);
DisplayBoard(show, ROW, COL);
//排查雷,需要雷区中的雷数在显示区中显示雷的个数
FindMine(mine,show,ROW,COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入0/1:>\n");
scanf("%d",&input);
switch (input)
{
case 1: game(); break;
case 0: printf("退出游戏\n"); break;
default:printf("输入错误,请您重新输入\n"); break;
}
} while (input);
}
---------------------------------------------------------------------------------------------------------------------------------
//game.c 实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0;i < rows;i++)
{
for (j = 0;j < cols;j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;//打印9*9
int j = 0;
printf("---------------------------\n");
for (i = 0;i <= row;i++)
{
printf("%d ",i);
}
printf("\n");
for (i = 1;i <= row;i++ )
{
printf("%d ",i);
for (j = 1;j <= col;j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
printf("---------------------------\n");
}
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
//在9*9表格里随机布置10个雷
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;//1 - 9
int y = rand() % col + 1; //每次只生成一个
//判断这个坐标是否有雷
if (board[x][y] != '1')//如果没有雷布置雷
{
board[x][y] = '1';
//布置完一个雷,雷数--
count--;
}
}
}
//在雷区回去x,y坐标8个方向雷的个数
int GetMineCount(char Mine[ROWS][COLS], int x,int y)
{
int sum = 0;
int count = 0;
int i = 0;
int j = 0;
for (i = x-1;i <= x+1;i++)
{
for (j = y - 1;j <= y+1;j++)
{
if (Mine[i][j] != '0')//是'1'时,count++;
{
count = Mine[i][j] - '0';
sum += count;
}
}
}
return sum;
//return (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] +
// Mine[x - 1][y + 1] - 8 * '0');
}
//排雷 //问题:Mine[ROW][COL]实参大小和形参大小不一样会导致问题
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < (row*col - EASY_COUNT))//如果找到的不是雷的个数 < 71,那么就继续排雷,每找到一次不是雷的就win++,说明排雷成功一次,71次找的都不是雷,那说明排雷成功
{
//排查雷之前需要输入你要排查的坐标
printf("请输入您要排查的坐标:>\n");
scanf("%d%d", &x, &y);
//输入合法的情况下
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//2种情况
//1.该坐标为雷,输,然后打印出雷区
//2.该坐标无雷,显示出该坐标8个方向的雷数
if (Mine[x][y] == '1')
{
printf("很遗憾,您被炸死了\n");
DisplayBoard(Mine, ROW, COL);
break;
}
else
{
int count = GetMineCount(Mine,x,y);//然后在显示区显示这个坐标8个方向雷的个数
Show[x][y] = count + '0';
//显示区放置的都是字符类型,而count 是int ,'3' - '0' = 数字3,所以数字3+'0' = '3';
DisplayBoard(Show, ROW, COL);//打印出显示区
win++;//进入这里说明排雷成功一次
}
}
//输入非法的情况下,重新输入,所以while()
else
{
printf("输入非法,请重新输入\n");
}
}
if (win == (row * col - EASY_COUNT))//71次找的都不是雷,那说明排雷成功
{
printf("恭喜你排雷成功!\n");
DisplayBoard(Mine, ROW, COL);//打印出显示区
}
}
---------------------------------------------------------------------------------------------------------------------------------
结果演示:
---------------------------------------------------------------------------------------------------------------------------------
初学C语言,以上代码分析为本人拙见,望大家多多指正,有什么问题可以@博主哈