package api import ( "errors" "github.com/kataras/iris/v12" "github.com/sirupsen/logrus" "main/database" "main/model" "main/utils" "strconv" "strings" ) // 初始化新棋盘 var cols = 15 func getRooms(ctx iris.Context) { db := database.GetInstance().GetMysqlDb() var rooms []typeRoomStatus if err := db.Model(&model.BackgammonRoom{}).Distinct("room_id").Order("room_id").Scan(&rooms).Error; err != nil { logrus.Errorln("sql执行失败:", err) } for k, v := range rooms { roomStatus, err := getRoomStatus(v.RoomId) if utils.ErrHandle(ctx, err) { return } rooms[k].Player = roomStatus.Player } err := ctx.JSON(utils.FormatRes(iris.StatusOK, "", rooms)) if utils.ErrHandle(ctx, err) { return } } // 删除房间 func delRoom(ctx iris.Context) { username := utils.GetLoginUser(ctx) if utils.DataIsNil(username) { return } id, err := strconv.Atoi(ctx.Params().Get("id")) if utils.ErrHandle(ctx, err) { return } roomStatus, err := getRoomStatus(id) if utils.ErrHandle(ctx, err) { return } db := database.GetInstance().GetMysqlDb() if roomStatus.Player == username.Username { if err1 := db.Where("room_id = ?", id).Delete(&model.BackgammonRoom{}).Error; err1 != nil { logrus.Errorln("sql执行失败:", err1) } } else if strings.Split(roomStatus.Player, ",")[0] == username.Username { if err1 := db.Create(&model.BackgammonRoom{ RoomId: roomStatus.RoomId, Player: strings.Split(roomStatus.Player, ",")[1], Winner: "", Current: strings.Split(roomStatus.Player, ",")[1], PawnStatus: initPawns(), }).Error; err1 != nil { logrus.Errorln("sql执行失败:", err1) } } else if strings.Split(roomStatus.Player, ",")[1] == username.Username { if err1 := db.Create(&model.BackgammonRoom{ RoomId: roomStatus.RoomId, Player: strings.Split(roomStatus.Player, ",")[0], Winner: "", Current: strings.Split(roomStatus.Player, ",")[0], PawnStatus: initPawns(), }).Error; err1 != nil { logrus.Errorln("sql执行失败:", err1) } } err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", "success")) if utils.ErrHandle(ctx, err) { return } } func initPawns() string { var newPawns string for i := 0; i < cols; i++ { tmp := "0" + strings.Repeat(",0", cols-1) if i == 0 { newPawns = tmp continue } newPawns += ";" + tmp } return newPawns } // 新建房间 func addRoom(ctx iris.Context) { username := utils.GetLoginUser(ctx) if utils.DataIsNil(username) { return } var currentStatus model.BackgammonRoom db := database.GetInstance().GetMysqlDb() if err := db.Order("room_id desc").First(¤tStatus).Error; err != nil { logrus.Errorln("sql执行失败:", err) } newPawns := initPawns() if err := db.Create(&model.BackgammonRoom{ RoomId: currentStatus.RoomId + 1, Player: username.Username, Current: username.Username, Winner: "", PawnStatus: newPawns, }).Error; err != nil { logrus.Errorln("sql执行失败:", err) } err := ctx.JSON(utils.FormatRes(iris.StatusOK, "", currentStatus.RoomId+1)) if utils.ErrHandle(ctx, err) { return } } func joinRoom(ctx iris.Context) { username := utils.GetLoginUser(ctx) if utils.DataIsNil(username) { return } id, err := strconv.Atoi(ctx.Params().Get("id")) if utils.ErrHandle(ctx, err) { return } roomStatus, err := getRoomStatus(id) if utils.ErrHandle(ctx, err) { return } if utils.CheckListItem(strings.Split(roomStatus.Player, ","), username.Username) { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("无法重复加入房间")) return } if !utils.CheckListItem(strings.Split(roomStatus.Player, ","), username.Username) && len(strings.Split(roomStatus.Player, ",")) > 2 { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("房间人数已满")) return } roomStatus.Player = roomStatus.Player + "," + username.Username db := database.GetInstance().GetMysqlDb() if err1 := db.Model(&model.BackgammonRoom{}).Where("id = ?", roomStatus.ID).Updates(&roomStatus).Error; err1 != nil { logrus.Errorln("sql执行失败:", err1) } err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", "success")) if utils.ErrHandle(ctx, err) { return } } func getRoomStatus(roomId int) (model.BackgammonRoom, error) { var status model.BackgammonRoom db := database.GetInstance().GetMysqlDb() if err := db.Where("room_id = ?", roomId).Order("id desc").First(&status).Error; err != nil { logrus.Errorln("sql执行失败:", err) } if utils.DataIsNil(status) { return model.BackgammonRoom{}, errors.New("房间号不存在") } return status, nil } // 获取房间棋盘状态 func getStatus(ctx iris.Context) { id, err := strconv.Atoi(ctx.Params().Get("id")) if utils.ErrHandle(ctx, err) { return } roomStatus, err := getRoomStatus(id) if utils.ErrHandle(ctx, err) { return } err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", roomStatus)) if utils.ErrHandle(ctx, err) { return } } // 新增棋子 func addPawn(ctx iris.Context) { username := utils.GetLoginUser(ctx) if utils.DataIsNil(username) { return } id, err := strconv.Atoi(ctx.Params().Get("id")) if utils.ErrHandle(ctx, err) { return } roomStatus, err := getRoomStatus(id) if utils.ErrHandle(ctx, err) { return } var tmpT string if roomStatus.Winner != "" { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("对局已结束")) return } if len(strings.Split(roomStatus.Player, ",")) != 2 { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("当前房间,玩家人数不足")) return } if roomStatus.Current != username.Username { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("现在不是你的回合")) return } if strings.Split(roomStatus.Player, ",")[0] == username.Username { tmpT = "1" } else if strings.Split(roomStatus.Player, ",")[1] == username.Username { tmpT = "-1" } else { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("非玩家,无法进行游戏")) return } place := strings.Split(ctx.URLParam("place"), ",") var newPawn []int for _, i := range place { tmp, _ := strconv.Atoi(i) newPawn = append(newPawn, tmp) } var pawnStatus [][]string for _, i := range strings.Split(roomStatus.PawnStatus, ";") { var tmp []string for _, j := range strings.Split(i, ",") { tmp = append(tmp, j) } pawnStatus = append(pawnStatus, tmp) } if pawnStatus[newPawn[0]][newPawn[1]] != "0" { ctx.StatusCode(iris.StatusBadRequest) ctx.SetErr(errors.New("该位置已有棋子")) return } winner := getWinner(pawnStatus, tmpT, [2]int{newPawn[0], newPawn[1]}) if winner { roomStatus.Winner = username.Username } pawnStatus[newPawn[0]][newPawn[1]] = tmpT var tmp []string for _, i := range pawnStatus { tmp = append(tmp, strings.Join(i, ",")) } roomStatus.PawnStatus = strings.Join(tmp, ";") roomStatus.Current = strings.Replace(strings.Replace(roomStatus.Player, username.Username, "", 1), ",", "", 1) db := database.GetInstance().GetMysqlDb() if err1 := db.Create(&model.BackgammonRoom{ RoomId: roomStatus.RoomId, Player: roomStatus.Player, Winner: roomStatus.Winner, Current: roomStatus.Current, PawnStatus: roomStatus.PawnStatus, }).Error; err1 != nil { logrus.Errorln("sql执行失败:", err1) } err = ctx.JSON(utils.FormatRes(iris.StatusOK, "", roomStatus)) if utils.ErrHandle(ctx, err) { return } } // 判断当前是否存在winner func getWinner(pawns [][]string, t string, pawn [2]int) bool { pawnAround := [8][2]int{{pawn[0] - 1, pawn[1] - 1}, {pawn[0], pawn[1] - 1}, {pawn[0] + 1, pawn[1] - 1}, {pawn[0] - 1, pawn[1]}, {pawn[0] + 1, pawn[1]}, {pawn[0] - 1, pawn[1] + 1}, {pawn[0], pawn[1] + 1}, {pawn[0] + 1, pawn[1] + 1}} around := [8]int{0, 0, 0, 0, 0, 0, 0, 0} for i, p := range pawnAround { if p[0] >= 0 && p[1] >= 0 && p[0] < cols && p[1] < cols && pawns[p[0]][p[1]] == t { current := [2]int{p[0], p[1]} for j := 0; j < 3; j++ { switch i { case 0: current[0]-- current[1]-- case 1: current[1]-- case 2: current[0]++ current[1]-- case 3: current[0]-- case 4: current[0]++ case 5: current[0]-- current[1]++ case 6: current[1]++ case 7: current[0]++ current[1]++ } //fmt.Println(current) if current[0] < 0 || current[0] > cols-1 || current[1] < 0 || current[1] > cols-1 || pawns[current[0]][current[1]] != t { around[i] = j + 1 break } around[i] = j + 2 } } } if around[0]+around[7] >= 4 || around[1]+around[6] >= 4 || around[2]+around[5] >= 4 || around[3]+around[4] >= 4 { return true } return false }