精华内容
下载资源
问答
  • 给学弟学妹们 15W 的图解操作系统!

    万次阅读 多人点赞 2021-05-11 09:04:11
    不知不觉在 CSDN 里了 23 篇图解操作系统的系列文章,总字数高达 15W ,而且每篇都配了很多自己手绘的图,也算有个体系了。 然后图解操作系统文章也帮助到了很多读者,时不时都会读者给小林发感谢信,说我的...

    大家好,我是小林。

    不知不觉在 CSDN 里写了 23 篇图解操作系统的系列文章,总字数高达 15W 字,而且每篇都配了很多自己手绘的图,也算有个体系了。
    在这里插入图片描述
    然后图解操作系统文章也帮助到了很多读者,时不时都会有读者给小林发感谢信,说我的图解文章帮助到他们拿到了心意的 offer,这一点我很庆幸,我的文章也影响了一批人。

    后来,有些读者跟提了个意见,希望这个图解系统能整理成电子文档,这样方便阅读。

    既然是读者的请求,作为宠粉的 CSDN 博主,那肯定得整理呀,于是我就连忙搞了几天,最终把图解操作系统整理成了电子文档,

    这次就开源给大家下载:点击下载图解系统 PDF

    接下来,我先来介绍(吹一吹)我的「图解系统 v1.0」。

    一、有什么内容呢?

    闻其名,不如看其图。

    整个图解系统的目录结构如下:

    在这里插入图片描述
    这份图解系统 电子文档共 16W 字 + 近 400 张图,小林也额外添加了些内容。

    在这里插入图片描述
    图解系统不仅仅涉及了操作系统的内容,还涉及一些计算机组成和 Linux 命令的内容。

    当然还是操作系统的内容占比较高,基本把操作系统进程管理、内存管理、文件系统、设备管理、网络系统这五大结构图解了,其中进程管理和网络系统这两个章节篇幅比较多,进程管理不仅包含了进程与线程的基本知识,还包含了进程间通信,多线程同步、死锁、悲观锁和乐观锁。网络系统包含 I/O 多路复用、零拷贝、Reactor 等等。

    计算机组成主要涉及是 CPU 方面的知识,我们不关注 CPU 是怎么设计与实现的,只关注跟我们开发者有关系的 CPU 知识,比如 CPU 执行程序的原理,CPU 缓存,CPU 伪共享等等,这些看似跟我们开发者无关,实际上关系挺大的,只有了解 CPU 缓存才能写出更快的代码,只要了解 CPU 伪共享才能避免写出无效缓存的代码。

    至于 Linux 命令的章节暂时内容没有很多,主要就写了如何用 Linux 命令「查看网络指标」和「从日志分析 PV、UV」,之所以没有写太多是觉得命令类的文章没办法体现出小林的图解功力,再加上这类命令一般网上资源也很多,工作中遇到需要使用某个命令时,去搜索了解并自己体验了一番后,才会比较深刻,单纯只看文章很容易就忘记这些命令了。

    二、小白适合看吗?

    这份图解系统 PDF 不是单纯的面经,而是相对比较系统化的 PDF,当然小林所写的内容是操作系统的重点知识,也是面试常问的知识点。

    我觉得相比背零零散散的面经,更建议你学好整个操作系统的知识体系,后面你在看面经的时候,你会发觉这些只不过是这颗知识树中的一个小分支,而且延展性会更好。

    操作系统是很容易让小白畏惧一门课,因为不管哪本操作系统书都是厚厚的,就会觉得操作系统东西太多,而且也不容易看懂,每个字我们能得懂,但是连成一句话就看懵了。

    其实小林当时在入门操作系统的时候,也是跟大家感受一样的,谁不是从小白度过过来的呢?

    之前我花了很多时间看书和看视频,学好操作系统后,我就在想能不能写一份帮助大家快速入门操作系统系统文章呢,于是就开始踏上了图解之路,用精美的图片打破大家对操作系统的畏惧感。

    事实证明,图解系列是正确的,在公众号连续写了很多篇图解系统的文章后,收到了非常多读者的支持与认可,有反馈以前大学没学会的,然后看了我的文章突然就醒悟了,也有反馈面试前突击了我的文章,然后拿到了心意的 offer。

    所以,这份图解系统 PDF 适合小白学习,也可以当作面试突击用的手册。

    不过,再怎么吹我的图解系统 PDF,如果大家想要系统化全面的学习操作系统,自然还是离不开书的,PDF 里的末尾会有我学习操作系统的心得,会推荐我看过并且认为不错的书和视频,大家可以留意一下。

    三、遇到问题怎么办?

    之前读者在阅读时遇到问题,通常都是在我的后台留言,或者私信我,但是有时候会遗漏信息。

    因为小林这边消息比较多,也没有助理,全部都是我一个人处理,所以必然会有遗漏回复的信息,而且后台留言也不方便讨论,首先是字数的限制,其次是不能放图片。

    熟悉我的读者也知道,小林是错别字大王,每篇文章都能写出好几个错别字,但是大家放心,这并不会影响阅读。

    这次图解系统是第一次发布,可能会有些错别字,而我自己是很难审核出来的,当局者迷旁观者清嘛。

    所以,大家在阅读「图解系统」时,有遇到困惑的问题,或者发现了错别字,欢迎通过下面的「邮箱地址」反馈给小林,一起迭代出更好的图解系统!

    邮箱地址:xiaolincoding@163.com

    四、图解系统开源

    好了,小林的牛逼吹完了,重磅来了。

    在这里插入图片描述
    开源给大家下载:点击下载图解系统 PDF

    好了,终于松一口气了,这个月终于把图解系统电子书发布出来了 。

    后面的计划大概率是图解 MySQL、Redis 的了,到时候大家别忘了追更哦,希望今年可以在出一份关于图解 MySQL、Redis 的 PDF。

    图解在路上,成长在路上,你我都在牛逼的路上!

    PS:整理图解系统不容易,小林的图解文章但凡对你有点儿帮助或者启发,希望可以给小林一键三连!

    展开全文
  • 杂谈_怎样写好英语

    千次阅读 2012-12-29 17:43:03
    但是就字写得奇烂,写完了连自己都不认识!不过你也别着急,英语书法是比较练的,要写一手漂亮的字,只需要十分钟即可,立竿见影。许多经我指点的学生,第二天交作业后,遭到老师的叱责,说他是找别人代写的...

    奉上一张英语连写规则,速杆见影阿,





    书法是门面,谁都想写一手好字来装点门面。但是就有人字写得奇烂,写完了连自己都不认识!不过你也别着急,英语书法是比较好练的,要写一手漂亮的字,只需要十分钟即可,立竿见影。许多经我指点的学生,第二天交作业后,遭到老师的叱责,说他是找别人代写的作业。

    下面是英语书法中要做到或注意的一些事项:

    1、大写字母写在第一格和第三格内,上面不要顶格,要留有一点儿余地,下面要压齐第三条线,其书写方法同印刷体的书写法基本一样,毋庸赘述;

    2、小写字母手写体和印刷体是不完全一样的,要特别注意f g k y的手写体和印刷体之间的区别;

    3、不要把下列字母互相写混:d和cl ol el、r和v、a和u、c和e等;

    4、写下列字母a c e m n o r s u v w x z时,要灌满中间格,注意要灌满,不要写大,更不要写小;

    5、写b d h k时,上面要顶格,下面压齐第三格,中间的“圈儿”的上面不要高于第二格,也不要低于这个格;

    6、写g p q y时,下面要压齐第四格,上面要顶第二格;

    7、i的主体在二三格之内,要灌满二三格,点儿点在一二格内靠下的位置,点圆;

    8、j的主体在二四格之内,上下顶格,点儿点在一二格靠下的位置,点圆;

    9、t上面不要顶格,顶部写到一二格中间的位置即可,下面压齐第三格,横线要写在第二格的横线上,要写平;

    10、f是英文字母中唯一四个格全占的字母,写在四个格之内的,上下顶格,横线要写在第二格的横线上,要写平要特别注意它和印刷体区别巨大;

    11、在写单词时,i j的点儿,f t的横线以及x的左撇要在写完一个单词的整体部分后再按反方向写上;

    12、写的时候,该对齐的地方一定要对齐,有格的时候要写齐,没格的时候也要写齐;

    13、在一个单词内所有的字母都可以连写,这样看起来每个单词都是手拉手的整体。但是,连笔写的时候要有个原则,就是清晰不混。字母的非主体部分,要以重复走过的笔迹为主,不能重复的时候才能带点儿痕迹,严防重复时画圈,特别是在可能引起误会的情况下更不能画圈;

    14、单词内部字母可以连写,但绝对禁止粘在一起从而使读者无法区分是哪个字母;

    15、切忌写单词的时候读出字母名称,应该读出字母或字母组合在该单词中的读音,字母在字母表中的名称音和在单词中的读音常常是不一样的;

    16、切记,该写的时候写,不该写的时候不要写,要写就写好;

    17、要想写好英语书法的最关键要做的一件事情就是:拒绝老师留的抄写作业!够叛逆的吧?你敢吗?可是你一定要记住,常常要你抄写单词的和罚你抄写的绝对不是好老师,这比体罚更严重,会害得你终生学不好英语,进而贻误你一生的前程!不过话说回来了,你拒绝不了那抄写作业,怎么办呢,我告诉你,要想有成效,你就得抱着积极的态度去完成它:把每个单词都读准后再默写下来。这可能更费时间,但是能达到熟练和记住单词的效果;

    18、最后我要郑重提出的是,不要用抄写的办法去记单词,用抄写的方法背单词,实际是在背字母的写法,学到老你也走不出英文字母表,且越写越乱,写了也不会读,这远远地背离了应该让学生认识到英语是一种拼音文字的因材施教的原则(这里我说的“材”是教材)。英语单词不像汉字那样,不会的写的,写写就会了,如果你用写汉字的办法去写英语单词,就注定了你永远都学不好英语!

    19、最后的最后,我要奉劝那些把板书写得让学生认不清的英语老师(其实你自己也认不清,不信你写完了下来看看,你自己还认识吗?)花点儿时间练练书法吧,先别说是为了孩子们的前途,就算是为你自己的脸面,也是必要的。



    展开全文
  • 今天篇文章,讲通过对话的形式,让你由浅入深着知道,为什么 Https 是安全的。 一、对称加密 ...当然,如果客户端要给服务器发送数据,也是采用这把密钥来加密,这里为了方便,我采用单方向...

    今天这篇文章,讲通过对话的形式,让你由浅入深着知道,为什么 Https 是安全的。

    一、对称加密

    一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客户端发送真实数据的时候,会用这把密钥对数据进行加密,客户端收到加密数据之后,用刚才收到的密钥进行解密。如图:

    当然,如果客户端要给服务器发送数据,也是采用这把密钥来加密,这里为了方便,我采用单方向传输的形式

    小白:那万一密钥在传输的过程中被别人截取了怎么吧?

    例如:

    假如服务器用明文的方式传输密钥给客户端,然后密钥被中间人给捕获了,那么在之后服务器和客户端的加密传输过程中,中间人也可以用他捕获的密钥进行解密。这样的话,加密的数据在中间人看来和明文没啥两样

    二、非对称加密

    一禅:这种方法就是,让客户端和服务器都拥有两把钥匙,一把钥匙是公开的(全世界知道都没关系),我们称之为公钥;另一把钥匙则是保密的(只有自己本人才知道),我们称之为私钥。这且,用公钥加密的数据,只有对应的私钥才能解密;用私钥加密的数据,只有对应的公钥才能解密

    这样,服务器在给客户端传输数据的过程中,可以用客户端明文给他的公钥进行加密,然后客户端收到后,再用自己的私钥进行解密。客户端给服务器发送数据的时候也一样采取这样的方式。这样就能保持数据的安全传输了。画个图理解一下:



    一禅:处理方式就是结合 对称加密+非对称加密这两种方式,我们可以用非对称加密的方式来传输对称加密过程中的密钥,之后我们就可以采取对称加密的方式来传输数据了。具体是这样子的:

    服务器用明文的方式给客户端发送自己的公钥,客户端收到公钥之后,会生成一把密钥(对称加密用的),然后用服务器的公钥对这把密钥进行加密,之后再把密钥传输给服务器,服务器收到之后进行解密,最后服务器就可以安全着得到这把密钥了,而客户端也有同样一把密钥,他们就可以进行对称加密了。

    小白:例如:

    服务器以明文的方式给客户端传输公钥的时候,中间人截取了这把属于服务器的公钥,并且把中间人自己的公钥冒充服务器的公钥传输给了客户端。

    之后客户端就会用中间人的公钥来加密自己生成的密钥。然后把被加密的密钥传输给服务器,这个时候中间人又把密钥给截取了,中间人用自己的私钥对这把被加密的密钥进行解密,解密后中间人就可以获得这把密钥了。

    最后中间人再对这把密钥用刚才服务器的公钥进行加密,再发给服务器。如图:

    毫无疑问,在这个过程中,中间人获取了对称加密中的密钥,在之后服务器和客户端的对称加密传输中,这些加密的数据对中间人来说,和明文没啥区别。

    数字证书登场

    在刚才的讲解中,我们知道,之所以非对称加密会不安全,是因为客户端不知道这把公钥是否是服务器的,因此,我们需要找到一种策略来证明这把公钥就是服务器的,而不是别人冒充的。

    解决这个问题的方式就是使用数字证书,具体是这样的:

    我们需要找到一个拥有公信力、大家都认可的认证中心(CA)

    服务器在给客户端传输公钥的过程中,会把公钥以及服务器的个人信息通过Hash算法生成信息摘要。如图

    为了防止信息摘要被人调换,服务器还会用CA提供的私钥对信息摘要进行加密来形成数字签名。如图:

    并且,最后还会把原来没Hash算法之前的个人信息以及公钥 和 数字签名合并在一起,形成数字证书。如图

    当客户端拿到这份数字证书之后,就会用CA提供的公钥来对数字证书里面的数字签名进行解密来得到信息摘要,然后对数字证书里服务器的公钥以及个人信息进行Hash得到另外一份信息摘要。最后把两份信息摘要进行对比,如果一样,则证明这个人是服务器,否则就不是。如图:

    这样,就可以保证服务器的公钥安全着交给客户端了。

    其实,(有些)服务器一开始就向认证中心申请了这些证书了(有没有看过没有证书的网站在地址栏会被标出警告?),而客户端是,也会内置这些证书。如图:

    当客户端收到服务器传输过来的数据数字证书时,就会在内置的证书列表里,查看是否有解开该数字证书的公钥,如果有则…,如果没有则…

    兄dei,如果觉得我写的不错,不妨帮个忙

    1、关注我的原创微信公众号「帅地玩编程」,每天准时推送干货技术文章,专注于写算法 + 计算机基础知识(计算机网络+ 操作系统+数据库+Linux),听说关注了的不优秀也会变得优秀哦。

    2、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

    作者简洁

    作者:大家好,我是帅地,从大学、自学一路走来,深知算法计算机基础知识的重要性,所以申请了一个微星公众号『帅地玩编程』,专业于写这些底层知识,提升我们的内功,帅地期待你的关注,和我一起学习。 转载说明:未获得授权,禁止转载

    展开全文
  • 我花了一夜用数据结构给女朋友写个H5走迷宫游戏

    万次阅读 多人点赞 2019-09-10 23:27:18
    而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完准备睡觉时:不好别睡觉! 分析 如果用数据...

    先看效果图(在线电脑尝试地址http://biggsai.com/maze.html):
    在这里插入图片描述

    起因

    在这里插入图片描述
    又到深夜了,我按照以往在公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满!
    在这里插入图片描述
    超越妹妹时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个小游戏啥的!
    在这里插入图片描述
    当我码完字准备睡觉时:写不好别睡觉!
    在这里插入图片描述

    分析

    如果用数据结构与算法造出东西来呢?

    • 什么东西简单容易呢?我百度一下,我靠,这个鸟游戏原来不好搞啊,得接触一堆不熟悉的东西,搞不来搞不来。

    有了(灵光一闪),写个猜数字游戏,问他加减乘除等于几。

    • 超越妹妹又不是小孩子,糊弄不过去。

    经过一番折腾,终于在半夜12点确定写迷宫小游戏了。大概弄清楚其中的几个步骤。

    大概是

    • 画线—>画迷宫(擦线)—>方块移动、移动约束(不出界不穿墙)—>完成游戏

    画线(棋盘)

    对于html+js(canvas)画的东西,之前学过javaswing应该有点映像。在html中有个canvas 的画布,可以在上面画一些东西和声明一些监听(键盘监听)。

    对于迷宫来说,那些线条是没有属性的,只有位置x,y,你操作这个画布时候,可能和我们习惯的面相对象思维不一样。所以,在你设计的线或者点的时候,记得那个点、线在什么位置,在后续划线还是擦线还是移动的时候根据这个位置进行操作。

     <!DOCTYPE html>
    <html>
      <head>
        <title>MyHtml.html</title>	
      </head> 
      <body>
      <canvas id="mycanvas" width="600px" height="600px"></canvas>
        
      </body>
      <script type="text/javascript">
    
    var aa=14;
        var chess = document.getElementById("mycanvas");
        var context = chess.getContext('2d');
    
        //  var context2 = chess.getContext('2d');
        //      context.strokeStyle = 'yellow';
        var tree = [];//存放是否联通
        var isling=[];//判断是否相连
        for(var i=0;i<aa;i++){
            tree[i]=[];
            for(var j=0;j<aa;j++){
                tree[i][j]=-1;//初始值为0
            }
        }  for(var i=0;i<aa*aa;i++){
            isling[i]=[];
            for(var j=0;j<aa*aa;j++){
                isling[i][j]=-1;//初始值为0
            }
        }
        
        function drawChessBoard(){//绘画
            for(var i=0;i<aa+1;i++){
                context.strokeStyle='gray';//可选区域
                context.moveTo(15+i*30,15);//垂直方向画15根线,相距30px;
                context.lineTo(15+i*30,15+30*aa);
                context.stroke();
                context.moveTo(15,15+i*30);//水平方向画15根线,相距30px;棋盘为14*14;
                context.lineTo(15+30*aa,15+i*30);
                context.stroke();
            }
        }
        drawChessBoard();//绘制棋盘
       
        //      var mymap=new Array(36);
        //      for(var i=0;i<36;i++)
        //     {mymap[i]=-1;}
    
    
      </script>
    </html>
    

    实现效果
    在这里插入图片描述

    画迷宫

    随机迷宫怎么生成?怎么搞?一脸懵逼。

    • 因为我们想要迷宫,那么就需要这个迷宫出口和入口有连通路径,你可能压根不知道迷宫改怎么生成,用的什么算法。小声BB:并查集(不相交集合)

    迷宫和不相交集合有什么联系呢?(规则)

    • 之前笔者在前面数据结构与算法系列中曾经介绍过并查集(不相交集合),它的主要功能是森林的合并,不联通的通过并查集能够快速将两个森林合并,并且能够快速查询两个节点是否在同一个森林中!

    我们的随机迷宫:在每个方格都不联通的情况下,是一个棋盘方格,这也是它的初始状态。而这个节点可以跟邻居可能相连,也可能不相连。我们可以通过并查集实现。

    具体思路为:(主要理解并查集)

    • 1:定义好不想交集合的基本类和方法(search,union等)
      2:数组初始化,每一个数组元素都是一个集合,值为-1
      3:随机查找一个格子(一维数据要转换成二维,有点麻烦),在随机找一面墙(也就是找这个格子的上下左右),还要判断找的格子出没出界。
      具体在格子中找个随机数m——>随机数m在二维中的位置[m/长,m%长]——>这个二维的上下左右随机找一个位置p[m/长+1,m%长][m/长-1,m%长][m/长,m%长+1][m/长,m%长-1]——>判断是否越界
      4:判断两个格子(一维数组编号)是否在一个集合(并查集查找)。如果在,则重新找,如果不在,那么把墙挖去
      5:把墙挖去有点繁琐,需要考虑奇偶判断它那种墙(上下还是左右,还要考虑位置),然后擦掉。(根据数组转换成真实距离)。具体为找一个节点,根据位置关系找到一维数组的号位用并查集判断是否在一个集合中。
      6:最终得到一个完整的迷宫。直到第一个(1,1)和(n,n)联通停止。虽然采用随机数找墙,但是效果并不是特别差。其中要搞清一维二维数组的关系。一维是真实数据,并查集操作。二维是位置。要搞懂转化!

    注意:避免混淆,搞清数组的地址和逻辑矩阵位置。数组从0开始的,逻辑上你自己判断。别搞混淆!
    在这里插入图片描述
    主要逻辑为:

    while(search(0)!=search(aa*aa-1))//主要思路
        {
            var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数
            var neihbour=getnei(num);
            if(search(num)==search(neihbour)){continue;}
            else//不在一个上
            {
               isling[num][neihbour]=1;isling[neihbour][num]=1;
                drawline(num,neihbour);//划线
                union(num,neihbour);
             
            }
        }
    

    那么在前面的代码为

    <!DOCTYPE html>
    <html>
      <head>
        <title>MyHtml.html</title>	
      </head> 
      <body>
      <canvas id="mycanvas" width="600px" height="600px"></canvas>
        
      </body>
      <script type="text/javascript">
    //自行添加上面代码
        //      var mymap=new Array(36);
        //      for(var i=0;i<36;i++)
        //     {mymap[i]=-1;}
        function getnei(a)//获得邻居号  random
        {
            var x=parseInt(a/aa);//要精确成整数
            var y=a%aa;
            var mynei=new Array();//储存邻居
            if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点
            if(x+1<14){mynei.push((x+1)*aa+y);}//下节点
            if(y+1<14){mynei.push(x*aa+y+1);}//有节点
            if(y-1>=0){mynei.push(x*aa+y-1);}//下节点
            var ran=parseInt(Math.random() * mynei.length );
            return mynei[ran];
    
        }
        function search(a)//找到根节点
        {
            if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点
            {
                return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩
            }
            else
                return a;
        }
        function value(a)//找到树的大小
        {
            if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点
            {
                return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩
            }
            else
                return -tree[parseInt(a/aa)][a%aa];
        }
        function union(a,b)//合并
        {
            var a1=search(a);//a根
            var b1=search(b);//b根
            if(a1==b1){}
            else
            {
                if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数
                {
                    tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加  注意是负数相加
                    tree[parseInt(b1/aa)][b1%aa]=a1;       //b树成为a树的子树,b的根b1直接指向a;
                }
                else
                {
                    tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa];
                    tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树
                }
            }
        }
    
        function drawline(a,b)//划线,要判断是上下还是左右
        {
    
            var x1=parseInt(a/aa);
            var y1=a%aa;
            var x2=parseInt(b/aa);
            var y2=b%aa;        
            var x3=(x1+x2)/2;
            var y3=(y1+y2)/2;
            if(x1-x2==1||x1-x2==-1)//左右方向的点  需要上下划线
            {
                //alert(x1);
                //  context.beginPath();
                context.strokeStyle = 'white';
                //    context.moveTo(30+x3*30,y3*30+15);//
                //   context.lineTo(30+x3*30,y3*30+45);
                context.clearRect(29+x3*30, y3*30+16,2,28);
                //    context.stroke();
            }
            else
            {
                //   context.beginPath();
                context.strokeStyle = 'white';
                //  context.moveTo(x3*30+15,30+y3*30);//
                //    context.lineTo(45+x3*30,30+y3*30);
                context.clearRect(x3*30+16, 29+y3*30,28,2);
                //      context.stroke();
            }
        }
         
        while(search(0)!=search(aa*aa-1))//主要思路
        {
            var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数
            var neihbour=getnei(num);
            if(search(num)==search(neihbour)){continue;}
            else//不在一个上
            {
               isling[num][neihbour]=1;isling[neihbour][num]=1;
                drawline(num,neihbour);//划线
                union(num,neihbour);
             
            }
        }
      </script>
    </html>
    

    实现效果:
    在这里插入图片描述
    在这里插入图片描述

    方块移动

    这部分我采用的方法不是动态真的移动,而是一格一格的跳跃。也就是当走到下一个格子将当前格子的方块擦掉,在移动的那个格子中再画一个方块。选择方块是因为方块更方便擦除,可以根据像素大小精准擦除。

    另外,再移动中要注意不能穿墙、越界。那么怎么判断呢?很好办,我们再前面会判断两个格子是否联通,如果不连通我们将把这个墙拆开。再拆的时候把这个墙的时候记录这两点拆墙可走即可(数组)

    另外,事件的监听上下左右查一查就可以得到,添加按钮对一些事件监听,这些不是最主要的。

    为了丰富游戏可玩性,将方法封装,可以设置关卡(只需改变迷宫大小)。这样就可以实现通关了。另外,如果写成动态存库那就更好了。
    在这里插入图片描述

    结语

    在线尝试地址,代码直接查看网页源代码即可!

    笔者前端能力和算法能力有限,写的可能不是特别好,还请见谅!当然,笔者欢迎和一起热爱学习的人共同进步、学习!欢迎关注笔者公众号:bigsai,后台回复java、数据结构、爬虫、springboot等有精心准备资料一份。如果感觉不错,欢迎关注、点赞!蟹蟹!

    在这里插入图片描述

    展开全文
  • 一手好字:硬笔书法轻松自学指南(知乎周刊 Plus) 知乎编辑团队 楷书,认知好字的范本 2017-03-16 《黄自元间架结构九十二法》 选本字帖 2017-03-16 先谈书体。 前人对练习书法的程序,各主张。的认为...
  • Mnist模型识别自己手写数字正确率低的原因

    千次阅读 多人点赞 2018-12-12 11:58:38
    的同学用官方的训练数据mnist训练自己的模型后,自己制作数字图片给训练的模型识别,结果正确率只有40%多,甚至用原来训练的数据集识别正确率都低于50%. 解决方法: 可以从下面几方面入手,自己...
  • 程序员如何才能写出一篇的技术文章

    千次阅读 多人点赞 2016-03-01 00:00:42
    每天的时间刷GitHub,博客。从我大二的时候,大概六年前开始技术博客,到现在已经540+了,大概每年会一百篇左右。这个答案由四部分组成: 博客的流量来源 不同文章类型的写作要点 如何博客 如何收集...
  • 今天终于时间好好给大家写写关于如何简历,给自己加分了。 篇文章拖了很久了应该说,本来想在上周的,但是事情实在是太多,又不想草草了事,所以搁置到现在。今天早上正好空出来了,就马上给大家码出来了。 ...
  • 文章时,经常遇到4困惑,真是不爽。
  • 对于日后的跳槽:思考有这个任务的复杂点在哪,有没有什么技术点是后面自己跳槽时能写到简历里的,是否有一些点让面试官觉得很牛逼的? 将自己的思考通过文档记录下来,经过思考和总结下来的内容通常是后面述职...
  • 最合适代码的字体

    千次阅读 2015-01-27 15:05:12
    每天盯着屏幕代码,自然需要寻找一种看得舒服的字体,让自己的代码赏心悦目,一般来说,我们选择用于显示代码的字体,如下几要求: 字母的宽度一致 或称为等宽字体,由于代码文件是普通文本,不带...
  • 2.写好一封工作邮件,重要的不是“怎么写”,而是“什么该写,什么不该写”。 3.重要的备忘、通知和需要留底的话,最好通过工作邮件传递。 I、如何做到位极人臣?(奏章和来往批复的文件写得好) 回到古代,司马光跟...
  • 在前面:大家K。首先为你点进篇有趣的文章点赞????!文章在撰写过程中难免疏漏和错误,欢迎你在下方留言指出文章的不足之处;如果觉得篇文章对你有用,也欢迎你点赞和留下你的评论。篇文章参考此文,...
  • 坚持技术博客一年能有多少收获!

    万次阅读 多人点赞 2020-10-10 08:31:57
    作者:小傅哥 ... 沉淀、分享、成长,让自己和他人都有所收获!...粉丝过万说明这个公众号已经度过了冷启动阶段,并且所的技术文章得到了一定的市场认可。这些文章内容构成了一小的生态圈,通过内
  • 第二种的思维可以了解了解,但是需要注意的是如果某个字符串定义为String类型,那么这个串就不改变了;如果需要改变,那么应该使用StringBuffer,这个例子也能够很的说明StringBuffer和String之间的区别! 下面...
  • 是人的脸,可我就是不好

    千次阅读 2017-05-24 21:26:56
    (了之 作品)看看我们首席书法官(了之)的,多漂亮啊,真让人羡慕嫉妒恨。说起来写字,记忆是痛苦的。我父亲的得特别赞,只可惜会他在三门峡,不让他出来炫耀一...
  • (有趣)文字隐藏到图片中

    千次阅读 2016-04-27 23:26:11
    建立一文本文件(.txt),的内容到里面。注意,在前面要空一两行,不起头就东西,否则第一行的内容会丢失。 建立或找一张图片(.jpg),最好小点儿,200K左右就行了,最多不要超过500K,不然打开很慢...
  • 我是如何从不出来,到完成二十万书稿的?

    千次阅读 多人点赞 2018-11-20 08:02:17
    去年过年的时候,父母从乡下来到我...父亲在家里最话语权,只是冷冷地说了一句话:“你还能写书?” 一盆冷水劈头盖脸地浇在我的身上;那一刻,我的玻璃心几乎要咔擦一声的摔在地上。瞅着父亲满头灰白的头发,我...
  • 如何写好一份PPT?

    千次阅读 2018-10-17 13:57:14
    我们在日常工作中经常能够看到像下面图片这样丑到爆炸的PPT, 就算是国际性的会议也会出现下面这样辣眼睛的作品 看到这样的作品,即使嘴上不说,我们也会在心里默念“这个人做的PPT...如果能把这四块内容的一...
  • 如何写好一篇英文科技论文

    千次阅读 2021-06-07 16:12:37
    如何写好一篇英文科技论文 声明: 本文根据香港城市大学陈关荣院士的报告如何写好一篇英文科技论文整理而成; 如发现相关侵权行为,请联系作者修改!!! 陈院士主页公开的报告PPT(如需要可自取) ...
  • 上一篇介绍了怎么用内部高速时钟做系统时钟, 内部时钟,就是3%的偏差对于...我手上的是JlinkV8,按官方说法,只要使用JLinkBurner.exe这个软件就能写. 这个软件在哪里? 在安装了Keil插件之后,这个软件就会出现
  • 如何写好科研论文(笔记)

    千次阅读 2020-10-14 16:25:51
    一、论文攥 1.标题(title) a.... b.... c....套路化,如:我们考虑了xx系统中的xx问题,利用xx原理或xx方法研究这个问题,在研究的过程中遇到了xx阻碍,然后又用到了什么特殊的手段解决了这个阻碍,
  • 代码规范、如何代码

    万次阅读 2016-08-08 15:41:14
    代码规范、如何代码 上大学以来,每当看到的文章,第一反应都是使用浏览器的收藏功能,收藏下来,久而久之,收藏的网址越来越多。虽然浏览器收藏夹也文件夹的功能...作为一程序员,肯定希望能写出一手
  • 如何写好一份产品需求文档

    万次阅读 多人点赞 2017-01-24 15:52:03
    如何写好一份产品需求文档 ...一份PRD可以直接的看出一产品人对自己所负责的产品的整体控能力,也间接的看出产品人的产品思维,表现出产品人对某一垂直行业的专业知识广度和需求洞察能力。 而P
  • 如果你现在在做微信公众号开发,吧,你看到篇文章应该不是如果在做了,相信你已经蛋疼了一段时间了。先来张微信后台萌萌的截图 微信后台很负责的告诉你,自定义菜单第一级目录汉字不超过4;但是或许你...
  • 给所有程序员_起个好名字是成功的一半

    万次阅读 多人点赞 2017-10-12 10:57:51
    时隔我做程序员两年了,现在才意识到为文件,为变量,为函数起个好名字的重要,...段代码很简单,输出两数的和,但有个问题,你看到c就知道是两数和吗?如果我们的代码足够多,当每次看到a,b,c的时候,我们都要尝
  • 作为一程序员,不了解数据库怎么行,那么数据库到底是啥呢,作为一Java工程师,平时和数据库打交道着实不少,所谓的CRUD其实就是对数据库进行增删改查的操作。 根据百度百科的介绍,数据库是“按照数据...
  • 究竟怎样代码才算是代码

    万次阅读 多人点赞 2016-09-21 16:05:06
    今天让我们来谈谈代码吧...在给“代码”下定义之前,这个问题无法回答。那么,究竟什么是代码?看下面段英文解释: ‘Good code’ is code that works, is bug free, and is readable and maintainable. Some
  • 大写转换小写 ctrl+...组快捷键可以让你打开你的工作区中任何一文件,而你只需要按下文件名或mask名中的前几字母,比如applic*.xml。美中不足的是组快捷键并非在所有视图下都用。2. ctrl+o:快速outl...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,076,408
精华内容 430,563
关键字:

怎么才能把这个有字写好