『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】

2023-11-08

一,什么是TicTacToe(井字棋)

本游戏为在下用lufylegend开发的第二款小游戏。此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎。可能我说了半天,对它名字不熟悉的朋友也不懂我在说神马。那没关系,我就引用Wiki(维基百科)的介绍作为大家对它名字的认识,顺便也勾起我们儿时的回忆:

井字棋,大陆、台湾又称为井字游戏、圈圈叉叉;另外也有打井游戏、OX棋的称呼,香港多称井字过三关、过三关,是种纸笔游戏。两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先以横、直、斜连成一线则为胜。如果双方都下得正确无误,将得和局。这种游戏实际上是由第一位玩家所控制,第一位玩家是攻,第二位玩家是守。第一位玩家在角位行第一子的话赢面最大(见图一),第二位玩家若是在边,角位下子,第一位玩家就可以以两粒连线牵制着第二位玩家,然后制造“两头蛇”。


图一


二,游戏在哪里玩?

相信大家看了介绍就对井字棋有了了解。现在我用html5配合开源游戏引擎lufylegend开发出了这一款游戏,并实现了人工智能(AI)确保游戏中玩家能棋缝对手。

接下来是游戏在线试玩和下载源码的地址:

下载地址(含源代码):http://files.cnblogs.com/yorhom/Tic_Tac_Toe.rar

在线试玩地址:http://www.lufylegend.com/lufylegend_developers/yorhom_Tic_Tac_Toe/index.html


三,游戏截图




四,游戏引擎

本游戏运用国产的lufylegend引擎,版本为1.6.1,如果大家感兴趣可以去官网看看

lufylegend官方网站:

http://lufylegend.com/lufylegend

lufylegend API文档:

http://lufylegend.com/lufylegend/api

上面有此引擎的下载和API介绍。关于用lufylegend开发游戏的其他文章:

【HTML5游戏开发】简单的《找不同汉字版》,来考考你的眼力吧


五,算法&代码讲解

先来个游戏初始化:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. init(30,"mylegend",390,420,main);  

为了方便操作游戏中的一些数据,我们设定许多变量:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. var backLayer,chessLayer,overLayer;  
  2. var statusText = new LTextField();  
  3. var statusContent="您先请吧……";  
  4. var matrix = [  
  5.     [0,0,0],  
  6.     [0,0,0],  
  7.     [0,0,0]  
  8. ];  
  9. var usersTurn = true;  
  10. var step = 0;  
  11. var title = "井字棋";  
  12. var introduction = ""  
  13. var infoArr = [title,introduction];  

第一行是层变量;第二行是实例化的文本框对象,用来显示文字;第三行是当前显示信息的文字,比如该哪方走,哪方赢了等,会根据不同情况改变。

matrix是用来保存当前棋盘数据的数组,如果下一步棋,就会更改其中数据,顺便也说一下,为了区分【空白格子】,【我方下的位置】,【电脑下的位置】,我们用-1来代表【我方下的位置】,用0来代表【空白格子】,1来代表【电脑下的位置】;看官且记,这-1,0,1在棋盘数组中便各有了代表意义。

userTurn是用来判断玩家是否可以下棋;step是用来表示走的步数,用来判断棋盘是否下满;title,introduction还有infoArr原本是用来制作关于界面的,结果做到最后就算了,大家直接忽视掉吧。

接下来就是main函数,由于没有图片,所以就没有加载部分了:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function main(){  
  2.     gameInit();  
  3.     addText();  
  4.     addLattice();     
  5. }  
main调用的几个函数如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function gameInit(){  
  2.     initLayer();  
  3.     addEvent();  
  4. }  
