返回

文章详情

AttoChess,一个完整的、可玩的16位x86 DOS国际象棋程序,仅278字节

Hacker News2026年7月16日 18:33

最小的可用国际象棋引擎 · 记录:278字节 AttoChess 一个完整的、可玩的16位x86 DOS国际象棋程序,仅278字节。它绘制棋盘,从键盘读取步伐,搜索四个层次深,并做出回应。这就是整个文件。 在GitHub上查看源码 大小 278字节 目标 x86 DOS .COM 搜索 4层 许可证 MIT 作者 Nicholas Tanner 年份 2026 01 传承 AttoChess是LeanChess的一个大小优化后裔。它在相同的环境中玩相同的游戏,使用相同的0x88格式棋盘和递归的最小化搜索,然而汇编成278字节:比之前保持最小有效国际象棋引擎记录的288字节程序小十字节。 1K ZX国际象棋 672字节 1982年 · David Horne · Sinclair ZX81 BootChess 487字节 2015年 · Olivier Poudade · x86引导扇区 LeanChess 288字节 2019年 · Dmitry Shechtman · x86 DOS (.COM) AttoChess 278字节 2026年 · Nicholas Tanner · x86 DOS (.COM) 注意 AttoChess并不是仅仅设置棋盘的字节计数特技。它启动,绘制棋局,从键盘读取你的步伐,进行真实的4层递归搜索,回应一个合法的走法,并循环。278字节数字是该整个程序的汇编大小,经过验证与生成的.COM逐字节匹配。 02 玩AttoChess 在模拟的DOS机器中加载278字节的程序。你执白先行。你的走法 未开始 K N B P Q R 白方 · k n b p q r 黑方 03 先前的工作 该项目立足于先前的工作,并且尊重这一传承是关键所在。LeanChess,Dmitry Shechtman,2019年 确实的突破:它把记录从487字节的引导扇区降低到288字节的DOS .COM,设计优雅、真正可读。一个填充的0x88棋盘,一个作为自身走法生成索引的棋子编码,以及一个单一的递归例程,既能走棋又能找到最佳回应。AttoChess中的每一个聪明想法都是这些想法进一步发展而来的,AttoChess是一部保留Shechtman版权和MIT许可的派生作品。如果你觉得这有趣,先阅读他的源码。 BootChess,Olivier Poudade,2015年 将国际象棋游戏装入512字节的引导扇区(487字节的代码),并重设公众对国际象棋可能有多小的预期。Poudade的页面仍然托管它。 1K ZX国际象棋,David Horne,1982年 在Sinclair ZX81上将一个可玩的游戏压缩到672字节,并作为标准存在了超过三十年。 04 验证尺寸 记录声明只有在你能重现时才有价值。组装源代码并测量输出:tasm AttoChess tlink /t AttoChess;/t生成一个.COM,而不是.EXE ls -l AttoChess.com;278字节。图像中没有其他内容:没有数据段填充,没有单独的渲染缓冲,没有保留的棋盘数组嵌入文件中。AttoChess.com中的每个字节都是程序实际使用的代码或表数据。 05 优化 AttoChess完整保留了原始的核心搜索。所有十个字节来自重新思考围绕搜索的两件事,即棋盘的绘制和走法的解码,另外还有一个改变在搜索循环内部,释放一个寄存器。 01 · 显示 棋盘自行绘制:没有渲染缓冲,没有int 21h/09h 这占据了最大的节省。原始程序将棋局渲染到单独的缓冲区:遍历棋盘,将每个方格转化为可打印字符,存储它,附加一个$终止符,并使用DOS函数09h(int 21h)打印整个字符串。这一过程需要设置缓冲指针,复制循环的存储,终止符的写入,并且,因为缓冲区在棋盘之后存在,图像中保留棋盘数组。AttoChess删除了这一切。棋盘的边框列按CR、LF、CR、LF(0Dh、0Ah、0Dh、0Ah)排列,而不是之前的08h填充。CR和LF仍然设置了位3,因此每个现有的边框/颜色遮罩测试都如以前一样触发,但是现在原始棋盘字节已经是一个可打印的框架。显示循环直接将每个字节流式输出到控制台,使用int 29h(DOS快速控制台输出):边框变成换行,空白方格变成NUL,只有真正的棋子才会进行ASCII转换。 main_loop:mov si,offset board_db + 24;行2(黑方后排),列0 mov cl,98;8个排名行+最后的CR、LF(CH=0) disp_loop:lodsb;读取方格内容 test al,30h;棋子? jz disp_cont;没有:原样输出(CR / LF / NUL) inc ax;零对齐国王和 al,27h;隔离棋子类型+黑色/小写位 add al,4Bh;K、N、B、P、Q、R(根据颜色大小写) disp_cont:int 29h;AL的快速控制台输出 循环 disp_loop 一次性移除:渲染缓冲,其指针设置,$终止符,int 21h / 09h字符串打印,以及文件图像中的保留棋盘数组。 02 · 启动 无BIOS模式设置;确定性启动 原始程序以int 10h启动强制BIOS显示模式0。AttoChess将其去除,而是明确了两个真实条目的假设,这整体上更小,并且无论如何程序如何启动都是正确的:start:cld;DF不保证

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