利用C语言实现简易版扫雷
我和我的父亲都是扫雷的狂热粉,小时候我常常因为技术不好而被父亲嘲笑,那么今天我要来做一个简易版扫雷,回头也给他玩一玩。
首先我们要构建好雷盘的样子,我们理所当然想到利用二维数组。那么请注意:因为我们每一次随机生成的雷盘不能展示给用户,所以显示盘与雷盘要分开,那么我们在这里要用到两个二维数组。一个是雷盘,用来记录随机生成雷的布局,另一个是显示盘,初始化全为*,让用户来扫雷。
具体功能:
- 先由电脑随机生成雷的分布。
- 玩家通过输入坐标来选择点。
- 玩家选择对应点后,对应点将显示周围雷的个数(以该点为中心的一个九宫格)。
- 玩家需要根据这个个数,自己推断出有雷的地方,不能输入有雷的对应坐标,只能输入没雷的对应坐标。
- 当输入坐标对应点有雷时,炸“死”,游戏结束。当剩下未选中的点的个数等于总共布下的雷的个数时,游戏胜利。
实现功能的函数:
1.菜单函数,必不可少,是展示给用户的第一界面,这个比较简陋,后期可以考虑做一些fashion一点的。
void Menu() { printf("##########################\n"); printf("#####choose 1 to play#####\n"); printf("#####choose 0 to exit#####\n"); printf("Please input your select here:>\n"); }
2.随机生成雷函数,那么对应雷的横竖坐标就是需要随机生成的数。如果大家看过我之前的三子棋就知道,在这里关于随机生成用到了函数GetIndex,算是一个小优化。
void SetMine(char mine_board[][COL], int row, int col) { srand((unsigned long)time(NULL)); int mine_num = MINES; while (mine_num) { int i_index = GetIndex(1,col-2);//生成1~10的随机数 int j_index = GetIndex(1,col-2); if (mine_board[i_index][j_index] == '0') { mine_board[i_index][j_index] = '1'; mine_num--; } } }
3.GetIndex函数,这里要注意start和end表示的是生成的随机数的范围。之前我们 如果用rand生成0~10的随机数,就直接rand%10,但是如果是5 ~10呢?所以我们用(end-start+1)得到的是0 ~end的范围,再加一个start,就能到到start ~end的范围。
static int GetIndex(int start, int end)//static修饰 代表该函数只能在本文件内部使用 { return rand() % (end - start + 1) + start; }
4.得到一个点周围雷的数量函数,这里要注意,我写的这个函数的返回值是整型,但得到的mine_board的和是字符型,那么要通过8-'0'来转换一下。
int GetMineNum(char mine_board[][COL], int i, int j) { return mine_board[i-1][j-1]+mine_board[i-1][j]+ mine_board[i-1][j+1]+ \ mine_board[i][j-1]+ mine_board[i][j+1]+ \ mine_board[i+1][j-1]+mine_board[i+1][j]+ mine_board[i+1][j+1]-8*'0';//整型 }
5.显示雷盘函数
void ShowBoard(char show_board[][COL], int row, int col) { int i = 0; int j = 0; printf(" "); for (i = 1; i <= col-2; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= col - 1; i++) { printf("----"); } printf("\n"); for (i = 1; i <=row - 2; i++) { printf("%-2d|", i); for (j = 1; j <=col - 2; j++) { printf(" %c |", show_board[i][j]); } printf("\n"); int k = 1; for (k = 1; k <= col - 1; k++) { printf("----"); } printf("\n"); } }
6.进行游戏函数,以total作为一个衡量标准。输入坐标,判断是否为雷的位置,是则游戏结束,不是则总的方块数减1,继续输入坐标。
void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col) { int i = 0; int j = 0; int total = (ROW - 2)*(COL - 2); while (1) { ShowBoard(show_board, row, col); printf("Please enter your pos<x,y>"); scanf("%d%d", &i, &j); if (i >= 1 && i < row - 2 && j >= 1 && j < col - 2) { if (mine_board[i][j] == '0') { int num = GetMineNum(mine_board, i, j); show_board[i][j] = num + '0'; total--; } else { ShowBoard(mine_board, row, col); printf("Game over!you lose!:(\n"); break; } } else { printf("Error!Try again!\n"); continue; } if (total == MINES) { printf("You win:)!\n"); break; } } }
7.Game函数,初始化两个盘,主要调用了前面的函数,对函数的一个整合,来贯穿一下整个流程。
void Game() { char show_board[ROW][COL]; char mine_board[ROW][COL]; memset(show_board, '*', sizeof(show_board)); memset(mine_board, '0', sizeof(mine_board)); SetMine(mine_board, ROW, COL); PlayGame(show_board, mine_board, ROW, COL); }
这里还是采用了文件的形式,分为函数声明,函数定义,主函数。
函数声明 Mine.h
#ifndef _MINE_H_ #define _MINE_H_ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define ROW 12 #define COL 12 #define MINES 20 void Menu(); void Game(); int GetIndex(int start, int end); void SetMine(char mine_board[][COL], int row, int col); int GetMineNum(char mine_board[][COL], int i, int j); void ShowBoard(char show_board[][COL], int row, int col); void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col); #endif
函数定义 Mine.c
#include"Mine.h" void Menu() { printf("##########################\n"); printf("#####choose 1 to play#####\n"); printf("#####choose 0 to exit#####\n"); printf("Please input your select here:>\n"); } static int GetIndex(int start, int end)//static修饰 代表该函数只能在本文件内部使用 { return rand() % (end - start + 1) + start; } //随机生成雷 void SetMine(char mine_board[][COL], int row, int col) { srand((unsigned long)time(NULL)); int mine_num = MINES; while (mine_num) { int i_index = GetIndex(1,col-2); int j_index = GetIndex(1,col-2); if (mine_board[i_index][j_index] == '0') { mine_board[i_index][j_index] = '1'; mine_num--; } } } //得到一个点周围雷的数量 int GetMineNum(char mine_board[][COL], int i, int j) { return mine_board[i-1][j-1]+mine_board[i-1][j]+ mine_board[i-1][j+1]+ \ mine_board[i][j-1]+ mine_board[i][j+1]+ \ mine_board[i+1][j-1]+mine_board[i+1][j]+ mine_board[i+1][j+1]-8*'0';//整型 } //显示雷盘 void ShowBoard(char show_board[][COL], int row, int col) { int i = 0; int j = 0; printf(" "); for (i = 1; i <= col-2; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= col - 1; i++) { printf("----"); } printf("\n"); for (i = 1; i <=row - 2; i++) { printf("%-2d|", i); for (j = 1; j <=col - 2; j++) { printf(" %c |", show_board[i][j]); } printf("\n"); int k = 1; for (k = 1; k <= col - 1; k++) { printf("----"); } printf("\n"); } } void PlayGame(char show_board[][COL], char mine_board[][COL], int row, int col) { int i = 0; int j = 0; int total = (ROW - 2)*(COL - 2); while (1) { ShowBoard(show_board, row, col); printf("Please enter your pos<x,y>"); scanf("%d%d", &i, &j); if (i >= 1 && i < row - 2 && j >= 1 && j < col - 2) { if (mine_board[i][j] == '0') { int num = GetMineNum(mine_board, i, j); show_board[i][j] = num + '0'; total--; } else { ShowBoard(mine_board, row, col); printf("Game over!you lose!:(\n"); break; } } else { printf("Error!Try again!\n"); continue; } if (total == MINES) { printf("You win:)!\n"); break; } } } void Game() { char show_board[ROW][COL]; char mine_board[ROW][COL]; memset(show_board, '*', sizeof(show_board)); memset(mine_board, '0', sizeof(mine_board)); SetMine(mine_board, ROW, COL); PlayGame(show_board, mine_board, ROW, COL); }
主函数 main.c
#include"Mine.h" int main() { int select = 0; int quit = 0; while (!quit) { Menu(); scanf("%d", &select); switch (select) { case 1: Game(); break; case 0: printf("OK,byebye!\n"); quit = 1; break; default: printf("Error!input again!\n"); break; } } system("pause"); return 0; }
运行展示界面:
这是简易版的扫雷,过过干瘾还是可以,但和电脑里的扫雷还是有一定的差别,后期还要做一些优化。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
- 很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25
- 这篇文章主要对C语言中const关键字的用法进行了详细的分析介绍,需要的朋友可以参考下...2020-04-25
- 下面小编就为大家带来一篇C语言实现时间戳转日期的算法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了C语言之整数划分问题(递归法)实例代码的相关资料,需要的朋友可以参考下...2020-04-25
- 本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。...2020-04-25
C语言正则表达式详解 regcomp() regexec() regfree()用法详解
C语言处理正则表达式常用的函数有regcomp()、regexec()、regfree()和regerror(),这里就为大家介绍一下,需要的朋友可以参考一下啊...2020-04-25- 这篇文章主要介绍了c语言实现找最大值最小值位置查找,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-04