皮皮网
皮皮网

【源码优化诊断】【安卓websocket源码】【csgo人物透视源码】bfs c源码

来源:帝国限时抢购源码 发表时间:2024-11-25 23:18:16

1.如何系统地自学 Python
2.如何用Python写一个贪吃蛇AI

bfs c源码

如何系统地自学 Python

       æ˜¯å¦éžå¸¸æƒ³å­¦å¥½ Python,一方面被琐事纠缠,一直没能动手,另一方面,担心学习成本太高,心里默默敲着退堂鼓?

       å¹¸è¿çš„是,Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。

       Python 的设计哲学之一就是简单易学,体现在两个方面:

       è¯­æ³•ç®€æ´æ˜Žäº†ï¼šç›¸å¯¹ Ruby 和 Perl,它的语法特性不多不少,大多数都很简单直接,不玩儿玄学。

       åˆ‡å…¥ç‚¹å¾ˆå¤šï¼šPython 可以让你可以做很多事情,科学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,总有一个是你感兴趣并且愿意投入时间的。

       åºŸè¯ä¸å¤šè¯´ï¼Œå­¦ä¼šä¸€é—¨è¯­è¨€çš„捷径只有一个: Getting Started

       ¶ 起步阶段

       ä»»ä½•ä¸€ç§ç¼–程语言都包含两个部分:硬知识和软知识,起步阶段的主要任务是掌握硬知识。

       ç¡¬çŸ¥è¯†

       â€œç¡¬çŸ¥è¯†â€æŒ‡çš„是编程语言的语法、算法和数据结构、编程范式等,例如:变量和类型、循环语句、分支、函数、类。这部分知识也是具有普适性的,看上去是掌握了一种语法,实际是建立了一种思维。例如:让一个 Java 程序员去学习 Python,他可以很快的将 Java 中的学到的面向对象的知识 map 到 Python 中来,因此能够快速掌握 Python 中面向对象的特性。

       å¦‚果你是刚开始学习编程的新手,一本可靠的语法书是非常重要的。它看上去可能非常枯燥乏味,但对于建立稳固的编程思维是必不可少。

       ä¸‹é¢åˆ—出了一些适合初学者入门的教学材料:

       å»–雪峰的 Python 教程    Python 中文教程的翘楚,专为刚刚步入程序世界的小白打造。    

       ç¬¨æ–¹æ³•å­¦ Python    è¿™æœ¬ä¹¦åœ¨è®²è§£ Python 的语法成分时,还附带大量可实践的例子,非常适合快速起步。    

       The源码 Hitchhiker’s Guide to Python!    è¿™æœ¬æŒ‡å—着重于 Python 的最佳实践,不管你是 Python 专家还是新手,都能获得极大的帮助。    

       Python 的哲学:

