【C语言】小游戏-扫雷(清屏+递归展开+标记)

大家好,我是深鱼~

目录

一、游戏介绍

二、文件分装

 三、代码实现步骤

1.制作简易游戏菜单

 2. 初始化棋盘(11*11)

 3.打印棋盘(9*9)

4.布置雷 

 5.计算(x,y)周围8个坐标的和 

6.排查雷 

 <1>清屏后打印棋盘

<2>递归展开

<3>标记雷

四、完整代码

game.h:相关函数的声明,整个代码要引用的头文件以及宏定义

 game.c:实现游戏相关的函数

test.c:整个游戏相关的测试

 五、游戏展示


一、游戏介绍

 

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输

排查雷的规则:
1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
2.如果这个位置是雷,就炸死了,表示游戏结束
3.如果把不是雷的位置都找出来了,那就通过了 


二、文件分装

 实现这个扫雷游戏,我创建了三个文件

源文件:

test.c:整个游戏相关的测试

game.c:实现游戏相关的函数

头文件:

game.h:相关函数的声明,整个代码要引用的头文件以及宏定义


 三、代码实现步骤

1.制作简易游戏菜单

这个简易菜单和上一篇文章三字棋一样,就不做过多的解释了

test.c

void menu()//打印简易菜单
{printf("************************************\n");printf("************   1.进入游戏  **********\n");printf("************   0.退出游戏  **********\n");printf("************************************\n");
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//空指针NULLdo{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//注意这里要加上;return 0;
}

 2. 初始化棋盘(11*11)

(1)定义两个数组为11*11:

定义一个数组(mine数组)表示雷的信息(1表示这个坐标是雷,0表示不是雷),另一个数组(show数组)表示排查雷的信息

假设我们要实现一个9*9的棋盘,如果我们只定义一个9*9的二维数组,计算周围8个坐标会越界,那么我们就需要将数组扩大成11*11的二维数组(上下左右分别多一排)

(2)为了简洁,传一个参数char set表示初始化的字符

初始化棋盘(9*9的外部也要初始化),因为mine和show数组不同,再传一个参数set即要初始化的字符内容

(3)宏定义ROWS,COLS,ROW,COL,EASY_COUNT 

为了方便修改游戏难度(改变棋盘的行和列及雷的个数),我们采用宏定义直接进行修改即可

game.h

#define ROW 9//可以进行扫雷的行列
#define COL 9#define ROWS ROW+2//进行判断的行列
#define COLS COL+2#define EASY_COUNT 10 //雷的个数//初始化棋盘(9*9的外部也要初始化)
void InitBoard(char board[ROWS][COLS],char ch);

 game.c

//初始化棋盘(9*9的外部也要初始化),为了mine和show数组不同,再传一个参数set即要初始化的内容
void InitBoard(char board[ROWS][COLS],char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){board[i][j] = ch;//自己的棋盘初始化为0,展示的数组初始化为*}}
}

 3.打印棋盘(9*9)

(1)打印出来的棋盘(show)得是9*9的,但是由于定义的数组就是11*11的,所以函数传参还得传11*11定义的数组

(2)因为我们这个游戏是自己输入需要排雷的位置,所以最好在棋盘的旁边打印出对应的数字,方便输入坐标

game.h

//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS]);

  game.c

//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS])//定义的数组是不变的,一直都是11*11
{printf("------扫雷------\n");//用来隔开数组//打印列号for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++)//传的是11*11,打印是9*9,也就是从数组下标1开始打印到下标为9{printf("%d ", i);//打印行号for (int j = 1; j <= COL; j++){printf("%c ", board[i][j]);//打印字符用%c}printf("\n");}printf("------扫雷------\n");
}

4.布置雷 

(1)布置雷是在mine数组上布置,定义mine数组上1代表有雷,0代表没雷(这样方便后面计算周围8个坐标的和)

(2)布置雷需要随机布置,那就得随机生成横纵坐标,跟上篇三字棋生成随机数一样rand函数

,但是注意取模结束后要+1,因为取模的结果是0-8,我们需要生成的坐标是1-9

(3)这里要注意一点:如果一个位置已经布置了雷,那么这个位置就不需要再布置了,加一条判断语句就可以解决这个问题

game.h

//布置雷
void SetMine(char mine[ROWS][COLS]);

   game.c

