python之在线PK游戏(第六天)

 

 本节作业:

       熟练使用类和模块,写一个交互性强、有冲突的程序。

       

故本次写了一个文字回合制的PK游戏,系统主程序为根目录下的:game_menu.py

 

1. 系统功能模块:

第六天的作业:文字游戏程序是在python3.4环境下开发,在python2.7环境下大同小异,主要功能模块如下图:

 python之在线PK游戏(第六天)

2. 系统目录结构:

程序采用分层的方式编写,包括系统配置conf、数据库访问层database、业务逻辑层modules,业务处理主程序game_menu.py,主要分类如下图:

 python之在线PK游戏(第六天)

3.应用知识点:

a) 类的使用

b) 文件的读写操作

c) 系统模块、自定义模块的操作

d) 日志模块的使用

 

4.程序流程图如下:

 python之在线PK游戏(第六天)

5.程序代码如下

5.1 主程序game_menu.py:

#_*_ coding=utf-8 _*_

'''
Created on 2016年3月15日
@author: 王凯
游戏主程序文件
'''

import os,sys,random,time
from datetime import date,datetime
from conf import setting,menu
from modules import common,role,skill,report
from database import dbapi

###角色属性和技能显示函数###
def role_skill_show():
    '''
    当主菜单选择1时,进行角色的属性和技能查看
    :return: 没有返回值
    '''
    show_flag = False
    while not show_flag:

        ###输出角色默认的菜单,有战士,弓箭手,法师###
        print(menu.role_default_menu.format(today, common.numtochr(weekoftoday)))

        ###选择角色的编号、分别调用战士,弓箭手,法师三个角色类###
        role_choose = common.input_msg_choose("请选择查看角色[1-3]: ", ["1", "2", "3","b"]).strip()
        if role_choose == '1':
            roleadj = role.zhanshi(role_choose)
        elif role_choose == '2':
            roleadj = role.gongjianshou(role_choose)
        elif role_choose == '3':
            roleadj = role.fashi(role_choose)
        else:
            show_flag = True
            continue

        ###输出角色的说明介绍及初始技能###
        common.show_message('角色说明如下:', "NOTICE")
        roleadj.role_instruction()

        ###输出角色的三个攻击技能###
        common.show_message('【%s】技能如下:' % (roleadj.role), "NOTICE")
        skill.skill(role_choose).print_skill_list()

###角色选择###
def choose_role(vs_type,role_choose,role_list):
    """
    角色选择函数
    :param vs_type 指定是挑战方,还是应战方
    :param role_choose: 角色选择输入的字符
    :return:role_list 角色名字,角色,角色的血量,角色名字列表
    """

    role_info = {}
    ###判断输入值是否为b,如果是则退出###
    if role_choose == "b":
        sys.exit()
    else:
        ###角色名字列表赋值###
        name_list = role_list[role_choose]
        ###角色类的实例化###
        roleadj = role.role(role_choose)

        ###选择角色各自的名字
        vs_name = common.input_msg_choose("请选择%s名字%s : " % (vs_type,name_list), name_list).strip()

        ###角色初始技能是否开启###
        init_skill_info = (roleadj.init_skill,roleadj.init_chance_rate,roleadj.init_harm_rate)
        init_skill_flag = common.input_msg_choose("初始技能【%s : %s%% 机率减少伤害 %s%%】,是否开启(y/n)" % init_skill_info, ['y','n']).strip()
        ###调用role类中的初始技能开关函数###
        init_skill_result = roleadj.init_skill_choose(init_skill_flag)
        if init_skill_result:
            common.show_message('已正常开启初始技能【%s : %s%% 机率减少伤害 %s%%】' % init_skill_info, "INFORMATION")
        else:
            common.show_message('禁止启用初始技能【%s】' % roleadj.init_skill, "NOTICE")

        ###挑战和守擂双方在选择同一种角色时,强制选择不同的二个名字###
        name_list.remove(vs_name)

    ###输出角色的技能###
    common.show_message('%s【%s】技能如下:' % (vs_type,roleadj.role), "NOTICE")
    skill.skill(role_choose).print_skill_list()

    ###定义角色的信息字典,方便return###
    role_info = {
                  "name" : vs_name,
                  "role" : roleadj.role,
                  "life" : roleadj.life,
                  "init_skill_flag" : roleadj.init_skill_flag,
                  "init_skill" : roleadj.init_skill,
                  "init_chance_rate" : roleadj.init_chance_rate,
                  "init_harm_rate" : roleadj.init_harm_rate
    }

    return(role_info,name_list)