[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function addText(){  
  2.     statusText.size = 15;     
  3.     statusText.weight = "bold";  
  4.     statusText.color = "white";  
  5.     statusText.text = statusContent;  
  6.     statusText.x = (LGlobal.width-statusText.getWidth())*0.5;  
  7.     statusText.y = 393;  
  8.       
  9.     overLayer.addChild(statusText);  
  10. }  
[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function addLattice(){  
  2.     backLayer.graphics.drawRect(10,"dimgray",[0,0,390,420],true,"dimgray");  
  3.     backLayer.graphics.drawRect(10,"dimgray",[0,0,390,390],true,"lavender");  
  4.     for(var i=0;i<3;i++){  
  5.         backLayer.graphics.drawLine(3,"dimgray",[130*i,0,130*i,390]);  
  6.     }  
  7.     for(var i=0;i<3;i++){  
  8.         backLayer.graphics.drawLine(3,"dimgray",[0,130*i,390,130*i]);  
  9.     }  
  10. }  
解释一下他们的功能。首先,gameInit是用来初始化游戏的,包括初始化层一类的东西。addText是用来加下面文字的。addLattice使用来画棋盘的。代码很简单,参照lufylegend API文档看一下就能看懂。

接下来我们来看gameInit里调用的函数:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function initLayer(){  
  2.     backLayer = new LSprite();  
  3.     addChild(backLayer);  
  4.   
  5.     chessLayer = new LSprite();  
  6.     backLayer.addChild(chessLayer);  
  7.   
  8.     overLayer = new LSprite();  
  9.     backLayer.addChild(overLayer);  
  10. }  
  11. function addEvent(){  
  12.     backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,onDown);  
  13. }  
initLayer是用来实例化层的,说明了一点就是实例化LSprite。addEvent用来加点击事件。

然后接下来就来看看事件触发的onDown:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function onDown(){  
  2.     var mouseX,mouseY;  
  3.     mouseX = event.offsetX;  
  4.     mouseY = event.offsetY;  
  5.   
  6.     var partX = Math.floor(mouseX/130);  
  7.     var partY = Math.floor(mouseY/130);  
  8.     if(matrix[partX][partY]==0){  
  9.         usersTurn=false;  
  10.         matrix[partX][partY]=-1;  
  11.         step++;  
  12.         update(partX,partY);  
  13.           
  14.         if(win(partX,partY)){  
  15.             statusContent = "帅呆了,你赢啦!点击屏幕重开游戏。";  
  16.             gameover();  
  17.             addText();  
  18.         }else if(isEnd()){  
  19.             statusContent = "平局啦~~点击屏幕重开游戏。";  
  20.             gameover();  
  21.             addText();  
  22.         }else{  
  23.             statusContent = "电脑正在思考中……";  
  24.             addText();  
  25.             computerThink();  
  26.         }  
  27.     }  
  28. }  
这个函数要做的就是先取出点击位置,然后根据点的位置下一颗棋,然后将在棋盘数组中相应的位置设为-1,表示是我方走的,然后判断:下了这一步棋后的胜负或者平局情况,并且调用相应的函数和显示相应的文字。判断赢,我们用win函数,代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function win(x,y){  
  2.     if(Math.abs(matrix[x][0]+matrix[x][1]+matrix[x][2])==3){  
  3.         return true;  
  4.     }  
  5.     if(Math.abs(matrix[0][y]+matrix[1][y]+matrix[2][y])==3){  
  6.         return true;  
  7.     }  
  8.     if(Math.abs(matrix[0][0]+matrix[1][1]+matrix[2][2])==3){  
  9.         return true;  
  10.     }  
  11.     if(Math.abs(matrix[2][0]+matrix[1][1]+matrix[0][2])==3){  
  12.         return true;  
  13.     }  
  14.     return false;  
  15. }  
首先我们判断第x行,第0,1,2列的数字相加的绝对值是否为3(由于这个函数在下面还要用到,所以我们要做得通用性,所以就用了绝对值)。为什么等于3呢?因为看官是否记得我们上面说的:-1代表【我方下的位置】,0代表【空白格子】,1代表【电脑下的位置】。但凡是下了棋的地方,值总是1或者-1,所以假如有三个同一方棋子连在一起,那这几个值加起来的绝对值一定是3。因此就返回true代表赢了。如果一直判断到最后都没有,就返回false,代表还没有赢。

我们用isEnd判断平局,代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function isEnd(){  
  2.     return step>=9;  
  3. }  
代码很简单,就是判断棋盘占满没有。

其中用到updata负责更新棋盘。代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function update(x,y){  
  2.     var v = matrix[x][y];  
  3.     if(v>0){  
  4.         chessLayer.graphics.drawArc(10,"green",[x*130+65,y*130+65,40,0,2*Math.PI]);  
  5.     }else if(v<0){  
  6.         chessLayer.graphics.drawLine(20,"#CC0000",[130*x+30,130*y+30,130*(x+1)-30,130*(y+1)-30]);  
  7.         chessLayer.graphics.drawLine(20,"#CC0000",[130*(x+1)-30,130*y+30,130*x+30,130*(y+1)-30]);  
  8.     }  
  9. }  

以上的代码也很好理解,就是先取出画的那一点是什么,如果是我方画的(在棋盘数组就是-1),在判断时,取出的值如果小于0,就画个叉叉。如果大于0也就是代表电脑画的(在棋盘数组中代表1),就画个圆。

onDown中还用到了gameOver函数,代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function gameover(){  
  2.     backLayer.removeEventListener(LMouseEvent.MOUSE_DOWN,onDown);  
  3.     backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,function(){  
  4.         chessLayer.removeAllChild();  
  5.         backLayer.removeChild(chessLayer);  
  6.         backLayer.removeChild(overLayer);  
  7.         removeChild(backLayer);  
  8.         matrix = [  
  9.             [0,0,0],  
  10.             [0,0,0],  
  11.             [0,0,0]  
  12.         ];  
  13.         step = 0;  
  14.         main();  
  15.         statusContent = "您先请吧……";  
  16.         addText();  
  17.     });  
  18. }  
