当前位置 博文首页 > iR-Poke:day131:2RenMJ:2RenMJ游戏简介&部署MJ项目到本地

    iR-Poke:day131:2RenMJ:2RenMJ游戏简介&部署MJ项目到本地

    作者:iR-Poke 时间:2021-01-30 15:34

    目录

    1.游戏简介

      1.如何做出一款麻将游戏?

      2.麻将运行界面

      3.麻将项目所用技术快速概览

      4.web开发 / 游戏开发 / APP开发 比较

      5.firefly游戏框架介绍

    2.部署麻将项目到本地

      1.项目整体目录结构

      2.客户端本地安装部署

      3.游戏服务端本地安装部署

      4.web服务端本地安装部署+运行

      5.游戏服务端运行

      6.客户端运行

    1.游戏简介

    1.如何做出一款麻将游戏?

    ?2000年Python第?个稳定的2.7版本发布以来,Python"简单、明确、优雅"设计哲学的根本出发点就决定了Python这?语?的编程易?性和?作?效性。特别是近几年来,在游戏?业中传统的编程语?c++开发及维护成本极?的劣势逐渐凸显,同样的业务需求实现,可能传统编程语?c++程序猿需要1周,??个普通的Python程序猿可能三天就能完成,同时后续隐藏的bug还会少很多。于是在休闲、棋牌游戏领域,Python这??效的脚本语?开始逐渐流?起来

    作为棋牌游戏中复杂度最?的游戏,麻将游戏开发游戏逻辑复杂多变,据不完全统计,全国地?麻将的种类已经超过上千种,不同的地?麻将差异巨?,?如有的没有"万",有的没有"饼",有的存在"亮倒"等操作,胡牌的类型更是千变万化,?些胡牌类型甚?有些匪夷所思(如绿??:即?牌全是绿?的牌,?种东北地?麻将的?胡胡法)。

    2.麻将运行界面

    1.大厅界面

     

    2.牌局界面

    3.系统提示

    4.系统邮箱

    3.麻将项目所用技术快速概览

    python版本: 2.7

    game server( 游戏服务端 )

    目录:echecs/

    依赖:firefly游戏引擎 / 基于twisted框架研发而来的

    web service( web端 )

    目录:echecs_web_services/

    依赖:tornado5.1+rpc接口

    client(客户端):

    目录:tpmj_new/

    依赖:白鹭引擎 Egret 5.0

    4.web开发 / 游戏开发 / APP开发 比较

    在wiki上对Server的分类:

      Typical servers are database servers, fifile servers, mail servers, print servers, web servers, game

    servers, and application servers.

    其他?种Server我们都?较清楚了,跟unix差不多同时诞?。接下来我们主要针对web servers,game servers, and application servers进?简单介绍。

    1.web server

    典型例?是淘宝。

      特点:所有流程均由客户端发起,客户端发个请求,服务端返回个响应。?且,根据客户端访问的服

    务不同,客户端可以向不同的具体服务端节点发起请求。

    2.game server

    典型例?是王者荣耀。

      特点:有?个?眼能感觉到的连接握?的过程,建?连接后,流程有可能是服务端发起(?如给你

    展示周边玩家),也有可能是客户端发起(?如你移动了?下)。

      同时,如果你?边有抓包?具,可以看到,如果你选中了某个玩家,在该玩家的头像框消失之前,

    ?直是同?个场景服务器在跟你通信。

    3.app server

    典型例?是QQ。

      特点:介于Web Server和Game Server之间,看着像?个web服务器,但是?有游戏服务器的特

    点。

    4.三者的共同点??

    都是为客户端提供多种服务

    都需要连接会话的概念

    服务端的每台物理机服务多个客户端

    都具有分布式结构

    5.三者的不同点??

    a. 会话的存在形式:

    这?点是web服务端与游戏服务端最本质的区别。

      web服务端的客户端与客户端之间交互?常有限,因此,服务端可以将会话保存在外部存储服务,?如?些缓存中间件、?件系统中间件,然后等再?到的时候再拿出来就可以了。

      ?游戏服务端的客户端与客户端之间交互?常频繁,?如,同场景的其他玩家会不停做不规律移动,战?时?个技能就会对复数个玩家造成影响。

      这时如果将会话状态保存在外部,会造成频繁的状态存取,严重影响服务器吞吐量。因此对于游戏服务端来说,会话通常保存在进程内。

    b. 交互频率与数据流向:

    web服务端的频率低,?且数据的流动是由客户端驱动的,流向通常是客户端请求了,服务端才返回。

    ?游戏服务端的频率?,数据的流动?部分由客户端驱动,?部分由服务端驱动。流向除了服务端对客户端请求的响应,还有服务端的主动推送。

    c. 通信协议基础:

    web通信的基础在应?层是http/https/websocket协议。

    游戏通常会实现私有的序列化协议,可以简单理解为应?层定义协议包结构平铺成字节流或者是串?序列化字节流。如果要?持?定程度的协议版本兼容,会??进制json或者protobuf来实现协议序列化,但是通信协议本身是没有「基础」可?的,纯私有化协议,不具普适性,也没有必要定义成?种专?的协议。

    5.firefly游戏框架介绍

    Firefly是免费、开源、稳定、快速扩展、能 “热更新”的分布式游戏服务器端框架,采?Python编写,基于Twisted框架开发。

    在麻将游戏中,应?firefly框架后的游戏总体架构图如下:

    1.client: 客户端,即玩家?户,游戏中客户端和服务端之间的连接是?连接,客户端和服务端的proxy节

    点进?连接;

    2.proxy:服务端的代理节点,其主要任务是负责消息打包和解包,加解密,然后将合法的消息转发向后

    端节点。proxy节点地址对公?开发(客户端通过域名和端?连接);

    3.gate: 服务端的消息分发节点(?户节点)。该节点根据消息请求id将不同的消息分发到不同的?节点中

    进?处理,如?沙麻将分发到?沙麻将的游戏节点处理,?东麻将分发到?东麻将节点处理,该类型节

    点?般不对公?开放;

    游戏节点,各类型的游戏,如csmj(?沙麻将),gdmj(?东麻将), xzmj(?战)等。此类节点为游戏主逻辑

    节点。

    4.master:firefly框架中的管理节点,它负责管理所有的proxy,gate,游戏节点等,主要管理节点的加?

    和退出,不负责具体业务逻辑;

    5.DB模块:游戏中所有涉及到数据库的部分,各节点皆有可能操作。

    2.部署麻将项目到本地

    1.项目整体目录结构

    项目目录结构:
    Codes/
    ├── echecs/                # 游戏引擎服务端
    ├── echecs_web_services/   # 游戏web服务端
    ├── mj_client_new/         # 游戏web客户端[压缩,已打包]
    └── tpmj_new/              # 游戏web客户端[原生,未打包]

    2.客户端本地安装部署

    1.修改客户端的main.min.js修改参数

    文件内搜索:127.0.0.1:8889127.0.0.1:10000 替换成自己服务器的地址,注意:如果是本地部署,则不需要修改。

    2.安装的轻量级web开发服务器live-server,需要通过npm进行安装。如果是部署到线上,则需要更换成nginx即可。

    npm install -g live-server

    3.运行项目  

    切换终端的工作目录到mj_client_new/,执行命令:live-server

    live-server

    3.游戏服务端本地安装部署

    1.基于python2.7创建虚拟环境

    mkvirtualenv mahjong -p python2

    2.在虚拟环境中安装麻将项目的第三方依赖模块

    pip install -r requirements.txt -i https://pypi.douban.com/simple

    注意: 安装过程中,Mysql-Python模块在暗转过程中会因为Mysql-Client报错,解决办法如下:

    sudo apt-get install python-dev
    sudo apt-get install libmysqld-dev
    sudo apt-get install libmysqlclient-dev
    pip install MySQL-python

    3.通过PyCharm打开项目Codes并设置虚拟环境

    注意:Codes事实上并非真正的项目根目录,而是多个项目根目录的父级目录。所以我们需要在pycharm的终端下面运行多个项目。

    4.web服务端本地安装部署+运行

    1.给redis设置密码

    web服务端中设置了缓存服务器为redis,并且配置项中redis的密码为必填项。所以我们必须设置redis的密码。

    sudo vim /etc/redis/redis.conf
    # 把500行左右的配置项requirepass的注释打开,填写自己的密码,例如我这里是happy
    # requirepass xxxxxxxx
    
    # 保存并重启redis
    service redis restart

    将注释打开-->修改密码

    进入redis-cli确认密码添加成功

    2.在mysql中创建数据库

    web服务端中集成了SQLAlchemy ORM框架,所以我们必须在mysql中先创建数据库 twoperson_majdb

    create database twoperson_majdb charset=utf8;

    3.web服务端根目录: echecs_web_services的配置文件修改

    web项目配置,Codes/echecs_web_services/config.ini,代码:

    DEBUG=1
    REDIS_HOST="127.0.0.1"
    REDIS_PORT=6379
    REDIS_DB=10
    REDIS_PWD="libolun"
    
    # testA mysql   mysql://root:123456@192.168.1.73/twoperson_majdb?charset=utf8
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@127.0.0.1/twoperson_majdb?charset=utf8"
    
    
    #  增加本地redis 地址 For example: redis://[:password]@localhost:6379/0
    # REDIS_URL = 'redis://:123456abc@192.168.1.73:25001/1'
    
    # testA mysql   mysql://er_mj:123456@119.23.66.138/er_mjdb?charset=utf8
    # SQLALCHEMY_DATABASE_URI = "mysql://root:123456@39.108.10.161/twoperson_majdb?charset=utf8"
    #  增加本地redis 地址 For example: redis://[:password]@localhost:6379/0
    # REDIS_URL = 'redis://:happyeveryday@oldboy.iespoir.com:8379/1'
    REDIS_URL = 'redis://:libolun@127.0.0.1:6379/1'

    4.web服务端和游戏服务端进行通信的配置

    Codes/echecs_web_services/app/config/game_config.json

    {
      "game_server_config":{
        "host": "127.0.0.1",
        "port": "10000"
      },
      "income_support" : 4000,
      "get_income_support_interval": 300
    }

    5.运行web服务端(web-server)

    接下来,在pycharm终端下运行web项目

    cd echecs_web_services/
    python manage.py
    # 注意:因为我们已经把tornado集成了SQLAlchemy了,所以项目运行的时候,让它直接连接数据库并创建了数据库表了。

    运行完这步之后,你就会发现数据库中就多了很多张表了

    运行了项目以后,需要添加游戏相关配置的参数信息,在数据库中执行SQL语句,注意:添加数据成功以后要重新启动web端。否则会重现缓存问题。

    INSERT INTO `iw_room_cfg` (`created_date`, `modified_date`, `id`, `name`, `special_rule`, `min_enter_gold`, `min_play_gold`, `max_enter_gold`, `base_bet`, `service_charge`, `draw_card_time`, `min_hu_fan`, `max_hu_fan`, `recommend_pay_num`, `room_type`, `desc`) 
    VALUES 
    (NULL,NULL,1,'初级场','{}',1000,999,0,60,90,12,6,0,6,0,NULL),
    (NULL,NULL,2,'中级场','{\"pass_hu_double\":1}',10000,4000,0,150,220,12,10,0,6,1,NULL),
    (NULL,NULL,3,'高级场','{\"pass_hu_double\":1}',40000,20000,0,500,750,12,12,0,6,2,NULL);

    5.游戏服务端运行

    1.游戏服务端的相关配置

    Codes/echecs/config.json,代码:

    {
        "master":{
             "rootport":10010,
             "webport":10009,
             "log":"logs/masterlog.log"
        },
        "servers":{
              "proxy_1":{
                    "port": 10000,
                    "webport": 10001,
                    "name": "proxy_1",
                    "app": "proxy.start_up",
                    "remoteport":[
                      {"rootport": 11001, "rootname": "gate_1", "is_available":1},
                      {"rootport": 11003, "rootname": "gate_2"}
                    ]
              },
              "gate_1": {
                    "rootport":11001,
                    "webport":11002,
                    "name":"gate_1",
                    "app":"gate.start_up"
              },
              "gate_2": {
                    "rootport":11003,
                    "webport":11004,
                    "name":"gate_2",
                    "app":"gate.start_up"
              },
              "room_1":{
                    "rootport": 12001,
                    "webport":12002,
                    "name":"room_1",
                    "app":"game.start_up",
                    "remoteport":[
                      {"rootport": 11001, "rootname": "gate_1"},
                      {"rootport": 11003, "rootname": "gate_2"}
                    ]
              },
              "room_2":{
                    "rootport