用一种方法,最好是只有一种方法来做一件事。

       å­¦ä¹ ä¹Ÿæ˜¯ä¸€æ ·ï¼Œè™½ç„¶æŽ¨èäº†å¤šç§å­¦ä¹ èµ„料,但实际学习的时候,最好只选择其中的一个,坚持看完。

       å¿…要的时候,可能需要阅读讲解数据结构和算法的书,这些知识对于理解和使用 Python 中的对象模型有着很大的帮助。

       è½¯çŸ¥è¯†

       â€œè½¯çŸ¥è¯†â€åˆ™æ˜¯ç‰¹å®šè¯­è¨€çŽ¯å¢ƒä¸‹çš„语法技巧、类库的使用、IDE的选择等等。这一部分,即使完全不了解不会使用,也不会妨碍你去编程,只不过写出的程序,看上去显得“傻”了些。

       å¯¹è¿™äº›çŸ¥è¯†çš„学习,取决于你尝试解决的问题的领域和深度。对初学者而言,起步阶段极易走火,或者在选择 Python 版本时徘徊不决,一会儿看 2.7 一会儿又转到 3.0,或者徜徉在类库的大海中无法自拔,Scrapy,Numpy,Django 什么都要试试,或者参与编辑器圣战、大括号缩进探究、操作系统辩论赛等无意义活动,或者整天跪舔语法糖,老想着怎么一行代码把所有的事情做完,或者去构想圣洁的性能安全通用性健壮性全部满分的解决方案。

       å¾ˆå¤šâ€œå¤§ç‰›â€éƒ½ä¼šå‘Šè¯«åˆå­¦è€…,用这个用那个,少走弯路,这样反而把初学者推向了真正的弯路。

       è¿˜ä¸å¦‚告诉初学者,学习本来就是个需要你去走弯路出 Bug,只能脚踏实地,没有奇迹只有狗屎的过程。

       é€‰æ‹©ä¸€ä¸ªæ–¹å‘先走下去,哪怕脏丑差,走不动了再看看有没有更好的解决途径。

       è‡ªå·±èµ°äº†å¼¯è·¯ï¼Œä½ æ‰çŸ¥é“这么做的好处,才能理解为什么人们可以手写状态机去匹配却偏要发明正则表达式,为什么面向过程可以解决却偏要面向对象,为什么我可以操纵每一根指针却偏要自动管理内存,为什么我可以嵌套回调却偏要用 Promise...

       æ›´é‡è¦çš„是,你会明白,高层次的解决方法都是对低层次的封装,并不是任何情况下都是最有效最合适的。

       æŠ€æœ¯æ¶Œè¿›å°±åƒæ³¢æµªä¸€æ ·ï¼Œé‚£äº›é™ˆæ—§çš„封存已久的技术,消退了迟早还会涌回的。就像现在移动端应用、手游和 HTML5 的火热,某些方面不正在重演过去 PC 的那些历史么?

       å› æ­¤ï¼Œä¸è¦æ‹…心自己走错路误了终身,坚持并保持进步才是正道。

       èµ·æ­¥é˜¶æ®µçš„核心任务是掌握硬知识,软知识做适当了解,有了稳固的根,粗壮的枝干,才能长出浓密的叶子,结出甜美的果实。

       ¶ 发展阶段

       å®Œæˆäº†åŸºç¡€çŸ¥è¯†çš„学习,必定会感到一阵空虚,怀疑这些语法知识是不是真的有用。

       æ²¡é”™ï¼Œä½ çš„怀疑是非常正确的。要让 Python 发挥出它的价值,当然不能停留在语法层面。

       å‘展阶段的核心任务,就是“跳出 Python,拥抱世界”。

       åœ¨ä½ é¢å‰ä¼šæœ‰å¤šä¸ªåˆ†æ”¯ï¼šç§‘学计算和数据分析、爬虫、Web 网站、游戏、命令行实用工具等等等等,这些都不是仅仅知道 Python 语法就能解决的问题。

       æ‹¿çˆ¬è™«ä¸¾ä¾‹ï¼Œå¦‚果你对计算机网络,HTTP 协议,HTML,文本编码,JSON 一无所知,你能做好这部分的工作么?而你在起步阶段的基础知识也同样重要,如果你连循环递归怎么写都还要查文档,连 BFS 都不知道怎么实现,这就像工匠做石凳每次起锤都要思考锤子怎么使用一样,非常低效。

       åœ¨è¿™ä¸ªé˜¶æ®µï¼Œä¸å¯é¿å…è¦æŽ¥è§¦å¤§é‡ç±»åº“,阅读大量书籍的。

       ç±»åº“方面

       ã€ŒAwesome Python 项目」:vinta/awesome-python · GitHub

       è¿™é‡Œåˆ—出了你在尝试解决各种实际问题时,Python 社区已有的工具型类库,如下图所示:

       è¯·ç‚¹å‡»è¾“入图片描述

       vinta/awesome-python

       ä½ å¯ä»¥æŒ‰ç…§å®žé™…需求,寻找你需要的类库。

       è‡³äºŽç›¸å…³ç±»åº“如何使用,必须掌握的技能便是阅读文档。由于开源社区大多数文档都是英文写成的,所以,英语不好的同学,需要恶补下。

       ä¹¦ç±æ–¹é¢

       è¿™é‡Œæˆ‘只列出一些我觉得比较有一些帮助的书籍,详细的请看豆瓣的书评:

       ç§‘学和数据分析:

       ❖「集体智慧编程」:集体智慧编程 (豆瓣)

       ❖「数学之美」:数学之美 (豆瓣)

       ❖「统计学习方法」:统计学习方法 (豆瓣)

       ❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)

       ❖「数据科学实战」:数据科学实战 (豆瓣)

       ❖「数据检索导论」:信息检索导论 (豆瓣)

       çˆ¬è™«ï¼š

       ❖「HTTP 权威指南」:HTTP权威指南 (豆瓣)

       Web 网站:

       ❖「HTML & CSS 设计与构建网站」:HTML & CSS设计与构建网站 (豆瓣)

       ...

       åˆ—到这里已经不需要继续了。

       èªæ˜Žçš„你一定会发现上面的大部分书籍,并不是讲 Python 的书,而更多的是专业知识。

       äº‹å®žä¸Šï¼Œè¿™é‡Œæ‰€è°““跳出 Python,拥抱世界”,其实是发现 Python 和专业知识相结合,能够解决很多实际问题。这个阶段能走到什么程度,更多的取决于自己的专业知识。

       ¶ 深入阶段

       è¿™ä¸ªé˜¶æ®µçš„你,对 Python 几乎了如指掌,那么你一定知道 Python 是用 C 语言实现的。

       å¯æ˜¯ Python 对象的“动态特征”是怎么用相对底层,连自动内存管理都没有的C语言实现的呢?这时候就不能停留在表面了,勇敢的拆开 Python 的黑盒子,深入到语言的内部,去看它的历史,读它的源码,才能真正理解它的设计思路。

       è¿™é‡ŒæŽ¨èä¸€æœ¬ä¹¦ï¼š

       ã€ŒPython 源码剖析」:Python源码剖析 (豆瓣)

       è¿™æœ¬ä¹¦æŠŠ Python 源码中最核心的部分,给出了详细的阐释,不过阅读此书需要对 C 语言内存模型和指针有着很好的理解。

       å¦å¤–,Python 本身是一门杂糅多种范式的动态语言,也就是说,相对于 C 的过程式、 Haskell 等的函数式、Java 基于类的面向对象而言,它都不够纯粹。换而言之,编程语言的“道学”,在 Python 中只能有限的体悟。学习某种编程范式时,从那些面向这种范式更加纯粹的语言出发,才能有更深刻的理解,也能了解到 Python 语言的根源。

       è¿™é‡ŒæŽ¨èä¸€é—¨å…¬å¼€è¯¾

       ã€Œç¼–程范式」:斯坦福大学公开课:编程范式

       è®²å¸ˆé«˜å±‹å»ºç“´ï¼Œä»Žå„种编程范式的代表语言出发,给出了每种编程范式最核心的思想。

       å€¼å¾—一提的是,这门课程对C语言有非常深入的讲解,例如C语言的范型和内存管理。这些知识,对阅读 Python 源码也有大有帮助。

       Python 的许多最佳实践都隐藏在那些众所周知的框架和类库中,例如 Django、Tornado 等等。在它们的源代码中淘金,也是个不错的选择。

       ¶  æœ€åŽçš„话

       æ¯ä¸ªäººå­¦ç¼–程的道路都是不一样的,其实大都殊途同归,没有迷路的人只有不能坚持的人!

       å¸Œæœ›æƒ³å­¦ Python 想学编程的同学,不要犹豫了,看完这篇文章,

       Just Getting Started  ï¼ï¼ï¼