//布置雷
void SetMine(char mine[ROWS][COLS])
{int count = EASY_COUNT;while (count)//注意这个循环进行的次数可能大于10次,可能有的位置已经是1,或者是多次生成的坐标相同{int x = rand() % ROW + 1;//%ROW得到的范围是0-8,结果+1的范围就算1-9int y = rand() % COL + 1;if (mine[x][y] != '1'){mine[x][y] = '1';count--;}}
}

 5.计算(x,y)周围8个坐标的和 

注意求和的时候需要将字符和数字进行转换,加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'

   game.c

//计算(x,y)周围8个坐标的和
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] +mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';//记住要减去8个'0'变成数字
}

6.排查雷 

 排查雷的规则:
1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
2.如果这个位置是雷,就炸死了,表示游戏结束
3.如果把不是雷的位置都找出来了,那就通过了 

(1)传参需要传两个数组,mine数组用来判断是否踩中了雷,show数组打印出来看

(2)排雷需要多次进行,while语句控制结束,当棋盘剩下的格子只剩下10个雷的时间就结束,

或者踩到了雷,直接break跳出结束

 game.h

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);

   game.c

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{int x = 0;int y = 0;int win = 0;char ch = 0;while (win<ROW*COL-EASY_COUNT)//当非雷的坐标已经全部排出来了,即只剩下雷了就跳出循环{printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (mine[x][y] == '1')//踩中雷了{system("cls");//清空屏幕printf("很遗憾,你被炸死了\n");DisplayBoard(mine);break;}else//不是雷,就统计(x,y)周围有几个雷:这时候雷定义为1的好处就出来了,我们直接把周围坐标的和加起来放入show坐标的对应位置上即可{if (show[x][y] == ' ')//为了避免再次输入已经变成空格的坐标{printf("该坐标已排查\n");continue;}else{//展开一片,去除和为0,,并打印出和非0的位置(递归实现)//条件:1.这个坐标不是雷//2.这个坐标周围没有雷,雷的个数是0//3.这个坐标没有被排查过RemoveZero(mine, show, x, y, &win);system("cls");DisplayBoard(show);do {printf("如果需要'$'对雷进行标记,请输入Y;无需标记,请按Enter键继续\n");while ((ch = getchar()) != '\n')//清空缓冲区{;}scanf("%c", &ch);if (ch == 'Y'){//标记雷并打印Remark(show);}else{continue;}} while (ch != '\n');//进行多次标记}}}else{printf("坐标非法,请重新输入\n");}}if (win == ROW * COL - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");}}

优化: 

 <1>清屏后打印棋盘

system("cls");

头文件:#include<windows.h>

清屏后再打印show数组棋盘,可以让屏幕更干净简洁 

system("cls");
DisplayBoard(show);

<2>递归展开

展开一片,去除和为0,,并打印出和非0的位置(递归实现)

条件:1.这个坐标不是雷
           2.这个坐标周围没有雷,雷的个数是0
           3.这个坐标没有被排查过

(1)递归展开:当mine数组计算周围8个坐标的和返回的是0,那就把show数组的这个位置变为空格,并且再看自己周围的八个坐标是否也为0,如果mine数组为0且show数组的对应位置为*,那么再对这个坐标的周围8个坐标进行爆炸式展开(show数组对应位置为*是为了防止多次把同一个位置变为空格

(2)传参记得传一个指针来使win++(即统计GetMineCount()的位置,每变一个符号,剩下的棋格数就少一个,对应又成功一步)

   game.c

//展开一片,去除和为0,并打印出和非0的位置(递归实现)
void RemoveZero(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int *num)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//小数组(9*9)内部才需要计算{//注意加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'int ret = GetMineCount(mine, x, y);if (ret == 0){show[x][y] = ' ';//如果这个周围坐标和是0,那就变为空格(*num)++;//变一个空格win也+1//看看周围8个坐标是否为0for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j]=='0'&&show[i][j] == '*')//show[i][j] == '*'是为了避免重复RemoveZero(mine, show, i, j,num);}}}else{show[x][y] = ret + '0';//数字+'0'变成字符(*num)++;}}
}

<3>标记雷

如果show数组上想要标记的位置为*,则可以标记;如果不是*,则不可标记

    game.c

//标记雷
void Remark(char show[ROWS][COLS])
{int x = 0;int y = 0;while (1){printf("请输入要标记的坐标>:\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (show[x][y] == '*'){show[x][y] = '$';system("cls");DisplayBoard(show);break;}else{printf("该位置不能被标记,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}


四、完整代码

game.h:相关函数的声明,整个代码要引用的头文件以及宏定义

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>#define ROW 9//可以进行扫雷的行列
#define COL 9#define ROWS ROW+2//进行判断的行列
#define COLS COL+2#define EASY_COUNT 10 //雷的个数//初始化棋盘(9*9的外部也要初始化)
void InitBoard(char board[ROWS][COLS],char ch);
//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS]);
//布置雷
void SetMine(char mine[ROWS][COLS]);
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);

 game.c:实现游戏相关的函数

#include"game.h"
//实现游戏相关的代码
//9*9的棋盘,上面布置10个雷//排查雷
//1.如果这个位置不是雷,就计算这个位置周围8个坐标有几个雷,并显示雷的个数
//2.如果这个位置是雷,就炸死了,表示游戏结束
//3.如果把不是雷的位置都找出来了,那就通过了//一个数组表示雷的信息(1表示这个坐标是雷,0表示不是雷),另一个数组表示排查雷的信息
//当要排查数组最外层的雷时,计算周围8个坐标会越界,这就需要把数组扩充为11*11,当然为了两个数组统一起来,两个数组都定义11*11//初始化棋盘(9*9的外部也要初始化),为了mine和show数组不同,再传一个参数set即要初始化的内容
void InitBoard(char board[ROWS][COLS],char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){board[i][j] = ch;//自己的棋盘初始化为0,展示的数组初始化为*}}
}//打印棋盘(打印9*9的部分就可以了)
void DisplayBoard(char board[ROWS][COLS])//定义的数组是不变的,一直都是11*11
{printf("------扫雷------\n");//用来隔开数组//打印列号for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++)//传的是11*11,打印是9*9,也就是从数组下标1开始打印到下标为9{printf("%d ", i);//打印行号for (int j = 1; j <= COL; j++){printf("%c ", board[i][j]);//打印字符用%c}printf("\n");}printf("------扫雷------\n");
}//布置雷
void SetMine(char mine[ROWS][COLS])
{int count = EASY_COUNT;while (count)//注意这个循环进行的次数可能大于10次,可能有的位置已经是1,或者是多次生成的坐标相同{int x = rand() % ROW + 1;//%ROW得到的范围是0-8,结果+1的范围就算1-9int y = rand() % COL + 1;if (mine[x][y] != '1'){mine[x][y] = '1';count--;}}
}//计算(x,y)周围8个坐标的和
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] +mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]-8*'0';//记住要减去8个'0'变成数字
}//展开一片,去除和为0,并打印出和非0的位置(递归实现)
void RemoveZero(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y,int *num)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)//小数组(9*9)内部才需要计算{//注意加和的时候数组中的是字符0,而加和是数字0,字符=数字-'0' eg:'1'=1-'0'int ret = GetMineCount(mine, x, y);if (ret == 0){show[x][y] = ' ';//如果这个周围坐标和是0,那就变为空格(*num)++;//变一个空格win也+1//看看周围8个坐标是否为0for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (mine[i][j]=='0'&&show[i][j] == '*')//show[i][j] == '*'是为了避免重复RemoveZero(mine, show, i, j,num);}}}else{show[x][y] = ret + '0';//数字+'0'变成字符(*num)++;}}
}//标记雷
void Remark(char show[ROWS][COLS])
{int x = 0;int y = 0;while (1){printf("请输入要标记的坐标>:\n");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (show[x][y] == '*'){show[x][y] = '$';system("cls");DisplayBoard(show);break;}else{printf("该位置不能被标记,请重新输入\n");}}else{printf("坐标非法,请重新输入\n");}}}
//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
{int x = 0;int y = 0;int win = 0;char ch = 0;while (win<ROW*COL-EASY_COUNT)//当非雷的坐标已经全部排出来了,即只剩下雷了就跳出循环{printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (mine[x][y] == '1')//踩中雷了{system("cls");//清空屏幕printf("很遗憾,你被炸死了\n");DisplayBoard(mine);break;}else//不是雷,就统计(x,y)周围有几个雷:这时候雷定义为1的好处就出来了,我们直接把周围坐标的和加起来放入show坐标的对应位置上即可{if (show[x][y] == ' ')//为了避免再次输入已经变成空格的坐标{printf("该坐标已排查\n");continue;}else{//展开一片,去除和为0,,并打印出和非0的位置(递归实现)//条件:1.这个坐标不是雷//2.这个坐标周围没有雷,雷的个数是0//3.这个坐标没有被排查过RemoveZero(mine, show, x, y, &win);system("cls");DisplayBoard(show);do {printf("如果需要'$'对雷进行标记,请输入Y;无需标记,请按Enter键继续\n");while ((ch = getchar()) != '\n')//清空缓冲区{;}scanf("%c", &ch);if (ch == 'Y'){//标记雷并打印Remark(show);}else{continue;}} while (ch != '\n');//进行多次标记}}}else{printf("坐标非法,请重新输入\n");}}if (win == ROW * COL - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");}}

test.c:整个游戏相关的测试

//测试代码
#include"game.h"
void menu()//打印简易菜单
{printf("************************************\n");printf("************   1.进入游戏  **********\n");printf("************   0.退出游戏  **********\n");printf("************************************\n");
}void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//初始化棋盘(9*9的外部也要初始化)InitBoard(mine, '0');InitBoard(show, '*');//打印棋盘(打印9*9的部分就可以了)DisplayBoard(show);//布置雷(放在mine数组9*9中即可)SetMine(mine);//排查雷FindMine(mine, show);
}
int main()
{int input = 0;srand((unsigned int)time(NULL));//空指针NULLdo{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);//注意这里要加上;return 0;
}

 五、游戏展示

