Follow Yokosawa hand range rules for 3-bets and BB defense in reviews

When the hero's own raise is re-raised, a hand in the same color as the
re-raiser's estimated range is now a call (raise still needs two above).
In the BB facing a single open of up to 4BB, the hero now defends wider:
blue or better (white vs CO, purple frame vs BTN, one below the opener)
calls, and three above raises. Opponent range estimates follow the same
rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
agomizi1cmandClaude Opus 5.5 committed 2026-10-19 23:31:07 +09:00
1 parent 0318ee2b5e
commit d89ce1dd30
3 files changed
+121 -15

No files matched your search

+67
View File
@@ -135,6 +135,73 @@ test('プリフロップ: 前に参加者がいたら、その人の色の一つ
assert.equal(j.verdict, 'good');
});
test('プリフロップ: 自分のレイズにリレイズされたら、相手と同じ色でもコールできる', () => {
// 6人: UTG(hero、後ろに5人 → 緑)がオープン、HJ が3bet(緑の二つ上 → 赤と推定)、ほかは降りて hero に戻る
for (const [cards, action, verdict] of [
[['Jh', 'Jd'], 'call', 'good'], // 赤 = 同じ → コール
[['Jh', 'Jd'], 'fold', 'tight'],
[['Kh', 'Qd'], 'call', 'loose'], // 黄 = 一つ下 → フォールド
[['Kh', 'Qd'], 'fold', 'good'],
[['Ah', 'Ad'], 'call', 'good'], // 紺 = 一つ上 → コール(二つ上はない)
]) {
const t = makeTable(6);
const hero = act(t, 'raise', 30);
const hj = act(t, 'raise', 90);
for (let k = 0; k < 4; k++) act(t, 'fold');
assert.equal(t.hand.toAct, hero);
act(t, action);
give(t, hero, cards);
const { judgments, estimated } = judgePreflop(t.hand, hero);
assert.equal(estimated.get(hj), 6);
const j = judgments[1];
assert.equal(j.situation.rule, 'reraised');
assert.equal(j.verdict, verdict, `${cards} ${action}`);
}
});
test('プリフロップ: BB は 4BB までのオープンに広くコールし、三つ上でレイズ', () => {
// 6人: CO(後ろに3人 → 青)がオープンして BB(hero)まで降りる。白以上でコール、赤以上でレイズ
const coOpen = (to, cards, action) => {
const t = makeTable(6);
act(t, 'fold');
act(t, 'fold');
act(t, 'raise', to);
act(t, 'fold');
act(t, 'fold');
const bb = t.hand.toAct;
assert.equal(bb, t.hand.bbSeat);
act(t, action, action === 'raise' ? to * 3 : 0);
give(t, bb, cards);
return judgePreflop(t.hand, bb).judgments[0];
};
for (const [cards, action, verdict] of [
[['Kh', '8h'], 'call', 'good'], // 白 = 青の一つ下 → コール
[['Qh', '5h'], 'call', 'loose'], // 紫枠 → フォールド
[['Kh', 'Qd'], 'call', 'good'], // 黄 = 二つ上 → まだコール
[['Kh', 'Qd'], 'raise', 'aggressive'],
[['Jh', 'Jd'], 'raise', 'good'], // 赤 = 三つ上 → レイズ
]) {
const j = coOpen(30, cards, action);
assert.equal(j.situation.rule, 'bb');
assert.equal(j.verdict, verdict, `${cards} ${action}`);
}
// 4BB を超えるオープンには、ほかの席と同じく一つ上が必要
const big = coOpen(50, ['Kh', '8h'], 'call');
assert.equal(big.situation.rule, 'normal');
assert.equal(big.verdict, 'loose');
// BTN(後ろに2人 → 白)のオープンには紫枠からコールできる。コールした BB のレンジも紫枠と推定する
const t = makeTable(6);
for (let k = 0; k < 3; k++) act(t, 'fold');
act(t, 'raise', 25);
act(t, 'fold');
const bb = act(t, 'call');
give(t, bb, ['Qh', '5h']);
const { judgments, estimated } = judgePreflop(t.hand, bb);
assert.equal(judgments[0].verdict, 'good');
assert.equal(estimated.get(bb), 1);
});
test('オールインの期待値: AA 対 KK はおよそ 82%', () => {
const hands = new Map([
[0, ['As', 'Ad']],