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

发布于:2022-10-23 ⋅ 阅读:(742) ⋅ 点赞:(0)

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

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




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


等风来,不如追风去……

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

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



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


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

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

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


回页首

游戏效果

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


回页首

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

错误提示信息截屏图
在这里插入图片描述


回页首

mypycolor完整源码(点此跳过源码)

#!/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    猜错提示字符说明,“R”是数字位置都猜对,“B”是除R以外猜对的数字(位置不对)。前面的数字是数字个数(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

        self.play() # 启动游戏。


    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{green}{'~'*50}{offall}")
                return
            else:
                print(f"\n{gray}{'~'*19} 提示:{blue}{guess}{gray} {'~'*19}{offall}")


        print(f"\n\n{gray}{'~'*17} 您的得分:{red}0 {gray}{'~'*19}\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"\n{'':>8}{blue}猜数({gray}如 1314 {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"\n{red}{' 输入错误!'.center(45, '~')}{offall}")
            return False

        return True

if __name__ == '__main__':
    Guess_num()
    

回页首

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

__下一篇:__ 

我的HOT博: