feat: smarter bot

This commit is contained in:
2026-07-07 23:23:12 +03:30
parent e7b2e05428
commit 525cd554ef
4 changed files with 112 additions and 37 deletions
+7 -1
View File
@@ -70,6 +70,9 @@ type Room struct {
// graceUntil: تا این لحظه هیچ حرکتِ خودکاری انجام نمی‌شود (هماهنگ با انیمیشن‌های کلاینت).
graceUntil time.Time
chatAt [4]time.Time // آخرین زمانِ چتِ هر جایگاه (ضدِ اسپم)
// seen: حافظه‌ی کارت‌های بازی‌شده در هَندِ جاری (برای هوشِ باتِ کارت‌شمار).
// بیتِ (rank-2) از seen[suit] یعنی آن کارت رو شده. هر هَند ریست می‌شود.
seen [4]uint16
}
func newRoom(id string, seats [4]*seatInfo, hub *Hub) *Room {
@@ -280,6 +283,7 @@ func (r *Room) handleInput(act roomAction) {
r.sendError(act.seat, err.Error())
return
}
r.seen = [4]uint16{} // شروعِ فازِ بازیِ هَند ⇒ ریستِ حافظه‌ی کارت‌ها
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیه‌ی کارت‌ها
r.react()
case "reshuffle":
@@ -340,6 +344,7 @@ func (r *Room) autoChooseTrump(seat int) {
return
}
_ = r.game.ChooseTrump(seat, botChooseTrump(hand))
r.seen = [4]uint16{} // شروعِ فازِ بازیِ هَند ⇒ ریستِ حافظه‌ی کارت‌ها
r.graceUntil = time.Now().Add(r.dealDelay) // انیمیشنِ پخشِ بقیه‌ی کارت‌ها
}
@@ -349,7 +354,7 @@ func (r *Room) autoPlayCard(seat int) {
if len(hand) == 0 {
return
}
choice := botPlay(hand, r.game.Trick, r.game.Trump, r.game.LeadSuit)
choice := botPlay(hand, r.game.Trick, r.game.Trump, r.game.LeadSuit, r.seen)
_ = r.playCard(seat, choice)
}
@@ -359,6 +364,7 @@ func (r *Room) playCard(seat int, card game.Card) error {
if err := r.game.PlayCard(seat, card); err != nil {
return err
}
r.seen[card.Suit] |= 1 << (card.Rank - 2) // ثبت در حافظه‌ی کارت‌شمارِ بات
// بُرِش: کارتِ غیرِاولِ دست، از خالِ حکم، در حالی که خالِ زمینه حکم نبوده
// ⇒ بازیکن خالِ زمینه را نداشته و با حکم بریده است.
if !wasFirst && card.Suit == r.game.Trump && r.game.LeadSuit != r.game.Trump {