初始化
void initboard(char board[ROWS][COLS], int row, int col, char set)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
显示输出
void displayboard(char board[ROWS][COLS], int row, int col)
{
//列标
for (int i = 0; i <= row; i++)
{
if (i == 0)
{
printf(" ");
}
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%2d ", i);//行号
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
设置雷
随机数种子
srand((unsigned int)time(NULL));
随机设置雷的位置
void setmine(char board[ROWS][COLS], int row, int col)
{
int mine = MINE;//雷数
while (mine)
{
//生成随机坐标x、y
int x = rand() % row + 1;
int y = rand() % col + 1;
//判断该坐标是否已经设置了雷
if (board[x][y] == '0')
{
board[x][y] = '1';
mine--;
}
}
}
排雷
排雷结束条件
- 踩到雷了,就直接输了
- 把不是雷的所有位置都排查过了,就算赢了
void findmine(char mineboard[ROWS][COLS], char showboard[ROWS][COLS], int row, int col)
{
//不是雷的数量
int win = row * col - MINE;
while (win)
{
int x = 0;
int y = 0;
displayboard(showboard, row, col);
printf("请输入所要排雷的坐标:>");
scanf("%d%d",&x,&y);
//判断坐标的合法性
if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//合法
{
//判断该坐标位置是否已经棑查过了
if (showboard[x][y] == '*')//没排查过
{
//排到的是雷
if (mineboard[x][y] == '1')
{
printf("排雷失败\n");
displayboard(mineboard, row, col);
break;
}
else//排到的不是雷
{
win--;//不是雷的个数--
showboard[x][y] = minenum(mineboard, x, y) + '0';
}
}
else//排查过了
{
printf("请勿重复排查\n");
}
}
else//不合法
{
printf("输入坐标不合法,请重新输入\n");
}
}
if (win == 0)
{
printf("排雷成功\n");
displayboard(mineboard, row, col);
}
}
因为有两个二维数组,一个十展现出来给玩家看的,一个是保存有雷的位置的,所以在玩家输入排查的位置的坐标后,要在该坐标显示周围有多少个雷。
代码如下:
int minenum(char mineboard[ROWS][COLS], int x, int y)
{
return mineboard[x - 1][y - 1] +
mineboard[x - 1][y] +
mineboard[x - 1][y + 1] +
mineboard[x][y + 1] +
mineboard[x + 1][y + 1] +
mineboard[x + 1][y] +
mineboard[x + 1][y - 1] +
mineboard[x][y - 1] - 8 * '0';
}
整体代码
text.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
//随机数种子
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择无效,请重新选择\n");
break;
}
} while (input);
return 0;
}
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//菜单
void menu()
{
printf("============\n");
printf("= 1.play =\n");
printf("= 0.exit =\n");
printf("============\n");
}
//初始化
void initboard(char board[ROWS][COLS], int row, int col, char set)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
//显示输出
void displayboard(char board[ROWS][COLS], int row, int col)
{
//列标
for (int i = 0; i <= row; i++)
{
if (i == 0)
{
printf(" ");
}
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%2d ", i);//行号
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//设置雷
void setmine(char board[ROWS][COLS], int row, int col)
{
int mine = MINE;//雷数
while (mine)
{
//生成随机坐标x、y
int x = rand() % row + 1;
int y = rand() % col + 1;
//判断该坐标是否已经设置了雷
if (board[x][y] == '0')
{
board[x][y] = '1';
mine--;
}
}
}
//该坐标周围存在雷的个数
int minenum(char mineboard[ROWS][COLS], int x, int y)
{
return mineboard[x - 1][y - 1] +
mineboard[x - 1][y] +
mineboard[x - 1][y + 1] +
mineboard[x][y + 1] +
mineboard[x + 1][y + 1] +
mineboard[x + 1][y] +
mineboard[x + 1][y - 1] +
mineboard[x][y - 1] - 8 * '0';
}
//排雷
void findmine(char mineboard[ROWS][COLS], char showboard[ROWS][COLS], int row, int col)
{
//不是雷的数量
int win = row * col - MINE;
while (win)
{
int x = 0;
int y = 0;
displayboard(showboard, row, col);
printf("请输入所要排雷的坐标:>");
scanf("%d%d",&x,&y);
//判断坐标的合法性
if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//合法
{
//判断该坐标位置是否已经棑查过了
if (showboard[x][y] == '*')//没排查过
{
//排到的是雷
if (mineboard[x][y] == '1')
{
printf("排雷失败\n");
displayboard(mineboard, row, col);
break;
}
else//排到的不是雷
{
win--;//不是雷的个数--
showboard[x][y] = minenum(mineboard, x, y) + '0';
}
}
else//排查过了
{
printf("请勿重复排查\n");
}
}
else//不合法
{
printf("输入坐标不合法,请重新输入\n");
}
}
if (win == 0)
{
printf("排雷成功\n");
displayboard(mineboard, row, col);
}
}
//扫雷游戏
void game()
{
//隐数组
char mineboard[ROWS][COLS];
//显数组
char showboard[ROWS][COLS];
//初始化隐数组--0表示不是雷,1表示雷
initboard(mineboard, ROWS, COLS, '0');
//初始化显数组--*号让玩家看不到棋盘的分布
initboard(showboard, ROWS, COLS, '*');
//设置雷
setmine(mineboard, ROW, COL);
displayboard(mineboard, ROW, COL);
//排雷
findmine(mineboard, showboard, ROW, COL);
}
game.h
#pragma once
//便于之后修改行、列
#define ROW 10
#define COL 10
#define ROWS 10+2
#define COLS 10+2
#define MINE 10
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//菜单
void menu();
//扫雷游戏
void game();