数字"炸弹"

数字炸弹小游戏,平时可以多个人一块玩。游戏规则也很简单:从0~100之间选一个数字,作为“炸弹”。每人轮流猜,数字的范围不断缩小,直到有人“踩到炸弹”为止。比如:炸弹数字为50,第一个人猜10,提示炸弹在“10到100”之间;第二个人猜60,提示炸弹在“10到60”之间,第三个人猜50,遇到炸弹,游戏结束。

规则很简单,如果人多的时候可以一块玩。如果没人的话,那就只能自己和自己玩。于是乎,我想到用程序写一个这样的游戏出来。嗯,应该很简单…

基本代码

事实上,打脸来得很快,本以为很轻松就搞定的东西,我花费了大概2个小时的时间,有兴趣的小伙伴也可以挑战一下,对自己的基础语法练习有很大的帮助。

整理一下思路:

  1. 这个游戏需要一个“炸弹”数字,这个简单,用random中的randint方法,只要指定范围,就能随机生成一个数字。
import random
boom = random.randint(1,100)
"""
pthon导入第三方工具,用 import 关键字
"""
  1. 如果每次玩都可以控制炸弹的范围就好了,这个时候,函数就派上用场啦。
import random
def numb_boom(start=1,end=100):
    boom = random.randint(start,end)
"""
number_boom函数,start参数默认为1,end参数默认为100
如果要更改参数值,只需在调用的时候指定对应的数值,如:
number_boom(14,250)
number_boom(13,34)
"""
  1. 这个游戏要一直玩,简单,while True一直循环下去,直到达到某些条件,就跳出循环。
import random
def numb_boom(start=1,end=100):
    boom = random.randint(start,end)
    while True:
        # 代码块
        pass
"""
pass只是为了保证代码完整,经常用来整理思路用。
就目前我的经验来看,while循环很少用到,最常用的是for循环。
while True用不好,程序就嗝屁啦...
"""
  1. 需要告诉程序,你猜的是什么数字?一个input函数,搞定。
import random
def numb_boom(start=1,end=100):
    boom = random.randint(start,end)
    while True:
  answer = input("踩炸弹(q退出):")
"""
这里有一个新手都会掉进去的坑:
1、input 接受用户输入信息传给answer,answer是字符串类型数据。
2、input 接受用户输入信息传给answer,answer是字符串类型数据。
3、input 接受用户输入信息传给answer,answer是字符串类型数据。
"""
  1. 如果不想玩啦,输入q退出。if条件,当输入的是字符串q的时候,结束死循环。
import random
def numb_boom(start=1,end=100):
    boom = random.randint(start,end)
    while True:
  answer = input("踩炸弹(q退出):")
        if answer == "q":
            print(boom,"退出游戏!")
            return boom
"""
在函数中,程序执行到 return 的时候,会自动跳出循环(应该是跳出整个函数)。
如果不是在函数中,也可以使用 break 跳出循环。
"""
  1. 如果调皮一下,输入的不是数字,应该怎么办?所以程序中应该还要判断输入的是不是数字,如果不是,就需要继续猜。
import random
def numb_boom(start=1,end=100):
    boom = random.randint(start,end)
    while True:
  answer = input("踩炸弹(q退出):")
        if answer == "q":
            print(boom,"退出游戏!")
            return boom
        if not answer.isdigit():
            print("调皮,输入整数>_<")
            continue
        else:
            answer = int(answer)
"""
这里的answer是字符串对象(对象都有很多方法),isdigit()方法可以用来识别answer是不是都是由数字组成的。
continue 在这里用的就很完美,程序执行到continue的时候,下面的代码都不执行,继续猜。
int(answer) :将answer转为int对象,便于比较boom和answer。
""" 
  1. 如果猜中了炸弹,也需要跳出死循环。
import random
def numb_boom(start=1,end=100):
    boom = random.randint(start,end)
    while True:
  answer = input("踩炸弹(q退出):")
        if answer == "q":
            print(boom,"退出游戏!")
            return boom
        if not answer.isdigit():
            print("调皮,输入整数>_<")
            continue
        else:
            answer = int(answer)        
        if boom == answer:
                print(boom,"boom~~~~~~")
                return boom
        else:
            # 这里应该最关键的部分
            pass

  1. 接下来最关键的一步就是,boom与answer不相等的时候,应该怎么办?

核心代码

boom与answer不相等,应该提示炸弹在某个区间内,而这个区间是根据answer的值去确定。

举个例子:

boom=50,第一次输入answer=20,那么应该提示炸弹在【20,100】之间;

第二次输入40,那么应该提示炸弹在【40,100】之间;

第三次输入60,那么应该提示炸弹在【40,60】之间;

直达输入50,boom,游戏结束。

以上是正常的输入方式…

以下是非正常的输入方式:

另一个例子:

boom=50,第一次输入answer=20,那么应该提示炸弹在【20,100】之间;

第二次输入10,那么应该如何提示?应该提示炸弹在【20,100】,还是【10,100】。

第三次输入60,那么应该如何提示?应该提示炸弹在【20,60】,还是【10,60】。

问题关键在于,如何给出合理的提示?

现在提示分为2种:

1、根据用户历史输入数据,给出炸弹范围。

2、根据用户最近2次输入的数据,给出炸弹范围。

我觉得第一种太死板,一直强制你去“踩”炸弹;第二种更加灵活,没有强求的意思,是生是死,自己掌握。

第一种提示的解决思路:

1、将用户输入的answer全部放到一个列表(answer_list)中,然后从列表中找出最接近boom的两个数字,问题转化为在answer_list中寻找距离boom的最近两个数。这一步我刚开始想得有点复杂,这里有一种简单方法:将boom放到answer_list中,升序排列,找到boom前后的两个数字即可,完整代码如下:

import random

def number_boom_v1(start=1,end=100):
    boom = random.randint(start,end)
    answer_list = [start,boom,end]
    while True:
        answer = input("踩炸弹(q退出):")
        if answer == "q":
            print("boom:",boom)
            return boom
        if not answer.isdigit():
            print("调皮,输入整数>_<")
            continue
        else:
            answer = int(answer)
            answer_list.append(answer)
        if boom == answer:
            print(boom," ,boom~~~~~~~~")
            return boom
        else:
            sorted_list = sorted(answer_list)
            boom_index = sorted(sorted_list).index(boom)
            print("炸弹在:{0}-{1}".format(sorted_list[boom_index-1],sorted_list[boom_index+1]))


if __name__ == '__main__':
    number_boom_v1()

第二种提示的解决思路:

制作一个提示列表numb_list,当boom大于answer,就替换numb_list的第一个数字;当boom小于answer,就替换numb_list中的第二个数字。具体代码如下:

import random


def number_boom_v2(start=1,end=100):
    boom = random.randint(start,end)
    numb_list = [start,end]
    while True:
        answer = input("踩炸弹(q退出):")
        if answer == "q":
            print("boom:",boom)
            return boom
        if not answer.isdigit():
            print("调皮,输入整数>_<")
            continue
        else:
            answer = int(answer)
        if boom == answer:
            print(boom," ,bomm~~~~~~~~")
            return boom
        elif boom > answer:
            numb_list[0] = answer
            print("炸弹在:{0}-{1}".format(numb_list[0],numb_list[1]))
        else:
            numb_list[1] = answer
            print("炸弹在:{0}-{1}".format(numb_list[0],numb_list[1]))


if __name__ == '__main__':
    number_boom_v2()

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

若有侵权,请联系删除

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