Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: select suit #13

Merged
merged 1 commit into from
Jan 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ func main() {
router.GET("/api/v1/game/:gameId", auth.EnsureValidTokenGin([]string{auth.ReadGame}), gameHandler.Get)
router.GET("/api/v1/game/:gameId/state", auth.EnsureValidTokenGin([]string{auth.ReadGame}), gameHandler.GetState)
router.PUT("/api/v1/game/:gameId/call", auth.EnsureValidTokenGin([]string{auth.WriteGame}), gameHandler.Call)
router.PUT("/api/v1/game/:gameId/suit", auth.EnsureValidTokenGin([]string{auth.WriteGame}), gameHandler.SelectSuit)
router.GET("/api/v1/game/all", auth.EnsureValidTokenGin([]string{auth.ReadGame}), gameHandler.GetAll)
router.PUT("/api/v1/game", auth.EnsureValidTokenGin([]string{auth.WriteAdmin}), gameHandler.Create)
router.DELETE("/api/v1/game/:gameId", auth.EnsureValidTokenGin([]string{auth.WriteAdmin}), gameHandler.Delete)
Expand Down
12 changes: 6 additions & 6 deletions pkg/game/deck-utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ func ShuffleCards(cards []CardName) []CardName {
return shuffled
}

func DealCards(cards []CardName, players []Player) ([]CardName, []Player) {
func DealCards(deck []CardName, numPlayers int) ([]CardName, [][]CardName) {
hands := make([][]CardName, numPlayers+1)
// Deal the cards
for i := 0; i < 5; i++ {
for j := 0; j < len(players); j++ {
players[j].Cards = append(players[j].Cards, cards[0])
cards = cards[1:]
for j := 0; j < numPlayers+1; j++ {
hands[j] = append(hands[j], deck[0])
deck = deck[1:]
}
}

return cards, players
return deck, hands
}

func NewDeck() []CardName {
Expand Down
124 changes: 62 additions & 62 deletions pkg/game/deck.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ package game
type Suit string

const (
EMPTY Suit = "EMPTY"
CLUBS = "CLUBS"
DIAMONDS = "DIAMONDS"
HEARTS = "HEARTS"
SPADES = "SPADES"
WILD = "WILD"
Empty Suit = "EMPTY"
Clubs = "CLUBS"
Diamonds = "DIAMONDS"
Hearts = "HEARTS"
Spades = "SPADES"
Wild = "WILD"
)

type CardName string
Expand Down Expand Up @@ -73,7 +73,7 @@ const (

// Card represents a card with a value, coldValue, suit, and renegable status.
type Card struct {
NAME CardName
Name CardName
Value int
ColdValue int
Suit Suit
Expand All @@ -82,62 +82,62 @@ type Card struct {

// Define cards as constants.
var (
EmptyCard = Card{EMPTY_CARD, 0, 0, EMPTY, false}
TwoHearts = Card{NAME: TWO_HEARTS, Value: 2, ColdValue: 0, Suit: HEARTS, Renegable: false}
ThreeHearts = Card{THREE_HEARTS, 3, 0, HEARTS, false}
FourHearts = Card{FOUR_HEARTS, 4, 0, HEARTS, false}
SixHearts = Card{SIX_HEARTS, 6, 0, HEARTS, false}
SevenHearts = Card{SEVEN_HEARTS, 7, 0, HEARTS, false}
EightHearts = Card{EIGHT_HEARTS, 8, 0, HEARTS, false}
NineHearts = Card{NINE_HEARTS, 9, 0, HEARTS, false}
TenHearts = Card{TEN_HEARTS, 10, 0, HEARTS, false}
QueenHearts = Card{QUEEN_HEARTS, 12, 0, HEARTS, false}
KingHearts = Card{KING_HEARTS, 13, 0, HEARTS, false}
AceHearts = Card{ACE_HEARTS, 1, 0, HEARTS, false}
JackHearts = Card{JACK_HEARTS, 11, 0, HEARTS, true}
FiveHearts = Card{FIVE_HEARTS, 5, 0, HEARTS, true}
TwoDiamonds = Card{TWO_DIAMONDS, 2, 0, DIAMONDS, false}
ThreeDiamonds = Card{THREE_DIAMONDS, 3, 0, DIAMONDS, false}
FourDiamonds = Card{FOUR_DIAMONDS, 4, 0, DIAMONDS, false}
SixDiamonds = Card{SIX_DIAMONDS, 6, 0, DIAMONDS, false}
SevenDiamonds = Card{SEVEN_DIAMONDS, 7, 0, DIAMONDS, false}
EightDiamonds = Card{EIGHT_DIAMONDS, 8, 0, DIAMONDS, false}
NineDiamonds = Card{NINE_DIAMONDS, 9, 0, DIAMONDS, false}
TenDiamonds = Card{TEN_DIAMONDS, 10, 0, DIAMONDS, false}
QueenDiamonds = Card{QUEEN_DIAMONDS, 12, 0, DIAMONDS, false}
KingDiamonds = Card{KING_DIAMONDS, 13, 0, DIAMONDS, false}
AceDiamonds = Card{ACE_DIAMONDS, 1, 0, DIAMONDS, false}
JackDiamonds = Card{JACK_DIAMONDS, 11, 0, DIAMONDS, true}
FiveDiamonds = Card{FIVE_DIAMONDS, 5, 0, DIAMONDS, true}
TenClubs = Card{TEN_CLUBS, 10, 0, CLUBS, false}
NineClubs = Card{NINE_CLUBS, 9, 0, CLUBS, false}
EightClubs = Card{EIGHT_CLUBS, 8, 0, CLUBS, false}
SevenClubs = Card{SEVEN_CLUBS, 7, 0, CLUBS, false}
SixClubs = Card{SIX_CLUBS, 6, 0, CLUBS, false}
FourClubs = Card{FOUR_CLUBS, 4, 0, CLUBS, false}
ThreeClubs = Card{THREE_CLUBS, 3, 0, CLUBS, false}
TwoClubs = Card{TWO_CLUBS, 2, 0, CLUBS, false}
QueenClubs = Card{QUEEN_CLUBS, 12, 0, CLUBS, false}
KingClubs = Card{KING_CLUBS, 13, 0, CLUBS, false}
AceClubs = Card{ACE_CLUBS, 1, 0, CLUBS, false}
JackClubs = Card{JACK_CLUBS, 11, 0, CLUBS, true}
FiveClubs = Card{FIVE_CLUBS, 5, 0, CLUBS, true}
TenSpades = Card{TEN_SPADES, 10, 0, SPADES, false}
NineSpades = Card{NINE_SPADES, 9, 0, SPADES, false}
EightSpades = Card{EIGHT_SPADES, 8, 0, SPADES, false}
SevenSpades = Card{SEVEN_SPADES, 7, 0, SPADES, false}
SixSpades = Card{SIX_SPADES, 6, 0, SPADES, false}
FourSpades = Card{FOUR_SPADES, 4, 0, SPADES, false}
ThreeSpades = Card{THREE_SPADES, 3, 0, SPADES, false}
TwoSpades = Card{TWO_SPADES, 2, 0, SPADES, false}
QueenSpades = Card{QUEEN_SPADES, 12, 0, SPADES, false}
KingSpades = Card{KING_SPADES, 13, 0, SPADES, false}
AceSpades = Card{ACE_SPADES, 1, 0, SPADES, false}
JackSpades = Card{JACK_SPADES, 11, 0, SPADES, true}
FiveSpades = Card{FIVE_SPADES, 5, 0, SPADES, true}
Joker = Card{JOKER, 0, 0, WILD, true}
EmptyCard = Card{EMPTY_CARD, 0, 0, Empty, false}
TwoHearts = Card{Name: TWO_HEARTS, Value: 2, ColdValue: 0, Suit: Hearts, Renegable: false}
ThreeHearts = Card{THREE_HEARTS, 3, 0, Hearts, false}
FourHearts = Card{FOUR_HEARTS, 4, 0, Hearts, false}
SixHearts = Card{SIX_HEARTS, 6, 0, Hearts, false}
SevenHearts = Card{SEVEN_HEARTS, 7, 0, Hearts, false}
EightHearts = Card{EIGHT_HEARTS, 8, 0, Hearts, false}
NineHearts = Card{NINE_HEARTS, 9, 0, Hearts, false}
TenHearts = Card{TEN_HEARTS, 10, 0, Hearts, false}
QueenHearts = Card{QUEEN_HEARTS, 12, 0, Hearts, false}
KingHearts = Card{KING_HEARTS, 13, 0, Hearts, false}
AceHearts = Card{ACE_HEARTS, 1, 0, Hearts, false}
JackHearts = Card{JACK_HEARTS, 11, 0, Hearts, true}
FiveHearts = Card{FIVE_HEARTS, 5, 0, Hearts, true}
TwoDiamonds = Card{TWO_DIAMONDS, 2, 0, Diamonds, false}
ThreeDiamonds = Card{THREE_DIAMONDS, 3, 0, Diamonds, false}
FourDiamonds = Card{FOUR_DIAMONDS, 4, 0, Diamonds, false}
SixDiamonds = Card{SIX_DIAMONDS, 6, 0, Diamonds, false}
SevenDiamonds = Card{SEVEN_DIAMONDS, 7, 0, Diamonds, false}
EightDiamonds = Card{EIGHT_DIAMONDS, 8, 0, Diamonds, false}
NineDiamonds = Card{NINE_DIAMONDS, 9, 0, Diamonds, false}
TenDiamonds = Card{TEN_DIAMONDS, 10, 0, Diamonds, false}
QueenDiamonds = Card{QUEEN_DIAMONDS, 12, 0, Diamonds, false}
KingDiamonds = Card{KING_DIAMONDS, 13, 0, Diamonds, false}
AceDiamonds = Card{ACE_DIAMONDS, 1, 0, Diamonds, false}
JackDiamonds = Card{JACK_DIAMONDS, 11, 0, Diamonds, true}
FiveDiamonds = Card{FIVE_DIAMONDS, 5, 0, Diamonds, true}
TenClubs = Card{TEN_CLUBS, 10, 0, Clubs, false}
NineClubs = Card{NINE_CLUBS, 9, 0, Clubs, false}
EightClubs = Card{EIGHT_CLUBS, 8, 0, Clubs, false}
SevenClubs = Card{SEVEN_CLUBS, 7, 0, Clubs, false}
SixClubs = Card{SIX_CLUBS, 6, 0, Clubs, false}
FourClubs = Card{FOUR_CLUBS, 4, 0, Clubs, false}
ThreeClubs = Card{THREE_CLUBS, 3, 0, Clubs, false}
TwoClubs = Card{TWO_CLUBS, 2, 0, Clubs, false}
QueenClubs = Card{QUEEN_CLUBS, 12, 0, Clubs, false}
KingClubs = Card{KING_CLUBS, 13, 0, Clubs, false}
AceClubs = Card{ACE_CLUBS, 1, 0, Clubs, false}
JackClubs = Card{JACK_CLUBS, 11, 0, Clubs, true}
FiveClubs = Card{FIVE_CLUBS, 5, 0, Clubs, true}
TenSpades = Card{TEN_SPADES, 10, 0, Spades, false}
NineSpades = Card{NINE_SPADES, 9, 0, Spades, false}
EightSpades = Card{EIGHT_SPADES, 8, 0, Spades, false}
SevenSpades = Card{SEVEN_SPADES, 7, 0, Spades, false}
SixSpades = Card{SIX_SPADES, 6, 0, Spades, false}
FourSpades = Card{FOUR_SPADES, 4, 0, Spades, false}
ThreeSpades = Card{THREE_SPADES, 3, 0, Spades, false}
TwoSpades = Card{TWO_SPADES, 2, 0, Spades, false}
QueenSpades = Card{QUEEN_SPADES, 12, 0, Spades, false}
KingSpades = Card{KING_SPADES, 13, 0, Spades, false}
AceSpades = Card{ACE_SPADES, 1, 0, Spades, false}
JackSpades = Card{JACK_SPADES, 11, 0, Spades, true}
FiveSpades = Card{FIVE_SPADES, 5, 0, Spades, true}
Joker = Card{JOKER, 0, 0, Wild, true}
)

func (c Card) String() string {
return string(c.NAME)
return string(c.Name)
}
60 changes: 58 additions & 2 deletions pkg/game/game-handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ func (h *Handler) Delete(c *gin.Context) {
// @Security Bearer
// @Param gameId path string true "Game ID"
// @Param call query int true "Call"
// @Success 200 {object} Game
// @Success 200 {object} State
// @Failure 400 {object} api.ErrorResponse
// @Failure 500 {object} api.ErrorResponse
// @Router /game/{gameId}/call [put]
Expand Down Expand Up @@ -261,6 +261,62 @@ func (h *Handler) Call(c *gin.Context) {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
state, err := game.GetState(id)
if err != nil {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
c.IndentedJSON(http.StatusOK, state)
}

c.IndentedJSON(http.StatusOK, game)
type SelectSuitRequest struct {
Suit Suit `json:"suit"`
Cards []CardName `json:"cards"`
}

// SelectSuit @Summary Select the suit
// @Description When in the Called state, the Goer can select the suit and what cards they want to keep from their hand and the dummy hand
// @Tags Game
// @ID select-suit
// @Produce json
// @Security Bearer
// @Param gameId path string true "Game ID"
// @Para body SelectSuitRequest true "Select Suit Request"
// @Success 200 {object} State
// @Failure 400 {object} api.ErrorResponse
// @Failure 500 {object} api.ErrorResponse
// @Router /game/{gameId}/suit [put]
func (h *Handler) SelectSuit(c *gin.Context) {
// Check the user is correctly authenticated
id, ok := auth.CheckValidated(c)
if !ok {
return
}

// Get the context from the request
ctx := c.Request.Context()

// Get the game ID from the request
gameId := c.Param("gameId")

// Get the request body
var req SelectSuitRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, api.ErrorResponse{Message: err.Error()})
return
}

// Select the suit
game, err := h.S.SelectSuit(ctx, gameId, id, req.Suit, req.Cards)

if err != nil {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
state, err := game.GetState(id)
if err != nil {
c.JSON(http.StatusInternalServerError, api.ErrorResponse{Message: err.Error()})
return
}
c.IndentedJSON(http.StatusOK, state)
}
Loading
Loading