看似代码有点长,其实很简单,就是简单的移除界面上的一切对象,并且把一些值恢复为默认值。还有onDown中的computerThink函数,代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function computerThink(){  
  2.     var b = best();  
  3.     var x = b.x;  
  4.     var y = b.y;  
  5.     matrix[x][y]=1;  
  6.     step++;  
  7.     update(x,y);  
  8.       
  9.     if(win(x,y)){  
  10.         statusContent = "哈哈你输了!点击屏幕重开游戏。";  
  11.         gameover();  
  12.         addText();  
  13.     }else if(isEnd()){  
  14.         statusContent = "平局啦~~点击屏幕重开游戏。";  
  15.         gameover();  
  16.         addText();  
  17.     }else{  
  18.         statusContent = "该你了!!!";  
  19.         addText();  
  20.     }  
  21. }  

首先这个函数用了best函数,这个函数会返回一个要下的位置,然后我们把在棋盘数组中相应的位置设置为1,并且把走的步数+1。然后在相应位置画上。然后判断是否赢了或者平局,或者没赢没输没平局。

best是电脑AI算法部分,代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function best(){  
  2.     var bestx;  
  3.     var besty;  
  4.     var bestv=0;  
  5.     for(var x=0;x<3;x++){  
  6.         for(var y=0;y<3;y++){  
  7.             if(matrix[x][y]==0){  
  8.                 matrix[x][y] = 1;  
  9.                 step++;  
  10.                 if(win(x,y)){  
  11.                     step--;  
  12.                     matrix[x][y] = 0;     
  13.                     return {'x':x,'y':y,'v':1000};  
  14.                 }else if(isEnd()){  
  15.                     step--;  
  16.                     matrix[x][y]=0;   
  17.                     return {'x':x,'y':y,'v':0};  
  18.                 }else{  
  19.                     var v=worst().v;  
  20.                     step--;  
  21.                     matrix[x][y]=0;  
  22.                     if(bestx==null || v>=bestv){  
  23.                         bestx=x;  
  24.                         besty=y;  
  25.                         bestv=v;  
  26.                     }  
  27.                 }  
  28.             }  
  29.         }  
  30.     }  
  31.     return {'x':bestx,'y':besty,'v':bestv};  
  32. }  
算法的思路如下:首先我们遍历棋盘数组,然后判断遍历到的那格如果是空的(也就值是0)就先假设画上,并且将在棋盘数组中相应的位置设为1,表示电脑是下的,然后将走的步数+1。普通的操作就完了,接下来就是给下的这一步评分阶段,代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. if(win(x,y)){  
  2.     step--;  
  3.     matrix[x][y] = 0;     
  4.     return {'x':x,'y':y,'v':1000};  
  5. }else if(isEnd()){  
  6.     step--;  
  7.     matrix[x][y]=0;   
  8.     return {'x':x,'y':y,'v':0};  
  9. }else{  
  10.     var v=worst().v;  
  11.     step--;  
  12.     matrix[x][y]=0;  
  13.     if(bestx==null || v>=bestv){  
  14.         bestx=x;  
  15.         besty=y;  
  16.         bestv=v;  
  17.     }  
  18. }  
首先我们判断一下如果下了这一步,是否就赢了,如果是,就先把步数改回去,并且把棋盘数组改为下这一步之前的棋盘数组(因为我们在computerThink里要改一道,所以先改回去,避免改重了),然后返回这一步的位置,并且评分为1000。最后这个过程用return来实现,return是神马,我想就不用说了吧。判断是否赢了,我们用了win函数,上面已经说过了。

