首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现一个简单的抢红包的单机控制台游戏

实现一个简单的抢红包的单机控制台游戏

作者头像
暮雨
发布2019-08-21 10:20:47
3270
发布2019-08-21 10:20:47
举报
文章被收录于专栏:云端漫步云端漫步

网看有看到微信红包的分配算法,二倍均值法,就简单的实现了一个简单的版本

红包随机算法

二倍均值法

设:人数:remainCount 剩余金额:remainMoney 红包随机金额范围为[1, remainMoney/remainCount*2] 最后一个红包金额为remainMoney

程序功能设计

  1. 设定抢红包的人数和金额
  2. 红包的分配算法实现
  3. 输入姓名实现抢红包(输入相同的姓名,不进行红包分配)
  4. 抢红包的数据存储

程序实现

package main

import (
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "time"
)

func main() {
    // 声明初始化cache
    cache := Cache{}

    // 设置红包
    remainCnt, remainMoney := setPacket()

    // 元---> 分
    remainMoney = remainMoney * 100

    for {
        // 输入姓名
        rName := Input()

        // 判读是否已抢
        if val, ok := cache.Get(rName); ok {
            fmt.Printf("你已抢到了%.2f元\n", float32(val)/100)
            continue
        }

        // 分配红包
        rMoney := randPacket(remainCnt, remainMoney)
        fmt.Printf("恭喜你%s,抢到了%.2f元\n", rName, float32(rMoney)/100)

        // 数据存储
        cache.Set(rName, rMoney)

        if remainCnt == 1 {
            fmt.Println("红包被抢完了")
            break
        }

        remainCnt--
        remainMoney -= rMoney
    }
}

// cache
type Cache map[string]int

// get
func (c Cache) Get(key string) (int, bool) {
    if val, ok := c[key]; ok {
        return val, ok
    }

    return 0, false
}

// set
func (c Cache) Set(key string, val int) {
    c[key] = val
}

func setPacket() (count, money int) {
    args := os.Args[1:]
    sName := ""

    if len(args) == 0 {
        fmt.Printf("请输入发红包人姓名:")
        fmt.Scanln(&sName)

        fmt.Printf("请输入红包人数:")
        fmt.Scanln(&count)

        fmt.Printf("请输入红包金额(元):")
        fmt.Scanln(&money)
    } else {
        sName = args[0]
        count, _ = strconv.Atoi(args[1])
        money, _ = strconv.Atoi(args[2])
    }
    fmt.Printf("%s发送了%d元红包, 开始抢红包。。。\n", sName, money)
    fmt.Println("================华丽的分割线========================")

    return count, money
}

func Input() string {
    var name string
    fmt.Printf("输入姓名抢红包:")
    fmt.Scanln(&name)

    return name
}

func randPacket(remainCnt, remainMoney int) int {
    if remainCnt == 1 {
        return remainMoney
    }

    rand.Seed(time.Now().UnixNano())
    min := 1
    max := remainMoney / remainCnt * 2
    money := min + rand.Intn(max-min)

    return money
}

总结

第一个问题:注意分配的单位是按分进行计算,这样保证随机在整数范围内随机 第二个问题:数据存储,这里简单的使用了map做数据的存储,这是一种内存性存储,程序运行完就释放了,那么怎么将数据持久化储存呢?我们常用的方案是DB或本地文件。在后续的文章中,将对数据持久化作为一个专题进行展开,并实现一个简单的本地DB进行数据的存储。第三个问题:这一版主要为了展示红包的分配算法,没有实现网络通信,在第二版中,将在此基础上进行扩展,实现网络通信,先基于socket实现网路通信。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云端漫记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 红包随机算法
  • 程序功能设计
  • 程序实现
  • 总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档