扫雷小游戏演示


本次C语言小游戏扫雷的内容就到此啦,有什么问题欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 ! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/38254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频监控有哪些存储方式?安防监控应该如何选择存储模式?

视频监控系统涉及到大量的视频数据&#xff0c;需要对这些数据进行存储&#xff0c;以备日后查看或备份。视频监控的存储需求需要根据场所的实际情况进行选择&#xff0c;以保证监控数据的有效存储和日后的调阅、回溯。 当前视频监控的存储方式&#xff0c;通常有以下几种&…

Golang协程,通道详解

进程、线程以及并行、并发 关于进程和线程 进程&#xff08;Process&#xff09;就是程序在操作系统中的一次执行过程&#xff0c;是系统进行资源分配和调度的基 本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程中分配和管理资源的基本单位&#xff0c;每…

【BASH】回顾与知识点梳理(二十三)

【BASH】回顾与知识点梳理 二十三 二十三. Linux 账号管理&#xff08;二&#xff09;23.1 账号管理新增与移除使用者&#xff1a; useradd, 相关配置文件, passwd, usermod, userdelusermoduserdel 23.2 用户功能&#xff08;普通用户可使用&#xff09;idfingerchfnchsh 23.3…

【数据库系统】--【2】DBMS架构

DBMS架构 01DBMS架构概述02 DBMS的物理架构03 DBMS的运行和数据架构DBMS的运行架构DBMS的数据架构PostgreSQL的体系结构RMDB的运行架构 04DBMS的逻辑和开发架构DBMS的层次结构DBMS的开发架构DBMS的代码架构 05小结 01DBMS架构概述 02 DBMS的物理架构 数据库系统的体系结构 数据…