###挑战和守擂双方PK函数###
def role_vs(offensive_info,defensive_info):
    '''
    挑战和守擂双方PK函数
    :param offensive_info: 挑战方的信息字典
    :param defensive_info: 防守方的信息字典
    :return: 没有返回值
    '''

    ###获取challage的信息###
    offensive_choose = offensive_info['choose']
    offensive_name = offensive_info['name']
    offensive_role = offensive_info['role']
    offensive_life = offensive_info['life']
    offensive_init_skill_flag = offensive_info['init_skill_flag']
    offensive_init_skill = offensive_info['init_skill']
    offensive_init_chance_rate = offensive_info['init_chance_rate']
    offensive_init_harm_rate = offensive_info['init_harm_rate']


    ###获取response的信息###
    defensive_choose = defensive_info['choose']
    defensive_name = defensive_info['name']
    defensive_role = defensive_info['role']
    defensive_life = defensive_info['life']
    defensive_init_skill_flag = defensive_info['init_skill_flag']
    defensive_init_skill = defensive_info['init_skill']
    defensive_init_chance_rate = defensive_info['init_chance_rate']
    defensive_init_harm_rate = defensive_info['init_harm_rate']


    ###PK双方的技能实例化和获取技能编号列表###
    offensive_skill_obj = skill.skill(offensive_choose)
    offensive_skill_list = offensive_skill_obj.skill_id_list()
    defensive_skill_obj = skill.skill(defensive_choose)
    defensive_skill_list = defensive_skill_obj.skill_id_list()


    i = 1
    flag = False
    common.show_message('双方准备,对战开始',"INFO")

    ###自动对战的开关###
    auto_flag = common.input_msg_choose("是否自动对战(y/n):",['y','n']).strip()
    while not flag:
        ###VS对方菜单,显示对战双方的角色,名字和血量###
        print(menu.vs_menu.format(offensive_name,offensive_role,offensive_life,defensive_name,defensive_role,defensive_life))
        common.show_message('第{0}回合'.format(i),"NOTICE")

        ###如果挑战方血量大于0,挑战方开始选择技能###
        if offensive_life > 0:
            if auto_flag == "y":
                ###自动对战开启,在技能列表中随机生成一个数字###
                offensive_skill_id = str(random.randint(int(offensive_skill_list[0]),int(offensive_skill_list[-1])))
            else:
                ###手工对战时,输入技能编号###
                offensive_skill_id = common.input_msg_choose("请挑战方选择技能编号【%s]: " % offensive_skill_list, offensive_skill_list).strip()

            ###调用技能伤害函数,并计算双方的剩余血量###
            (offensive_life,defensive_life) = offensive_skill_obj.skill_harm(offensive_skill_id,offensive_info,defensive_info)
            offensive_info['life'] = offensive_life
            defensive_info['life'] = defensive_life
        else:
            common.show_message('挑战方【%s】已经挂了,应战方【%s】守擂成功' % (offensive_name,defensive_name),"ERROR")
            ###挑战方挂了,进行PK记录回写报表文件###
            report.record_input_file(offensive_role,offensive_name,defensive_role,defensive_name,True)
            ###挑战方挂了,进行PK记录回写日志文件###
            common.log_input_file(offensive_name,defensive_name,True)

            ###PK结束,退出本次循环###
            flag = True
            continue

        ###守擂方血量大于0,开始选择技能###
        if defensive_life > 0:
            if auto_flag == "y":
                ###自动对战开启,在技能列表中随机生成一个数字###
                defensive_skill_id = str(random.randint(int(defensive_skill_list[0]),int(defensive_skill_list[-1])))
            else:
                ###手工对战时,输入技能编号###
                defensive_skill_id = common.input_msg_choose("请应战方选择技能编号【%s]: " % defensive_skill_list, defensive_skill_list).strip()

            ###调用技能伤害函数,并计算双方的剩余血量###
            (defensive_life,offensive_life) = defensive_skill_obj.skill_harm(defensive_skill_id,defensive_info,offensive_info)
            defensive_info['life'] = defensive_life
            offensive_info['life'] = offensive_life
        else:
            common.show_message('挑战方【%s】成功获胜,应战方【%s】已经升天了' % (offensive_name,defensive_name),"ERROR")
            ###守擂方挂了,进行PK记录回写报表文件###
            report.record_input_file(offensive_role,offensive_name,defensive_role,defensive_name,False)
            ###挑战方挂了,进行PK记录回写日志文件###
            common.log_input_file(offensive_name,defensive_name,False)

            ###PK结束,退出本次循环###
            flag = True
            continue

        time.sleep(2)
        i += 1


