继上一次写的那个扫雷游戏之后,我对它并不是很满意,在经过几天的思考之后,昨天晚上三点的多的时候,突然想到了解决办法,于是在今天给它加以实现,实现最终的版本,对于要实现和市面上玩的那种结构,目前以我的水准还做不到,但是它可以只用键盘输入的方式进行一个游玩,那么它就是成功的,代码如下:
头文件:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
void game(void);//游戏主体函数
void put_qipan(char** game, int wide); //输出棋盘函数
void chushiqipan(char** qipan, int wide, char set);//初始化棋盘的函数
void produce_lei(char** game, int wide, int lei_number);//产生雷的函数
void find_zhouwei(char** game, char** show, int x, int y, int* sum, int wide);//用于展开周围的不是雷的点
int find_lei(char** game, int x, int y);给出周围该点周围有几个雷的函数
void intput_lei(char** game, char** show, int wide, int lei_number); //用户输入坐标找雷的函数
int nandu_menu();//选择难度的函数
void chaqizi(char** game, char** show, int wide);//用去插旗子的函数
void zhan_zhouwei(char** game, char** show, int* sum, int wide);//用于查看该点周围是否有0,判别是否继续啊展开的函数
测试文件:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu(void);//菜单函数
int main() {
int is_play = 1;
while(is_play){
menu();
scanf("%d", &is_play);
if (is_play < 0 || is_play > 1) {
printf("输入错误,请重新输入:>");
scanf("%d", &is_play);
}
else if (is_play == 1) {
//system("cls");
game();
}
}
return 0;
}
void menu(void) {
printf("**********************\n");
printf("***三月三款扫雷游戏***\n");
printf("****输入 1 开始游戏***\n");
printf("****输入 0 结束游戏***\n");
printf("**********************\n");
printf("请输入:>");
}
游戏函数文件:
#include"game.h"
void game(void) {
int wide = 11;
int lei_number = 10;
int nandu = nandu_menu();
switch (nandu) {
case 1: {
wide = 11;
lei_number = 10;
break;
}
case 2: {
wide = 17;
lei_number = 40;
break;
}
case 3: {
wide = 27;
lei_number = 99;
break;
}
}
srand(time);
//生成游戏棋盘
char** game = (char**)malloc(wide * sizeof(char*));
for (int i = 0;i < wide;i++) {
game[i] = (char*)malloc(wide * sizeof(char));
}
chushiqipan(game, wide, '0');//初始化游戏棋盘
//生成展示棋盘
char** show = (char**)malloc(wide * sizeof(char*));
for (int i = 0;i < wide;i++) {
show[i] = (char*)malloc(wide * sizeof(char));
}
chushiqipan(show, wide, '*');//初始化展示棋盘
for (int j = 0;j < wide;j++) {
show[0][j] = '0';
show[wide - 1][j] = '0';
show[j][0] = '0';
show[j][wide - 1] = '0';
}
produce_lei(game, wide, lei_number);//产生给定数量的雷
//put_qipan(game, wide);
put_qipan(show, wide);
intput_lei(game, show, wide, lei_number);//用户输入函数
}
//难度菜单
int nandu_menu() {
int nandu = 0;
while (nandu < 1 || nandu > 3){
printf("**********************\n");
printf("*请输如你想选择的难度*\n");
printf("****输入 1 简单模式***\n");
printf("****输入 2 普通模式***\n");
printf("****输入 3 困难模式***\n");
printf("**********************\n");
printf("请输入:>");
scanf("%d", &nandu);
if (nandu < 1 || nandu > 3) {
printf("输入错误,请重新输入\n");
}
}
system("cls");
return nandu;
}
//用户输入排雷坐标函数
void intput_lei(char** game, char** show, int wide, int lei_number) {
int sum_zhan = 0;
int* sum = &sum_zhan;
while (sum_zhan < wide * wide - lei_number) {
int x = 0;
int y = 0;
int choice_chaqi = 1;
do {
printf("****是否要进行插旗****\n");
printf("***输入 1 进行插旗****\n");
printf("***输入 0 进行排雷****\n");
printf("请输入:>");
scanf("%1d", &choice_chaqi);
if (choice_chaqi > 1 || choice_chaqi < 0) {
printf("输入错误,请重新输入\n");
}
else if (choice_chaqi == 1) {
chaqizi(game, show, wide);
system("cls");
put_qipan(show,wide);
}
} while (choice_chaqi);
printf("请输入你想要排雷点的坐标:>");
scanf("%d %d", &x, &y);
if (x < 1 || x > wide - 2 || y < 1 || y > wide - 2) {
printf("输入越界,请重新输入\n");
}
else if (show[x][y] != '*'&&show[x][y]!='&') {
printf("此处已经排过了,请重新输入\n");
}
else if (game[x][y] == '1') {
system("cls");
printf("您踩雷了!游戏结束\n");
put_qipan(game, wide);
break;
}
else {
system("cls");
find_zhouwei(game,show, x, y, sum, wide);
zhan_zhouwei(game, show, sum, wide);
put_qipan(show, wide);
}
}
if (sum_zhan == wide * wide - lei_number) {
system("cls");
printf("游戏获胜,恭喜你排完了所有的雷!\n");
put_qipan(game, wide);
}
}
//用于查看该点周围是否有0,判别是否继续展开的函数
void zhan_zhouwei(char** game, char** show, int* sum, int wide) {
for (int i = 1;i < wide - 1;i++) {
for (int j = 1;j < wide - 1;j++) {
if (show[i][j] == '0' && show[i - 1][j] == '*' ) {
find_zhouwei(game, show, i, j, sum, wide);
}
else if (show[i][j] == '0' && show[i + 1][j] == '*') {
find_zhouwei(game, show, i, j, sum, wide);
}
else if (show[i][j] == '0' && show[i][j - 1] == '*') {
find_zhouwei(game, show, i, j, sum, wide);
}
else if (show[i][j] == '0' && show[i][j + 1] == '*') {
find_zhouwei(game, show, i, j, sum, wide);
}
}
}
int flag = 1;
for (int i = 1;i < wide - 1;i++) {
for (int j = 1;j < wide - 1;j++) {
if (show[i][j] == '0' && show[i - 1][j] == '*') {
flag = 0;
break;
}
else if (show[i][j] == '0' && show[i + 1][j] == '*') {
flag = 0;
break;
}
else if (show[i][j] == '0' && show[i][j - 1] == '*') {
flag = 0;
break;
}
else if (show[i][j] == '0' && show[i][j + 1] == '*') {
flag = 0;
break;
}
}
if (flag == 0) {
break;
}
}
//put_qipan(show, wide);
//Sleep(1000);
if (flag == 0) {
zhan_zhouwei(game, show, sum, wide);
}
}
//用于展开周围的不是雷的点
void find_zhouwei(char** game, char** show, int x, int y, int* sum, int wide) {
//本身
int lei_number = find_lei(game, x, y);
show[x][y] = '0' + lei_number;
(*sum)++;
if (show[x][y] == '0') {
//上方
{
if (x - 1 != 0) {
int lei_number = find_lei(game, x - 1, y);
show[x - 1][y] = '0' + lei_number;
(*sum)++;
}
}
//下方
{
if (x + 1 != wide - 1) {
int lei_number = find_lei(game, x + 1, y);
show[x + 1][y] = '0' + lei_number;
(*sum)++;
}
}
//左边
{
if (y - 1 != 0) {
int lei_number = find_lei(game, x, y - 1);
show[x][y - 1] = '0' + lei_number;
(*sum)++;
}
}
//右边
{
if (y + 1 != wide - 1) {
int lei_number = find_lei(game, x, y + 1);
show[x][y + 1] = '0' + lei_number;
(*sum)++;
}
}
}
}
//给出周围该点周围有几个雷的函数
int find_lei(char** game, int x, int y) {
int lei_number = 0;
for (int i = x - 1;i <= x + 1;i++) {
for (int j = y - 1;j <= y + 1;j++) {
lei_number += game[i][j] - '0';
}
}
return lei_number;
}
//用于插旗子的函数
void chaqizi(char** game, char** show,int wide) {
int x = 0;
int y = 0;
int flag = 1;
while (flag) {
printf("请输入你想要插旗子的坐标:>");
scanf("%d %d", &x, &y);
if (x < 1 || x > wide - 2 || y < 1 || y > wide - 2) {
printf("输入越界,请重新输入\n");
}
else if (show[x][y] !='*') {
printf("此处不可插旗子,请重新输入\n");
}
else{
show[x][y] = '&';
flag = 0;
}
}
}
//产生雷的函数
void produce_lei(char** game, int wide, int lei_number) {
while (lei_number) {
int x = rand( ) % (wide - 3) + 1;
int y = rand( ) % (wide - 3) + 1;
if (game[x][y] != '1') {
game[x][y] = '1';
lei_number--;
}
}
}
//初始化矩阵的函数
void chushiqipan(char **qipan,int wide,char set) {
for (int i = 0;i < wide;i++) {
for (int j = 0;j < wide;j++) {
qipan[i][j] = set;
}
}
}
//输出矩阵的函数
void put_qipan(char **game,int wide) {
//以下为示例输出
printf("***三月三扫雷小游戏***\n");
for (int i = 0;i < wide-1;i++) {
printf("%2d", i);
}
printf("\n");
for (int i = 1;i < wide-1;i++) {
printf("%2d", i);
for (int j = 1;j < wide-1;j++) {
printf("%2c", game[i][j]);
}
printf("\n");
}
//以上为示例输出
}