resign 认输
(groupCode, senderUin int64)
| 109 | |
| 110 | // resign 认输 |
| 111 | func resign(groupCode, senderUin int64) (msg message.Message, err error) { |
| 112 | msg = message.Message{message.At(senderUin)} |
| 113 | // 检查对局是否存在 |
| 114 | room, ok := chessRoomMap.Load(groupCode) |
| 115 | if !ok { |
| 116 | return nil, errNotExist |
| 117 | } |
| 118 | // 检查是否是当前游戏玩家 |
| 119 | if senderUin != room.whitePlayer && senderUin != room.blackPlayer { |
| 120 | return |
| 121 | } |
| 122 | // 如果对局未建立, 中断对局 |
| 123 | if room.whitePlayer == 0 || room.blackPlayer == 0 { |
| 124 | chessRoomMap.Delete(groupCode) |
| 125 | msg = append(msg, message.Text("对局结束")) |
| 126 | return |
| 127 | } |
| 128 | // 计算认输方 |
| 129 | var resignColor chess.Color |
| 130 | if senderUin == room.whitePlayer { |
| 131 | resignColor = chess.White |
| 132 | } else { |
| 133 | resignColor = chess.Black |
| 134 | } |
| 135 | if isAprilFoolsDay() { |
| 136 | if resignColor == chess.White { |
| 137 | resignColor = chess.Black |
| 138 | } else { |
| 139 | resignColor = chess.White |
| 140 | } |
| 141 | } |
| 142 | room.chessGame.Resign(resignColor) |
| 143 | chessString := getChessString(*room) |
| 144 | eloString := "" |
| 145 | if len(room.chessGame.Moves()) > 4 { |
| 146 | // 若走子次数超过 4 认为是有效对局, 存入数据库 |
| 147 | dbService := newDBService() |
| 148 | if err = dbService.createPGN(chessString, room.whitePlayer, room.blackPlayer, room.whiteName, room.blackName); err != nil { |
| 149 | return |
| 150 | } |
| 151 | whiteScore, blackScore := 1.0, 1.0 |
| 152 | if resignColor == chess.White { |
| 153 | whiteScore = 0.0 |
| 154 | } else { |
| 155 | blackScore = 0.0 |
| 156 | } |
| 157 | eloString, err = getELOString(*room, whiteScore, blackScore) |
| 158 | if err != nil { |
| 159 | return |
| 160 | } |
| 161 | } |
| 162 | msg = append(msg, message.Text("认输, 游戏结束。\n", eloString, chessString)) |
| 163 | if isAprilFoolsDay() { |
| 164 | msg = append(msg, message.Text("对手认输, 游戏结束, 你胜利了。\n", eloString, chessString)) |
| 165 | } |
| 166 | chessRoomMap.Delete(groupCode) |
| 167 | return |
| 168 | } |
no test coverage detected