###PK场菜单函数###
def battlefield(role_name_list):
    '''
    在进入PK场后,选择双方的角色###
    :param role_name_list: 角色名字列表
    :return: 没有返回值
    '''

    ###进入PK场,输出角色选择菜单###
    print(menu.role_default_menu.format(today, common.numtochr(weekoftoday)))

    ###初始化PK双方的角色信息字典###
    challenge_role_info = {}
    response_role_info = {}

    ###选择挑战方角色、名称及初始技能###
    challenge_choose = common.input_msg_choose("请选择挑战方角色[1-3]: ", ["1", "2", "3","b"]).strip()
    (challenge_role_info,role_name_list[challenge_choose]) = choose_role('挑战方',challenge_choose,role_name_list)
    challenge_role_info['choose'] = challenge_choose


    ###选择应战方角色、名称及初始技能###
    response_choose = common.input_msg_choose("请选择应战方角色[1-3]: ", ["1", "2", "3","b"]).strip()
    (response_role_info,role_name_list[response_choose]) = choose_role('应战方',response_choose,role_name_list)
    response_role_info['choose'] = response_choose
    response_role_info['life'] += 100


    ###调用role_vs,进行对战环节###
    role_vs(challenge_role_info,response_role_info)

###PK战绩排序函数###
def pk_result_sorted(sort_list,dates,value=0):
    '''
    对PK战绩进行不同的排序
    :param sort_list 角色名字列表
    :param dates 起始和结束日期
    :param value 指定排序的值
    :return 无返回值
    '''

    ###调用PK记录报表,获取所有角色名字的信息###
    all_user_pk_result = {}
    user_pk_list = report.print_vs_all_report(sort_list,dates,value)
    all_user_pk_result = {'startdate':dates['start'],
                          'enddate':dates['end'],
                          'vs_record':"
".join(user_pk_list)
                         }
    ###输出所有角色名字的PK记录并进行排序###
    common.show_message(menu.all_vs_history.format(**all_user_pk_result),"NOTICE")


