Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

希望增加拔子規則,以及抽子,摃擔 #304

Open
ejmoog opened this issue Oct 9, 2021 · 13 comments
Open

希望增加拔子規則,以及抽子,摃擔 #304

ejmoog opened this issue Oct 9, 2021 · 13 comments
Labels
enhancement New feature or request

Comments

@ejmoog
Copy link

ejmoog commented Oct 9, 2021

拔子:走子階段,當受到對方禁閉時,直接拔走對方一顆棋子,然後續繼走棋。

抽子:落子時,若十二子下完,雙方都沒有吃子,則互相抽掉對方一子,然後開始走棋。

摃:走子階段,在橫縱綫上,兩顆己方棋子左右(上下)圍住中間一顆敵子,則可吃掉中間棋子。

擔:走子階段,在幅斜綫上,己方一顆棋子走到對方兩個棋子中間,則移除對方兩顆棋子。

這樣攻擊跟趣味性更強。

@calcitem
Copy link
Owner

calcitem commented Oct 9, 2021

您好! 這些規則在海峽兩岸都是流行的規則,將會列入開發計劃。 謝謝您的寶貴建議!

@calcitem calcitem added the enhancement New feature or request label Oct 9, 2021
@calcitem
Copy link
Owner

calcitem commented Oct 9, 2021

一旦 https://f-droid.org/zh_Hans/packages/com.calcitem.sanmill/ 上释出支援這些棋規的新軟體,將會第一時間通知您,敬請期待!

@ejmoog
Copy link
Author

ejmoog commented Oct 10, 2021

【重要】上面寡人對擔和摃的介紹反了。應該是在正方形四條綫上的是擔(一挑二),八條放射綫上是槓(二夾一)。

之所以這樣設置,是因為第二圈的正方形頂點是最優點,每個人都想搶佔。因此要用擔和槓的規則来制衡。

與此同時,擔和槓應該只是在走棋時才有,因為如果落子時也能擔和槓的話,那落子的顧忌就太多,很難落子。

寡人在
https://www.appinn.com/zhiqi-for-android/
小衆軟件推薦了你的作品。

@calcitem
Copy link
Owner

calcitem commented Oct 10, 2021

多謝您的大力推薦,難怪我感覺奇怪,為什麼昨天 Star 這個專案的人數一下子增長那麼多,從27暴漲到35,而且大部分是中文用戶。關注此專案的人數增加後將有助於推動專案發展,謝謝您的寶貴支持!

對了,F-Droid 的英文鏈接可以替換為上面的簡中鏈接嗎?因為眾所周知的原因,絕大部分大陸地區用戶只能從F-Droid下載這個軟體。謝謝您!

@ejmoog
Copy link
Author

ejmoog commented Oct 10, 2021

多謝您的大力推薦,難怪我感覺奇怪,為什麼昨天關注這個專案的人數一下子增長那麼多,從27暴漲到35,而且大部分是中文用戶。關注此專案的人數增加後將有助於推動專案發展,謝謝您的寶貴支持!

對了,F-Droid 的英文鏈接可以替換為上面的簡中鏈接嗎?因為眾所周知的原因,絕大部分大陸地區用戶只能從F-Droid下載這個軟體。謝謝您!

不用客氣,我們要感謝你開發這款民間傳統弈棋,並且還是自由軟體,非常棒!

把F-Droid英文換成簡中,這個要青小蛙才能換,我只能在下面留言。

@calcitem
Copy link
Owner

了解,謝謝您!

我後續在增加台灣直棋規則支援後,也將會增加正體中文的 F-Droid 頁面介紹。

@calcitem
Copy link
Owner

拔子:走子階段,當受到對方禁閉時,直接拔走對方一顆棋子,然後續繼走棋。

請問允許拔走對方在“直”中的棋子嗎?

抽子:落子時,若十二子下完,雙方都沒有吃子,則互相抽掉對方一子,然後開始走棋。

