Python面向对象项目练习:彩票竞猜

项目需求

编写一个彩票竞猜小游戏,用户可以选择游戏类型(双色球或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+变量名即可在其他方法中调用)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值