test.c
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//扫雷游戏大概 我们需要一个正方形的棋盘,每次点击也就是排查的时候,判断这个点是否有雷,并且统计出在这个点的周围有几个雷存在
//不需要返回单纯打印就可以
void menu() {
printf("**********************\n");
printf("***** 1.开始游戏 *****\n");
printf("***** 0.退出游戏 *****\n");
printf("**********************\n");
}
//游戏函数
//游戏函数
void game() {
//定义两个数组,也就是两个棋盘,一个为被掩盖住的棋盘(也就是排查雷的棋盘),一个则是布置雷的棋盘,之所以创建两个数组是因为,假设你
//排查出一个点,但此时显示1,你并不知道这个1是雷,还是指这周围有一个雷。
char chessboard[rows][lists];//布置雷的棋盘
char chessboard2[rows][lists];//排查雷的棋盘
//初始化数组,也就是棋盘
Inta(chessboard,rows,lists,'0');
Inta(chessboard2,rows,lists,'*');
//打印棋盘
/*print(chessboard2, row, list);*/
//布置雷
settime(chessboard,row,list);
print(chessboard2, row, list);
排查雷
Inve(chessboard, chessboard2, row, list);
}
int main() {
int input;
//随机数
srand((unsigned int)time(NULL));
do {
//首先打印选择界面,写一个函数
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入有误,请重新选择");
break;
}
} while (input);
return 0;
}
第二部分
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//由于我们最终需要的棋盘还是9x9的所以,循环还是9次就好
void Inta(char arr[rows][lists],int Row,int List,char set) {
int i = 0;
//循环行
for (i = 0; i < rows; i++) {
int j = 0;
for (j = 0; j < lists; j++) {
arr[i][j] = set;
}
}
}
//打印棋盘
void print(char arr[rows][lists], int Row, int Rist) {
int i = 1;
for (int i = 0; i <= row; i++) {
printf("%d ",i);
}
printf("\n");
//循环行
for (int i = 1; i <= row; i++) {
printf("%d ", i);
int j = 1;
for (j = 1; j <= list; j++) {
printf("%c ", arr[i][j]);
}
printf("\n");
}
}
void settime(char arr[rows][lists], int Row, int List) {
//布置10个雷
int count = 10;
while (count) {
int x = rand()%row + 1;//随机1-9行
int y = rand()%list + 1;// 随机1-9列
//判断此坐标是否以及有雷
if (arr[x][y] == '0') {
arr[x][y] = '1';
count--;
}
}
}
int around(char chessboard[rows][lists],int x,int y) {
return chessboard[x - 1][y] + chessboard[x - 1][y - 1] + chessboard[x][y - 1] +
chessboard[x + 1][y - 1] + chessboard[x + 1][y] + chessboard[x + 1][y + 1] +
chessboard[x][y + 1] + chessboard[x-1][y+1] - 8 * '0';
}
void Inve(char chessboard[rows][lists], char chessboard2[rows][lists], int Row, int List) {
int x = 0;
int y = 0;
int win = 0;
while (win < row * list -10) {
printf("请输入你要排查的坐标:");
scanf("%d %d", &x, &y);
//判断输入的坐标是否在范围内
if (x >= 1 && x <= row && y >= 1 && y <= list) {
if (chessboard[x][y] == '1') {
printf("你被炸死了");
print(chessboard, row, list);
break;
}
else {
int n = around(chessboard,x,y);
//原先这里放的是星号,当你排查完不是炸弹的时候,这个位置上的0就变成统计周围炸弹的数字
chessboard2[x][y] = n + '0';
print(chessboard2, row, list);
}
}
else {
printf("您的输入有误\n");
}
}
if (win == row * list - 10) {
printf("恭喜你,排雷成功");
print(chessboard, row, list);
}
}
第三部分
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
//如果我们定义的是9x9的棋盘,假设我选的坐标是在边上,那么此时去判断它的四周是否有雷,可能会存在越界行为,所以我们干脆创建为11x11
#define row 9
#define list 9
#define rows row+2
#define lists list+2
void Inta(char arr[rows][lists], int Rows,int Rists,char set);
void print(char arr[rows][lists], int Row, int List);
void settime(char arr[rows][lists],int Row,int List);
void Inve(char chessboard[rows][lists], char chessboard2[rows][lists], int Row, int List);
思路以及方法皆有注释