feat: smarter bot
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package ws
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"hakemsho/internal/game"
|
||||
)
|
||||
|
||||
func card(s game.Suit, r game.Rank) game.Card { return game.Card{Suit: s, Rank: r} }
|
||||
|
||||
func TestBotWinsWhenOpponentLeads(t *testing.T) {
|
||||
// حریف با شاهِ پیک رهبری کرده؛ بات باید با آسِ پیک (کمترین کارتِ برنده) ببرد.
|
||||
hand := []game.Card{card(game.Spades, game.Ace), card(game.Spades, 3), card(game.Clubs, 5)}
|
||||
trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.King)}}
|
||||
got := botPlay(hand, trick, game.Hearts, game.Spades)
|
||||
if got != card(game.Spades, game.Ace) {
|
||||
t.Errorf("expected S-A to win, got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBotSavesCardWhenPartnerWins(t *testing.T) {
|
||||
// شریک (صندلی۰) با آسِ پیک برنده است؛ باتِ صندلی۲ باید کمترین پیک را بریزد.
|
||||
hand := []game.Card{card(game.Spades, game.King), card(game.Spades, 5)}
|
||||
trick := []game.TrickCard{
|
||||
{Seat: 0, Card: card(game.Spades, game.Ace)},
|
||||
{Seat: 1, Card: card(game.Spades, 2)},
|
||||
}
|
||||
got := botPlay(hand, trick, game.Hearts, game.Spades)
|
||||
if got != card(game.Spades, 5) {
|
||||
t.Errorf("expected low S-5 (save the King), got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBotTrumpsOpponent(t *testing.T) {
|
||||
// بات پیک ندارد و حریف با آسِ پیک میبرد ⇒ باید با کمترین حکم بِبُرد.
|
||||
hand := []game.Card{card(game.Hearts, 2), card(game.Hearts, game.King), card(game.Clubs, 9)}
|
||||
trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.Ace)}}
|
||||
got := botPlay(hand, trick, game.Hearts, game.Spades)
|
||||
if got != card(game.Hearts, 2) {
|
||||
t.Errorf("expected lowest trump H-2, got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBotDiscardsWhenPartnerWinsAndVoid(t *testing.T) {
|
||||
// شریک میبرد و بات خالِ زمینه را ندارد ⇒ حکم را هدر ندهد، کارتِ کم بریزد.
|
||||
hand := []game.Card{card(game.Hearts, game.King), card(game.Clubs, 4), card(game.Clubs, 9)}
|
||||
trick := []game.TrickCard{
|
||||
{Seat: 0, Card: card(game.Spades, game.Ace)},
|
||||
{Seat: 1, Card: card(game.Spades, 2)},
|
||||
}
|
||||
got := botPlay(hand, trick, game.Hearts, game.Spades)
|
||||
if got != card(game.Clubs, 4) {
|
||||
t.Errorf("expected low discard C-4 (keep trump), got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBotLeadsNonTrumpAce(t *testing.T) {
|
||||
// در رهبری، آسِ غیرِحکم را نقد کن.
|
||||
hand := []game.Card{card(game.Clubs, game.Ace), card(game.Diamonds, 7), card(game.Hearts, game.King)}
|
||||
got := botPlay(hand, nil, game.Hearts, 0)
|
||||
if got != card(game.Clubs, game.Ace) {
|
||||
t.Errorf("expected to lead C-A, got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBotCannotBeatKeepsLow(t *testing.T) {
|
||||
// حریف با آسِ پیک میبرد و بات فقط پیکِ پایین دارد ⇒ کمترین را بریزد.
|
||||
hand := []game.Card{card(game.Spades, 4), card(game.Spades, 9)}
|
||||
trick := []game.TrickCard{{Seat: 0, Card: card(game.Spades, game.Ace)}}
|
||||
got := botPlay(hand, trick, game.Hearts, game.Spades)
|
||||
if got != card(game.Spades, 4) {
|
||||
t.Errorf("expected low S-4, got %v", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBotChooseTrumpPrefersStrongLongSuit(t *testing.T) {
|
||||
// خشت: ۴ کارت اما ضعیف؛ گشنیز: ۳ کارت اما آس+شاه. باید گشنیز را حکم کند اگر
|
||||
// امتیازش بیشتر شود — اینجا خشت ۴تایی برنده است. تستِ ساده: بلندترینِ قوی.
|
||||
hand := []game.Card{
|
||||
card(game.Diamonds, 2), card(game.Diamonds, 3), card(game.Diamonds, 4), card(game.Diamonds, 5),
|
||||
card(game.Clubs, game.Ace),
|
||||
}
|
||||
if got := botChooseTrump(hand); got != game.Diamonds {
|
||||
t.Errorf("expected Diamonds (longest), got %v", got)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user