大家好,欢迎来到IT知识分享网。
这篇博客将为大家带来一个c语言写的小程序——扫雷。
用到的知识——数组,函数。
快来围观呀!
目录
1.网页版扫雷
游戏规则 :
1.扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败
2.游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开;
3.1代表1的上下左右及斜角合计有一颗雷,依次轮推,2则有2颗,3则有3颗。在确实是炸弹的方格上点了旗子,就安全了,不是炸弹的被点了旗子,后面会被炸死的。问号就三不确定这里有没有炸弹,不会存在点错了被炸死的状况
1.1本篇扫雷与网页版扫雷的区别
游戏规则相同,但目前没法实现无雷地区展开一片(该步骤可以用递归实现)
本篇扫雷通过依次排查无雷坐标进行实现
2.自制扫雷
2.1新建文件
分别在源文件和头文件下创建game.c,test.c,和game.h
test.c:用于构建扫雷的整体框架结构
game.h:用于存放扫雷中出现的函数的声明,以及所要用到的头文件(简单来说是main函数头上那一堆)
game.c:用于编写扫雷用到的函数定义
有了这些文件可以使程序看起来思路更加清晰,不理解没关系可以接着往下看
2.2代码编写
2.2.1 整体思路
主体: 输出菜单让用户选择——>根据选择判断是否进入游戏——>游戏运行——>游戏结束
游戏运行:
1.生成两个数组,分别代表用户界面的图和内部地雷图(0代表无雷,1代表有雷)
2.用户界面数组初始化为*,内部地雷数组初始化为0
3.用随机数在内部地雷数组中放置雷“1”
4.输出用户界面并让用户输入排查的坐标
5.判断坐标处是否为雷,是雷游戏结束(展示答案),不是雷计算并显示该坐标处的雷数
6.使用while循环,通过对操作次数进行计数判断游戏是否结束
2.2.1 test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" int main() { int a; while (1) { srand((unsigned int)time(NULL)); menu(); printf("请选择:"); scanf("%d", &a); switch (a) { case 1: printf("开始扫雷\n"); game(); break; case 0: printf("游戏结束了\n"); break; default: printf("输入错误,请重新输入\n"); break; } if (a) ; else break; } return 0; }
用while(1)死循环来使用户可进行多次游戏
2.2.2 game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" //输出菜单 void menu(void) { printf("*\n"); printf(" 1.play *\n"); printf(" 0.exit *\n"); printf("*\n"); } //初始化数组 void initi(char arr[ROWW][COLL], char ch) { int i, j; for (i = 0; i < ROWW; i++) { for (j = 0; j < COLL; j++) { arr[i][j] = ch; } } } //输出数组 void print(char arr[ROWW][COLL]) { int i, j; for (i = 0; i <= ROW; i++) { printf("%2d ", i); } printf("\n"); for (i = 1; i <= ROW; i++) { printf("%2d ", i); for (j = 1; j <= COL; j++) { printf("%2c ", arr[i][j]); } printf("\n"); } } //放置雷 void place(char arr[ROWW][COLL], int n) { int count = COUNT; while (count) { int x = rand() % ROW + 1; int y = rand() % COL + 1; if (arr[x][y] != '1') { arr[x][y] = '1'; count--; } } } //计算雷数 char Num(char arr[ROWW][COLL], int a, int b) { int i, j, sum = 0; char result = '0'; for (i = a - 1; i <= a + 1; i++) { for (j = b - 1; j <= b + 1; j++) { sum += arr[i][j] - 48; } } result += sum; return result; } //扫雷实现 void game(void) { int a, b; int freq = 0; char mine[ROWW][COLL], show[ROWW][COLL]; initi(mine, '0'); initi(show, '*');//初始化数组 place(mine, COUNT); while (freq < ROW * COL - COUNT)//判断排查次数是否到达无雷数 { printf("-------扫雷游戏-------\n"); print(show);//输出数组 printf("\n"); printf("请输入:"); scanf("%d%d", &a, &b); if (a >= 1 && a <= ROW && b >= 1 && b <= COL) { if (show[a][b] == '*') { if (mine[a][b] == '1') { printf("恭喜你,你被炸死了\n"); printf("-----以下展示答案-----\n"); print(mine); break; } else if (mine[a][b] == '0') { show[a][b] = Num(mine, a, b); freq++; } } else { printf("输入重复,请重新输入\n"); } } else { printf("越界输入,错误!\n"); } } if (freq == ROW * COL - COUNT) { printf("恭喜你,扫清所有雷!\n"); } }
2.2.3 game.h
#pragma once #define ROW 9 #define COL 9 #define ROWW 11 #define COLL 11 #define COUNT 10 #include<stdio.h> #include<time.h> #include<stdlib.h> //输出菜单 void menu(void); //扫雷实现 void game(void); //初始化数组 void initi(char arr[ROWW][COLL], char ch); //输出数组 void print(char arr[ROWW][COLL]); //放置雷 void place(char arr[ROWW][COLL], int n); //雷数 char Num(char arr[ROWW][COLL], int a, int b);
2.3 程序运行
好了,以上就是简易版扫雷的全部内容,还不快点动手去试试~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119916.html


