你看过/写过哪些有意思的代码?
大家认为不适合用视频分享, 那就用图文一起探索一下 0 和 1 的世界吧~ 去年的时候,我在UCSB讲正常的CS课讲的无聊了,就琢磨着开发一个新的项目,让UCSB的CS学生可以更好地参与进来。这个项目有几个最根本的要求,第一是要好玩,看着就想试试。第二是要门槛非常低,只要会写点程序就能玩,而且「Hello World」容易实现。第三就是有深入空间,想随便玩玩可以随便写写,但是想认真研究,上限要足够高。于是乎,我开发了迄今为止我最满意的一个个人项目——「ColorFight!」。
这是一个多人AI对战类游戏,每个玩家写一个自己的AI,然后在战场上角逐,从而赢取最终的胜利。游戏画面约末是这个样子的:
游戏的基本理念是,每个玩家出生的时候占据一个格子,然后尽可能地扩张,比谁在规定游戏时间内占领的格子多。
这个游戏最开始的时候,内容还没有这么丰富,大概是这个样子的:
每个格子都是一样的,你能做的就是玩命扩张。游戏的规则也很直接,第一,你只能攻击你已经占领格子相邻的格子。第二,同时间只能攻击一个格子。第三,占领格子的时间是不同的,空格子需要的时间最短,如果这个格子已经被占领,则这个格子已经被占领的时间越长,攻击所需的时间就越短。
就从这个最最最基本的游戏规则开始,我一边自己探索新的游戏规则,一边带着UCSB的小伙伴们玩。由于我已经给他们写好了所有的API(全部是通过HTTP和服务器通讯的,我全给wrap起来写成了一个python的类),还给他们写好了example AI,他们只需要把我的代码clone下来,然后就可以直接跑了。我甚至还给他们提供了手动操作的入口,让他们熟悉游戏规则。
ColorFight!的精髓之处在于,API极其简单,对于最基础的版本,你只有一件事可做,就是attack。你可以把全部的精力放在游戏策略的应用上,而不用去纠结API的使用。
当然,这个最基础的版本虽然满足了刚才提到的第一点和第二点,但是上限确实低了一些,给优秀玩家的发挥空间太少了,于是我在之后的版本中,逐渐引入了一些新的元素。在保持游戏原有优势的情况下,增加了游戏的乐趣和可编程度。
在第一张图里,很明显地已经能看到有一些特殊的格子,我们叫做golden cells和energy cells。他们分别有各自的用处。同样明显的是那个小房子,这也是我最满意的设计。这个小房子叫作base,每个玩家在积累了足够多的gold之后可以建造,出生时自带一个。如果所有的base都被人干掉了,则立刻死亡。这也给了一些好战的玩家直接斩杀的机会。后来的进程说明,斩杀是最有快感的事情,后面打到决赛经常出现一个优势AI把其他玩家差不多杀干净的场景。
在保留了原有的基础API attack的同时,我又增加了几个技能,让玩家可以炸开格子,或者同时攻击格子,或者给自己的攻击加速。这些技能几乎随着版本的更新一直在不断地微调甚至大改。
到现在为止,ColorFight!已经在UCSB举办了三季。其中第一季是我自己带着中国学生玩的,后面两季和UCSB IEEE合作,做成了校级的比赛,还有不少老外参加。到了最新一季决赛的时候,那个AI我自己都觉得赏心悦目,打得非常精彩。
第一季的视频我自己给搬到了B站,感兴趣的小伙伴可以去看看,这是决赛的视频:
Colorfight -- UCSB AI competition Season 1 Final Round_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili第二季和第三季的视频都在youtube(因为我们是youtube做的直播),第三季(官方第二季)的决赛视频在这里(有条件的同学可以看一下,哈哈):
https://www.youtube.com/watch?v=tg33gHr3Ygc我个人对于这个项目本身特别的满意,从我最初的目的来说,确实有很多的UCSB的学生参与进来,甚至有一些人完整地跟下来了三季。而且每一季都可以看到大家的进步(第一季的冠军第二季开始没参加,决赛随便打了一下被秒了)。有不少人在这个过程中编程水平有了明显的进步。
对于我个人来说,这也是我做的第一个比较大型的网页项目(工作不写网页)。从前端到后端都是我一个人完成的,尤其是在heroku免费服务器+免费db的制约下,如何把游戏的延迟做到尽量低,着实费了一番功夫(事实上performance问题我一直到最后也一直在不断地最调整)。
但是现在回头看看,感觉当时付出的努力都是值得的,很开心。
最后,明年可能要离开SB了,现在去哪儿还没定,如果有哪个学校的CSSA或者CS社团(团体?)的小伙伴想在学校内部开展一波比赛,欢迎联系我(如果是UW或者UCI就最好了)!
(UW和UCI的小伙伴竟然都联系我了,很开心,接下来或许有合作?其他学校的小伙伴对这个project感兴趣的也欢迎联系我,做一个这个比赛还真的挺有趣的~如果参加的学校多,没准我们可以做一个跨校的比赛~) /// 更新 2020-02-12
虽然三年前用pygame做时运行效率很渣,但是2020年了,我们有Taichi了啊,感谢大神 @胡渊鸣:-)
用Taichi重写的PBF2D @60FPS
https://www.zhihu.com/video/1215031537483579392
/// 更新 2018-08-05
工程问题就要用工(cao)程(kuai)师(meng)的思维解决。XYZ三轴连扫,理清杂线。
https://www.zhihu.com/video/1009615422542508032
/// 更新 2018-06-23
看到好多童鞋回复炒豆/炒菜机器人,大家的关注点都很奇特啊…
不过各位慷慨的赞真的是给了我很大的动力,上周我决定写一个自定义场景的功能。大概思路是场景用各种模型文件(.obj)描述,这些模型决定了粒子团的位置。这相当于给定一个mesh和步长,对该模型进行voxelization:
龙:我很方
于是,炒兔模拟器诞生了...
https://www.zhihu.com/video/994085257263562752
可能有人会纳闷,兔子上那些凸出来的线是什么?
嗯,这大概就是voxelization算法界的卖家秀和买家秀了。大家diss时还望手下留情!
毕竟,龙也很方,我也很方...
附上我找到的一个voxelization算法:Eisemann, Elmar, and Xavier Décoret. "Single-pass GPU solid voxelization for real-time applications." In Proceedings of graphics interface 2008, pp. 73-80. Canadian Information Processing Society, 2008.
传统的算法是在每个点上发射线,判定跟模型相交几次。在没有octree等空间搜索数据结构的前提下,这个复杂度是 https://www.zhihu.com/equation?tex=%5Cmathcal%7BO%7D%28%5Ctext%7B%23triangles%7D+%5Ctimes+%5Ctext%7Bgrid_size%7D%29 。而这篇文章的思路是,对mesh上每个三角形面片,找到该面片前面最近的那个点并+1。所有面片都这样操作完后,再做一次prefix scan。那么所有为奇数的点就是在mesh的内部了。这样相当于所有面片只算一次就够了!复杂度应该是 https://www.zhihu.com/equation?tex=%5Cmathcal%7BO%7D%28%5Ctext%7B%23triangles%7D+%2B+%5Ctext%7Bgrid_size%7D%29 。
/// 原回答
看了好多有意思的回答,发现果然有界面的代码比命令行的炫酷很多...我也来安利一下自己的一个项目(在大家的支持下又更了!/** 已弃更 T.T */)。一年前做了一个基于粒子模型的流体模拟器,算法来自
Position Based Fluid (PBF)这篇论文。最终效果如下(渣画质见谅...):
https://www.zhihu.com/video/989493267066609664
完成这个项目大概需要的技能是:
一点儿C++/CUDA:用来疯狂地算!一点儿OpenGL/GLSL:用来生动地画!一点儿Visual Studio:除了大,VS真是一款梦幻IDE一个支持空间搜索的数据结构:我用的是最简单的空间网格(spatial grid, spatial hashing...)。其基本思想就是,将一个3D空间划分成一个个尺寸固定的小格(cell, voxel...参考Minecraft),每个小格存储所有在其内部的粒子的信息。这个思想的核心数据结构用几个数组就能搞定了,因此非常容易在GPU上实现。推荐这篇:NVIDIA - Particle Simulation using CUDA*一点儿线性代数,即矩阵运算与线性变换的关系。这主要是为了实现摄像机,如果用现有3D框架的话并非必需。当然了,线性代数是计算机图形学(CG)的基础,真想学CG的话这块儿知识还是很有必要掌握的。
用其他语言行吗?当然,只是个人倾向于原生态的CUDA/OpenCL,用着舒服、省心...
//////////////////
最开始我是在一堂课上看到了这个视频(需翻墙),当时就被其仿真效果惊艳到了。
YouTube - Position Based Fluids - SIGGRAPH submission video
看完了乐呵了就把这事忘了...直到毕业后有次碰巧看到了PBF这篇论文,惊喜的发现这里面的数学运算比较简单,基本就是些向量运算,属于学过线性代数就可以徒手开撸的项目。于是码农独有的中二病爆发,我花了一周,重新实现了一遍paper。
...才怪
//////////////////
做这个的过程还是挺一波三折的。
决心实现一遍论文的时候我正在准备面试。一开始的打算就是拿python快速实现个2D demo,满足一下自己的好奇心就行。于是随便看了看后,拉了个pygame包就糙快猛地干了两周。
一运行,粒子炸了。一切尽在预料之中。
断断续续地debug了一阵后,算法终于算是稳定下来了,粒子不再会跑几帧后就“挥一挥衣袖, 不带走一片云彩”了。但我用python的姿势水平还是太渣。这个版本没有任何绘图方面的优化,三位数的粒子就能让程序处于幻灯片水准了。这性能差得让我直接失去了继续debug的动力——就算是bug free,几十个粒子大概是毛液体效果也看不出了。
元气大伤,怒删代码,饮恨封刀,专心刷题三个月。
顺利搞定面试后,手又痒了——自己最开始入门编程就是因为想做游戏,学的是ActionScript 3.0 (RIP...),因此从零实现一个流体模拟器对我是个极具诱惑力的念头。
但是,第一次python的血汗史让我意识到,这事儿终究不能一蹴而就。想要实现一套拿得出去的方案,需要耐得住性子。
以及一台带GPU的电脑...
于是我就开心地下单了...
可能是因为没了面试的压力,可以更加专注了,这次我花了很大功夫做准备工作,包括:
翻了一遍线性代数...学了一遍OpenGL基本知识。推荐这个网站:Learn OpenGL, extensive tutorial resource for learning Modern OpenGL。一开始的话看完Getting Started就足够了。搭好了particle system(就是个数组,记录粒子的位置速度等信息...),又写(chɑo)了一个camera,用来360度无死角的监视这些粒子。camera是我认为的学习CG的一个很好的入口,可以将坐标系、线性变换的知识应用起来。推荐一本书:3D Computer Graphics: A Mathematical Introduction with OpenGL: Samuel R. Buss。有兴趣的话搜书名就好...
前期准备工作基本就这些了。第一遍我写的仍是基于CPU的算法。目的是以后写GPU遇到bug时好歹有个参考,前提是对于CPU版本是正确的这点要有蜜汁自信...后来运行下看了看,感觉像是对的(粒子没炸),但还是很慢。
写CUDA时还需要几点微小的工作:
学习了一个GPU的基本(suɑn)法。这里推荐一门课:Udacity CS344: Intro to Parallel Programming。这课又学CUDA又学并行算法,帅爆了有木有?在用CUDA写完整套算法后,我没能找到按下F5的勇气,于是又写了几个单元测试。实证明,这些测试就像TLA+一样,它不能保证100%的正确性,但是能给你99%的信心。
最终第一次按下F5后,效果是这样的:
https://www.zhihu.com/video/989525393724022784
开心到炸
数据结构课上写的随机心形迷宫生成和寻路,使用栈实现的寻路算法
可以随机生成一个心形迷宫,并寻路,从起点出发不断试探回溯,直至到达终点
完成寻路后的效果,箭头表示寻找到的一条路径,空方块表示回溯过的点
代码运行效果,一开始一定想不到它是个心,结局是不是很惊喜~
https://www.zhihu.com/video/975912911306280960
再倒着来一遍(逃
https://www.zhihu.com/video/975913269580513280
//520之前放代码,欢迎大家围观(〃ω)
//明天是520(Oh不,是今天,逃...),完整代码已上传至github,欢迎star,欢迎fork,如发现任何bug或有其他修改建议,欢迎和我联系~
neolay/HeartMaze
//第一次发表文章,希望大家喜欢(#^.^#)
Kalay:用C语言生成心形迷宫//最后祝大家520快乐~
刚才发现被CSDN公众号宠幸了,不过我只能扮演个被侵权人了┑( ̄Д  ̄)┍
啥是佩奇,Python 告诉你!
原答案:
前两天刚学了一点python,心血来潮用turtle库画了一只小猪佩琪。勉强还能看,代码写得很烂就不放了哈哈。
-----------------------------------------------------------------------------------
惊!这么多人看到哈哈。
既然大家都要看看,我就把源码发出来吧,不过提前说一下,是真的烂,因为真的只在慕课(不是广告哈,感觉确实讲得很好)看了两天的python课,老师就讲了个turtle库,我就瞎搞出来这么个东西玩玩儿,肯定有很多问题,希望大家多多指教!(就连github账号都是找回密码的。。。)
github地址:
https://github.com/Monster12138/-/blob/master/%E5%B0%8F%E7%8C%AA%E4%BD%A9%E5%A5%87.py
-----------------------------------------------------------------------------------
有小伙伴私信我说调试出错了,我看了下应该是在开始的时候想用一个第三方库,最后没用上忘了删掉,要是刚装的ide调试出错了可以删掉第二行再试试,github上已修改。
-----------------------------------------------------------------------------------
2018-5-24 02:43:11
代码优化完毕(~ ̄▽ ̄)~
叉会儿腰先~
最近有些忙,今天才刷完函数这一章,实在看不下去以前的流水账代码(#`皿),就动手将它重构了。
将小猪佩奇的零部件进行了简单封装,再用绝对坐标代替了以前的相对坐标,降低各个函数的耦合,这次差不多可以看了 ̄▽ ̄
github地址:
https://github.com/Monster12138/-/blob/master/%E5%B0%8F%E7%8C%AA%E4%BD%A9%E5%A5%872.0.py依旧欢迎提出改进建议!
https://www.zhihu.com/video/975714077260115968 将一张图片生成一个 HTML 页面:img2html - GitHub
核心代码就一百来行(不考虑代码美观还可以压缩),如下图,左边是原图,右边是生成的 HTML(右图点开放大,可以看到全是字组成的):
通过命令行参数控制抽象程度:另一张图片,点击查看,具体描述可以见 GitHub 项目 README.md
<hr/>gotp:Golang OTP(One-Time Password) Library.
这个是为了方便在电脑端生成二次验证码,对我来讲作用是方便每次需要打开手机输入二次验证的地方(登录线上服务器、内网系统登录等),这个库实现了 TOTP/HOTP,欢迎 star/fork。
https://www.zhihu.com/video/976259602594111488
本来是想挑战下程序化齿轮,然后坑越挖越大发现传动和交互比齿轮图形本身复杂n倍。原本计划一周搞定的兴趣小程序搞了2个月……
原文链接:https://www.zhihu.com/answer/241654749 大二沉迷音游,于是在学校的开发板上写了这个。
https://www.zhihu.com/video/1007781169122975744
----------------- 分割线 -------------------
哇这么多人围观,感谢各位大佬点赞~
虽然关注点好像跑偏了,说好的一起探讨代码呢233333
那我假装试图把关注点拉回来一下。。。这个板子CPU是Cortex-M3加上一堆外设,音乐是在板子上接了一个小音响,把wav文件存在了sd卡里,由CPU把数据送到音乐播放模块然后用音响放出来。
因为这货的memory只有96k,连首歌都放不下,所以音乐只能在游戏中键下落的同时一点一点读进来。所以整个游戏的逻辑是,音乐和对应的铺面文件(一种固定格式的文件,定义了歌曲的什么时间要下落什么样的键)都放在sd卡里,游戏开始前把整个铺面文件读进来,然后游戏过程中把时间分割成很小的片(4ms),在每一个时间片中: 1. 读一部分音乐传给音乐模块。2. 捕获触屏事件。3. 移动屏幕上的键
当然由于这货CPU也很烂(好像最高50MHz),4ms之内完不成这三件事游戏会卡顿,所以还做了些其他优化我就不写了知道啰嗦了一大堆你们也不爱看hhhhhh
另外有人说有些绿条掉到一半消失了,那是因为我手残提前碰到了那个轨道被判了miss(中间的小圈如果变红就是出了miss)
还有那些说我手速快啊大触啊之类的。。。你们偷偷说就行了,别让那些真正的音游大佬看到就好(手动滑稽)
最后附上代码链接:zyxiaooo/SJTU
---------------- 关于评论区的问题 ---------------
虽然有的已经在评论里回答了,但是评论太多可能不方便看到,在这统一回答下:
开发版型号:TI stellaris LM3S9B96语言:C为什么单手/单指:我也很想用两只手啊,只是屏幕是单点触控,如果两只手的话一个手按下去的同时另一只手没有抬起来会判定到中间的位置。反正我是很难做到按下去然后马上完美的抬起来这种操作,所以干脆单手成绩还好一些。关于铺面怎么来的:人工抓节奏,然后按一定的格式写到文件里面。关于怎么抓节奏,可以用一些音频软件(Au之类的),找到曲子开始的时间还有一拍的时长,然后根据曲子的风格还有节奏来定每拍的键型。当时的音游大概都是人工制谱,没见过能生成契合节奏而且可玩性高的铺面的AI。当然现在AI发展这么快不排除有这种AI的可能性。关于deemo里entrance的logo:当时金工实习的时候做的(不要问我为什么cs的要金工实习)。 有个叫什么线切割还是什么来着,大概是你在电脑上画一个能一笔画的东西机器就能帮你切下来。关于中间的点:绿色相当于charming/perfect,蓝色相当于great,红色相当于miss。关于其他的优化技巧:比较重要的是用了DMA减轻了CPU的工作量。另外LCD方面也要尽可能地少画像素点。
我主要做的是计算机图形学相关的工作吧。相比较起来 通常能直观地看到你期待的结果,甚至能超过你的预期。
之前用C++和OpenGL做了一个“基于草图进行植物建模 Sketch-based Tree Modeling”的程序,我觉得挺有意思的。。
用户绘制一副草图,就能创建一棵植物模型,并可以导出供Maya等使用。
在Bilibili中上传了这个视频(录制这个视频是因为我某位老师在英国爱丁堡大学做访问,她在朋友圈看到了我做的东西,然后让我录制一下给他在英国教的外国小朋友看。。):
Bilibili链接如下:
【图形学】基于草图进行植物建模~~_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili程序下载链接:百度网盘(密码:0ck8)
博客链接:个人博客的链接
有小伙伴想要我的壁纸,链接如下:电脑桌面壁纸
首先是程序的建模效果~
最后是我录制的一个演示视频,在B站中也能找到~
https://www.zhihu.com/video/991460370141200384
谢谢大家浏览我的回答啦~~(:з」∠)_
屏保版下载链接(附源码)
http://www.yeyulingfeng.com/3572.html
网站是我好基友的,有很多实用的绿色软件,大家可以关注下
去年去公司实训,组长让一人写一个小项目,其它大佬都会用数据库框架什么的写图书管理系统、财务管理系统之类的,眼看着要交项目了我还啥都没写,我心想算了,就滑天下之大稽吧
滑天下之大稽
https://www.zhihu.com/video/1003647961393496064
我永远都忘不了组长当时的表情
囧
评论区有人要看源码,我就把源码放到github上了,其实很简单,没用到什么高深的东西
https://github.com/LCsion/huaji
评论区有人说想做成屏保效果,我在网上找了一下还真有这个jar包,然后把原程序改了一下,目前是这样子的…
滑天下之大稽2.0
https://www.zhihu.com/video/1010273217012875264
答主没安装录屏软件,求饶老师的学生不要教做人~