請問是先手方先抽還是後手方先抽呢?

@calcitem calcitem pinned this issue Jan 22, 2023
@calcitem
Copy link
Owner

calcitem commented Jan 23, 2023

参考:https://zh.wikipedia.org/zh-hans/%E5%8D%81%E4%BA%8C%E5%AD%90%E7%9B%B4%E6%A3%8B

优先实现:
(1) 布子结束后如满盘,双方各抽子一枚 (在走子阶段先走的一方先抽子,能否抽“直”以外的子,跟随着吃子的规则,即如果吃子能吃“直”,则允许,否则不允许)。
(2) 在走子阶段 [不包含前述(1)]中的相互抽子阶段,只要无路可走,就可以拔掉对方的一颗子,并且己方继续走棋 (而非对方走棋)。

规则三(台湾直棋):
在规则一的基础上,增加两种吃子方式「担」和「扛」。在走子阶段,若
在正方形的一条边的两端停留着对方两颗棋子,己方一棋子走到中间的空位,
可「担」掉左右对方二子。己方一颗棋子行走后,在八条幅线的其中一条上,
形成己方两颗棋子夹一颗对方棋子,可「扛」吃中间的棋子。当一方只剩下不
多于三颗子时,可以「飞」至棋盘任意位置。

2. 「担」在三个四方形的边(特别要强调只限三个四方形的边),两端有两枚对方的棋子,只要在中间
  下一子,或移动自己的棋子进入其中,就可以将对方的这两枚棋子吃掉,这叫「担」。如果四方形任何一边的一端有一枚自己的棋子,中间有一枚对方的棋子,那么自己若再移一枚棋子到这边的另一端上去,这样的情况则不可以称做「担」。
3. 「杠」杠刚好与担相反,仅能在八条放射状的直线上之任何一条进行,而不可以在三个四方形的边上。 「杠」的规则为:若自己有一子在外四方形或内四方形的边(或角),而对方在同一角线上恰有一枚棋子于内四方形的边或角,此时自己再下一枚或移一枚棋子在同一直线的中间位置,在形式上,好像是我方的两枚棋子对付对方的一枚棋子,如此就可以把这枚被攻击的棋子吃掉,这叫做「杠」,它的下法有点像炮棋,另外若在这八条直线上已经有自己的二子在一线上相邻,而对方再下一子于另一点上,则不可以「杠」。

需要考虑的选项:

  • 是否只剩3枚棋子时才允许?
  • 是否在走棋阶段才允许?
  • 是否限制线的范围?

测试用例:

  • 不只是双人对战,人机对战的各种场景都需要测试
  • 如果黑方最后一子成三,那么是就吃子,不应该视为摆满;
  • 吃掉对方,对方还没继续吃,就报告被堵死输棋了。这是不对的。
  • 先标后拔是否正常工作?
  • 走子阶段谁先走都正常?
  • 允许吃多子是否正常?正常,没有吃多子。
  • 适配编辑棋局
  • 三子连珠 请吃子 的提示以及 请继续吃子 需要按条件修改。
  • 如果后手和先手方先后拔子,并且拔完后先手方先下,那么拔完第2子后tip提示是轮到后手方行棋,不对。
  • 如果拔子再行棋,并且白方先走子,也会存在轮到哪方行棋的提示错乱问题。
  • 如果行棋方吃完走后自己不能走怎么办?吃完子后应该要检测棋局是否困毙状态。前面几项也应应该类似。
  • 成三吃子造成的对方无路可走
  • 摆棋最后一着刚好成三,能吃任意子吗?
  • 如果吃对方的子正好是刚摆的,会留下红圈。
  • 访问规则页面前警告棋盘会被清空
  • 红圈不能转移的问题
  • ios不能复制信息
  • stalemateRemovalRegardlessOfMillFormation 需要加进去
  • 多次回滚时提示用户
  • 复制信息时将版本号和语言一起复制
  • 如果是第一回合就不用delay
  • 提示关闭增强活动能力
  • 性能优化:
    is_stalemate_removal 总共用了2.59% 如果没开规则是0.01%
    is_stalemate_removal 中的 is_all_surrounded 用了2%, 没开规则就没有消耗。