但是万一下了这一步没赢怎么办,就接着判断是否下了成平局,怎么才能成平局呢?就是把整个棋盘占满且对方没有赢,自己也没有赢就是平局。由于如果别人赢了,就不会进行电脑AI,也就不会调用best函数,换句话说就是不可能进行到这一步;如果是电脑赢了,在上级判断中已经做了相应操作而且用return已经推出函数了,也不会运行到此步,因此直接判断占满没有就可以了。因此用到isEnd函数,上面也用到过,并且讲到过,这里不罗嗦。

万一上面的两种情况都不对怎么办?那就随便下个吧。但是随便下也不能乱下。因此用到了worst来选择“随便下”最好的位置。代码如下:

[javascript]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. function worst(){  
  2.     var bestx;  
  3.     var besty;  
  4.     var bestv = 0;  
  5.     for(var x=0;x<3;x++){  
  6.         for(var y=0;y<3;y++){  
  7.             if(matrix[x][y] == 0){  
  8.                 matrix[x][y] = -1;  
  9.                 step++;  
  10.                 if(win(x,y)){  
  11.                     step--;  
  12.                     matrix[x][y] = 0;     
  13.                     return {'x':x,'y':y,'v':-1000};  
  14.                 }else if(isEnd()){  
  15.                     step--;  
  16.                     matrix[x][y]=0;   
  17.                     return {'x':x,'y':y,'v':0};;  
  18.                 }else{  
  19.                     var v=best().v;  
  20.                     step--;  
  21.                     matrix[x][y]=0;  
  22.                     if(bestx==null || v<=bestv){  
  23.                         bestx=x;  
  24.                         besty=y;  
  25.                         bestv=v;  
  26.                     }  
  27.                 }  
  28.                   
  29.             }  
  30.         }  
  31.     }  
  32.     return {'x':bestx,'y':besty,'v':bestv};  
  33. }  

这个函数和best是反着来的,它是假设下了某一步后,别人会赢或者平局。如果别人走那步会赢,就返回这个位置,把这个位置先占住。平局和对方赢是一样的原理,就是见哪里不对就填哪里。最后的判读是在对方不可能赢的情况下采取的,就是通过best函数取最好的。这个best函数在上面讲过了。不作解释了~~

通过worst这个函数会返回几个值,第一个和第二个是随便下的位置,最后一个是评分。在best中我们把这几个返回值接收到,并且通过评分判断这个选择是否比平局的结果还要差,再返回给computerThink这个函数来绘画布局。因此这个过程很绕。大家要搞清楚关系,搞清楚了就不难了。


本次讲解就讲到这里。多谢大家捧场!

若游戏异常,请及时联系我。谢谢大家的支持!

----------------------------------------------------------------

欢迎大家转载我的文章。

转载请注明:转自Yorhom's Game Box

欢迎继续关注我的博客



