猜数字游戏的实现(Python3.5)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猜数字游戏的实现(Python3.5)相关的知识,希望对你有一定的参考价值。

最近实现了一个猜数字的游戏,用python写的,本人python技术很渣,在不断百度的情况下,总算完成了这个猜数字的游戏,写上一点心得,也许以后有用。

猜数字游戏规则特别简单,就是用户猜一个4位数字,如果位置正确则记为A,数字正确则记为B(例如:被猜数字1234,用户输入了1456;则返回1A1B)

首先,我定义了一个猜数字的大类,写入了初始化方法后,加了一个生成4位不重复数字的方法,具体逻辑是这样:首先生成一个10位不重复的序列,然后利用List的pop方法,返回结果,然后把每个结果用字符串累加的方法加起来,用while循环控制次数,最后得到4位不重复的数字字符串,其它额外要求根据实际情况增加。这里用到了random模块,所以要import random

第一步:

import random

class guessNumber():

    ‘‘‘

    猜数字游戏:

    1、用户输入一组数字后,返回以*A*B的方式返回结果

    2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

    ‘‘‘

    def __init__(self):

        self.guess_number = ‘‘ #被猜测的数字

   

   

    #生成随机不重复的4位数,包括首位位0的数字,如(0567)

    def genRandomNum(self):
        if self.guess_number == ‘‘:    #对象中guess_number参数有没有纸,如果有就直接返回传入的值
            result = ‘‘ #生成的数字
            l1 = [str(i) for i in range(10)]    #l1是一个类似[0,1,2,3,4,5,6,7,8,9]序列
            while(result.__len__() < 4):    #用while循环控制生成数字的位数
                tmp = l1.pop(random.randrange(l1.__len__()))    #用list的pop方法返回对应的数字,这样可以避免重复
                if tmp == ‘0‘:    #判断首位是否为0,如果是0,那么需要加上之前去除的元素
                    l1.append(‘0‘)    #把之前删除的“0”重新加上
                    tmp = l1.pop(random.randrange(l1.__len__()))    #再来一次
                    result += tmp    #字符串累加,响应while的循环条件,到4位时停止循环
                else:
                    result += tmp
        else:
            result = str(self.guess_number)    #如果已经设置了guess_number,那么直接返回设置的结果
        return result    #返回生成的4位不重复的数字(仅限于自动生成,其它途径传入的不算)

 

if __name__ == ‘__main__‘:

    guess = guessNumber()

    target = guess.genRandomNum()

    print(target)

第二步:实现生成随机不重复的4位数字后,接下来就考虑用户输入的数字了。

用户输入的数字有这么几种情况:

1、长度不符合要求

2、输入其它非数字字符

3、不输入

这些异常都要过滤

在类guessNumber中添加这个方法:

import random

class guessNumber():

    ‘‘‘

    猜数字游戏:

    1、用户输入一组数字后,返回以*A*B的方式返回结果

    2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

    ‘‘‘

    def __init__(self):

        self.guess_number = ‘‘ #被猜测的数字

   

    #因为没有参数,所以在要加静态方法的声明

    @staticmethod   

    def user():
        result = ‘‘
        while True:
            primary_number = input("请输入您猜测的数字:")

            #其它准出条件,如果用户输入了q,Q,quit字符,则退出游戏
            if primary_number == ‘q‘ or primary_number == ‘Q‘ or primary_number == ‘quit‘:
                return 1

            #判断用户输入的是不是数字以及长度是不是刚好4位
            elif primary_number.isdigit() and len(primary_number) == 4:
                tmp = list(str(primary_number))    #把用户输入的数字转换成list方便操作
                a1 = tmp.pop(0)    #去掉其中两个字符,并穿给对应的变量(为什么这么做?一种实现方法,勿喷。囧)
                a2 = tmp.pop(0)   

                #如果输入的数字大于1000,小于10000
                if int(primary_number) > 1000 and int(primary_number) < 10000:

                    #如果a1和a2有一个在tmp里面,或者tmp里面的两个值相等,那么意味着有重复数字
                    if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:
                        print("您输入的数字不符合要求")
                    else:
                        break;

                #同上
                elif(int(primary_number)<1000 and int(primary_number) >= 100):
                    if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:
                        print("您输入的数字不符合要求")
                    else:
                        break;
                else:
                    print("您输入的数字不符合要求")
            else:
                print("不要输入非数字字符")
        result = primary_number     #把值给result
        return result 

if __name__ == ‘__main__‘:

    guess = guessNumber()

    target = guess.user()

    print(target)

第三步:第二步的代码写得很啰嗦,但是不影响使用……,用户输入数字后,需要判断用户输入的数字于被猜测的数字之间差了多远,所以要写一个逻辑判断语句

import random

class guessNumber():

    ‘‘‘

    猜数字游戏:

    1、用户输入一组数字后,返回以*A*B的方式返回结果

    2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

    ‘‘‘

    def __init__(self):

        self.guess_number = ‘‘ #被猜测的数字

        self.number = ‘‘    #猜测的数字

        self.history = {}    #存储猜测的结果

    #我把方法命名成提示

    def tip(self):
        input_list = list(str(self.number))    #将类中的猜测的数转换成一个list
        target_list = list(str(self.guess_number))    #将类中的被猜测的数转换成一个list
        a = 0    #A的个数
        b = ""    #B的字符串
        for i in range(input_list.__len__()):    #遍历猜测的数字,如果其中有一个数字在被猜测的数中,那么b中增加一个B,如果对应位置的数正好相等,那么a自增1
            if input_list[i] == target_list[i]:
                a += 1
            if input_list[i] in target_list and input_list[i] != target_list[i]:
                b += ‘B‘

        result = ("%sA%sB" % (a, len(b)))
        #将猜测的结果写入结果集,不重复记录
        tmp = []
        for key in self.history:
            tmp.append(key)
        if self.number in tmp:
            pass
        else:
            self.history[self.number] = result
        return result  

