mmxvoodoo 发表于 2020-2-9 22:54:21

零基础学Python第38讲课后作业——自己写的猜数字(xAyB型)

本帖最后由 mmxvoodoo 于 2020-2-14 00:19 编辑

作为初学者其实是不敢来这个板块的,因为是很简单的东西。真正0基础的我听了小甲鱼的课后花了一下午加一晚上时间把自己小时候在文曲星词典上玩过的这个游戏写出来了,大佬们就当看个笑话,多多批评我也是应该的。

import random
import sys

class NumTrue:#自动生成的四位数字即答案
    countgame = 10#设定可以猜测的次数
    def __init__(self):#生成各个位数不重复的四位数
      self.list = []
      while not len(self.list) == 4:
            num = str(random.randint(0, 9))
            if num not in self.list:
                self.list.append(num)

class NumInput:#输入数字及相关检查参数和方法设定
    def __init__(self, ip):#初始化输入值及检查参数
      self.ip = ip#输入数字
      self.numlist = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
      self.cklist = []#检查用列表,检查输入是否重复、是否输入了非数字及输入的各位数字和答案数字位置是否一致
      self.ckcount = 0#检查输入的各位数字是否存在于答案中
      self.slogen = 1#标记数字,用于检查输入中是否存在非数字及是否存在重复数字的参数
    def cknum(self):#检查输入中是否有非数字出现
      for each in range(4):
            if self.ip not in self.numlist:
                self.cklist.append(each+1)
      if self.cklist:
            print(f'您的输入中第{self.cklist}位不是有效数字,请重新输入')
            self.cklist.clear()
            self.slogen = 0
    def ckrp(self):#检查输入值中是否有重复数字
      for i in self.ip:
            if i not in self.cklist:
                self.cklist.append(i)
                continue
            else:
                self.slogen = 0
                print('您输入的数字中有重复数字,请重新输入')
                break
      self.cklist.clear()
    def ckstreet(self):#检查各位数字是否和答案的位置一致
      for i in self.ip:
            if i == numtrue.list:
                self.cklist.append(i)
    def ckinclude(self):#检查各数字是否存在于答案中
      for j in self.ip:
            if not j in self.cklist and j in numtrue.list:
                self.ckcount += 1
    def prinfo(self):#输出此次猜测得到的结果
      print(f'{self.ckcount}个数字猜对了大小但位置不对,\n'
            f'{len(self.cklist)}个数字大小和位置都对了\n'
            f'您还剩{numtrue.countgame}次机会')

intr = 'Y'
print(f'欢迎来玩猜数字游戏,请输入一个每个位数数字不重复的四位数,您一共有{NumTrue.countgame}次机会')

while True:
    if (not intr in ['Y', 'y']) or (intr in ['N', 'n']):
      print('欢迎下次来玩')
      sys.exit(0)
    print('========================游戏开始============================')
    numtrue = NumTrue()#生成答案及一次游戏的可猜测次数
    #print(numtrue.list)#开发检查点,检查随机数是否正常生成,也可以用来作弊直接看答案
    while numtrue.countgame:
      input_str = NumInput(input('请输入您的数字:'))#生成输入的数字及检查参数和检查方法
      if not len(input_str.ip) == 4:#检查输入数字是否是四位
            print('您输入的不是四位数字,请重新输入')
            continue
      else:
            input_str.cknum() #检查输入中是否有非数字
            ifinput_str.slogen:
                input_str.ckrp()# 检查输入是否还有重复数字
      ifinput_str.slogen:
            numtrue.countgame -= 1
            input_str.ckstreet()#检查输入的各位数字是否在答案的相同位置
            #print(input_str.cklist)#开发检查点,检查存真列表是否正常工作
            input_str.ckinclude()#检查输入的各位数字是否存在于答案之中
            if len(input_str.cklist) == 4:
                intr = input('恭喜你!答对了!是否再来一遍?Y/N:')
                break
            else:
                if not numtrue.countgame == 0:
                  input_str.prinfo()
                  continue
    else:
      intr = input(f'太可惜了,正确答案是{numtrue.list},您的次数已用完,是否再来一次Y/N?')
      continue

PS:早上起来又改了下,把能自己感觉能class的东西都都扔进class了。
PPS:过几天发现了个bug,又增加了判断输入是否是数字的条件,并将默认一次游戏猜测次数改成了10次,原来的5次太难了!

thekingb1ll 发表于 2020-2-13 21:28:40

真的是0基础么,好厉害的亚子,感jio我是five

mmxvoodoo 发表于 2020-2-13 23:29:18

thekingb1ll 发表于 2020-2-13 21:28
真的是0基础么,好厉害的亚子,感jio我是five

真是零基础,这几天在修饰器和描述器的课程里死去活来。
页: [1]
查看完整版本: 零基础学Python第38讲课后作业——自己写的猜数字(xAyB型)