一.大致思路
1、我们得有一个9*9的棋盘;
2、我们在棋盘上布置10颗雷;
3、搜索周围的雷,并且排查雷;
4、判断输赢;
二.编写程序
1.头文件与宏定义
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<stdbool.h> #define MINE_COUNT 10//地雷数量 #define ROW 9 #define COL 9//棋盘大小 #define ROWS ROW+2 #define COLS COL+2 int setp = ROW * COL - MINE_COUNT; int flag = 1; #pragma warning (disable:6031)
2.菜单制作
void Menu() { printf("******************\n"); printf("******1.Play******\n"); printf("******0.Exit******\n"); printf("******************\n"); }
制作一个简易的菜单,告诉玩家应该怎么使用
3.主函数的编写
int main() { srand((unsigned int)time(NULL));//产生真正的随机数 int input = 1; while (input != 0) { Menu(); printf("请输入选项:"); scanf("%d", &input); switch (input) { case 1: system("cls"); game(); break; case 0: system("pause"); system("cls"); printf("已成功退出游戏!"); break; default: system("pause"); system("cls"); printf("输入有误,请重新输入!"); break; } } return 0; }
4.子函数的声明
void Hide_board(char a[][COLS], int x, int y, char set);//初始化棋盘 void Show_board(char a[][COLS], int x, int y);//打印棋盘 void Set_mine(char mine[][COLS], int x, int y, int count);//布置雷 void Find_mine(char show[][COLS], char mine[][COLS], int x, int y);//排查雷 int get_mine(char show[][COLS], char mine[][COLS], int x, int y);//得到雷的数量 bool is_mine(char mine[][COLS], int m, int n);//判断下m,n是否为雷 bool is_find(char show[][COLS], int m, int n);//判断是否被排查过 void surprise(char mine[][COLS], char show[][COLS], int x, int y, int m, int n);//展开一片
5.初始化棋盘与打印棋盘
void Hide_board(char a[][COLS], int x, int y, char set) { for (int i = 1; i <= x; i++) { for (int j = 1; j <= y; j++) { a[i][j] = set; } } } void Show_board(char a[][COLS], int x, int y) { for (int i = 0; i <= x; i++) { if (i < 10) printf("%d ", i); else { printf("%c", 'A' + i - 10); } } putchar('\n'); for (int j = 0; j <= x; j++) { printf("--"); } putchar('\n'); for (int i = 1; i <= y; i++) { if (i < 10) printf("%d|", i); else { printf("%c|", 'A' + i - 10); } for (int j = 1; j <= x; j++) { printf("%c ", a[i][j]); } putchar('\n'); } }
6.布置雷
void Set_mine(char mine[][COLS], int x, int y, int count) { int m = 0; int n = 0; while (count) { m = rand() % x + 1; n = rand() % y + 1; if (mine[m][n] == ' ') { mine[m][n] = '*'; count--; } } }
7.排查雷
void Find_mine(char show[][COLS], char mine[ROWS][COLS], int x, int y) { int m = 0; int n = 0; char ch = 0; int win = 0; while (scanf("%d %d %c", &m, &n, &ch) != EOF)//无空格报错 { if (m >= 1 && m <= x && n >= 1 && n <= y) { if (!is_find(show, m, n)) { if (show[m][n] == '!' && 'Y' == ch) { show[m][n] = '@'; printf("取消标记成功!\n"); system("cls"); Show_board(show, x, y); break; } if ('Y' == ch) { show[m][n] = '!'; printf("标记成功!\n"); system("pause"); system("cls"); Show_board(show, x, y); break; } else { if (is_mine(mine, m, n)) { printf("你被雷炸死了\n\a\a\a"); show[m][n] = '*'; flag = 0; system("pause"); system("cls"); Show_board(show, x, y); break; } else { surprise(mine, show, x, y, m, n); system("pause"); system("cls"); Show_board(show, x, y); break; } } } else { printf("坐标已经排查过,请重新输入:\n"); } } else { printf("坐标非法,请重新输入!\n"); } } }
8.得到雷的数量
int get_mine(char show[][COLS], char mine[][COLS], int m, int n) { int count = 0; if (mine[m - 1][n - 1] == '*') count++; if (mine[m - 1][n] == '*') count++; if (mine[m - 1][n + 1] == '*') count++; if (mine[m][n - 1] == '*') count++; if (mine[m][n + 1] == '*') count++; if (mine[m + 1][n - 1] == '*') count++; if (mine[m + 1][n] == '*') count++; if (mine[m + 1][n + 1] == '*') count++; return count; }
9. 判断下m,n是否为雷以及判断是否被排查过
bool is_mine(char mine[][COLS], int m, int n) { if (mine[m][n] == ' ') return false; return true; } bool is_find(char show[][COLS], int m, int n) { if (show[m][n] == '@' || show[m][n] == '!') return false; return true; }
10.展开一片的实现
void surprise(char mine[][COLS], char show[][COLS], int x, int y, int m, int n) { if (!(m >= 1 && m <= x && n >= 1 && n <= y)) return; if (is_mine(mine, m, n) || is_find(show, m, n)) return; setp--; int count = get_mine(show, mine, m, n); show[m][n] = count + '0'; if (count == 0) { surprise(mine, show, x, y, m - 1, n - 1); surprise(mine, show, x, y, m - 1, n); surprise(mine, show, x, y, m - 1, n + 1); surprise(mine, show, x, y, m, n - 1); surprise(mine, show, x, y, m, n + 1); surprise(mine, show, x, y, m + 1, n - 1); surprise(mine, show, x, y, m + 1, n); surprise(mine, show, x, y, m + 1, n + 1); } }
11.Play玩法的实现
void game() { char mine[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; Hide_board(mine, ROW, COL, ' ');//初始化 Hide_board(show, ROW, COL, '@');//初始化 Set_mine(mine, ROW, COL, MINE_COUNT);//布置雷 //display_board(mine, ROW, COL);//开透视 Show_board(show, ROW, COL);//展示棋盘(给玩家看); setp = ROW * COL - MINE_COUNT; flag = 1;//重置一下,开始新的游戏 while (setp && flag) { printf("请输入你要排查的位置:\n"); Find_mine(show, mine, ROW, COL); } if (!setp) { system("cls"); printf("挑战成功\a\a\a\a\n"); } else if (!flag) { system("cls"); printf("挑战失败\a\a\a\n"); } Show_board(show, ROW, COL);//展示棋盘(给玩家看); for (int j = 0; j <= COL; j++) { printf("--"); } putchar('\n'); Show_board(mine, ROW, COL); }