思路:
和三子棋实现的方法相同创建三个文件
头文件:(game.h)包含有函数的声明,头文件的引用,变量的声明
源文件:(test.c)游戏逻辑的实现
(game.c)具体游戏的函数的实现
设置两个数组
1.mine --- 放置雷的具体位置 char
2.show --- 排查后所在坐标的情况 char
步骤:
1.初始化棋盘(两个)
mine 放入'0'
show 放入'*'
2.mine数组内,放置雷
'0'代表无雷 '1'代表有雷 随机放置
3.show数组内,排查雷(x,y)
a.若在(x,y)位置,mine数组内放置为'1'则爆炸,游戏结束;
b.若在(x,y)位置,mine数组内放置为'0',则统计周围的雷的个数。
4.打印数组
mine雷棋盘为游戏结束后,最后打印;
show雷棋盘一直被打印在屏幕上。
第一部分:game.h
#pragma once
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MineNum 10
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
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
#include "game.h"
void menu()
{
printf("\n");
printf("***************************\n");
printf("***************************\n");
printf("******* 1. play *******\n");
printf("******* 0. exit *******\n");
printf("***************************\n");
printf("***************************\n");
}
//设置两个数组
//1.mine --- 放置雷的具体位置 char
//2.show --- 排查后所在坐标的情况 char
//步骤:
//1.初始化棋盘(两个)
// mine 放入'0'
// show 放入'*'
//2.mine数组内,放置雷
// '0'代表无雷 '1'代表有雷 随机放置
//3.show数组内,排查雷(x,y)
// a.若在(x,y)位置,mine数组内放置为'1'则爆炸,游戏结束;
// b.若在(x,y)位置,mine数组内放置为'0',则统计周围的雷的个数。
//4.打印数组
//mine雷棋盘为游戏结束后,最后打印;
//show雷棋盘一直被打印在屏幕上。
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//打印棋盘
DisplayBoard(show, ROW, COL);
//放置雷
SetMine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
//排查雷
FindMine(mine,show, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:>");
scanf("%d", &input);
system("cls");//清除屏幕上的所有内容
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
#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;
int j = 0;
for (i = 0; i < row + 1; 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");
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = 0;
while (count<MineNum)
{
int x = rand() % row + 1;
int y = rand() % col + 1;//每次循环就要生成一次随机坐标
if (board[x][y] == '0')
{
board[x][y] = '1';
count++;
}
}
}
int GetMine(char board[ROWS][COLS], int row, int col, int x, int y)
{
int count = 0;
int i = 0;
int j = 0;
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
//注意mine数组中是'0'和'1',需要减去'0'才是整型0和1
count += board[x + i][y + j] - '0';
}
}
return count;
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
//show数组内,排查雷(x, y)
// a.若在(x,y)位置,mine数组内放置为'1'则爆炸,游戏结束;
// b.若在(x,y)位置,mine数组内放置为'0',则统计周围的雷的个数。
int x = 0;
int y = 0;
while (1)
{
printf("请输入你要排查的坐标:>");
scanf("%d %d", &x, &y);//输入坐标
system("cls");
//判断坐标合法性
int sum = row*col-MineNum;
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (mine[x][y] == '1')
{
system("cls");
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int count = GetMine(mine, ROW, COL, x, y);
//注意count为整型,show数组为char类型,需要+'0'
show[x][y] = count+'0';
sum--;
DisplayBoard(show, ROW, COL);
}
}
else
{
printf("输入非法,请重新输入\n");
}
if (sum == 0)
{
system("cls");
printf("恭喜你,扫雷成功\n");
DisplayBoard(mine, ROW, COL);
break;
}
}
}