一个统计“如果当时买了这串号码,能中几等奖”的Python程序

First of all……咳咳,首先要说明,这个程序仅供娱乐,就是写着玩的。说明书如下:

--------------------说明开始的分割线--------------------
本程序附带一些彩票的开奖结果,具体来说是:

福建36选7:2014-06-19~2011-01-08 共525期
双色球:2014-06-12~2011-03-13 共500期
福建31选7:2014-06-20~2012-01-08 共500期

这些数据都以明文txt形式存放在程序文件夹中,可以自行扩充,但请严格遵守格式。
程序运行后,会要求你选择一个彩种,输入你的号码,输入你要搜索的期数(比如最近
100期),然后在上面提到的开奖结果里面进行搜索,最后显示出来你“如果当时买了”这些彩票,会是怎样的一个中奖情况。

程序显示给你的中奖信息就像这个样子:
<4,['02', '03', '04', '05', '08', '12', '29', '19'],'2014-06-16'>
意思是,在2014年6月16日,你如果买这个号,会中4等奖,开奖号码
是'02', '03', '04', '05', '08', '12', '29', '19'。

程序的输出经过排序,中奖级别高的显示在前面,最多显示100条中奖信息(我想一般人是不可能在500期里面能中奖100次吧?)

--------------------特别注意的分割线--------------------
如你所见,这个程序还十分原始粗糙,没有什么输入合法性的检查和纠正。
所以,请确保按要求输入数据:
1、个位数的球,例如1,要输入01而不能输入1,
2、输入的号码要从小到大排序后输入,特殊球(比如双色球的蓝球),在最后就行
反正就是,彩票上怎么写,你跟着抄过来就行了。

程序涉及到的数据文件已经上传到: http://download.csdn.net/detail/shutdown_r_now/7535699

代码如下:
#-*- coding: UTF-8 -*-

# 程序:if_I_Had_Buy_That
# 版本:20140622
# 语言:Python 2.7
# 功能:在过去的彩票开奖结果中匹配指定号码的中奖信息

shuangseqiu_data_file = "shuangseqiu.txt"
fujian36_7_data_file = "fujian36_7.txt"
fujian31_7_data_file = "fujian31_7.txt"

max_output_records = 100

class lottery_data:
    def __init_(self):
        self.numbers = [] #中奖号码
        self.date = ''    #开奖日期

def retrive_data(line):
    """
    传入参数line是一行文本,其格式形如(双色球):14066 02 05 15 17 18 21 16 2014-06-12
        即:[彩票期数] [中奖号码(最后一个是特别球,双色球里是篮球,36选7里是特别号)] [日期]
    返回值是一个lottery_data类型的对象
    """
    line = line.strip('\n')

    rtn = lottery_data()
    rtn.numbers = line[6:-11].split(' ')
    rtn.date = line[-10:]

    return rtn

def win_count_in_history(lottery_type, my_numbers, periods):
    """
    功能:统计lottery_type类型的彩票(比如双色球)在periods期数内(比如500期),my_numbers这串号码的中奖次数,
        经过对中奖级别从大到小的排序后输出(最多输出的行数由max_output_records指定)。
    输入:lottery_type是str型的彩票类型,目前有:
        福建36选7     fujian36_7
        双色球        shuangseqiu
        福建31选7     fujian31_7

        my_numbers是list格式,如['01', '02' , '23'],要和lottery_type指定的彩票类型匹配。
        periods是int型数据,指定了要搜索的期数范围,具体能够查询的期数范围和数据的多少有关。
    输出:在终端显示结果
    """

    win_times = 0
    if lottery_type == 'shuangseqiu':
        data_file = file(shuangseqiu_data_file)
    elif lottery_type == 'fujian36_7':
        data_file = file(fujian36_7_data_file)
    elif lottery_type == 'fujian31_7':
        data_file = file(fujian31_7_data_file)

    referred_lines = 0
    win_records = []
    while referred_lines < periods:
        line = data_file.readline()
        referred_lines += 1
        if len(line) == 0:
            print u"对不起,您想查询过去{0}期的数据,但我们只有{1}期的数据。".format(periods, referred_lines-1)
            break

        result = retrive_data(line)
        win_grade = cmp_with_result(lottery_type, my_numbers, result.numbers)
        if win_grade > -1:
            if len(win_records) == 0:
                win_records = [(win_grade, result.numbers, result.date)]
            else:
                pos = 0
                recorded_history_n = len(win_records)
                while pos < recorded_history_n: 
                    if win_grade < win_records[pos][0]:
                        win_records.insert(pos, (win_grade, result.numbers, result.date))
                        if recorded_history_n == max_output_records:
                            del win_records[-1]
                        break
                    pos += 1
                if pos == recorded_history_n and recorded_history_n < max_output_records:
                    win_records.append((win_grade, result.numbers, result.date))
    data_file.close()
    
    if len(win_records) == 0:
        print u"真是遗憾啊,我没有找到任何可能的中奖信息"
    for record in win_records:
        print record

def count_same_numbers(my_numbers, standard_numbers):
    """
    功能:统计两组数据中共有的数字的个数
    输入参数:list格式,如['01', '02' , '23'],两个参数长度要匹配,且假设数据已经从小到大排过序了
    返回值:两组数据中共有的数字的个数
    """
    lens = len(my_numbers)
    same_numbers = 0
    i = 0
    j = 0

    while i < lens and j < lens:
        if my_numbers[i] == standard_numbers[j]:
            same_numbers += 1
            i += 1
            j += 1
        elif my_numbers[i] < standard_numbers[j]:
            i += 1
        else:
            j += 1
    return same_numbers