如何用Python写一个贪吃蛇AI

       如何用Python写一个贪吃蛇AI

       前言

       最近在网上看到一张让人涨姿势的,中展示的源码是贪吃蛇游戏,估计大部分人都玩过。源码但如果仅仅是源码贪吃蛇游戏,那么它就没有世差含什么让人涨姿势的源码地方了。问题的源码源码优化诊断关键在于,中的源码贪吃蛇真的很贪吃XD,它把矩形中出现的源码食物吃了个遍,然后华丽丽地把整个矩形填满,源码真心是源码看得赏心悦目。作为一个CSer,源码第一个想到的源码是,这东西是源码写程序实现的(因为,一般人干不出这事。源码果断是源码要让程序来干的)第二个想到的是,写程序该如何实现,该用什么算法?既然开始想了,就开始做。因为Talk is cheap,要show me the code才行。 (从耗子叔那学来的)开始之前,让我们再欣赏一下那只让人涨姿势的贪吃蛇吧:(如果下面的动态浏览效果不佳的话,可以右键保存下来查看)

       语言选择

       Life is short, use python!所以,根本就没多想,直接上python。安卓websocket源码最初版本先让你的程序跑起来首先,我们第一件要做的就是先不要去分析这个问题。你好歹先写个能运行起来的贪吃蛇游戏,然后再去想AI部分。这个应该很简单,cc++也就百来行代码(如果我没记错的话。不弄复杂界面,直接在控制台下跑),python就更简单了,去掉注释和空行,5、行代码就搞定了。而且,最最关键的,这个东西网上肯定写滥了,你没有必要重复造轮子,去弄一份来按照你的意愿改造一下就行了。

       简单版本

       我觉得直接写perfect版本不是什么好路子。因为perfect版本往往要考虑很多东西,直接上来就写这个一般是bug百出的。所以,一开始我的目标仅仅是让程序去控制贪吃蛇运动,让它去吃食物,仅此而已。csgo人物透视源码现在让我们来陈述一下最初的问题:

       在一个矩形中,每一时刻有一个食物,贪吃蛇要在不撞到自己的条件下,找到一条路(未必要最优),然后沿着这条路运行,去享用它的美食。

       我们先不去想蛇会越来越长这个事实,问题基本就是,给你一个起点(蛇头)和一个终点(食物),要避开障碍物(蛇身),从起点找到一条可行路到达终点。

       我们可以用的方法有:BFSDFSA*只要有选择,就先选择最简单的方案,我们现在的目标是要让程序先跑起来,优化是后话。so,从BFS开始。我们最初将蛇头位置放入队列,然后只要队列非空,就将队头位置出队,然后把它四领域内的4个点放入队列,不断地循环操作,直到到达食物的位置。这个过程中,蜜桃tv网站源码我们需要注意几点:

       1.访问过的点不再访问。

       2.保存每个点的父结点(即每个位置是从哪个位置走到它的,这样我们才能把可行路径找出来)。

       3.蛇身所在位置和四面墙不可访问。

       通过BFS找到食物后,只需要让蛇沿着可行路径运动即可。这个简单版本写完后,贪吃蛇就可以很欢快地运行一段时间了。看图吧:(不流畅的感觉来自录屏软件@_@)

       为了尽量保持简单,我用的是curses模块,直接在终端进行绘图。从上面的动态可以看出,每次都单纯地使用BFS,最终有一天,贪吃蛇会因为这种不顾后果的短视行为而陷入困境。而且,即使到了那个时候,它也只会BFS一种策略,导致因为当前看不到目标(食物),认为自己这辈子就这样了,破罐子破摔,最终停在它人生中的某一个点,不再前进。(我好爱讲哲理XD)

       BFS+Wander

       上一节的短网址源码统计简单版本跑起来后,我们认识到,只教贪吃蛇一种策略是不行的。它这么笨一条蛇,你不多教它一点,它分分钟就会挂掉的。所以,我写了个Wander函数,顾名思义,当贪吃蛇陷入困境后,就别让它再BFS了,而是让它随便四处走走,散散心,思考一下人生什么的。这个就好比你困惑迷茫的时候还去工作,效率不佳不说,还可能阻碍你走出困境;相反,这时候你如果放下手中的工作,停下来,出去旅个游什么的。回来时,说不定就豁然开朗,土地平旷,屋舍俨然了。Wander函数怎么写都行,但是肯定有优劣之分。我写了两个版本,一个是在可行的范围内,朝随机方向走随机步。也就是说,蛇每次运动的方向是随机出来的,总共运动的步数也是随机的。Wander完之后,再去BFS一下,看能否吃到食物,如果可以那就皆大欢喜了。如果不行,说明思考人生的时间还不够,再Wander一下。这样过程不断地循环搜笑进行。可是就像“随机过程随机过”一样,你“随机Wander就随机挂”。会Wander的蛇确实能多走好多步。可是有一天,它就会把自己给随机到一条死路上了。陷入困境还可以Wander,进入死胡同,那可没有回滚机制。所以,第二个版本的Wander函数,我就让贪吃蛇贪到底。在BFS无解后,告诉蛇一个步数step(随机产生step),让它在空白区域以S形运动step步。这回运动方向就不随机了,而是有组织有纪律地运动。先看图,然后再说说它的问题:

       没错,最终还是挂掉了。S形运动也是无法让贪吃蛇避免死亡的命运。贪吃蛇可以靠S形运动多存活一段时间,可是由于它的策略是:

       

       1. 目标是食物时,走最短路径

       2. 目标是蛇尾时,走最长路径

       那第三种情况呢?与食物和蛇尾都没路径存在的情况下,这个时候本来就只是挑一步可行的步子来走,最短最长关系都不大了。至于人为地让蛇走S形,我觉得这不是什么好策略,最初版本中已经分析过它的问题了。 (当然,除非你想使用最最无懈可击的那个版本,就是完全不管食物,让蛇一直走S,然后在墙边留下一条过道即可。这样一来,蛇总是可以完美地把所有食物吃完,然后占满整个空间,可是就很boring了。没有任何的意思)

       上面还提到一个问题:因为食物是随机出现的,有没可能出现无解的布局?答案是:有。我运行了程序,然后把每一次布局都输出到log,发现会有这样的情况:

       

       # # # # # # #

       * * * * * #

       * * - 0 * #

       * * # + * #

       * * * * * #

       * * * * * #

       # # # # # # #

       其中,+号是蛇头,-号是蛇尾,*号是蛇身,0是食物,#号代表空格,外面一圈#号代表墙。这个布局上,食物已经在蛇头面前了,可是它能吃吗?不能!因为它吃完食物后,长度加1,蛇头就会把0的位置填上,布局就变成:

       

       # # # # # # #

       * * * * * #

       * * - + * #

       * * # * * #

       * * * * * #

       * * * * * #

       # # # # # # #

       此时,由于蛇的长度加1,蛇尾没有动,而蛇头被自己围着,挂掉了。可是,我们却还有一个空白的格子#没有填充。按照我们之前教给蛇的策略,面对这种情况,蛇头就只会一直追着蛇尾跑,每当它和食物有路径时,它让虚拟的蛇跑一遍发现,得到的新布局是不安全的,所以不会去吃食物,而是选择继续追着蛇尾跑。然后它就这样一直跑,一直跑。死循环,直到你按ESC键为止。由于食物是随机出现的,所以有可能出现上面这种无解的布局。当然了,你也可以得到完满的结局,贪吃蛇把整个矩形都填充满。上面的最后一个问题,暴力法是否能得到最优序列。从上面的分析看来,可以得到,但不能保证一定得到。最后,看看高瞻远瞩的蛇是怎么跑的吧:

       矩形大小*,除去外面的边框,也就是8*。Linux下录完屏再转成GIF格式的,优化前多M,真心是没法和Windows的比。用下面的命令优化时,有一种系统在用生命做优化的感觉:

       Shell

       convert output.gif -fuzz % -layers Optimize optimised.gif

       最后还是拿到Windows下用AE,三下五除二用序列合成的动态 (记得要在format options里选looping,不然是不会循环播放的)

       Last but not least如果对源代码感兴趣,请戳以下的链接:

       Code goes here

       另外,本文的贪吃蛇程序使用了curses模块,类Unix系统都默认安装的,使用Windows的童鞋需要安装一下这个模块,送上地址:

       需要curses请戳我

       以上的代码仍然可以继续改进(现在加注释不到行,优化一下可以更少),

相关栏目:时尚