初始化项目文件
This commit is contained in:
313
api_iris/service/api/backgammon.go
Normal file
313
api_iris/service/api/backgammon.go
Normal file
@ -0,0 +1,313 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user