腾讯Perfdog支持Windows PC端体验性能测试

一、背景 最近在做抖音的小玩法&#xff0c;其基于unity引擎&#xff0c;然后挂载到直播伴侣。以及Perfdog近期也支持了Windows的测试&#xff0c;所以做一个体验测试。 二、如何做 查看PC端的支持&#xff0c;目前是beat版本 选择或搜索自己需要的对应的程序&#xff0c;如…

大数据Flink(五十九):Flink on Yarn的三种部署方式介绍以及注意

文章目录 Flink on Yarn的三种部署方式介绍以及注意 一、Pre-Job 模式部署作业

对任意类型数都可以排序的函数:qsort函数

之前我们学习过冒泡排序&#xff1a; int main() {int arr[] { 9,7,8,6,5,4,3,2,1,0 };int sz sizeof(arr)/sizeof(arr[0]);int i 0;for (i 0; i < sz-1; i) {int j 0;for (j 0; j < sz-1-i; j) {if (arr[j] > arr[j 1]){int temp 0;temp arr[j];arr[j] ar…

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…

七、dokcer-compose部署springboot的jar

1、准备 打包后包名为 ruoyi-admin.jar 增加接口 httpL//{ip}:{port}/common/test/han #环境变量预application.yml 中REDIS_HOSTt的值&#xff0c;去环境变量去找&#xff1b;如果找不到REDIS_HOST就用myredis 1、Dockerfile FROM hlw/java:8-jreRUN ln -sf /usr/share/z…