def cmp_with_result(lottery_type, my_numbers, result_numbers):
    """
    功能:比较所买彩票号和开奖号码,得出中奖级别
    输入:lottery_type是str型的彩票类型,目前有:
         福建36选7     fujian36_7
         双色球        shuangseqiu
         福建31选7     fujian31_7


         my_numbers和result_numbers均为list型数据,如['01', '02' , '23']
    返回值:-1表示没中奖,0表示特别奖(有些彩票会有),其余数字表示对应奖级
    """
    hit_special_ball = 0 #特别球,通常只有一个,比如双色球的蓝球
    hit_common_ball = 0  #普通球,比如双色球的红球
    
    # 判断特别球是否猜中 
    if lottery_type  == 'shuangseqiu' and my_numbers[-1] == result_numbers[-1]:
        hit_special_ball = 1
    elif lottery_type == 'fujian36_7' or lottery_type == 'fujian31_7' and result_numbers[-1] in my_numbers:
        hit_special_ball = 1

    # 判断普通球是否猜中
    hit_common_ball = count_same_numbers(my_numbers, result_numbers)

    # 根据不同彩票类型,返回中奖级别
    if lottery_type  == 'shuangseqiu':
        return shuangseqiu_win_rule(hit_special_ball, hit_common_ball)
    elif lottery_type == 'fujian36_7':
        return fujian36_7_win_rule(hit_special_ball, hit_common_ball)
    elif lottery_type == 'fujian31_7':
        return fujian31_7_win_rule(hit_special_ball, hit_common_ball)
    else:
        print u"对不起,好像出错了,现在退出程序。"
        quit()

def fujian31_7_win_rule(hit_special_ball, hit_common_ball):
    """
    功能:根据命中球数,给出福建31选7中奖级别。
    输入:两个int型数据
    返回值:-1表示没中奖,0表示特别奖(有些彩票会有),其余数字表示对应奖级
    """
    if hit_special_ball == 1:
        if hit_common_ball == 4:
            return 5
        elif hit_common_ball == 5:
            return 3
        elif hit_common_ball == 6:
            return 1
        else:
            return -1
    elif hit_common_ball == 4:
        return 6
    elif hit_common_ball == 5:
        return 4
    elif hit_common_ball == 6:
        return 2
    elif hit_common_ball == 7:
        return 0
    else:
        return -1    

def fujian36_7_win_rule(hit_special_ball, hit_common_ball):
    """
    功能:根据命中球数,给出福建36选7中奖级别。
    输入:两个int型数据
    返回值:-1表示没中奖,0表示特别奖(有些彩票会有),其余数字表示对应奖级
    """
    if hit_special_ball == 1:
        if hit_common_ball == 3:
            return 6
        elif hit_common_ball == 4:
            return 5
        elif hit_common_ball == 5:
            return 3
        elif hit_common_ball == 6:
            return 1
        elif hit_common_ball == 7:
            return 0
        else:
            return -1
    elif hit_common_ball == 4:
        return 6
    elif hit_common_ball == 5:
        return 4
    elif hit_common_ball == 6:
        return 2
    elif hit_common_ball == 7:
        return 1
    else:
        return -1

def shuangseqiu_win_rule(hit_blue_ball, hit_red_ball):
    """
    功能:根据命中球数,给出双色球中奖级别。
    输入:两个int型数据
    返回值:-1表示没中奖,0表示特别奖(有些彩票会有),其余数字表示对应奖级
    """

    if hit_blue_ball == 1:
        if hit_red_ball <= 2:
            return 6
        elif hit_red_ball == 3:
            return 5
        elif hit_red_ball == 4:
            return 4
        elif hit_red_ball == 5:
            return 3
        else:
            return 1
    elif hit_red_ball == 4:
        return 5
    elif hit_red_ball == 5:
        return 4
    elif hit_red_ball == 6:
        return 2
    else:
        return -1

print u"""#---------------------------
#   程序:if_I_Had_Buy_That
#   版本:20140622
#   语言:Python 2.7
#   功能:在过去的彩票开奖结果中匹配指定号码的中奖信息
#---------------------------
"""

lottery_id =raw_input('请输入要查询的彩票种类:\
    \n1 表示福建36选7 \
    \n2 表示双色球 \
    \n3 表示福建31选7 \
    \n>> '.decode('utf-8').encode('gbk'))
if lottery_id == '1':
    lottery_type = 'fujian36_7'
elif lottery_id == '2':
    lottery_type = 'shuangseqiu'
elif lottery_id == '3': 
    lottery_type = 'fujian31_7'
else:
    print u'别闹,输入点正常的数字,不然……我出错给你看……你别碰我,再碰我一下我就退出!'
    input_anyhthing_to_exit = raw_input()
    quit()

my_numbers = raw_input('请输入一组彩票号码, 用空格隔开, 如 01 03 24:\n>> '.decode('utf-8').encode('gbk')).split(' ')
periods = raw_input("请输入要查询的期数范围,如500:\n>> ".decode('utf-8').encode('gbk'))

try:
    win_count_in_history(lottery_type, my_numbers, int(periods))
except:
    print u"\n\n我……有点不舒服,先退了,你是不是给我喂了什么不对的东西啊!或者数据文件不对了?\
        \n\n如果你确定你没有给我乱吃什么的话,那请向开发者反映,他会治好我哒!"
finally:
    input_anyhthing_to_exit = raw_input("\n\n请输入任意键以退出程序>> ".decode('utf-8').encode('gbk'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值