###主程序开始,显示主菜单###
if __name__ == "__main__":

    ###定义并赋值当前的日期和星期几的显示###
    today = datetime.now().strftime("%Y-%m-%d")
    weekoftoday = date.weekday(datetime.now())

    ### --------    开始主程序   ---------###
    flag = False
    while not flag:

        ###定义三类角色的名字列表,战士,弓箭手,法师各有二个用户###
        _role_list = { "1" : ['za','zb'],
                  "2" : ['ga','gb'],
                  "3" : ['fa','fb']
                }

        ###显示游戏的主菜单界面,分别有角色,PK场,战绩榜###
        print(menu.main_menu.format(today, common.numtochr(weekoftoday)))
        choose = common.input_msg_choose("选择功能编号[0-3]: ", ["0", "1", "2", "3"]).strip()

        ###0、退出游戏###
        if choose == "0":
            flag = True
            continue

        ###1、角色及技能介绍###
        if choose == "1":
            role_skill_show()                             ###调用角色信息显示函数###

        ###2、PK场###
        if choose == "2":
            battlefield(_role_list)                       ###调用PK场函数###

        ###3、战绩榜###
        if choose == "3":

            ###定义初始的用户列表和用户选择菜单###
            _name_list = ['za','zb','ga','gb','fa','fb']
            _name_add_list = ['za','zb','ga','gb','fa','fb','b']

            ###调用report函数的起始和结束日期输入函数###
            date_dict = report.get_date()
            ###调用PK记录的排序函数,默认是按用户排序的###
            pk_result_sorted(_name_list,date_dict)

            pk_flag = False
            while not pk_flag:

                ###输入指定排序的方式编号###
                sort_input = common.input_msg_choose("输入战绩排序编号[0-3]:", ["0","1","2","3"]).strip()
                ###选择0时,结束排序,进行用户查询环节###
                if sort_input != "0":
                    ###根据输入的排序编号进行具体排序###
                    pk_result_sorted(_name_list,date_dict,int(sort_input))
                    continue

                query_flag = False
                while not query_flag:
                    ###输入具体的角色名字,来查询具体的PK记录###
                    user_name = common.input_msg_choose("输入用户【%s】,返回(b): " % _name_list,_name_add_list).strip()
                    ###当输入b时,返回到主菜单###
                    if user_name == 'b':
                        pk_flag = True
                        query_flag = True
                        continue
                    else:
                        ###当选择具体角色名字时,生成并输出自己的PKu结果和具体记录###
                        user_pk_result = dict()
                        user_pk_result = report.print_vs_report(user_name,date_dict)
                        common.show_message(menu.role_vs_history.format(**user_pk_result),"NOTICE")
game_menu

5.2 配置文件包conf:

   5.2.1 参数配置文件setting.py

#_*_ coding=utf-8 _*_

'''
Created on 2016年3月15日
@author: 王凯
定义基本的变量
'''

import os,sys


###程序文件主目录###
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
###添加主目录到环境变量###
sys.path.append(BASE_DIR)

###定义角色和技能数据库信息###
DATABASE = dict(engineer="file", dbpath=os.path.join(BASE_DIR, "database"), tables={"role" : "role","skill" : "skill"})


###日志文件存放路径###
LOG_PATH = os.path.join(BASE_DIR, "log")

###角色初始生命值###
init_hp = 1000
setting

   5.2.2 界面显示模板文件menu.py

#_*_ coding=utf-8 _*_

'''
Created on 2016年3月15日
@author: 王凯

该模块用来定义系统的菜单模板
'''

# 主程序中的菜单输出信息###

main_menu = '''
-------------------------------------------------------------------------
                            kevin在线游戏
                                            今天 {0}   星期{1}
-------------------------------------------------------------------------
       【1】角色介绍     【2】PK场      【3】战绩榜     【0】退出
-------------------------------------------------------------------------
'''

###角色菜单输出信息###

role_default_menu = '''
-------------------------------------------------------------------------
                               角色
                                            今天 {0}   星期{1}
-------------------------------------------------------------------------
          【1】战士         【2】弓箭手        【3】法师
返回(b)
-------------------------------------------------------------------------
'''

###对战菜单###

vs_menu = '''
-------------------------------------------------------------------------
         挑战方:{0}({1})                          应战方:{3}({4})
                                   VS
           血量:{2}                                 血量:{5}
-------------------------------------------------------------------------
'''

###所有用户战榜菜单###
all_vs_history = '''
------------------------------------------------------------------------------
                                 战绩榜

                                           VS时间:{startdate} 至 {enddate}
------------------------------------------------------------------------------
战绩:
   用户    挑战次数 挑战成功次数 守擂次数 守擂成功次数  PK次数  PK成功次数
{vs_record}
------------------------------------------------------------------------------
  【1】挑战成功次数   【2】守擂成功次数  【3】PK成功次数   【0】用户查询
------------------------------------------------------------------------------
'''