测试用棋谱:

 1.    b6    b2
 2.    f2    f6
 3.    d6    d7
 4.    g7    f4
 5.    e4    g4
 6.    g1    e3
 7.    e5    d5
 8.    c5    a7
 9.    a4    b4
10.    c4    c3
11.    d3    d2

成三吃子造成的对方无路可走:

 1.    b2    f6
 2.    f2    d2
 3.    b6    b4
 4.    g7    d3
 5.    d1    c4
 6.    a4    c3
 7.    e3    c5xe3
 8.    d5    e3xd1
 9.    d1    e4
10.    e5    d7
11.    g1    g4
12.    a1xd7    a7
13.    d5-d6    c5-d5
14.    d6-d7    d5-c5xd7
15.    b6-d6    c5-d5
16.    d6-b6    d5-c5xb6
17.    g7-d7    c5-d5
18.    d7-g7    d5-c5xg7
19.    e5-d5    f6-f4

走棋后对方无路可走:

 1.    b2    f6
 2.    f2    d2
 3.    b6    b4
 4.    g7    d3
 5.    d1    c4
 6.    a4    c3
 7.    e3    c5xe3
 8.    d5    e3xd1
 9.    d1    e4
10.    e5    d7
11.    g1    g4
12.    a1xd7    a7
13.    d5-d6    c5-d5
14.    d6-d7    d5-c5xd7
15.    b6-d6    c5-d5
16.    d6-b6    d5-c5xb6
17.    g7-d7    c5-d5
18.    d7-g7    d5-c5xg7
19.    e5-d5    f6-e5xd5
20.    f2-f4    c5-b6
21.    f4-f2    b6-d6
22.    f2-f4    d6-f6
23.    f4-f2    g4-g7xf2
24.    g1-f2    g7-g4
25.    f2-g1xe3    a7-b6
26.    g1-f2    g4-g1
27.    f2-e3    f6-f4
28.    e3-f2    f4-g4
29.    f2-e3    e5-f6
30.    e3-f2    d3-e3
31.    f2-f4    e3-f2
32.    a4-a7    c4-c5
33.    a7-a4

应该只允许抽和自己相邻的棋子:

12子无斜线,开抽对方自己再走一子。

 1.    d6    f4
 2.    d2    b4
 3.    d5    d7
 4.    g4    a4
 5.    c4    a7
 6.    g7    a1xg7
 7.    g7    g1
 8.    d1    d3
 9.    e4    e5
10.    e4-e3    b4-b2
11.    e3-e4    a4-b4
12.    e4-e3    b4-a4xc4
13.    e3-e4    a4-b4
14.    e4-e3    b4-a4xe3
15.    d5-c5    a4-b4
16.    c5-d5    b4-a4xd5
17.    d6-d5    a4-b4
18.    d5-d6    b4-a4xd6
19.    d2-f2

12子无斜线,摆棋最后一步刚好成三

 1.    d6    d2
 2.    f4    b4
 3.    a7    d1
 4.    a4    f6
 5.    b2    f2
 6.    c4    d5
 7.    e5    e4
 8.    g4    g1
 9.    d3    c3
10.    g7    d7
11.    b6    e3
12.    c5

全成三,12子用例