FROM: http://blog.csdn.net/yorhomwang/article/details/8652567

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】 的相关文章

  • PC端微信打不开小程序解决

    PC端微信点击小程序之后没有啥反应 可以使用下面的方法解决 右键桌面的微信快捷方式 属性 兼容性 勾选上以兼容模式运行这个程序即可
  • 141.判断链表是否有环操作

    单链表与环的情况 1 判断链表是否有环 对于这个问题我们可以采用 快慢指针 的方法 就是有两个指针fast和slow 开始的时候两个指针都指向链表头head 然后在每一步操作中slow向 前走一步即 slow slow gt next 而f
  • 【IDEA】IDEA 接口方法不能跳转到实体类实现方法的问题

    1 概述 在做 Flink Flink 1 13 编译 的时候 最后执行命令 flink 1 13 mvn clean install Dmaven test skip true Dhadoop version 2 8 3
  • 【数据架构系列-02】从《数据中台能力成熟度模型》的发布,聊聊火了的中台

    热点之所以会 热起来 是由于万众瞩目的那份炽烈 也是因为无数双 手 的奋力炒作 所以 要穿过那 缭绕烟雾 看到本质 便需要冷静的头脑 2023年1月4日 信通院发布了 数据中台能力成熟度模型 框架 不由让我浮想联翩 之后是不是还会出现业务中
  • vetur mode_modules Cannot find name template 红色波浪不显示

    解决方法 打开文件 首选项 设置中搜索Vetur 拉到最底部 不勾选勾选Script即可 勾选前 取消后
  • 【配置环境】Visual Studio 配置 OpenCV

    目录 一 环境 二 下载和配置 OpenCV 三 创建一个 Visual Studio 项目 四 配置 Visual Studio 项目 五 编写并编译 OpenCV 程序 六 解决CMake编译OpenCV报的错误 七 本人编译好的库 一
  • 解决:vue组件顶部留有空白问题

    问题 制作导航栏组件时发现无论怎么调整 顶部始终留有一小部分空白 解决 后来经过多方查找 原来是index html的body自带样式 在该文件的头部写如下自定义样式 问题解决
  • Windows10下载到U盘怎么安装?

    Windows10系统是目前主流的操作系统之一 很多用户把Win10系统下载到U盘后不知道怎么安装了 那么下面小编就给大家分享一下Windows10下载到U盘的具体安装教程 准备工作 1 U盘一个 尽量使用8G以上的U盘 2 在本页面下载U
  • 攻防世界-web篇(php_rce)详解

    每日一题 今天我们来攻防世界web篇 php rce 目录 1 利用system函数远程命令执行 2 查找文件目录 3 进入flag目录 4 查看flag文件拿到flag 首先打开题目 这里我们可以看到打开后是一个ThinkPHP V5的界
  • 【目标检测】1、基础内容

    文章目录 1 目标检测是什么 2 目标检测基础 2 1 候选框提取 2 2 特征提取 2 3 分类器 3 目标检测性能评估参数 4 NMS 非极大值抑制 4 数据集 新方法 RFCN Mask RCNN等 5 注意力机制 6 全卷积网络 F
  • GIS地理信息定位系统

    简介 地理信息系统 GIS Geographic Information System 是一门综合性学科 结合地理学与地图学以及遥感和计算机科学 已经广泛的应用在不同的领域 是用于输入 存储 查询 分析和显示地理数据的计算机系统 随着GIS
  • 学习笔记。张飞硬件设计视频1到23

    寒假在家学习 讲得很好 分享一下
  • 漫谈ELK在大数据运维中的应用

    圈子里关于大数据 云计算相关文章和讨论是越来越多 愈演愈烈 行业内企业也争前恐后 群雄逐鹿 而在大数据时代的运维挑站问题也就日渐突出 任重而道远了 本文旨在针对复杂的大数据运维系统推荐一把利器 达到抛砖引玉的效果 如果文中出现任何纰漏和错误
  • adfs服务器获取信息失败,在使用Fiddler或其他诊断工具时无法登陆到ADFS服务器

    在使用Fiddler或其他诊断工具时无法登陆到ADFS服务器 03 29 2016 2 分钟可看完 本文内容 问题描述 当使用Fiddler或其他诊断工具进行ADFS 排错时 用户从内部登录ADFS会反复弹窗要求进行身份验证 示例图如下 问
  • 教你一招永久去除WPS广告

    WPS的广告挺烦人的 一直以为无法去除 直到打开了配置工具 隐藏的够深的 首先打开WPS的配置工具 打开高级 选择其他选项 然后WPS广告的勾选项全部去掉
  • UbuntuServer虚拟机安装

    UbuntuServer虚拟机安装 目录 UbuntuServer虚拟机安装 环境 步骤 创建UbuntuServer虚拟机 UbuntuServer安装 环境 VMware Workstation Pro 15 1 0 Ubuntu Se
  • 【Spark NLP】第 2 章:自然语言基础

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore

随机推荐

  • pycharm下载安装

    接下来安装pycharm 1 首先从网站下载pycharm 点击打开链接 链接为 http www jetbrains com pycharm download section windows 进入之后如下图 根据自己电脑的操作系统进行选择
  • Linux的介绍

    简介 主要介绍Linux的概念 Linux是一款操作系统 类似与Windows 开源 免费 安全 高校 稳定 非常擅长处理高并发 现在大多数企业级项目都是部署在Linux系统的服务器中运行 Linux的创始人是Linus 吉祥物是一只叫Tu
  • 深入理解Mysql索引底层数据结构与算法

    索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构对比 二叉树 左边子节点的数据小于父节点数据 右边子节点的数据大于父节点数据 如果col2是索引 查找索引为89的行元素 那么只需要查找两次 就可以获取到行元素所在的磁盘指针地
  • [labtools 27-2269]no devices detected on target localhost问题解决

    小白刚学FPGA 以流水灯为例入门 在连接板子的时候遇到了这个问题 记录一下 板子型号 xc7z045ffg900 2 解决办法之一 按照table 1 11更改图1 3里34位置处拨码
  • Linux系统中 systemd-journaldCPU占用异常的解决方法

    一 待解决问题 先贴几张图 问题解决之前最头疼的问题 因打印日志的高占用 以致CPU占用高达96 已经无法满足日常使用 从图中可见systemd journald占用了1 4的CPU资源 注 我是用的是Deepin系统 二 解决办法 因为要
  • SpringBoot2.x 集成Hadoop3.0.3 实现HDFS文件系统管理

    任务要求 搭建SpringBoot 2 x 集成Hadoop3 0 3环境 实现Hadoop 重要组成部分HDFS 文件系统管理的封装 核心pom xml 文件
  • vSphere之vCLS

    vCLS vSphere Cluster Services 是在vSphere7 0U1引入的集群服务 它使用代理虚拟机维护集群服务的运行状况 当主机添加到集群时 将创建 vCLS 代理虚拟机 vCLS vm 每个 vSphere 集群中最
  • Dell工作站8T硬盘安装ubuntu 16.04

    Dell工作站8T硬盘安装ubuntu 16 04 MBR文件系统仅支撑2T磁盘 因此在2T以上磁盘上安装ubuntu时 如果想利用全部磁盘空间 需要采用GPT分区 文件系统 模型 这需要重新分区 制作Ubuntu 16 04启动U盘 一
  • js-语言基础进阶-变换按钮的实现

    作者 芝士小熊饼干 系列专栏 数据结构 蓝桥杯 算法 坚持天数 16天
  • 从零搭建Maven私有仓库

    前言 主要使用到的技术 linux docker sonatype nexus maven 1 nexus3介绍 世界上第一个也是唯一一个免费使用的通用工件存储库 2 使用docker安装nexus3 1 下载 使用命令 docker pu
  • 20201105枚举课后总结

    文章目录 枚举 210733 奶牛碑文 http wikioi cn problem 210733 题目描述 输入格式 输出格式 样例输入 样例输出 思路 1 2 代码 210792 分解质因数 http wikioi cn problem
  • java会话技术--03--Session覆盖问题

    java会话技术 03 Session覆盖问题 代码位置 https gitee com DanShenGuiZu learnDemo tree master sessionCookie learn 1 现象 同一域名 同一个服务 不同的端
  • 如何在 vue 项目中引入高德地图

    文章目录 前言 一 申请 地图api开发者key 二 在vue项目安装高德地图的包 三 使用 1 在自己的组件中引入高德地图类 2 编写初始化函数 3 添加插件 前言 相信在 web 开发中有不少项目都用到过地图 那么我们怎么在自己的项目中
  • 程序删除自己

    void DeleteApplicationSelf std string strFileName this char szCommandLine MAX PATH 10 设置本进程为实时执行 快速退出 SetPriorityClass G
  • RabbitMQ消息队列实战(1)—— RabbitMQ的体系

    RabbitMQ是一个开源的消息代理和队列服务器 用来在不同的应用之间共享数据 1983年 被认为是RabbitMQ的雏形的Teknekron创建 首次提出了消息总线的概念 中间经历过数个阶段的发展 一直到2004年 AMQP Advanc
  • Makefile中的$@ $^等常见的符号解析

    之前学过一些Makefile 但是长时间不看 里面的符号又不少 慢慢就忘记了 这次在看Makefile文件 就顺带整理一些常用的符号 以后查询起来也方便 表示目标 表示所有的依赖 lt 表示第一个依赖 即时赋值 延时赋值 附加 例如 CC
  • bluestore中lru和2q缓存和onode_map的联系

    collection对应于某个pg 里面有OnodeSpace结构的onode map变量 OnodeSpace结构的变量内又有Cache结构的cache指针变量和unordered map的onode map变量 这个onode map变
  • 数据结构——>稀疏数组

    一 稀疏数组 1 定义 稀疏数组也叫稀疏矩阵 是普通数组的压缩 在这里我们可以说普通数组的无效数据量远远大于有效数据量 有效数据 在下方的例子中 非0数字就是有效数据 普通数组 其稀疏数组表现形式为 如果第一个例子没看懂 那我们再来举个例子
  • el-input @focus设置光标位置

    关于el input获取焦点失去焦点时光标位置可以使用 focus方法 随便写个el input 设置ref focus blur属性和方法
  • 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】

    一 什么是TicTacToe 井字棋 本游戏为在下用lufylegend开发的第二款小游戏 此游戏是大家想必大家小时候都玩过 因为玩它很简单 只需要一张草稿纸和一只笔就能开始游戏 所以广受儿童欢迎 可能我说了半天 对它名字不熟悉的朋友也不懂