case 6:
MoveQueue = append(MoveQueue, GetPlayerMoveDistance(currentPos, GoSpaceID))
case 7:
- // TODO: GET OUT OF JAIL FREE
+ Users[visitorID].GetOutOfJailCards++
case 8:
MoveQueue = append(MoveQueue, GetPlayerMoveDistance(currentPos, BoardwalkSpaceID))
case 9:
case 13:
InJailVisitors = append(InJailVisitors, InJailVisitor{visitorID: visitorID, turns: DEFAULT_JAIL_TURNS})
case 14:
- // TODO: GET OUT OF JAIL FREE
+ Users[visitorID].GetOutOfJailCards++
case 15:
AdjustPlayerMoney(visitorID, 10)
}
return true
}
+func ValidateCanExitJail(UUID string) bool {
+ for _, iJV := range InJailVisitors {
+ player := Users[iJV.visitorID]
+ if Users[TurnPlayerID].UUID == UUID && player.UUID == UUID {
+ return true
+ }
+ }
+ return false
+}
+
func ProcessLanding() {
ProcessGo()
ProcessTax()
package game
+import (
+ "errors"
+)
+
const DEFAULT_JAIL_TURNS int32 = 3
+const JAIL_BUYOUT_COST int32 = 50
func RemovePlayerFromJail(playerID int32) {
for i, iJV := range InJailVisitors {
}
}
+ MoveablePlayers = append(MoveablePlayers, playerID)
}
func RemovePlayerFromMoveable(pID int32) {
if turns <= 0 {
RemovePlayerFromJail(visitorID)
- MoveablePlayers = append(MoveablePlayers, visitorID)
} else {
RemovePlayerFromMoveable(visitorID)
}
}
}
+
+var ErrNotEnoughJailCards = errors.New("Cannot use jail card: player does not have enough get out of jail free cards")
+var ErrNotEnoughMoney = errors.New("Cannot execute action: player does not have enough money")
+
+func JailUseCard() error {
+ if Users[TurnPlayerID].GetOutOfJailCards > 0 {
+ RemovePlayerFromJail(TurnPlayerID)
+ Users[TurnPlayerID].GetOutOfJailCards -= 1
+ return nil
+
+ } else {
+ return ErrNotEnoughJailCards
+ }
+}
+
+func JailBuyout() error {
+ if Users[TurnPlayerID].Money >= JAIL_BUYOUT_COST {
+ RemovePlayerFromJail(TurnPlayerID)
+ AdjustPlayerMoney(TurnPlayerID, -JAIL_BUYOUT_COST)
+ return nil
+ } else {
+ return ErrNotEnoughMoney
+ }
+}
func ProcessMovement() {
for i, playerID := range MoveablePlayers {
if playerID == TurnPlayerID {
-
// Movement
for {
// condition to stop moving
package game
type User struct {
- UUID string
- Money int32
- CurrentSpaceID int32
+ UUID string
+ Money int32
+ CurrentSpaceID int32
+ GetOutOfJailCards int32
}
type PropertyType int
func main() {
fmt.Println("monopoly-web backend")
- game.Users = append(game.Users, game.User{UUID: "abc", Money: 100, CurrentSpaceID: 0})
+ game.Users = append(game.Users, game.User{UUID: "abc", Money: 100, CurrentSpaceID: 0, GetOutOfJailCards: 0})
fmt.Println(game.Users)
// register routes
http.HandleFunc("/health", healthHandler)
http.HandleFunc("/api/v1/roll", rollDiceHandler)
http.HandleFunc("POST /api/v1/turn", endTurnHandler)
+ http.HandleFunc("POST /api/v1/exit-jail", exitJailHandler)
// listen and serve
log.Fatal(http.ListenAndServe(":8080", nil))
game.EndTurn()
}
}
+
+func exitJailHandler(w http.ResponseWriter, req *http.Request) {
+ err := req.ParseForm()
+ if err != nil {
+ http.Error(w, "Bad Request: Failed to parse form data", http.StatusBadRequest)
+ return
+ }
+
+ if !game.ValidateCanExitJail(UUID) {
+ w.WriteHeader(http.StatusForbidden)
+ w.Write([]byte(`{"status": "forbidden", "message": "Not your turn or not in jail"}`))
+ }
+
+ method := req.PostForm.Get("method")
+
+ switch method {
+ case "buyout":
+ err = game.JailBuyout()
+ if err == game.ErrNotEnoughMoney {
+ http.Error(w, "error: Insufficient funds", http.StatusUnprocessableEntity)
+ }
+
+ case "jail_free_card":
+ err = game.JailUseCard()
+ if err == game.ErrNotEnoughJailCards {
+ http.Error(w, "error: Insufficient jail cards", http.StatusUnprocessableEntity)
+ }
+ default:
+ w.WriteHeader(http.StatusBadRequest)
+ w.Write([]byte(`{"status": "bad req", "message": "escape jail method does not exist"}`))
+ return
+ }
+
+ w.WriteHeader(http.StatusOK)
+ w.Write([]byte(`{"status": "success", "message": "Action processed"}`))
+}
+++ /dev/null
-package game
-
-type User struct {
- UUID string
- Money int32
-}
-
-type PropertyType int
-
-const (
- TypeGo PropertyType = iota
- TypeColor
- TypeChest
- TypeTax
- TypeRailroad
- TypeChance
- TypeJail
- TypeUtility
- TypeParking
- TypePolice
-)