项目需求
编写一个彩票竞猜小游戏,用户可以选择游戏类型(双色球或21点),双色球玩法要求用户从35个数字中选取6个普通号码和1个特殊号码,开奖后核查用户是否中奖。21点玩法,用户可根据抽取牌的点数决定是否继续发牌,停止发牌后与电脑比较点数大小,点数大者获胜,点数超过21点会直接爆点失败。
项目流程
1、创建彩票类,初始化属性时提示游戏玩法,并按照用户输入的指令调用彩票类的各方法
import random
class Lottery:
def __init__(self):
self.ssq_list = [i for i in range(1, 36)]
self.dot_21_list = [i for i in range(1, 14)] * 4
self.ssq_computer_num_6 = []
self.dot_21_computer_p_list = []
self.dot_21_user_p_list = []
while True:
print('=' * 50)
print('*********欢迎来到彩票竞猜系统,本彩票有两种玩法**********\n'
'-------------------玩法介绍-----------------------\n'
'双色球玩法:从35个号码中选取6个普通号码和1个特殊号码\n'
'21点玩法:抽取牌的点数加起来不超过21点,最大者获胜\n'
'------------------------------------------------\n'
'*********请按以下指令进行游玩**********\n'
'*********1、 双色球玩法 **********\n'
'*********2、 21点玩法 **********\n'
'*********3、 退出游戏 **********')
self.model = input('请输入指令:')
if self.model == '1':
self.user_select_ssq()
self.kai_jiang_ssq()
elif self.model == '2':
self.computer_dot_21()
self.user_dot_21()
self.kai_jiang_dot_21()
elif self.model == '3':
print('游戏结束,欢迎下次游玩!')
break
else:
print('输入的指令错误,请重新输入!')
2、方法:双色球用户选号
# 双色球用户选号
def user_select_ssq(self):
while True:
select_num_str = input('请输入6个你选取的普通号码(用英文逗号隔开):')
self.select_num = [int(i) for i in select_num_str.split(',')]
self.select_sup_num = input('请输入1个你选取的特殊号码:')
if len(self.select_num) == 6:
for i in range(6):
computer_ssq_6 = random.choice(self.ssq_list)
self.ssq_computer_num_6.append(computer_ssq_6)
self.ssq_list.remove(computer_ssq_6)
self.computer_ssq_sup = random.choice(self.ssq_list)
break
else:
print('选取的号码不是6个数字,请重新输入')
3、方法:21点电脑和用户决定是否继续发牌
# 21点庄家决定是否继续发牌(超过16点会自动放弃继续发牌)
def computer_dot_21(self):
while True:
computer_sum = 0
computer_p = random.choice(self.dot_21_list)
self.dot_21_computer_p_list.append(computer_p)
self.dot_21_list.remove(computer_p)
for c_item in self.dot_21_computer_p_list:
computer_sum += c_item
if computer_sum > 16:
break
# 21点闲家决定是否继续发牌
def user_dot_21(self):
i = 1
while i <= 10:
user_p = random.choice(self.dot_21_list)
self.dot_21_user_p_list.append(user_p)
self.dot_21_list.remove(user_p)
print('*' * 15, '第{}轮发牌,你的点数为{}'.format(i, user_p), '*' * 15)
yes_or_no = input('是否继续发牌(y/n):')
if yes_or_no == 'y' or yes_or_no == 'Y':
i += 1
else:
break
else:
print('请求发牌次数超过游戏规则!!')
4、方法:双色球开奖和21点结果比较
# 双色球开奖比较
def kai_jiang_ssq(self):
# self.user_select_ssq()
print(f'今日开奖号码为{self.ssq_computer_num_6},特殊号码为{self.computer_ssq_sup}')
z_j_num = [y for y in self.select_num if y in self.ssq_computer_num_6]
z_j = len(z_j_num)
#以下条件判断特别繁琐,需要优化,思考如何优化??==>可否封装成函数?
if z_j <= 2 and self.select_sup_num == self.computer_ssq_sup:
print(f'你中了三等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
elif z_j <= 4 and self.select_sup_num == self.computer_ssq_sup:
print(f'你中了二等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
elif z_j == 5 and self.select_sup_num == self.computer_ssq_sup:
print(f'你中了一等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
elif z_j == 6 and self.select_sup_num == self.computer_ssq_sup:
print(f'你中了特等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
elif z_j == 4 and self.select_sup_num != self.computer_ssq_sup:
print(f'你中了三等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
elif z_j == 5 and self.select_sup_num != self.computer_ssq_sup:
print(f'你中了二等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
elif z_j == 6 and self.select_sup_num != self.computer_ssq_sup:
print(f'你中了一等奖, 中奖普通号码为{z_j_num},特殊号码为{self.computer_ssq_sup}')
else:
print(f'你只中了{z_j}个号码,未中奖,再接再厉!!')
self.ssq_computer_num_6.clear()
# 21点庄家和闲家开点比较
def kai_jiang_dot_21(self):
computer_total = 0
user_total = 0
for c_p in self.dot_21_computer_p_list:
computer_total += c_p
print('庄家点数有:', self.dot_21_computer_p_list)
print('闲家点数有:', self.dot_21_user_p_list)
print('*' * 10, '庄家共计点数为{}'.format(computer_total), '*' * 10)
for u_p in self.dot_21_user_p_list:
user_total += u_p
print('*' * 10, '你共计点数为{}'.format(user_total), '*' * 10)
if computer_total > 21 and user_total > 21:
print('庄家和玩家点数都超21点,平局!!')
elif computer_total > 21 >= user_total:
print('庄家爆点,玩家胜!!')
elif computer_total <= 21 < user_total:
print('玩家爆点,庄家胜!!')
else:
if user_total > computer_total:
print('你的点数大于庄家点数,玩家胜!!')
elif computer_total == user_total:
print('庄家和玩家点数相同,平局!!')
else:
print('你的点数小于庄家点数,庄家胜!!')
self.dot_21_computer_p_list.clear()
self.dot_21_user_p_list.clear()
5、运行主程序
if __name__ == '__main__':
Lottery()
总结
1、锻炼面向对象编程时各流程的拆解思路和逻辑,并转化到类的各方法中
2、熟练掌握类中各方法之间的调用(self+方法名即可调用)
3、掌握类中某方法的变量在另一方法中的调用(self+变量名即可在其他方法中调用)