if __name__ == ‘__main__‘:
    a = guessNumber()
    a.guess_number = ‘1234‘
    a.number = ‘1456‘
    print(a.tip())    #应该打印出:1A1B

 

第四步:整合

import random

class guessNumber():

    ‘‘‘

    猜数字游戏:

    1、用户输入一组数字后,返回以*A*B的方式返回结果

    2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

    ‘‘‘

    def __init__(self):

        self.guess_number = ‘‘ #被猜测的数字

        self.number = ‘‘    #猜测的数字

        self.history = {}    #存储猜测的结果

   

   

    #生成随机不重复的4位数,包括首位位0的数字,如(0567)

    def genRandomNum(self):
        if self.guess_number == ‘‘:    #对象中guess_number参数有没有纸,如果有就直接返回传入的值
            result = ‘‘ #生成的数字
            l1 = [str(i) for i in range(10)]    #l1是一个类似[0,1,2,3,4,5,6,7,8,9]序列
            while(result.__len__() < 4):    #用while循环控制生成数字的位数
                tmp = l1.pop(random.randrange(l1.__len__()))    #用list的pop方法返回对应的数字,这样可以避免重复
                if tmp == ‘0‘:    #判断首位是否为0,如果是0,那么需要加上之前去除的元素
                    l1.append(‘0‘)    #把之前删除的“0”重新加上
                    tmp = l1.pop(random.randrange(l1.__len__()))    #再来一次
                    result += tmp    #字符串累加,响应while的循环条件,到4位时停止循环
                else:
                    result += tmp
        else:
            result = str(self.guess_number)    #如果已经设置了guess_number,那么直接返回设置的结果
        return result    #返回生成的4位不重复的数字(仅限于自动生成,其它途径传入的不算)

 

 

    @staticmethod   

    def user():
        result = ‘‘
        while True:
            primary_number = input("请输入您猜测的数字:")

            #其它准出条件,如果用户输入了q,Q,quit字符,则退出游戏
            if primary_number == ‘q‘ or primary_number == ‘Q‘ or primary_number == ‘quit‘:
                return 1

            #判断用户输入的是不是数字以及长度是不是刚好4位
            elif primary_number.isdigit() and len(primary_number) == 4:
                tmp = list(str(primary_number))    #把用户输入的数字转换成list方便操作
                a1 = tmp.pop(0)    #去掉其中两个字符,并穿给对应的变量(为什么这么做?一种实现方法,勿喷。囧)
                a2 = tmp.pop(0)   

                #如果输入的数字大于1000,小于10000
                if int(primary_number) > 1000 and int(primary_number) < 10000:

                    #如果a1和a2有一个在tmp里面,或者tmp里面的两个值相等,那么意味着有重复数字
                    if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:
                        print("您输入的数字不符合要求")
                    else:
                        break;

                #同上
                elif(int(primary_number)<1000 and int(primary_number) >= 100):
                    if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:
                        print("您输入的数字不符合要求")
                    else:
                        break;
                else:
                    print("您输入的数字不符合要求")
            else:
                print("不要输入非数字字符")
        result = primary_number     #把值给result
        return result 

 

    def tip(self):
        input_list = list(str(self.number))    #将类中的猜测的数转换成一个list
        target_list = list(str(self.guess_number))    #将类中的被猜测的数转换成一个list
        a = 0    #A的个数
        b = ""    #B的字符串
        for i in range(input_list.__len__()):    #遍历猜测的数字
            if input_list[i] == target_list[i]:
                a += 1
            if input_list[i] in target_list and input_list[i] != target_list[i]:
                b += ‘B‘

        result = ("%sA%sB" % (a, len(b)))
        #将猜测的结果写入结果集,不重复记录
        tmp = []
        for key in self.history:
            tmp.append(key)
        if self.number in tmp:
            pass
        else:
            self.history[self.number] = result
        return result  

 

    #在start函数中调用

    def start(self):
        self.guess_number = guessNumber.genRandomNum(self)    #先生成被猜测的数字,写入类中
        while True:    #呼应user方法的返回值:1
            self.number = guessNumber.user()    #然后用户开始猜测
            if self.number != 1:
                result = guessNumber.tip(self)
                if result == ‘4A0B‘:    #准出条件,还有隐藏的q/Q/quit!
                    print("恭喜你,你赢了!")
                    break
                else:
                    print("你猜测的数字是: " + self.number + " 结果是: " + result)
            else:
                print("游戏结束,欢迎下次游戏!")
                break

if __name__ == ‘__main__‘:
    game = guessNumber()
    game.start()

 

总结:

1、还可以继续优化

2、可以尝试实现电脑和人脑对局。第一种是猜同一组数字,电脑必须分析并返回最大结果给玩家,但是另外却存储最有可能的数据集合,直到运行出唯一正确答案后直接战胜玩家。另外一种是玩家和电脑对猜对方的数字,先猜正确的先赢。

以上是关于猜数字游戏的实现(Python3.5)的主要内容,如果未能解决你的问题,请参考以下文章

Python实现简单的猜数字游戏

python实现猜数字游戏

用C#编写猜数字游戏,

猜数字游戏网页版

小程序实现猜数字游戏

小程序实现猜数字游戏