package game import ( "fmt" ) type Board struct { Sentinal [4]*Card `json:"sentinal"` Scourge [4]*Card `json:"scourge"` } func NewBoard() *Board { return &Board{ Sentinal: [4]*Card{NewEmpty(0), NewEmpty(1), NewEmpty(2), NewEmpty(3)}, Scourge: [4]*Card{NewEmpty(0), NewEmpty(1), NewEmpty(2), NewEmpty(3)}, } } func (b *Board) String() string { return fmt.Sprintf("---------\n|%v|%v|%v|%v|\n---------\n|%v|%v|%v|%v|\n---------\n", b.Sentinal[0], b.Sentinal[1], b.Sentinal[2], b.Sentinal[3], b.Scourge[0], b.Scourge[1], b.Scourge[2], b.Scourge[3]) } func (b *Board) GetRow(id int) []*Card { if id == SentinalID { return b.Sentinal[:] } else { return b.Scourge[:] } } func (b *Board) GetCard(id int, pos int) *Card { return b.GetRow(id)[pos] } func (b *Board) Remove(c *Card) { for k, v := range b.Sentinal { if v.Id == c.Id { b.Sentinal[k] = NewEmpty(k) } } for k, v := range b.Scourge { if v.Id == c.Id { b.Scourge[k] = NewEmpty(k) } } } func (b *Board) Empty(id int) bool { res := true row := b.GetRow(id) for _, v := range row { if !v.Empty() { res = false } } return res } func (b *Board) CanMove(id, src, dest int) bool { brd := b.GetRow(id) if brd[src].Empty() { return false } if !brd[dest].Empty() { return false } if brd[src].Sick { return false } return true } func (b *Board) Move(id, src, dest int) bool { var brd [4]*Card if id == SentinalID { brd = b.Sentinal } else { brd = b.Scourge } if brd[src].Empty() { return false } if !brd[dest].Empty() { return false } if brd[src].Sick { return false } brd[dest] = brd[src] brd[src] = NewEmpty(src) if id == SentinalID { b.Sentinal = brd } else { b.Scourge = brd } return true } func (b *Board) CanPlay(id int, c *Card, dest int) bool { brd := b.GetRow(id) if !brd[dest].Empty() { return false } return true } func (b *Board) Play(id int, c *Card, dest int, should bool) bool { brd := b.GetRow(id) if should { brd[dest] = c c.Position = dest } else { return false } return true } func (b *Board) CanAttack(id, atk, def int) bool { aBrd := b.GetRow(id) if aBrd[atk].Empty() || aBrd[atk].Sick || atk != def { return false } return true } func (b *Board) Attack(id int, atk, def int) int { var aBrd [4]*Card var dBrd [4]*Card if id == SentinalID { aBrd = b.Sentinal dBrd = b.Scourge } else { aBrd = b.Scourge dBrd = b.Sentinal } if dBrd[def].Empty() { //health damage if id == SentinalID { b.Sentinal = aBrd b.Scourge = dBrd } else { b.Scourge = aBrd b.Sentinal = dBrd } return 1 } //Do actual battle math attacker := aBrd[atk].Power defender := dBrd[def].Power if attacker > defender { dBrd[def] = NewEmpty(def) if id == SentinalID { b.Sentinal = aBrd b.Scourge = dBrd } else { b.Scourge = aBrd b.Sentinal = dBrd } return 0 } if attacker == defender { aBrd[atk] = NewEmpty(atk) dBrd[def] = NewEmpty(def) if id == 1 { b.Sentinal = aBrd b.Scourge = dBrd } else { b.Scourge = aBrd b.Sentinal = dBrd } return 0 } return -1 }