最近堆叠的事情比较多,返回到这一层时知乎问题已经不能修改了,只好开一篇文章说。

用C语言,能在100行之内实现贪吃蛇吗? - duangsuse的回答 - 知乎 https://www.zhihu.com/question/360814879/answer/1601486959

不说无关技术的语文错误(如把使用写成适用),那个压行代码的部分应该也有部分逻辑缺失的问题(比如 cursEnableputWall 的逻辑,对程序正确性影响大)

我在此给一个完整的压行版(10行,但行数已无意义):

//gcc rm.c -DW=24 -DH=18 -lncurses -include curses.h #-include stdlib.h -include unistd.h
// gobals
int w;int h;int nM;int nBlk;typedef int*map2D;map2D m;map2D que;int p;int iHead=0;useconds_t delayUsec;void init(int m_w,int m_h,int dt){w=m_w;h=m_h;nM=w*h;delayUsec=dt*1000;map2D*maps[]={&m,&que};for(int i=0;i<2;i++)*maps[i]=malloc(sizeof(int)*nM);}
// data model
static inline int pYX(int y,int x){return y*w+x;}static inline void yxP(int p,int*y,int*x){*y=p/w,*x=p%w;}static inline int cycledInc(int*p){*p=(*p+1)%nM;return*p;}int isZeroOr(int n,int x){return(x%n)==0;}int curUse(int(op)(WINDOW*,bool)){return op(stdscr,1);}
//putXX
void putWall(){int y,x;for(int i=0;i<nM;i++){yxP(i,&y,&x);if (isZeroOr(w-1, x)||isZeroOr(h-1, y)) m[i]=1;}}void putCell(){que[cycledInc(&iHead)]=p;m[p]=1;}void putFruit(){int pA;do{pA=rand()%nM;}while(m[pA]!=0);m[pA]=2;}
//game
void game(char*style[]){noecho();curUse(nodelay);curUse(keypad);int ch,y,x,d=1,iTail=0;putWall();putFruit();p=pYX(h/2,w/2);putCell();while((ch=wgetch(stdscr))!='q'){if(ch==(-1)){}else if(ch==259&&d!=w)d=-w;else if(ch==258&&d!=-w)d=w;else if(ch==260&&d!=1)d=-1;else if(ch==261&&d!=-1)d=1;p+=d;if(m[p]==1){break;}if(m[p]==2){putFruit();}else{m[que[cycledInc(&iTail)]]=0;}putCell();for(int i=0;i<nM;i++){yxP(i,&y,&x);mvprintw(y,x*nBlk,style[m[i]]);}wrefresh(stdscr);usleep(delayUsec);}}
//call init,game
int main(){char*deftStyle[]={"  ","[]","()"};nBlk=2;initscr();curs_set(0);init(W,H,100);game(deftStyle);wgetch(stdscr);return endwin();}

第一行编译命令 # 号后的头文件是选择性包含(.h 里只用了函数的 extern),可以 -Wno-everything 替换。

关于这个程序以代码行数评优劣,的确十分不妥(不过不当人面我说句心里话,我重写的那个大佬也该试着多重写几次看看,总会有进步;还有,许多其它都只实现了命令行前端的答主,你们大几百行已经够我用 clean C + asprintf 写一个 multiplayer 的贪吃蛇了,要加油啊)

至于B站那个18行的,不得不承认是“很有创新性”(我也不知道该不该这么说),反正我复刻了一遍(修改了IO方式消除“闪烁”,为此也对后端数据解释做了点改动,毕竟不要闪烁是不可能区别mpApple各自渲染的)

// Windows.h, conio.h, limits.h, stdlib/stdio/time
// 当然你要和他一样短,C预处理器 gcc -E 过一遍内联所有常量就行
define w 50
#define h 40
#define speed 100
const char *sNone="  ", *sBody="[]", *sFruit="()";
const int nM=w*h, nBlk=2; int *m;HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
void printp(int p, const char* s) {COORD cd = {p%w*nBlk, p/w};SetConsoleCursorPosition(hStdout, cd);printf("%s", s);
}
int randP() { int pt; do { pt = rand()%nM; } while (m[pt]!=0); return pt; }
#define isZeroOr(n, x) ((x%n) == 0)int main(void) {srand(time(NULL));m = malloc(nM);char* cmd; asprintf(&cmd, "mode con cols=%d lines=%d", w*nBlk, 1+h); system(cmd);for (int i=0; i<nM; i++) m[i] = (isZeroOr(h-1, i/w) || isZeroOr(w-1, i%w))? 1 : 0;int p=(h/2)*w + w/2, d=1, nLen=1, pA=randP();unsigned t0 = time(NULL);char ch; while (!kbhit() || (ch=getch()) != 'q') {d =(ch=='a')? -1 :(ch=='d')?+1 :(ch=='w')? -w :(ch=='s')? +w : d;p+=d; if (m[p]==1) break;m[p] = nLen+1/*decred later*/;if (p==pA) { nLen++; pA = randP(); continue; }int oldMpA = m[pA]; m[pA] = INT_MAX-1;for (int i=0; i<nM; i++) { m[i]--; printp(i, (m[i]<=0)? sNone : (m[p]!=INT_MAX-1-1)? sBody : sFruit); }m[pA] = oldMpA;unsigned t1 = time(NULL);Sleep((t1-t0)/speed); t0 = t1;}
}

注意,我这个版本没有“闪烁”而且没注意压行,长几倍。当然性能一样很垃圾(每次渲染都要递减整个 map 数组,思量是不是要 SIMD <xmmintrin> 优化,啧啧)