**@@@@*@/@*@OO@O*/**@OO@*@ b m s 5 0 11 0 0 0 0 1

@calcitem calcitem unpinned this issue Feb 4, 2023
@calcitem
Copy link
Owner

與此同時,擔和槓應該只是在走棋時才有,因為如果落子時也能擔和槓的話,那落子的顧忌就太多,很難落子。

https://api.lib.ntnu.edu.tw:8443/server/api/core/bitstreams/594e9597-0add-4dc5-b1e7-be53a8410789/content

P6:

台灣直棋遊戲一開始的階段於此篇論文稱為放子階段,放子階段雙方輪流放置手上的棋子於棋盤之上。在放子階段時,將棋子放置於棋盤上線段的交叉點上,但不可放置在已經有棋子的點上,已放置的棋子在此階段是不可移動的。因此在此階段等同於為接下來的行子階段先佈局,此階段也可以產生三種「吃子」的情況,而且在此階段不會產生結來盤面。

因此:落子時也能擔和槓。

@calcitem
Copy link
Owner

印尼的规则是允许在斜线上擔,这是差异点。

来源:https://apkcombo.com/mulmulan/com.hahacompany.mulmul/

@calcitem
Copy link
Owner

一、同类规则合并

  1. “一挑二”类(将己方棋子移动到对方两子中间并吃掉)

    • 常见命名:挑担、担、挑、Gotong、(印尼) “放子到中间吃两端”
    • 本质要点:中间点为空,己方放上去后一次吃掉两端敌棋。
  2. “二夹一”类(己方两端夹住敌棋并吃掉)

    • 常见命名:杠、扛、抬、打、二子夹一、打炮(部分条件略不同,但本质均为“中间敌棋被夹走”)
    • 本质要点:己方两子在同一线上,中间隔一枚敌棋后,可将敌棋吃掉。
  3. “跳吃”类(跳过邻位敌棋并将之吃掉)

    • 常见命名:跳吃、跳
    • 本质要点:己方只剩 1 子或特定条件时,可沿直线或斜线跳过敌棋并吃掉之。
  4. “飞”与特殊走法(当剩 2~3 枚时可飞至任意点等)

    • 常见命名:飞、跳过数枚、任意走
    • 本质要点:棋子数不足时,走子不再受一般距离限制,可快速移动到任何空点。

注:部分玩法将“打炮”或“背背”也归类在“二夹一”/“一挑二”变体之中,规则名称虽多,但核心机制就是“中间格敌”或“中间格己方空点”。


二、主要差异点对照

下表列举上述同类规则在不同版本或地区的常见差异,供快速对比:

规则/现象 线段范围 阶段限制 棋子数量限制 命名差异 其他说明
“一挑二”
(挑担、担、gotong 等)
- 多数大陆/闽南:仅限方形边(水平、垂直)
- 印尼部分:含斜线也可“担”
- 部分仅走子阶段可“担”
- 台湾、印尼:落子阶段也可“担”
- 有些要求己方只剩 3 枚或以下
- 有些只在己方剩 1 枚时才可
- “挑担”、“担”、“gotong”、“挑” 等 - 是否允许在落子阶段就吃子,是最大分歧之一。
- 部分地区不限制己方棋子数,只要中间空即可“一挑二”。
“二夹一”
(杠、扛、抬、打、打炮 等)
- 多数大陆/闽南:仅在 8 条斜线/放射线
- 也有水平/垂直适用的别名(“打炮”等)
- 同上,多数规则限定在走子阶段
- 台湾规则:落子时也可“杠”
- 有些需己方剩 3 枚或以下
- 有些对己方数不设限
- “杠”、“扛”、“抬”、“打”、“二子夹一”、“打炮”等 - “打炮”常指己方两子相邻,中间或隔一枚敌棋时吃子。
- 有的版本称其为“炮”的吃子方法,与象棋炮类似。
跳吃 - 一般适用于可走动的所有线段
(含水平、垂直、对角)
- 通常只在走子阶段 - 常见限定:己方仅剩 1 枚时才能用 - “跳吃”或“跳” - 不可连跳,一回合只能跳一次。
(特例走法) - 不限线段,只要是空点即可 - 仅在走子阶段生效
(剩 2~3 枚时)
- 常设定:己方剩 3 或 2 枚时可飞 - “飞”、“任意走” - 提高残局的灵活性,增加翻盘或加速终局的机会。

备注:有的地区将“打炮”归入“二夹一”范畴,也有的将其单独列为“炮式吃子”。“背背”等较小众称呼,也可纳入“一挑二”或“二夹一”变体。


三、简要结论

  • 不同名字,本质相同:如“担”“挑担”“gotong”大多是“一挑二”,靠在同一条线上放子到敌棋两端空格;“杠”“扛”“二夹一”“打”本质是“两端己子夹中间敌棋”。
  • 主要分歧点
    1. 适用线段(只限方形边还是包含斜线/放射线);
    2. 执行阶段(仅走子阶段 vs. 落子和走子都可);
    3. 己方棋子数量(是否要先减少到 3 枚、2 枚或 1 枚才能执行)。
  • 命名多样化:因地方习俗、文献记载和语言差异,“担”“杠”“扛”“打”“抬”“挑担”“背背”“打炮”“gotong” 等叫法纷繁,实际上只要明白其核心“夹中吃子”或“跳过吃子”原理,即可理解各玩法的差异所在。

@calcitem calcitem pinned this issue Dec 30, 2024
@calcitem
Copy link
Owner

一、整体结构示例

可以将不同的规则分为若干“卡片”(Card)或“可折叠面板”(ExpansionPanel),每个卡片内有若干可配置项。大致可以分为以下几个卡片:

  1. 基础规则卡片(如是否启用“飞”,棋子数量限制等)
  2. “一挑二”卡片(挑担/担/gotong)
  3. “二夹一”卡片(杠/扛/打炮)
  4. “跳吃”卡片
  5. 其他特殊吃法卡片(如“背背”)

Flutter UI 常用组件

  • Switch (开关):用于布尔值开/关。
  • Checkbox (复选框):可同时勾选多个选项。
  • Radio (单选按钮):同一组中只能选一项。
  • Dropdown (下拉选单):在小空间内提供多选一或多选多的选择。
  • TextFormField (文本输入框):需要数值或文字时可用。

二、示例:基础规则卡片

这里放置最常用的全局性配置,比如“是否允许飞”、“棋子数剩多少时可以飞”、“落子阶段是否允许吃子”等。

1. 是否启用“飞”功能

  • 控件类型:SwitchListTile
  • Label允许“飞”
  • Value:bool,默认值(true/false)
    • 若为 false,则不出现其子配置;若为 true,则展开子配置。

2. “飞”规则细节

在“是否启用‘飞’功能”打开后出现。

  • 棋子数量限制
    • 控件类型:RadioListTile 或 Dropdown
    • Label当己方只剩多少枚时可以飞:
    • 可选项232 或 3 都可飞不限
  • 飞的范围
    • 控件类型:SwitchListTile
    • Label是否可飞到任意空点(含跳过敌棋)
    • Value:bool (如果需要细分,也可多选,如“仅直线飞” / “含对角线飞”等)

3. 落子阶段能否吃子

  • 控件类型:SwitchListTile
  • Label落子阶段允许吃子
  • Value:bool

三、“一挑二”卡片(挑担 / 担 / gotong 等)

1. 是否启用“一挑二”

  • 控件类型:SwitchListTile
  • Label启用“一挑二”规则(挑担/担/gotong)
  • Value:bool

2. 线段范围选择

当“一挑二”开启时,对应可配置允许在哪些线段上“一挑二”。

  • 控件类型:CheckboxListTile (多选)
    • Label可用线段范围:
    • 可选值
      • 水平 / 垂直线
      • 斜线 / 放射线
      • 全部

(也可用 Radio 来做单选,看实际需求是多选还是单选)

3. 执行阶段

  • 是否在落子阶段可用
    • SwitchListTile: 落子阶段可“一挑二”
  • 是否在走子阶段可用
    • SwitchListTile: 走子阶段可“一挑二”

两者都打开则表示落子和走子都可以,一者或全部关闭表示不允许。

4. 棋子数限制

  • 控件类型:RadioListTile
  • Label只能在己方剩余多少枚棋子时触发“一挑二”
  • 可选项
    • <=1
    • <=2
    • <=3
    • 无限制

5. 其他条件(若需进一步细分)

  • 是否允许一次吃掉超过 2 子(若出现多子连线)
    • SwitchListTile: 允许一次多子吃(一般默认 false)
  • 是否需要正方形边(部分台湾规则限定“三个四方形边”)
    • SwitchListTile: 只在正方形边可用

四、“二夹一”卡片(杠 / 扛 / 打 / 打炮 等)

1. 是否启用“二夹一”

  • 控件类型:SwitchListTile
  • Label启用“二夹一”规则(杠/扛/打炮)
  • Value:bool

2. 线段范围

  • 控件类型:CheckboxListTile 或 RadioListTile
  • Label可用线段:
  • 可选值8 条放射线水平 / 垂直线所有线段

不同版本有不同需求,可自由组合。

3. 执行阶段

  • 是否在落子阶段可用
    • SwitchListTile: 落子阶段可“二夹一”
  • 是否在走子阶段可用
    • SwitchListTile: 走子阶段可“二夹一”

4. 棋子数限制

  • 控件类型:RadioListTile 或 Dropdown
  • Label只能在己方剩余多少枚时可“二夹一”
  • 可选<=1<=2<=3无限制

5. 子规则:打炮

如果需要单独细化“打炮”的前提(如己棋相邻、中间隔敌棋等),可做子配置。

  • 控件类型:SwitchListTile
  • Label启用“打炮”特殊规则
    • 若开启,再出现:
      • 己棋相邻是否必需?(Switch 或 Radio)
      • 水平/垂直限定?(Switch)

五、“跳吃”卡片

1. 是否启用“跳吃”

  • 控件类型:SwitchListTile
  • Label启用“跳吃”规则
  • Value:bool

2. 棋子数限制

  • 控件类型:RadioListTile
  • Label仅当剩几枚时可跳吃
  • 可选项<=1<=2无限制

3. 跳吃范围

  • CheckboxListTile
    • 可跳水平线
    • 可跳垂直线
    • 可跳对角线
  • 是否允许连跳(若有些规则可多跳)
    • SwitchListTile: 允许同一回合连跳

六、其他特殊吃法卡片(如“背背”)

若有独特称呼或地方规则“背背”等,可以参照上面模式配置:

  1. 是否启用“背背” (Switch)
  2. 限定线段 (CheckboxListTile)
  3. 阶段 (SwitchListTile)
  4. 棋子数限制 (RadioListTile)
  5. 额外条件 (是否只在某些位置或某些情形生效)

七、综合注意事项

  1. 层级结构

    • 对于 Flutter 来说,可以使用 ExpansionPanelList 或一个 ListView 中分多个 Card,每个 Card 内用 Column + 各种 ListTile 来承载这些选项。
    • 当某个功能 Switch 关闭时,其子选项可以用 Visibility (或条件渲染) 隐藏。
  2. 选项关联

    • 如果“落子阶段可吃子”被全局关闭,则所有关于“落子阶段是否可‘担’/‘杠’”的子选项可以自动禁用或隐藏。
    • 如果“允许飞”被关闭,则不用显示“飞”相关配置。
  3. 默认值

    • 需要根据所希望的“标准规则”或“常见玩法”来设置初始值,例如:
      • 默认为 false
      • 一挑二二夹一 基本为 true
      • 线段范围默认“仅方形边”或“仅 8 条斜线”视版本而定。
  4. 命名与翻译

    • 卡片标题或选项说明中可列出多个名字,例如:“担(或挑担/gotong)”、"杠(或扛/打/抬)",以免玩家混淆。

@calcitem
Copy link
Owner

需要 string Position::fen() const 将 last from/to 传参才行,总体看比较复杂。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants