8 球(黑八)规则,要点如下: 开球 - 开局母球必须放在开球线(balk line)之后(placeBall())。 - 开球没有特殊的“4球碰库 / 犯规重开”规则——开球就是普通第一杆(开球规则.txt 明确说明)。 - 开球合法进球就算“break”(isPartOfBreak())。 分组(大小花) - 进球前未分组:本杆只进 1–7 号(小花)→ 你的组=小花;只进 9–15 号(大花)→ 你的组=大花;黑白八不参与分组。 - 本杆同时进双方球则不能确定分组,下次继续。 必须按组击球 - 未分组时:先撞黑八 = 犯规。 - 已分组、己方组还有球时:先撞对方组球 = 犯规(Wrong group hit first)。 - 己方组清空后:必须先撞黑八,否则犯规(Must hit 8-ball first)。 犯规判定(foulReason()) 1. 母球进袋; 2. 一杆没碰到任何球; 3. 先撞错球(同上); 4. 本杆没有进球时,母球接触目标球后必须碰一次库边(No cushion after contact)。 犯规处罚 - 犯规提示“FOUL + Ball in hand”,对手获得自由球:母球在台上从原位重新摆,不在台上放回开球线中点(单机进 PlaceBall,联机由对家摆)。 - 犯规且黑八入袋: - 已分组且场上还有其它球 → 黑八摆回脚点(foot spot),按“过早进黑八”犯规处理; - 未分组、或场上已无其它球 → 直接判负。 开球的特殊之处(applyBreakRespot()) - 开球合法打进黑八:不判负、不判犯规、不给自由球,黑八摆回脚点,开球方继续击球。 - 开球时母球与黑八同时入袋 → 开球方直接输掉该局(开球后8号球直接入.txt 第 2 行,代码中因未分组直接走 handleGameEnd(false))。 胜负 - 合法击球清空己方组后打进黑八 ⇒ 获胜(isEndOfGame())。 - 未清空己组或犯规时打进黑八 ⇒ 按上述犯规/判负处理。 ------ 9 球规则 开球与摆球 - 菱形(钻石)摆球(Rack.diamond()):1 号球在置球点(脚点)顶端,9 号球放菱形中心,其余球任意(代码固定顺序)。 - 开局母球必须放在开球线(balk line)之后(placeBall())。 - 无特殊开球犯规规则——开球即普通第一杆,犯规按一般规则处理。 按序击球(最少号球规则) - nextCandidateBall() 按球号升序取台面上最小号球。 - 犯规判定中的“撞错球”(NineBall.foulReason): - 本杆第一碰撞的球必须是当前最低号球(getLowestBallAtStartOfShot 按“本杆进袋的球 + 台上剩余球”取最小号),否则犯规。 - 练习模式放宽:练习时只有「第一撞是 9 号球且台上还有其它球」才算犯规;撞其它非最小号球不判犯规。 犯规判定(foulReason()) 1. 母球进袋; 2. 一杆没碰到任何球; 3. 第一碰撞不是最低号球(如上); 4. 本杆没有进球时,接触后必须碰一次库边(No cushion after contact)。 犯规处理(handleFoul) - 提示 FOUL + Ball in hand(自由球):母球在台上从原位重摆,不在台则放回开球线中点。 - 犯规时 9 号球进袋:不判负,把 9 号球摆回脚点(foot spot)并同步(RerackEvent),然后给对手自由球。 进球与胜负 - 每进一球累计得分/连击数(currentBreak、addMyScore)。 - 任何合法(无犯规)一杆把 9 号球打进袋即直接获胜(isEndOfGame():9 球进袋 && 非犯规)。 - 进其它球不出错就继续由我击球;失误(未进球且未犯规)则换对方。 与 8 球的关键差异 - 不分组;永远打最小号球。 - 9 球犯规进袋重摆回脚点、不给对方胜(8 球犯规进黑八未清组时也重摆,但清组后进黑八即输)。 - 比分就是你进的球数;没有“贴库/拉杆垫”等额外规则实现。