golang 斗地主

dwg255 · 2019-04-19 13:00:02 · 2483 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-04-19 13:00:02 的文章,其中的信息可能已经有所发展或是发生改变。

项目地址:

https://github.com/dwg255/landlord

说明:go modules管理依赖包,执行编译自动下载依赖;使用sqlite数据库,无需配置;自带无脑出牌AI;服务端经过压力测试,客户端代码来自https://github.com/mailgyc/doudizhu ,原版服务端用python tornado开发。golang开发的服务端编程简单,执行高效,有效利用多核资源,游戏server端为golang典型的应用场景之一。项目大量使用goroutine及channel,命名及注释清晰。

主要依赖包:

  • github.com/astaxie/beego 主要用到其logs包,监听http端口及处理请求使用golang自带的包 net/http
  • github.com/mattn/go-sqlite3 持久化数据使用了sqlite,省去配置mysql及见表的操作
  • github.com/gorilla/websocket websocket连接及收发消息

项目目录说明:

  • common 公共包,*包含全局配置、生成全部牌型的方法、计算牌型以及客户端协议常量*
    • config .go 全局配置
    • generate.go 生成json格式所有牌型
    • model.go
    • poker.go
    • protocol.go
    • rule.go
  • conf 配置文件目录 *监听的端口、日志级别、日志路径、存储路径等*
  • controllers 控制器目录 *处理http请求*
    • Index .go
    • LogiN.go
    • LogoUt.go
    • RegiSter.go
  • db 数据目录 *sqlite数据目录*
  • logs 日志文件目录
  • main 项目入口 *初始化配置、启动服务*
    • config.go 初始化全局配置
    • init.go
    • main.go 启动服务,监听端口
  • pid
  • roter 路由目录
    • router.go
  • service 逻辑目录 *处理开局、出牌、加入机器人、输赢判断等*
    • client.go 处理客户端请求,启动协程处理客户端请求
    • request.go
    • robot.go 机器人
    • room.go 房间
    • table.go
  • static 静态文件目录
  • templates 模板文件目录
  • go.mod
  • go.sum
  • LICENSE
  • main.exe windows 64位系统下的可执行文件
  • README.MD
  • rule.json 生成的所有牌型文件
func init() {      //生成pid文件,保存pid
    pidFileName := "pid"
    fileInfo, err := os.Stat(pidFileName)
    if err != nil {
        if os.IsNotExist(err) {
            err = os.Mkdir(pidFileName, os.ModePerm)
            fileInfo, _ = os.Stat(pidFileName)
        }
    }
    if fileInfo.IsDir() {
        pid := os.Getpid()
        pidFile, err := os.OpenFile(pidFileName+"/landlord.pid", os.O_RDWR|os.O_CREATE, 0766)
        if err != nil {
            logs.Error("open pidFile [%s] error :%v", pidFileName, err)
            return
        }
        err = pidFile.Truncate(0)  //清空数据

        _, err = io.WriteString(pidFile, strconv.Itoa(pid))
        if err != nil {
            logs.Error("write pid error :%v", err)
        }

        err = pidFile.Close()
        if err != nil {
            logs.Error("close pid file err: %v", err)
        }
    } else {
        logs.Error("pidFile [%s] is exists and not dir", pidFileName)
    }
}

更多代码详见 GitHub -service -room.go 文件内包含压测代码,压测5000个房间CPU平均占有率30%-50%,内存200M左右。

运行步骤:

1.下载源码:

git clone https://github.com/dwg255/landlord.git

2.编译:

cd landlord/main
go build -o ../main.exe
cd ..
main.exe

3.启动: 浏览器访问 http://localhost

4.效果展示: http://blzz.shop

5.运行截图:


License

This project is released under the terms of the MIT license. See LICENSE for more information or see https://opensource.org/licenses/MIT.



有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2483 次点击  ∙  1 赞  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传