至于其它两个超短(C/JavaScript,惯常一维的存储模式)蛇,虽然还好(也不至于按一键更一帧,之前听说有人只会这么写),但行为上要么直接朝运动反向击键会挂(我也写了这种版本),要么完全不会挂(没有墙、撞自己也不会),所以说,最小化设计也不是说一定有多短。

就好像算法的时间复杂度一样,好的代码功能越多越好维护、实现行数开销越少,烂代码,即便刚开始看起来很短,如果要加一个功能,要么然你痛苦要么然电脑痛苦。

cmd代码玩贪吃蛇_关于N行贪吃蛇回答的补充相关推荐

  1. python代码少的作品_原创 8行python代码展示程序员从入门到大神(或跑路)的全部状态...

    一行python代码可以做什么? 人生苦短,我用python.python的世界里无处不在的简洁和短小,往往一行代码可以实现很多有意思功能. 你敢想象你从入门python代码.网络达人.反重力怪才.爱 ...

  2. cmd 复制到剪贴板命令_从命令行复制到剪贴板

    cmd 复制到剪贴板命令 If you've ever been debugging with a fellow developer, you'll hear "OK, execute th ...

  3. 贪吃蛇javascript代码_源于Jquery开发贪吃蛇游戏——简单思路分析总结

    前言 刚开始是学习前端那会,在熟悉 HTML+CSS+JS 后,我开始尝试去做贪吃蛇游戏.没想到在一顿瞎搞后还真搞出来了一个简陋版的贪吃蛇.哈哈!因为这是我刚开始学习前端的时候做的,所以代码有点简陋, ...

  4. python界面小游戏贪吃蛇_用Python实现童年贪吃蛇小游戏功能的实例代码

    贪吃蛇作为一款经典小游戏,早在 1976 年就面世了,我最早接触它还是在家长的诺基亚手机中. 尽管贪吃蛇的历史相对比较久远,但它却有着十分顽强的生命力,保持经久不衰,其中很重要的原因便是游戏厂家不断的 ...

  5. python贪吃蛇_如何用Python写一个贪吃蛇?

    阅读文本大概需要 5 分钟 作者:Hawstein http://hawstein.com/2013/04/15/snake-ai/ 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游 ...

  6. 单片机设计 游戏_五子棋+黄金矿工+贪吃蛇(STM32、4.3寸电容屏)

    单片机设计 游戏_五子棋+黄金矿工+贪吃蛇(STM32.4.3寸电容屏) 想要更多项目私wo!!! 一.电路设计 此电路由STM32F1精英版和4.3寸电容屏TFTLCD组成. 二.运行效果 三.部分 ...

  7. 贪吃蛇统计分数的c语言代码,C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!...

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  8. 怎么用python编贪吃蛇_少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二)

    原标题:少儿编程分享:手把手教你用PYTHON编写贪吃蛇(二) 检测和判断 无论我们制作的简单或者复杂的游戏 这都是最关键的两个部分 事件处理循环 61. while True: # 游戏主循环 62 ...

  9. html游戏贪吃蛇代码,html5贪吃蛇游戏使用63行代码完美实现

    以前也很少关注html5,感觉选择html已经慢慢成为趋势,想了解下.就找了个游戏学习了,写完这个游戏感觉html5和js结合很紧密,如果js不是特别好.估计需要先补习下js,这个只是个人的建议,不一 ...

  10. python3小游戏源代码_如何用python3代码玩小游戏?

    在大家的印象中,程序员似乎一直是在码代码的,做着枯燥无聊的生活,殊不知,他们其实也有很多在编程中的快乐.小编最羡慕的就是他们能写一段小程序运行出来,好玩又好看,看起来还很高大上!为了照顾众多pytho ...

最新文章

  1. JVM指令详解(上)
  2. php项目后的感受,PHP项目感受4 - 刘景刘恒的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. AI英特尔杯公开课:2019.06.27在线直播《研究生人工智能创新大赛—AI赋能,创新引领》课堂笔记和感悟(二)
  4. 在linux上使用ASP
  5. 将文件或视频隐藏在图片里
  6. matlab中mod(10 3),matlab的rem()和mod()函数
  7. BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)
  8. spring-boot推送实时日志到前端页面显示
  9. 小福利,杨格(Young)不等式验证之用python里面的matplotlib和numpy模块画图
  10. python使用Speech_Recognition实现普通话识别(一)
  11. Kali 编译 Android 源码
  12. 基于python的网络聊天室论文_基于python的聊天室(2),实现,二
  13. 医学报告生成论文总结【4-24】
  14. SQL 中的 COALESCE 函数初学者指南
  15. 1013---IBM X3850 X6 重新构建Raid5---过程记录
  16. 哪种类型是python不支持的_Python不支持以下哪种数据类型?
  17. kml文件转成cvs_如何将excel转换成kml
  18. 表格中编辑后进行数据比较的方法介绍-比较两套数据
  19. 武汉,一座被低估的城市!(2)
  20. 基于matlab的通信系统的设计与实现,基于MATLAB的FHSS通信系统设计与实现

热门文章

  1. java类后面的尖括号_泛型 - Java中的T(尖括号)是什么意思?
  2. python的安装以及使用和文本编译器的安装使用
  3. pyqt qdialog 默认按钮_QT编程的QDialog对话框右上角的问号按钮如何取消呢
  4. smbus协议的command_SMBus接口信号/应用框图/帧格式
  5. mysql编译安装原理_Mysql源码编译安装主从复制
  6. html怎么实现追加表格,jQuery实现html表格动态添加新行的方法
  7. 单纯学python能干啥_如何高效学习Python编程,转行的朋友可以过来看看,单纯的经验分享...
  8. 调用import win32com.client出错的解决办法
  9. 工作总结-虚拟机参数
  10. 2017 ZSTU寒假排位赛 #5