Golang语言社区彬哥Go语言笔记Go语言网络课程更新专栏

ByteEdu教育平台会员抽奖小工具v1.0.1

2019-05-10  本文已影响2人  Golang语言社区

| * * *
github代码: https://github.com/Golangltd/codeclass/tree/master/ByteEdu.Com |

image image image image

Rand.go:

package main

import (
        "math/rand"
        "time"
)

/*
   作者:彬哥
   来自:LollipopGo游戏服务器架构
*/

func init() {
        rand.Seed(time.Now().UnixNano())
}

func RandGroup_LollipopGo(p ...uint32) int {
        if p == nil {
                panic("args not found")
        }

        r := make([]uint32, len(p))
        for i := 0; i < len(p); i++ {
                if i == 0 {
                        r[0] = p[0]
                } else {
                        r[i] = r[i-1] + p[i]
                }
        }

        rl := r[len(r)-1]
        if rl == 0 {
                return 0
        }

        rn := uint32(rand.Int63n(int64(rl)))
        for i := 0; i < len(r); i++ {
                if rn < r[i] {
                        return i
                }
        }

        panic("bug")
}

func RandInterval_LollipopGo(b1, b2 int32) int32 {
        if b1 == b2 {
                return b1
        }

        min, max := int64(b1), int64(b2)
        if min > max {
                min, max = max, min
        }
        return int32(rand.Int63n(max-min+1) + min)
}

func RandIntervalN_LollipopGo(b1, b2 int32, n uint32) []int32 {
        if b1 == b2 {
                return []int32{b1}
        }

        min, max := int64(b1), int64(b2)
        if min > max {
                min, max = max, min
        }
        l := max - min + 1
        if int64(n) > l {
                n = uint32(l)
        }

        r := make([]int32, n)
        m := make(map[int32]int32)
        for i := uint32(0); i < n; i++ {
                v := int32(rand.Int63n(l) + min)

                if mv, ok := m[v]; ok {
                        r[i] = mv
                } else {
                        r[i] = v
                }

                lv := int32(l - 1 + min)
                if v != lv {
                        if mv, ok := m[lv]; ok {
                                m[v] = mv
                        } else {
                                m[v] = lv
                        }
                }

                l--
        }

        return r
}

WriteFile.go:

package main

import (
        "fmt"
        "os"
)

/*
   作者:彬哥
   来自:LollipopGo游戏服务器架构
*/

func WriteFileData(data string) {

        f, err := os.OpenFile("ByteEdu.txt", os.O_APPEND|os.O_WRONLY, 0644)
        if err != nil {
                fmt.Println(err)
                f.Close()
                return
        }
        fmt.Fprintln(f, data)

        err = f.Close()
        if err != nil {
                fmt.Println(err)
                return
        }
}

tmain.go:

package main

import (
        "bufio"
        "fmt"
        "os"
        "strconv"
        "strings"
)

/*
  Go语言控制台抽奖
  1. 抽奖人,读取配置文件(CSV)
  2. 随机方法,随机数
  3. 中奖人信息写入文件
*/

func init() {

}

func main() {
        reader := bufio.NewReader(os.Stdin)
        fmt.Println("--= www.ByteEdu.Com =--")
        fmt.Println("--------活动抽奖--------")
        fmt.Println("输入规则:")
        fmt.Println("A|1:  A表示一等奖,1表示数量")
        fmt.Println("B|2:  B表示二等奖,2表示数量")
        fmt.Println("C|3:  C表示三等奖,3表示数量")
        fmt.Println("注:  数量可以变化,例如A|12等")

        tmpmap := make(map[int]int)
        for {
                fmt.Print("-> ")
                text, _ := reader.ReadString('\n')
                text = strings.Replace(text, "\r\n", "", -1)
                // 截取字符
                data := strings.Split(text, "|")
                if len(data) != 2 {
                        fmt.Print("输入错误!")
                        continue
                }
                // 获取随机数
                count, errrr := strconv.Atoi(data[1])
                if errrr != nil {
                        fmt.Println(errrr)
                        return
                }
                if count >= len(G_ByteEdu) {
                        fmt.Println("全体中奖!,本轮抽奖结束!")
                        return
                }
                var icount []int
                for iBINGE := 0; iBINGE < int(count); iBINGE++ {
                        ii := RandInterval_LollipopGo(0, int32(len(G_ByteEdu)))
                        icount = append(icount, int(ii))
                }
                if len(icount) == 0 {
                        fmt.Println("抽奖名单为空,请检查抽奖名单!,抽奖结束!")
                        return
                }
                switch data[0] {
                case "A":
                        {
                                fmt.Println("抽取一等奖!")
                                for i, v := range icount {
                                        fmt.Println(i, v)
                                        _, ok := tmpmap[v]
                                        if !ok {
                                                msg := "恭喜:" + G_ByteEdu[v].Name + ",获得一等奖!"
                                                fmt.Println(msg)
                                                tmpmap[v] = v
                                                WriteFileData(msg)
                                        } else {
                                                fmt.Println("很遗憾,无人中奖!")
                                        }
                                }
                        }
                case "B":
                        {
                                fmt.Println("抽取二等奖!")
                                for i, v := range icount {
                                        fmt.Println(i, v)
                                        _, ok := tmpmap[v]
                                        if !ok {
                                                fmt.Println("恭喜:" + G_ByteEdu[v].Name + ",获得二等奖!")
                                                tmpmap[v] = v
                                        } else {
                                                fmt.Println("很遗憾,无人中奖!")
                                        }
                                }
                        }
                case "C":
                        {
                                fmt.Println("抽取三等奖!")
                                for i, v := range icount {
                                        fmt.Println(i, v)
                                        _, ok := tmpmap[v]
                                        if !ok {
                                                fmt.Println("恭喜:" + G_ByteEdu[v].Name + ",获得三等奖!")
                                                tmpmap[v] = v
                                        } else {
                                                fmt.Println("很遗憾,无人中奖!")
                                        }
                                }
                        }
                default:
                        fmt.Println("没有中奖!")
                }
        }
}

上一篇 下一篇

猜你喜欢

热点阅读