###具体用户的战榜和PK记录信息###
role_vs_history = '''
------------------------------------------------------------------------------
                                 战绩榜

用户:{user}                                VS时间:{startdate} 至 {enddate}
------------------------------------------------------------------------------
战绩:
挑战【{attack_sum}】次,成功【{attack_ok}】次 | 守擂【{defence_sum}】次,成功【{defence_ok}】次 | PK【{all_sum}】次,成功【{ok_sum}】次

PK战况:
------------------------------------------------------------------------------
     对战时间                             结果
{vs_record}
'''
menu

5.3 数据库包database:

   5.3.1 初始化数据模块db_init.py

#_*_ coding=utf-8 _*_

'''
Created on 2016年3月15日
@author: 王凯
定义角色和技能的信息,并初始化输出到数据库db文件
'''

import json,os,sys

###程序文件主目录######程序文件主目录###
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
###添加主目录到环境变量###
sys.path.append(BASE_DIR)

###导入如下三个模块###
from conf import setting
from modules import common
from database import dbapi

###角色列表###
role_list = {
    "1": {"role": "战士", "init_skill":"守护","init_skill_flag":1,"chance_rate" : 50 , "harm_rate" : 20},
    "2": {"role": "弓箭手", "init_skill":"闪避","init_skill_flag":1,"chance_rate" : 40 , "harm_rate" : 25},
    "3": {"role": "法师", "init_skill":"法盾","init_skill_flag":1,"chance_rate" : 30 , "harm_rate" : 40},
}

###角色的技能列表###
role_skill_list = {
    "1": {"role": "战士", "skill": (
        {"id": "11", "level": "初级技能", "name": "野蛮冲锋","init_harm": 100, "chance_rate" : 40 , "harm_rate" : 20},
        {"id": "12", "level": "中级技能", "name": "旋风斩", "init_harm": 150, "chance_rate" : 30 , "harm_rate" : 20},
        {"id": "13", "level": "高级技能", "name": "百刃斩" ,"init_harm": 200, "chance_rate" : 20 , "harm_rate" : 20},
    )},
    "2": {"role": "弓箭手", "skill": (
        {"id": "21", "level": "初级技能", "name": "点射","init_harm": 100, "chance_rate" : 40 , "harm_rate" : 20},
        {"id": "22", "level": "中级技能", "name": "连射", "init_harm": 150, "chance_rate" : 30 , "harm_rate" : 20},
        {"id": "23", "level": "高级技能", "name": "爆裂箭" ,"init_harm": 200, "chance_rate" : 20 , "harm_rate" : 10},
    )},
    "3": {"role": "法师", "skill": (
        {"id": "31", "level": "初级技能", "name": "火球术","init_harm": 100, "chance_rate" : 40 , "harm_rate" : 20},
        {"id": "32", "level": "中级技能", "name": "冰咆哮", "init_harm": 150, "chance_rate" : 30 , "harm_rate" : 20},
        {"id": "33", "level": "高级技能", "name": "地狱雷光" ,"init_harm": 200, "chance_rate" : 20 , "harm_rate" : 20},
    )}
}


'''
###初始化角色数据库文件 role.db###
def init_db_role():
    _db_file = os.path.join(setting.DATABASE['dbpath'], "role.db")
    with open(_db_file, "w+") as f:
        f.write(json.dumps(role_list))

###初始化角色技能数据库文件 skill.db###
def init_db_skill():
    _db_file = os.path.join(setting.DATABASE['dbpath'], "skill.db")
    with open(_db_file, "w+") as f:
        f.write(json.dumps(role_skill_list))

'''
###初始化角色数据库文件 role.db###
def init_db_role():
    _db_file = os.path.join(setting.DATABASE['dbpath'], "role.db")
    ###调用函数,将角色列表以json的格式写入文件###
    dbapi.write_db_json(role_list,_db_file)

