字符界面的中国象棋

最近正在开发一个字符界面的中国象棋,效果大概如下

chess

代码见 https://gitee.com/zhcosin/emacs-chess-cn 以及 https://github.com/zhcosin/emacs-chess-cn

用法:

(add-to-list 'load-path "path/to/chess-cn.el")
(require 'chess-cn)
  • 开启新对弈: chess-cn–new 命令(快捷键 C-c C-n),会打开一个名为 chess-cn 的缓冲区,
  • 走子方法: 用方向键移动光标,回车键选择棋子,移动到目标位置再按回车键完成走子/吃子(目标位置无子为移动,有对方棋子为吃子,有己方棋为重新选子).
  • 光标移动方法: 用上下左右方向键快速移动光标(在棋盘格子间移动而非按字符移动),也实现了 emacs 和 evil 的光标移动快捷键(后者需要安装有 evil).
  • 悔棋: chess-cn–undo 命令(快捷键 C-c C-u).
  • 保存与加载棋局: chess-cn–save 命令保存当前棋局到文件(快捷键 C-c C-s), chess-cn–load 命令加载指定棋局文件(快捷键 C-c C-l).

快捷键列表:

  • C-c C-n 开启新对弈
  • C-c C-u 悔棋
  • C-c C-s 保存棋局到文件
  • C-c C-l 从文件加载棋局

开发进度:

  • [X] 字符界面表示层(界面绘制,棋盘坐标与缓冲区位置互相转换)
  • [X] 内核框架(对弈方,兵种,棋子,棋局,棋步等)
  • [X] 走子/吃子规则,将帅不可见面规则,走棋后己方将帅不可面临威胁规则
  • [X] 棋局上快速移动光标(按格子移动而非按字符移动)
  • [ ] 中文棋谱术语
  • [X] 将军判断与胜负判决(将死)
  • [X] 棋步历史与悔棋
  • [X] 棋局保存与加载
  • [X] 规则违反提示信息展示
  • [ ] 当前选子突出展示,最后一步落子突出展示
  • [ ] 摆放残局
  • [ ] 人机对战(极大极小搜索算法)
27 个赞

不错不错,支持你。。。。。。。。。。

支持一下!!!

EmacsWiki: chinese-chess.el 这里也有一个中国象棋

哇,涨见识了,不过看到一个“不能再悔棋了”,表示不能忍. 另外发现它也没有把“楚河汉界”写在河道中,哈哈,我也是纠结了半天,连续两行有汉字会把行高撑得变形严重,导致河道边的横竖日字差别过于明显,所以我最后也是放弃了打上这四个字,就是心里有点憋屈,没有楚河汉界,还能叫象棋吗?

1 个赞

有历史记录的,悔棋到开局的时候,当然就不能再悔棋了。

厉害!不过如果没有人机对战的话,好难找对手。

建议用方向键选择棋子,会比挪光标舒服很多

一个小建议:可以考虑下 GitHub - casouri/valign: Pixel-perfect visual alignment for Org and Markdown tables. 这样的处理方式,用实线代替虚线。

车马相士将炮兵刚好可以对应键盘 CMXSJPB 选子

3 个赞

牛逼啊,有趣 :+1:

已经实现了走子/吃子规则,但将帅尚未实现不能见面的规则. 接下来的工作:

  • 将帅不可见面
  • 将军判断
  • 输赢判决
  • 悔棋功能
  • 人机对战 chess
1 个赞

实现棋盘一般使用bitboard,不用二维数组.

参考:

https://github-wiki-see.page/m/yangboz/godpaper/wiki/位棋盘(BitBoard)

https://www.xqbase.com/computer/eleeye_struct.htm

1 个赞

就高性能搜索才需要 bit encoding 节约体积,不讲究的用 list of list 的都有

一开始不知道 elisp 有数组,所以弄成了 list 套 list,不过现在懒得改了,只要不做人工对战,光人工走棋这没啥性能要求.

有联机的功能吗?

应该不会有人想在 emacs 中联机玩象棋吧 :joy:

emacs用户可能愿意。 联机的话需要服务器吧,或者用区块链分布式点对点联机。

这个看起来还成了大工程,尤其想玩联机的话 :joy:

区块链象棋一般人玩不起吧…