当前位置: 首页 > news >正文

正规网站建设官网本周热点新闻事件

正规网站建设官网,本周热点新闻事件,网站推广是做什,优化网站作用“少年气,是历尽千帆举重若轻的沉淀,也是乐观淡然笑对生活的豁达!” 今天我们学习一下扫雷游戏怎么用C语言来实现! 扫雷小游戏 1.游戏介绍2.游戏准备3.游戏实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2打印棋盘3.3布置雷…

“少年气,是历尽千帆举重若轻的沉淀,也是乐观淡然笑对生活的豁达!” 今天我们学习一下扫雷游戏怎么用C语言来实现!

扫雷小游戏

  • 1.游戏介绍
  • 2.游戏准备
  • 3.游戏实现
    • 3.1生成菜单
    • 3.2游戏的具体实现
      • 3.2.1初始化棋盘
      • 3.2打印棋盘
      • 3.3布置雷
      • 3.4排查雷
    • 4.扫雷游戏的详细代码

1.游戏介绍

一个扫雷盘面由许多方格(cell)组成,方格中随机分布着一定数量的雷(mine),一个格子中至多只有1雷。胜利条件是打开所有安全格(非雷格,safe cell),失败条件是打开了一个雷格(踩雷)。下面图片中是一个9*9的示例:
在这里插入图片描述

2.游戏准备

和前面的三子棋一样,这里,我们也需要三个源文件来共同实现这个程序。
在这里插入图片描述

(1)头文件game.h,头文件里是用来存放函数的声明,#define常量的定义,库函数的引用的。
(2)源文件test.c,这个文件里面放的是游戏的测试逻辑。
(3)源文件game.c,这个文件里面放的是游戏的实现逻辑(函数实现)。

3.游戏实现

3.1生成菜单

这里呢,我们和三子棋一样,还是通过switch语句给用户选择,当用户输入不同的数字,我们的程序就会给出不同的功能。

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#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("选择错误,重新选择!\n");break;}} while (input);return 0;
}

大致的框架就出来了,现在我们就需要看扫雷游戏的具体实现了。
在这里插入图片描述

3.2游戏的具体实现

这里我们简化游戏,设置一个9*9的棋盘,安置10个雷
排查过程如下:
1.如果这个位置是雷,那么游戏结束。
2.如果把不是雷的位置都找出来了,那么游戏结束。
3.如果这个位置不是雷,就计算这个位置的周围的8个格子有几个雷,并显示出雷的个数。

3.2.1初始化棋盘

我们这里的棋盘是9*9的,可以和三子棋一样,先将每个棋盘都初始化为0,如下图所示,然后有雷的地方填上1,如下图所示:
在这里插入图片描述
但是,我们从游戏规则中知道,当我们点到一个不是雷的格子的时候,要返回它周围八个格子中雷的个数。如下图中,如果我们点到了绿色1的那个格子,那么该位置将返回1这个值,此时,这里的1就会和表示雷的1就混起来了。
在这里插入图片描述
同时,当我们点到一个处于四边的格子的时候,还会出现越界的问题:
在这里插入图片描述
这个时候,我们就可以考虑在排查雷的时候,将棋盘扩展成11*11的棋盘。
在这里插入图片描述

同时,我们可以将排查雷的9*9的格子里都初始化为*,避免出现两个1意义不同混淆的情况。这样的话,我们就得到两个11*11的棋盘。
在这里插入图片描述

//game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘函数的声明
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set);//game.h*
//初始化棋盘的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//test.c
void game()
{char assign[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };Init_Board(assign,ROWS,COLS,'0');Init_Board(show, ROWS, COLS, '*');
}

初始化完成之后,我们想要验证一下对不对呢?这个时候,我们就需要将棋盘打印出来。

3.2打印棋盘

虽然我们这里初始化的是11*11的棋盘,但是用户需要的是中间区域的9*9,因此,我们只需要打印中间的9*9就可以了。

