Go изменение матрицы при добавлении столбца - PullRequest
0 голосов
/ 05 апреля 2020

Я пишу карточную игру с go. У меня есть карты в матрице срезов (3 строки, n столбцов) и карты в колоде с обычным срезом

type Game struct {
    Deck     []Card   `json:"-"`
    InPlay   [][]Card `json:"in_play,omitempty"`
}

type Card struct {
    Number  *int64 `json:"number"`
    Suit    *int64 `json:"suit"`
}

В определенной ситуации я хочу добавить еще один ряд карт на

func(g *Game) AddCards() {
  g.InPlay[0] = append(g.InPlay[0], g.Deck[0])
  g.InPlay[1] = append(g.InPlay[1], g.Deck[1])
  g.InPlay[2] = append(g.InPlay[2], g.Deck[2])
  g.Deck = g.Deck[3:]
}

Вместо добавления нового столбца карт это приводит к добавлению столбца, но также к изменению карт, которые у меня в игре.

1 4 7            1  4 7 10              1 4 7 10
2 5 8   becomes  10 5 8 11  instead of  2 5 8 11
3 6 9            11 6 9 12              3 6 9 12

странно, если следовать этому шаблону, если я добавлю еще один столбец

1  4 7 10            1  4  7 10 13              1  4 7 10 13
10 5 8 11   becomes  10 13 8 11 14  instead of  10 5 8 11 14
11 6 9 12            11 14 9 12 15              11 6 9 12 15

Это происходит только снизу с карточками в столбце, в 3 столбцах слева от места добавления нового столбца

EDIT

Колода создана с

func New() *Deck {
    rand.Seed(time.Now().UnixNano())

    deck := Deck{}
    cards := []Card{}

    // Constant integers
    for _, number := range NUMBERS {
        for _, suit := range SUITS {
            card := Card{
                Number:  ptr.int64(number), // turns int64 to pointer
                Suit: ptr.int64(suit),
            }
            cards = append(cards, card)
        }
    }

    deck.Cards = cards
    deck.Shuffle()
    return &deck
}

, а исходная матрица с

func (g *Game) Deal() {
    inPlay := [][]deck.Card{[]deck.Card{}, []deck.Card{}, []deck.Card{}}
    inPlay[0] = g.Deck.Cards[0:4]
    inPlay[1] = g.Deck.Cards[4:8]
    inPlay[2] = g.Deck.Cards[8:12]

    g.InPlay = inPlay
    g.Deck.Cards = g.Deck.Cards[12:]
    return
}

1 Ответ

1 голос
/ 06 апреля 2020

Вот простой подход:

func(c *Card) Copy() *Card {
  return &Card{
    Number: c.Number,
    Suit: c.Suit,
  }
}
func(g *Game) AddCards() {
  g.InPlay[0] = append(g.InPlay[0], g.Deck[0].Copy())
  g.InPlay[1] = append(g.InPlay[1], g.Deck[1].Copy())
  g.InPlay[2] = append(g.InPlay[2], g.Deck[2].Copy())
  g.Deck = g.Deck[3:]
}
func (g *Game) Deal() {
  inPlay := [][]deck.Card{[]deck.Card{}, []deck.Card{}, []deck.Card{}}
  for i, row := range inPlay {
    for j := 0; j < 3; j++ {
      row = append(row, g.Deck.Cards[j].Copy())
    }
    g.Deck.Cards = g.Deck.Cards[3:]
  }
  g.InPlay = inPlay
  return
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...