每天进步一点点,坚持带来大改变!

目录

实现思路:

1.代码搭建:

2.游戏框架的搭建:

3.扫雷游戏功能实现:

1.棋盘的设置:

2.初始化棋盘:

3.打印棋盘:

4.布置雷:

5.排查雷:

6.整体代码实现

7.视频链接

实现思路:

扫雷游戏的实现包含两部分:首先应该是布置雷,其次排查雷。

1.代码搭建:

test.c文件来实现整个游戏的框架,game.h文件实现整个游戏实现需要的声明,game.c文件实现扫雷游戏的功能。

2.游戏框架的搭建:

#include<stdio.h>void menu()
{printf("******************\n");printf("****  1.play *****\n");printf("****  0.exit  ****\n");printf("******************\n");
}
void game()
{//布置雷的信息//排查出雷的信息//初始化数组//打印棋盘//布置雷//排查雷}
int main()
{int input = 0;do{menu();printf("请输入:");scanf("%d", &input);switch (input){case 1:game();//扫雷游戏的实现break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新输入!");break;}} while (input);return 0;
}

3.扫雷游戏功能实现:

1.棋盘的设置:

因为当排查出雷的信息是需要显示坐标周围八个含雷的个数,所以避免数组越界的问题,9*9的扫雷棋盘实际需要11*11的棋盘。

game.h

#define Row 9
#define Col 9#define Rows Row+2
#define Cols Col+2

定义棋盘:

    //布置雷的信息char mine[Rows][Cols] = { 0 };//排查出雷的信息char show[Rows][Cols] = { 0 };

2.初始化棋盘:

布置雷的数组:用‘0’初始化

排查雷的数组:用‘*‘初始化

 void Initboard(char board[Rows][Cols], int rows, int cols, int set);


void Initboard(char board[Rows][Cols], int rows, int cols, int set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}

3.打印棋盘:

//打印棋盘
    Displayboard(mine, Row, Col);
    Displayboard(show, Row, Col); 

void Displayboard(char board[Rows][Cols], int row, int col)
{int i = 0;int j = 0;printf("*欢迎来到扫雷游戏*\n");for (j = 0; j < col; j++){printf("%d ", j);}printf("\n");for (i = 1; i < row; i++){printf("%d ", i);for (j = 1; j < col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("*欢迎来到扫雷游戏*\n");}

4.布置雷:

思路:电脑生成随机数对应的x,y坐标,然后在棋盘上布置雷,雷用’1‘表示。

随机数的生成:使用rand()函数———srand()函数———time()函数(时间戳)

                          头文件#include<stdlib.h>                            #include<time.h>

 void SetMine(char board[Rows][Cols], int row, int col);

   //主函数调用

    srand((unsigned int)time(NULL));

void SetMine(char board[Rows][Cols], int row, int col)
{int count = Easy_count;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}

5.排查雷:

思路实现:

循环查找,每次查找一个坐标,如果是雷,很遗憾,被炸死了,如果不是雷,返回坐标周围八个坐标的含雷的信息赋值给show数组并且递归展开所有非雷的棋子


//用来查找坐标周围含有的雷的个数
int get_mine_count(char board[Rows][Cols], int x, int y)
{return (board[x - 1][y] + board[x - 1][y - 1] +board[x][y - 1] + board[x + 1][y - 1] +board[x + 1][y] + board[x + 1][y + 1] +board[x][y + 1] + board[x - 1][y + 1] - 8 * '0');
}
static void Openboard(char mine[Rows][Cols],char show[Rows][Cols] ,int x, int y, int* win)
{if (x >= 1 && x <= Row && y >= 1 && y <= Col){if (show[x][y] == ' ' || show[x][y] != '*'){return;}else if (get_mine_count(mine, x, y) != 0){show[x][y] = get_mine_count(mine, x, y) + '0';(*win)++;return;}else//如果不是雷,则递归展开调用{show[x][y] = ' ';//第二次调用的时候不会重复排查(*win)++;int i = 0;int j = 0;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){Openboard(mine, show, x + i, y + j, win);}}}}
}
void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-Easy_count){printf("请输入要查找雷的坐标:");scanf("%d%d", &x, &y);if (x >= 1 & x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");Displayboard(mine, Row, Col);break;}else//如果不是雷{Openboard(mine,show, x, y, &win);Displayboard(show, Row, Col);}}else{printf("输入的坐标已被查找,请重新输入:\n");}}else{printf("输入的坐标不合理,请重新输入:\n");}}if (win == row * col - Easy_count){printf("恭喜你,排雷成功!\n");Displayboard(show, Row, Col);}
}

6.整体代码实现

test.c

#include"game.h"void menu()
{printf("******************\n");printf("****  1.play *****\n");printf("****  0.exit  ****\n");printf("******************\n");
}
void game()
{//布置雷的信息char mine[Rows][Cols] = { 0 };//排查出雷的信息char show[Rows][Cols] = { 0 };//初始化数组Initboard(mine, Rows, Cols, '0');Initboard(show, Rows, Cols, '*');//布置雷SetMine(mine, Row, Col);Displayboard(show, Row, Col);//排查雷FindMine(mine, show, Row, Col);
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请输入:");scanf("%d", &input);switch (input){case 1:game();//扫雷游戏的实现break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);return 0;
}

game.h 

#include<stdio.h>
#include<stdlib.h>
#include<time.h>#define Row 9
#define Col 9#define Rows Row+2
#define Cols Col+2#define Easy_count 10
void Initboard(char board[Rows][Cols], int rows, int cols, int set);void Displayboard(char board[Rows][Cols], int row, int col);void SetMine(char board[Rows][Cols], int row, int col);void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col);

game.c 

#include"game.h"void Initboard(char board[Rows][Cols], int rows, int cols, int set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}
void Displayboard(char board[Rows][Cols], int row, int col)
{int i = 0;int j = 0;printf("*欢迎来到扫雷游戏*\n");for (j = 0; j < col; j++){printf("%d ", j);}printf("\n");for (i = 1; i < row; i++){printf("%d ", i);for (j = 1; j < col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("*欢迎来到扫雷游戏*\n");}void SetMine(char board[Rows][Cols], int row, int col)
{int count = Easy_count;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}//用来查找坐标周围含有的雷的个数
int get_mine_count(char board[Rows][Cols], int x, int y)
{return (board[x - 1][y] + board[x - 1][y - 1] +board[x][y - 1] + board[x + 1][y - 1] +board[x + 1][y] + board[x + 1][y + 1] +board[x][y + 1] + board[x - 1][y + 1] - 8 * '0');
}
static void Openboard(char mine[Rows][Cols],char show[Rows][Cols] ,int x, int y, int* win)
{if (x >= 1 && x <= Row && y >= 1 && y <= Col){if (show[x][y] == ' ' || show[x][y] != '*'){return;}else if (get_mine_count(mine, x, y) != 0){show[x][y] = get_mine_count(mine, x, y) + '0';(*win)++;return;}else//如果不是雷,则递归展开调用{show[x][y] = ' ';//第二次调用的时候不会重复排查(*win)++;int i = 0;int j = 0;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){Openboard(mine, show, x + i, y + j, win);}}}}
}
void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-Easy_count){printf("请输入要查找雷的坐标:");scanf("%d%d", &x, &y);if (x >= 1 & x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");Displayboard(mine, Row, Col);break;}else//如果不是雷{Openboard(mine,show, x, y, &win);Displayboard(show, Row, Col);}}else{printf("输入的坐标已被查找,请重新输入:\n");}}else{printf("输入的坐标不合理,请重新输入:\n");}}if (win == row * col - Easy_count){printf("恭喜你,排雷成功!\n");Displayboard(show, Row, Col);}
}

7.视频链接

扫雷

如何用C语言实现小游戏——扫雷相关推荐

  1. c语言实现小游戏-扫雷

    扫雷大家都玩过吧,没玩过的可以在自己电脑上玩一下,我实现在这个扫雷不像电脑上那种是直接用鼠标点,而是自己输入坐标来排雷. 头文件game.h #ifndef _GAME_H_ #define _GAM ...

  2. 如何用java语言编写小游戏?(贪吃蛇)

    自己做了个贪吃蛇,效果图如下" 素材和图片是网上找的,在做这游戏的过程中其实最麻烦的是像素的调整,需要一点点去试....所以大家做的时候像素方面自己试就行了,根据自己的实际情况判断. 先说一 ...

  3. java做小游戏扫雷(附源码)

    下载解压即可玩:扫雷 项目代码下载:java代码 目录 图片 怎么自己也能做 代码细节 感受 全部代码 GameWin.java类 : MapBottom.java类: GameUtil.java类: ...

  4. Windows经典小游戏--扫雷精装版

    Windows经典小游戏–扫雷精装版 最开始玩的电脑游戏就是蜘蛛纸牌和扫雷了,那时候觉得很神奇的事情现在自己也可以做了.下面就展示一下C语言扫雷的代码. 首先创建一个"扫雷"的项目 ...

  5. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

  6. 如何用c语言编写军旗游戏

    今天教大家如何用C语言编写军旗游戏 ~ 1.效果图: 2.主要代码: #include <graphics.h> #include <time.h>#define CHESIZ ...

  7. c语言 倒计时不清屏_打字游戏超细讲解(C语言基础小游戏)

    首先我们会发现我们网上看到的打字游戏都是上来就敲代码,小白看的一脸懵,所以鑫哥在这给大家送上一份超级详细的打字游戏编写流程及对应的结果展示,希望可以帮到小白进行入门学习. 话不多说,我们先看一下什么叫 ...

  8. c语言经典游戏,C语言——经典小游戏——打砖块

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言--经典小游戏--打砖块 玩法:按A与D控制球拍的移动,按S暂停游戏 百度网盘下载:http://pan.baidu.com/s/1o64ECTc ...

  9. c语言2048代码linux,C语言2048小游戏课设(附源码).doc

    PAGE PAGE 1 C语言2048小游戏课设 项目说明 本系统基于C语言开发,适用于刚入门的C语言新手项目课设,开发软件采用VC++6.0开发,VS,DEV C++等均可运行.(书生) 项目运行截 ...

最新文章

  1. [转]PDO防注入原理分析以及使用PDO的注意事项
  2. python 全景图像拼接( python3.6 + opencv3.4.2.16) 融合
  3. 机器学习:特征选择和降维实例
  4. (已解决)linux如何删除-开头的文件或者目录
  5. java 入门 第三季1
  6. Spring4.2.6+SpringMVC4.2.6+MyBatis3.4.0 整合
  7. 2021 年前端趋势预测
  8. Oracle 练习题 20131021 for 循环练习
  9. mybatis+Druid连接池的问题
  10. Java经纬度坐标转换到平面坐标
  11. python根据文件名列表筛选满足条件的文件
  12. C语言日字,【C语言日日练(二)】static关键字
  13. Java出现The import javax.servlet cannot be resolved 的解决方法
  14. MySQL 8.0.11 中使用 grant ... identified by 时 error 1064 near 'identified by '密码'' at line 1...
  15. nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
  16. 随机过程 Class 3 条件期望
  17. 帆软报表设计器常用代码知识
  18. Day16:数据仓库设计
  19. java反射类型转换_Java反射探索研究(转)
  20. 50天用JavaScript完成50个web项目,我学到了什么?

热门文章

  1. Android的.9图片使用问题
  2. 单片机中常用的串口通信协议帧
  3. 四种常见的 POST 提交数据方式 专题
  4. hiredis使用简介
  5. Playcanvas 上手使用
  6. linux下创建用户和添加用户权限
  7. 禁用键盘快捷键_如何在Windows中使用键盘快捷键临时禁用键盘
  8. 监控易:2023年ITOM信创市场分析与预测
  9. m031开发 新唐_基于新唐M031开发的激光测距仪方案
  10. 曾有一个人,爱我如生命(2)