私密相册管家-加密码保护私人相册照片安全

App Store史上最安全、最强大、最卓越的私密相册App&#xff01;再也不用担心私密照片视频被别人看见了&#xff01;
私密相册为你提供多重密码保护机制、简单便捷的照片存储空间&#xff0c;完美地将你的私密照片远离一切恶意偷窥者的窥探&#xff01; 【产品功能】
 √ 支…

Redis—持久化

这里写目录标题 AOF三种写回策略写回策略的优缺点AOF 重写机制AOF后台重写AOF优缺点使用命令 RDBRDB 持久化的工作原理执行快照时&#xff0c;数据能被修改吗RDB 持久化的优点RDB 持久化的缺点 混合持久化大key对持久化的影响 AOF 保存写操作命令到日志的持久化方式&#xff0…

开源数据库Mysql_DBA运维实战 (DML/DQL语句)

DML/DQL DML INSERT 实现数据的 插入 实例&#xff1a; DELETE 实现数据的 删除 实例&#xff1a; UPDATE 实现数据的 更新 实例1&#xff1a; 实例2&#xff1a; 实例3&#xff1a; DQL DML/DQL DML语句 数据库操纵语言&#xff1a; 插入数据INSERT、删除数据DELE…

2023年即将推出的CSS特性对你影响大不大?

Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了许多新功能&#xff0c;今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式&#xff0c;也…

【vue3】点击按钮弹出卡片,点击卡片中的取消按钮取消弹出的卡片(附代码)

实现思路&#xff1a; 在按钮上绑定一个点击事件&#xff0c;默认是true&#xff1b;在export default { }中注册变量给卡片标签用v-if判断是否要显示卡片&#xff0c;ture则显示&#xff1b;在卡片里面写好你想要展示的数据&#xff1b;给卡片添加一个取消按钮&#xff0c;绑…

JVM G1垃圾回收机制介绍

G1(Garbage First)收集器 (标记-整理算法)&#xff1a; Java堆并行收集器&#xff0c;G1收集器是JDK1.7提供的一个新收集器&#xff0c;G1收集器基于“标记-整理”算法实现&#xff0c;也就是说不会产生内存碎片。此外&#xff0c;G1收集器不同于之前的收集器的一个重要特点是&…

Python 基础教程,Python 是什么?

Python 的诞生是极具戏曲性的&#xff0c;据 Guido 自述记载&#xff0c;Python 语言是在圣诞节期间为了打发无聊的时间而开发的&#xff0c;之所以会选择 Python 作为该编程语言的名字&#xff0c;是因为 Guido 是 Monty Python 戏剧团的忠实粉丝。 Python 语言是在 ABC 语言的…

深度学习的“前世今生”

1、“感知机”的诞生 20世纪50年代&#xff0c;人工智能派生出了这样两个学派&#xff0c;分别是“符号学派”及“连接学派”。前者的领军学者有Marvin Minsky及John McCarthy&#xff0c;后者则是由Frank Rosenblatt所领导。 符号学派的人相信对机器从头编程&#xff0c;一个…

Sencha Ext.NET Crack,构建Blazing快速应用

Sencha Ext.NET Crack,构建Blazing快速应用 Sencha Ext.NET是一个高级的ASP.NET核心组件框架&#xff0c;它包含了强大的跨浏览器Sencha Ext JS库。通过140多个预构建和专业测试的UI组件实现企业级性能和生产效率。Sencha Ext.NET使用尖端的Web技术创建功能强大的Web应用程序&a…

Hlang社区项目说明

文章目录 前言Hlang社区技术前端后端 前言 Hello,欢迎来到本专栏&#xff0c;那么这也是第一次做这种类型的专栏&#xff0c;如有不做多多指教。那么在这里我要隆重介绍的就是这个Hlang这个项目。 首先&#xff0c;这里我要说明的是&#xff0c;我们的这个项目其实是分为两个…

发布属于自己的 npm 包

1 创建文件夹&#xff0c;并创建 index.js 在文件中声明函数&#xff0c;使用module.exports 导出 2 npm 初始化工具包&#xff0c;package.json 填写包的信息&#xff08;包的名字是唯一的&#xff09; npm init 可在这里写包的名字&#xff0c;或者一路按回车&#xff0c;后…