猜数字小游戏——算法学习


【点击此处跳转笔记正文】

Python 官网https://www.python.org/




  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……

这是我参加“14天阅读挑战赛”第一周第二篇

点击查看“14天阅读挑战赛”详情,《趣学算法第二版》学习打卡。



跟着小玉老师学算法
猜数字游戏
(“代码是框架,算法是灵魂”)


  书中说“算法之美”!确实,追求算法是一种美的享受,不断的优化迭代,让最初“能实现”的算法,也可以“进化”得灵动。

  看到学习群里有做“猜数字”游戏练习的,大致阅读了其源码,理解了游戏的规则。用从小玉老师直播中学到的,组织设计数据结构,捋清数据关系、程序逻辑,设计算法,持续优化,最终做出了这个“猜数字”小游戏。

  游戏规则:猜数字游戏,机器随机选择一个数位各不相同的四位数,您可以有七次机会猜对。七次不中,Game over!猜测次数越少,得分越高。一次猜对100分,七次不中0分。
  猜错提示字符说明,“R”是数字位置都猜对,“B”是除R以外猜对的数字(位置不对)。前面的数字是数字个数(1~4)。


回页首

  经QQ学习群学友“无令“提点,修缮了代码中的大量bug,重新上传效果截屏图片。比如前面的猜数提示居然搞成了“猜数(如 1314):”,竟然有两个相同数字的提示来做示例!😓😓

游戏效果

在这里插入图片描述
在这里插入图片描述


回页首

  在学习QQ群友的指导下,加入了对玩家错误数字输入的提示。在些对他表示感谢😊

错误提示信息截屏图

在这里插入图片描述


回页首

  我大多在安卓手机上学习代码,昨天才发现,Windows是不支持033转义字符控制的,在Windows上跑我带033转义字符控制的代码,看起来麻嘎嘎的一遍。以前都没没注意到,源于照顾对本段源码感性趣的小伙伴,去除了033转义字符串,已打包上传CSDN。

无转义字符界面效果
在这里插入图片描述
  有喜欢的小伙伴可以自行去CSDN下载,或给我留言索取。


回页首

mypycolor完整源码(点此跳过源码)(bug修复 2022-10-23)

#!/sur/bin/nve python
# coding: utf-8

'''

Author:梦幻精灵_cq

date:2022-10-22

'''


from  time import localtime, time


class Guess_num:
    '''猜数字游戏:\n    机器随机选择一个数位各不相同的四位数,您可以有七次机会猜对。七次不中,Game over!第一次猜对满分100,猜测次数越少,得分越高。七次不中0分。\n    游戏用RB字符提示您所猜数字对的位数,“R”是数位数字都猜对,“B”是除R以外猜对的数字(位置不对)。RB前面的数字是猜对的数字个数(1~4)。'''


    def __init__(self):
        from random import sample

        while True:
            choice = "".join(sample('0123456789', k=4))

            if choice[0] != '0':
                self.target = choice
                break

        while True:
            self.play() # 启动游戏。
            if not input(f"\n{' 直接回车退出,任意键继续。'.center(37, '~')}"):
                break


    def play(self):
        ''' 游戏 '''
        blue = '\033[34m'
        red = '\033[91;5m'
        gray = '\033[90m'
        green = '\033[92;5m'
        offall = '\033[0m'
        print(f"\n\n{gray}{'='*19}{green} 猜数字游戏 {gray}{'='*19}\n\n{gray}{self.__doc__}{offall}\n")

        for i in range(7, 0, -1):

            while True:
                number = self.input_num()
 
                if self.isnumber(number):
                    break

            guess = self.iswin(number, self.target)

            if guess is True:
                print(f"\n{green}{'~'*19} 恭喜猜中!{'~'*20}{offall}\n\n{'':>15}{blue}您的得分:{green}{100*i/7:3.2f}{offall}\n\n{'':>16}目标数字:{green}{self.target}{offall}\n\n{green}{'~'*50}{offall}")
                return
            else:
                print(f"{gray}{f' 您还能猜{i-1}次。':~>16}提示:{blue}{guess}{gray} {'~'*17}{offall}\n")


        print(f"\n\n{red}{' Game over!'.center(49, '~')}\n\n{gray}{'~'*17} 您的得分:{red}0 {gray}{'~'*20}\n\n{'':>18}目标数字:{green}{self.target}{offall}\n\n{'~'*50}{offall}\n")


    def iswin(self, number, target):
        ''' 判断猜中 '''

        if number == target:
            return True

        r = b = 0
        for i in range(4):
            if number[i] == target[i]:
                r += 1
            elif number[i] in target:
                b += 1

        return f"{r}R{b}B"


    def input_num(self):
        ''' 数字输入 '''
        blue = '\033[34m'
        red = '\033[91;5m'
        gray = '\033[90m'
        offall = '\033[0m'

        while True:

            number = input(f"{'':>11}{blue}猜数({gray}如 8976{blue}):{offall}").strip()

            if not self.isnumber(number):
                continue 

            return number


    def isnumber(self, number):
        ''' 判断错误数字 '''
        red = '\033[91;5m'
        offall = '\033[0m'

        if not number.isdigit() or len(number) != 4 or number[0] == '0' or len(set(number)) < 4:
            print(f"{red}{' 输入错误!'.center(45, '~')}{offall}\n")
            return False

        return True


if __name__ == '__main__':
    green = '\033[92;5m'
    blue = '\033[34m'
    offall = '\033[0m'
    t0 = time()
    Guess_num()
    print(f"\n{'':>16}游戏用时{green}{(time()-t0)/60:5.2f}{offall} 分。")
    y, M, d, h, m, s = localtime()[:6]
    input(f"{'~'*14} {blue}{y}-{M:02}-{d:02}{offall} {green}{h:02}:{m:02}:{s:02}{offall} {'~'*15}")


回页首

__上一篇:__ 猜数字小游戏——算法学习

__下一篇:__ 

我的HOT博:
    评论 2
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    梦幻精灵_cq

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值