###初始化角色技能数据库文件 skill.db###
def init_db_skill():
    _db_file = os.path.join(setting.DATABASE['dbpath'], "skill.db")
    ###调用函数,将角色技能列表以json的格式写入文件###
    dbapi.write_db_json(role_skill_list,_db_file)

###初始化技能数据表###
def init_database():
    tables = list(setting.DATABASE['tables'].values())            ###数据表名称列表###
    database = setting.DATABASE['dbpath']                         ###数据表存放路径###

    for _table in tables:
        ###数据库文件存在判断###
        if not os.path.exists(os.path.join(database, "{0}.db".format(_table))):
            print("Table {0}.db create successfull".format(_table))
        ###通过反射初始化数据表###
        if hasattr(sys.modules[__name__], "init_db_{0}".format(_table)):
           init_func = getattr(sys.modules[__name__], "init_db_{0}".format(_table))
           init_func()
        else:
           ###如果不存在,则输出错误日志###
           common.write_log("init table {0} failed,no function init_db_{0} found".format(_table),"error")


###主程序开始,调用初始化函数,生成数据库文件###
if __name__ == "__main__":
    init_database()
db_init

   5.3.2 数据访问层模块dbapi.py

#_*_ coding=utf-8 _*_

'''
Created on 2016年3月15日
@author: 王凯

数据库访问层:
1 提供从数据文件、报表文件中读取数据的接口
2 将数据写入到数据文件的接口
'''

import os,sys,json
from conf import setting
from modules.common import write_log