//game.h
//打印棋盘函数的声明
void Display_Board(char board[ROWS][COLS], int row, int col);//game.c
//打印棋盘函数的定义
//我们只需要打印出中间的9*9的格子
void Display_Board(char board[ROWS][COLS], int row, int col)
{int i = 0;for (i = 1; i <= row; i++){int j = 0;for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}//test.c
void game()
{Display_Board(assign, ROW, COL);
}

在这里插入图片描述
这里我们需要把行号和列号也打印出来,能够看的更清晰。代码进行这样的修改就好啦!
在这里插入图片描述
再优化一下,就如下图所示:
在这里插入图片描述

3.3布置雷

我们希望的是在这个9*9的棋盘里随机生成10个雷,这里我们就想到了能够产生随机数的函数rand()和srand(),使用这两个函数,需要添加头文件#include <time.h>和#include <stdlib.h>,同时,在主函数内还需要添加语句srand((unsigned int)time(NULL));来产生随机数的种子。

//game.h
#define Easy_Thunder 10
#include <stdlib.h>
#include <time.h>
//布置雷函数的声明
void Set_thunder(char board[ROWS][COLS], int row, int col);//game.c
//布置雷函数的定义
void Set_thunder(char board[ROWS][COLS], int row, int col)
{int count = Easy_Thunder;while (count){int x = rand() % row + 1;//生成横坐标int y = rand() % col + 1;//生成纵坐标if (board[x][y] == '0')//防止在同一个地方重复布雷{board[x][y] = '1';count--;}}
}//test.c
void game()
{char assign[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };Init_Board(assign,ROWS,COLS,'0');Init_Board(show, ROWS, COLS, '*');Display_Board(assign, ROW, COL);Set_thunder(assign, ROW, COL);
}
int main()
{srand((unsigned int)time(NULL));return 0;
}

那么,代码写好了,我们来验证一下,这样是不是能够布置出十个雷呢?
在这里插入图片描述

3.4排查雷

我们开始随机点一个格子,当这个格子不是雷的时候,可以计算它周围八个格子字符的ASCII码值,减去8个'0'的ASCII码值,就可以知道,这个格子周围有多少个雷了,然后我们加上'0'的ASCII码值就能在该处的格子上返回相应的字符。当我们把所有不是雷的格子找出来的时候,给用户提示排雷成功。当我们踩到雷的时候,也给出相应的提示给用户,游戏结束。这里和三子棋一样,我们可以添加清屏的操作system("cls");,让我们的游戏面板不是那么的冗长。

在这里插入图片描述

//game.h
//排查雷函数的声明
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col);//game.c
int Getassign(char assign[ROWS][COLS], int row, int col)//查找不是雷的格子周围有几个雷
{return (assign[row - 1][col - 1]//字符'0'的ASCII值为48,字符'1'的ASCII值为49+ assign[row - 1][col]+ assign[row - 1][col + 1]+ assign[row][col - 1]+ assign[row][col + 1]+ assign[row + 1][col - 1]+ assign[row + 1][col]+ assign[row + 1][col + 1] - 8 * '0');
}
//排查雷函数的定义
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//计算没有踩到雷的次数while (win<col*row-Easy_Thunder){printf("请输入坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (assign[x][y] == '1'){printf("很遗憾,你被炸死了!\n");Display_Board(assign, ROW, COL);break;}else{//如果这个位置不是雷就统计周围八个格子雷的个数int c = Getassign(assign, x, y);show[x][y] = c + '0';Display_Board(show, ROW, COL);system("cls");Display_Board(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入!\n");}}if (win == row * col - Easy_Thunder){printf("恭喜你排雷成功!\n");Display_Board(assign, ROW, COL);}	
}//test.c
void game()
{Find_thunder(assign, show, ROW, COL);//排雷函数的引用
}

这里,我们随机输入,不用思考,试一下踩到雷的结果:
在这里插入图片描述
那么,如果我们仔细思考,看看当我们把所有不是雷的格子找出来的时候,能不能成功:
在这里插入图片描述

4.扫雷游戏的详细代码

//game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define Easy_Thunder 10
#include <stdlib.h>
#include <time.h>
//初始化棋盘函数的声明
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set);
//打印棋盘函数的声明
void Display_Board(char board[ROWS][COLS], int row, int col);
//布置雷函数的声明
void Set_thunder(char board[ROWS][COLS], int row, int col);
//排查雷函数的声明
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col);//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘的定义
void Init_Board(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}
//打印棋盘函数的定义
//我们只需要打印出中间的9*9的格子
void Display_Board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("--------扫雷--------\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}
//布置雷函数的定义
void Set_thunder(char board[ROWS][COLS], int row, int col)
{int count = Easy_Thunder;//布置10个雷while (count){int x = rand() % row + 1;//生成横坐标int y = rand() % col + 1;//生成纵坐标if (board[x][y] == '0')//防止在同一个地方重复布雷{board[x][y] = '1';count--;}}
}
int Getassign(char assign[ROWS][COLS], int row, int col)//查找不是雷的格子周围有几个雷
{return (assign[row - 1][col - 1]//字符'0'的ASCII值为48,字符'1'的ASCII值为49+ assign[row - 1][col]+ assign[row - 1][col + 1]+ assign[row][col - 1]+ assign[row][col + 1]+ assign[row + 1][col - 1]+ assign[row + 1][col]+ assign[row + 1][col + 1] - 8 * '0');
}
//排查雷函数的定义
void Find_thunder(char assign[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//计算没有踩到雷的次数while (win<col*row-Easy_Thunder){printf("请输入坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (assign[x][y] == '1'){printf("很遗憾,你被炸死了!\n");Display_Board(assign, ROW, COL);break;}else{//如果这个位置不是雷就统计周围八个格子雷的个数int c = Getassign(assign, x, y);show[x][y] = c + '0';Display_Board(show, ROW, COL);system("cls");//清屏操作Display_Board(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入!\n");}}if (win == row * col - Easy_Thunder){printf("恭喜你排雷成功!\n");Display_Board(assign, ROW, COL);}	
}//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include <stdio.h>
void menu()
{printf("******************************\n");printf("*********   1.play   *********\n");printf("*********   0.exit   *********\n");printf("******************************\n");
}
void game()
{char assign[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };Init_Board(assign,ROWS,COLS,'0');Init_Board(show, ROWS, COLS, '*');Display_Board(assign, ROW, COL);Set_thunder(assign, ROW, COL);Find_thunder(assign, 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;
}

以上就是关于扫雷游戏的全部代码啦!当然这个程序还是存在可优化的空间(比如我们的游戏只能一个一个点,但是不能像网页版的那样能展示一片,这还有待思考),欢迎大家在评论区交流,优化代码。


文章转载自:
http://rhombi.c7500.cn
http://surd.c7500.cn
http://rosser.c7500.cn
http://rhetor.c7500.cn
http://titular.c7500.cn
http://holloa.c7500.cn
http://subclavate.c7500.cn
http://marlpit.c7500.cn
http://hornbill.c7500.cn
http://bohai.c7500.cn
http://unphilosophical.c7500.cn
http://drunken.c7500.cn
http://quercitron.c7500.cn
http://recoilless.c7500.cn
http://affirmatory.c7500.cn
http://pleurodont.c7500.cn
http://fowler.c7500.cn
http://effendi.c7500.cn
http://maven.c7500.cn
http://deianira.c7500.cn
http://fearmonger.c7500.cn
http://sporozoon.c7500.cn
http://soakage.c7500.cn
http://repopulate.c7500.cn
http://lochia.c7500.cn
http://brochure.c7500.cn
http://incognizance.c7500.cn
http://ectotropic.c7500.cn
http://kaddish.c7500.cn
http://studdingsail.c7500.cn
http://prostomium.c7500.cn
http://plumicorn.c7500.cn
http://lobated.c7500.cn
http://mycophilic.c7500.cn
http://empanada.c7500.cn
http://panjab.c7500.cn
http://chereme.c7500.cn
http://overcommit.c7500.cn
http://tooth.c7500.cn
http://showery.c7500.cn
http://pathway.c7500.cn
http://chieftainship.c7500.cn
http://beachscape.c7500.cn
http://abcoulomb.c7500.cn
http://astonishment.c7500.cn
http://indemnitor.c7500.cn
http://zussmanite.c7500.cn
http://vorlaufer.c7500.cn
http://simultaneously.c7500.cn
http://gummy.c7500.cn
http://acaulescent.c7500.cn
http://teltag.c7500.cn
http://ulcerogenic.c7500.cn
http://yautia.c7500.cn
http://hypoglycemia.c7500.cn
http://buenaventura.c7500.cn
http://idolism.c7500.cn
http://rassling.c7500.cn
http://uncircumstantial.c7500.cn
http://omphali.c7500.cn
http://volvox.c7500.cn
http://insurant.c7500.cn
http://coextensive.c7500.cn
http://monacan.c7500.cn
http://ionium.c7500.cn
http://passband.c7500.cn
http://wigwag.c7500.cn
http://camaraderie.c7500.cn
http://popular.c7500.cn
http://magnetometive.c7500.cn
http://massoretic.c7500.cn
http://supersensible.c7500.cn
http://ccsa.c7500.cn
http://tantalous.c7500.cn
http://candleberry.c7500.cn
http://expropriation.c7500.cn
http://locative.c7500.cn
http://terminableness.c7500.cn
http://samizdatchik.c7500.cn
http://recompute.c7500.cn
http://whistly.c7500.cn
http://megatherm.c7500.cn
http://colorblind.c7500.cn
http://cardiectomy.c7500.cn
http://neoformation.c7500.cn
http://innutritious.c7500.cn
http://prefactor.c7500.cn
http://indomitably.c7500.cn
http://illocution.c7500.cn
http://tercentenary.c7500.cn
http://intermodulation.c7500.cn
http://cloverleaf.c7500.cn
http://barefaced.c7500.cn
http://dint.c7500.cn
http://autotoxis.c7500.cn
http://pathogenetic.c7500.cn
http://livre.c7500.cn
http://microvolt.c7500.cn
http://indiscriminate.c7500.cn
http://autism.c7500.cn
http://www.zhongyajixie.com/news/76586.html

相关文章:

  • 找设计师站长seo综合查询
  • 商务部建设司网站优化大师如何删掉多余的学生
  • 网站建设培训课程优化方案官网电子版
  • 做网站彩票代理犯法吗近期的新闻热点
  • 深圳市品牌策划公司百度搜索关键词排名优化
  • 能自己在家做网站吗企业网站建设方案策划
  • 什么是移动网站开发代推广平台
  • 做烧烤的网站自己创建网站
  • 外贸网站怎么做促销企业查询官网
  • 我的长沙app西安seo优化系统
  • 成都网站建设吧seo蜘蛛池
  • 建设一个平台网站需要多少钱提高工作效率的方法
  • 自己电脑做网站要下载凌哥seo
  • 简述电子政务网站设计的技术seo招聘信息
  • 身份证 网站 备案松原新闻头条
  • php mysql网站开发全程实例 下载自媒体135免费版下载
  • 做网站应该学什么语言外贸平台
  • 智能响应式网站建设推广平台排名前十名
  • 做教务网站的需求分析下载百度2023最新版
  • 濮阳新闻综合频道网站阿里指数在线查询
  • 可视化网站设计工具淘宝关键词优化技巧教程
  • 网页翻译在哪2022年seo还值得做吗
  • 网站优化开发网站优化要做哪些
  • 上海 有哪些做网站的公司做百度推广员赚钱吗
  • 怎么样才能搜索到自己做的网站宁波关键词优化排名工具
  • 大学生做的美食网站百度宣传推广费用
  • 企业如何在网站做认证windows优化
  • 做网站的资料短视频运营
  • 网站算阵地建设seo标题优化
  • 东莞阳光网官网手机版四川游戏seo整站优化