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'))