###追加信息到指定文件###
def append_db_json(contant, filename):
    """
    将信息以 json 格式写入数据表文件(追加)
    :param contant: 要写入的 json 格式内容
    :param filename: 要写入的数据表文件名
    :return: 无返回
    """
    try:
        with open(filename, 'a+') as fa:
            fa.write(json.dumps(contant))
            fa.write("
")
    except Exception as e:
        write_log(e,'critical')

###覆盖重写信息到指定文件###
def write_db_json(contant, filename):
    """
    将信息以 json 格式写入数据表文件(覆盖)
    :param contant: 写入的json数据内容
    :param filename: 要写入的文件名
    :return: 无返回结果
    """
    try:
        with open(filename, 'w+') as fw:
            fw.write(json.dumps(contant))
    except Exception as e:
        write_log(e,'critical')


###从指定数据库文件中读取数据###
def load_data_from_db(tabename):
    """
    从指定的数据表中获取所有数据,通过 json 方式将数据返回
    :param tabename: 数据文件名
    :return: 返回数据库文件信息
    """
    try:
        with open(tabename, 'r+') as f:
            return json.load(f)
    except Exception as e:
        write_log(e,'critical')

###从VS报表中读取指定用户的PK记录###
def load_vs_report(startdate, enddate,user=''):
    """
    查找报表记录中的指定用户的PK记录,将结果存入到列表中
    :param user:  角色用户名
    :param startdate: 开始日期
    :param enddate: 结束日期
    :return: 返回用户的PK记录
    """

    ###指定报表的文件名###
    _file = os.path.join(setting.LOG_PATH, "vs_report")
    result = list()

    try:
        with open(_file, "r") as f:
            for line in f:
                _record = json.loads(line)

                ###指定输入用户信息是否为空###
                if user:
                    ###判断用户是否存在###
                    if _record['attack_name'] == user or _record['defence_name'] == user:
                        ###通过输入的起始和结束日期对报表记录进行匹配,是则追加到返回列表中###
                        if _record["time"] >= startdate and _record["time"] <= enddate:
                            result.append(_record)
                ###输入用户为空,则追加所有用户记录到返回列表中###
                else:
                    if _record["time"] >= startdate and _record["time"] <= enddate:
                        result.append(_record)

        return result
    ###执行异常,则输出到错误日志文件###
    except Exception as e:
        write_log("dbapi > load_vs_report > {0}".format(e),"critical")
dbapi

   5.3.3 数据文件role.db

{"3": {"init_skill": "u6cd5u76fe", "harm_rate": 40, "chance_rate": 30, "init_skill_flag": 1, "role": "u6cd5u5e08"}, "1": {"init_skill": "u5b88u62a4", "harm_rate": 20, "chance_rate": 50, "init_skill_flag": 1, "role": "u6218u58eb"}, "2": {"init_skill": "u95eau907f", "harm_rate": 25, "chance_rate": 40, "init_skill_flag": 1, "role": "u5f13u7badu624b"}}
role.db

   5.3.4 数据文件skill.db

{"3": {"skill": [{"level": "u521du7ea7u6280u80fd", "chance_rate": 40, "id": "31", "name": "u706bu7403u672f", "init_harm": 100, "harm_rate": 20}, {"level": "u4e2du7ea7u6280u80fd", "chance_rate": 30, "id": "32", "name": "u51b0u5486u54ee", "init_harm": 150, "harm_rate": 20}, {"level": "u9ad8u7ea7u6280u80fd", "chance_rate": 20, "id": "33", "name": "u5730u72f1u96f7u5149", "init_harm": 200, "harm_rate": 20}], "role": "u6cd5u5e08"}, "1": {"skill": [{"level": "u521du7ea7u6280u80fd", "chance_rate": 40, "id": "11", "name": "u91ceu86eeu51b2u950b", "init_harm": 100, "harm_rate": 20}, {"level": "u4e2du7ea7u6280u80fd", "chance_rate": 30, "id": "12", "name": "u65cbu98ceu65a9", "init_harm": 150, "harm_rate": 20}, {"level": "u9ad8u7ea7u6280u80fd", "chance_rate": 20, "id": "13", "name": "u767eu5203u65a9", "init_harm": 200, "harm_rate": 20}], "role": "u6218u58eb"}, "2": {"skill": [{"level": "u521du7ea7u6280u80fd", "chance_rate": 40, "id": "21", "name": "u70b9u5c04", "init_harm": 100, "harm_rate": 20}, {"level": "u4e2du7ea7u6280u80fd", "chance_rate": 30, "id": "22", "name": "u8fdeu5c04", "init_harm": 150, "harm_rate": 20}, {"level": "u9ad8u7ea7u6280u80fd", "chance_rate": 20, "id": "23", "name": "u7206u88c2u7bad", "init_harm": 200, "harm_rate": 10}], "role": "u5f13u7badu624b"}}
skill.db

5.4 业务处理包modules:

   5.4.1 公共函数模块common.py

#_*_ coding=utf-8 _*_

'''
Created on 2016年3月15日
@author: 王凯
'''

import os,sys,logging,random,re
from datetime import datetime,date
from conf import setting

###生成随机数,用于机率判断来是否触发技能###
def random_decide(random_num,cmp_value,cmp_mode='eq'):
    """
    生成一个指定范围值之内随机数,并对随机数进行判断
    :param random_num:用来定义随机数的范围值
    :param cmp_value:定义需要比对的值
    :param cmp_flag:如果是gt或lt,则进行大于或小于判断,如果是eq,则为等于判断,默认为eq
    :return:  返回True或False
    """

    ###生成指定范围的随机数
    ra = random.randrange(1,random_num)

    ###根据比较符,输出判断的字符串###
    if  cmp_mode == 'eq':
        express = "{0} == {1}"
    elif cmp_mode == 'gt':
        express = "{0} > {1}"
    elif cmp_mode == 'lt':
        express = "{0} < {1}"
    else:
        show_message('比较模式错误','ERROR')
        return False

    flag = eval(express.format(ra,cmp_value))

    ###根据结果,返回正确与否###
    if flag:
        return True
    return False


###根据等级分颜色显示###
def show_message(msg, msgtype):
    """
    对print函数进行封装,根据不同类型显示不同颜色
    :param msg:  显示的消息体
    :param msgtype:  消息类型
    :return: 返回格式化过的内容
    """

    if msgtype == "INFO":
        show_msg = "

相关推荐