()
| 16 | ) |
| 17 | |
| 18 | func init() { |
| 19 | // 注册游戏信息 |
| 20 | engine, gameManager, err := gamesystem.Register("猜硬币", &gamesystem.GameInfo{ |
| 21 | Command: "- 创建猜硬币\n" + |
| 22 | "- [加入|开始]游戏\n" + |
| 23 | "- 开始投币", |
| 24 | Help: "每个人宣言银币正面数量后,掷出参游人数的银币", |
| 25 | Rewards: "正面与宣言的数量相同的场合获得 正面数*10 ATRI币\n" + |
| 26 | "正面与宣言的数量相差2以内的场合获得 正面数*5 ATRI币\n" + |
| 27 | "其他的的场合失去 10 ATRI币", |
| 28 | }) |
| 29 | if err != nil { |
| 30 | panic(err) |
| 31 | } |
| 32 | engine.OnFullMatch("创建猜硬币", zero.OnlyGroup, func(ctx *zero.Ctx) bool { |
| 33 | err := gameManager.CreateRoom(ctx.Event.GroupID) |
| 34 | if err != nil { |
| 35 | ctx.SendChain(message.Text("[ERROR]:", err)) |
| 36 | return false |
| 37 | } |
| 38 | return true |
| 39 | }).SetBlock(true).Handle(func(ctx *zero.Ctx) { |
| 40 | // 结束后关闭房间 |
| 41 | defer gameManager.CloseRoom(ctx.Event.GroupID) |
| 42 | uid := ctx.Event.UserID |
| 43 | userScore := wallet.GetWalletOf(uid) |
| 44 | if userScore < 10 { |
| 45 | ctx.SendChain(message.Text("你的ATRI币不足以满足该游戏")) |
| 46 | return |
| 47 | } |
| 48 | // 等待对方响应 |
| 49 | ctx.SendChain(message.Text("你开启了猜硬币游戏。\n其他人可发送“加入游戏”加入游戏或你发送“开始游戏”开始游戏")) |
| 50 | recv, cancel := zero.NewFutureEvent("message", 999, false, zero.OnlyGroup, zero.FullMatchRule("加入游戏", "开始游戏"), zero.CheckGroup(ctx.Event.GroupID)).Repeat() |
| 51 | defer cancel() |
| 52 | answer := "" |
| 53 | var answerid int64 |
| 54 | var duel = make(map[int64]int, 2) |
| 55 | uidlist := []int64{uid} |
| 56 | duel[uid] = -1 |
| 57 | wait := time.NewTimer(120 * time.Second) |
| 58 | for { |
| 59 | select { |
| 60 | case <-wait.C: |
| 61 | ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, |
| 62 | message.Text("时间超时,游戏取消"))) |
| 63 | return |
| 64 | case c := <-recv: |
| 65 | answer = c.Event.Message.String() |
| 66 | answerid = c.Event.UserID |
| 67 | if answer == "加入游戏" { |
| 68 | _, ok := duel[answerid] |
| 69 | if ok { |
| 70 | ctx.Send(message.ReplyWithMessage(c.Event.MessageID, |
| 71 | message.Text("你已经加入了游戏"))) |
| 72 | } else { |
| 73 | challengScore := wallet.GetWalletOf(answerid) |
| 74 | if challengScore < 10 { |
| 75 | ctx.SendChain(message.Text("你的ATRI币不足以满足该游戏")) |
nothing calls this directly
no test coverage detected