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

时间: 2024-10-13 12:37:10

猜数字游戏的实现(Python3.5)的相关文章

python3.3使用tkinter实现猜数字游戏代码

发布时间:2014-06-18   编辑:www.jbxue.com 原文地址:http://www.jbxue.com/article/python/22152.html python3.3使用tkinter开发猜数字游戏的例子,python3.3中tkinter的使用方法. 本节脚本小编分享一例ython3.3中tkinter开发猜数字小游戏的代码. 例子,python3.3中tkinter实例. 复制代码代码示例: # -*- coding: utf-8 -*-import tkinter

python3+pyQt5+QtDesignner实现窗口化猜数字游戏

描述:使用QtDesignner设计界面,pyQt5+python3实现主体方法制作的猜数字游戏. 游戏规则:先选择游戏等级:初级.中级.高级.魔鬼级,选择完游戏等级后点击“确定”,然后后台会自动生成一个与游戏等级匹配的“神秘数字”,游戏玩家在文本框内输入数字,再点击文本框旁边的“确定”,即可比较玩家所猜数字是否就是“神秘数字”. 游戏界面: 源代码: 代码1:guessNumberGame.py (界面代码) 1 # -*- coding: utf-8 -*- 2 3 # Form imple

Python3基础学习-while循环实例- 猜数字游戏

需求: 猜数字游戏, 要求如下: 给个数字, 比如是66. 让用户一直猜,直到猜对退出. 中间输入q或Q也能退出 如果猜大了,提示用户猜小一点; 如果猜小了,提示用户猜大一点; likely = 66 while True: guest_num = input("请输入你猜测的数字[q|Q退出]: ") if guest_num.upper() == "Q": break elif int(guest_num) > likely: print("你猜

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

猜数字游戏及rand()函数

#include<stdio.h>#include<stdlib.h>int main() { short number; short guess=0; number=rand()%100; number++; printf("猜数字游戏\n"); printf("该数字在1到100之间\n"); while(guess!=number) { printf("请你输入所猜数字:"); scanf("%hd&quo

原创Android游戏--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

--------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添加的功能,以及一些可改进的地方,于是准备继续完善此游戏,顺便学Android了. 本次更新信息如下: 1.改正了随机数生成算法,更正了不能产生数字'9'的bug 2.增加了数据存储与IO的内容,使用了SharedPreferences保存数据 3.保存数据为: 总盘数,猜中的盘数 4.使用了Simp

*循环-20. 猜数字游戏

1 /* 2 * Main.c 3 * C20-循环-20. 猜数字游戏 4 * Created on: 2014年8月18日 5 * Author: Boomkeeper 6 *********测试部分通过********* 7 */ 8 9 #include <stdio.h> 10 11 int main(void){ 12 13 int random = 0,N = 0;//系统输入的随机数和最大猜测次数 14 int in = 0;//每次输入的猜测 15 int count = 0

猜数字 游戏

前几天一直做的一个小游戏,猜数字游戏,开始不会做,通过老师的帮助还是成功做出来了,也算小有成就了,嘿嘿. 下面给大家看看我做的这个小游戏: public class GuessNumber { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("\t****** 猜数字 ******\n"); System.out.println("

Python实现简单的猜数字游戏

Python实现简单的猜数字游戏,具体如下: 随机生成一个1-10之间的数字,让用户来猜,当猜错时,会提示猜的数字是大还是小了,直到用户猜对为止. import random secret = random.randint(1,10) #print(secret) print('------猜数字游戏!-----') guess = 0 while guess != secret: temp = input('猜数字游戏开始,请输入数字:') guess = int(temp) if guess