“数字炸弹“——练习Python基础知识的小游戏【文末源码地址】

毋宸
2023-12-01

数字"炸弹"

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

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

基本代码

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

整理一下思路:

  1. 这个游戏需要一个“炸弹”数字,这个简单,用random中的randint方法,只要指定范围,就能随机生成一个数字。

    import random
    boom = random.randint(1,100)
    """
    pthon导入第三方工具,用 import 关键字
    """
    
  2. 如果每次玩都可以控制炸弹的范围就好了,这个时候,函数就派上用场啦。

    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)
    """
    
  3. 这个游戏要一直玩,简单,while True一直循环下去,直到达到某些条件,就跳出循环。

    import random
    def numb_boom(start=1,end=100):
        boom = random.randint(start,end)
        while True:
            # 代码块
            pass
    """
    pass只是为了保证代码完整,经常用来整理思路用。
    就目前我的经验来看,while循环很少用到,最常用的是for循环。
    while True用不好,程序就嗝屁啦...
    """
    
  4. 需要告诉程序,你猜的是什么数字?一个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是字符串类型数据。
    """
    
  5. 如果不想玩啦,输入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 跳出循环。
    """
    
  6. 如果调皮一下,输入的不是数字,应该怎么办?所以程序中应该还要判断输入的是不是数字,如果不是,就需要继续猜。

    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。
    """   
    
  7. 如果猜中了炸弹,也需要跳出死循环。

    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
    
  8. 接下来最关键的一步就是,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前后的两个数字即可,完整代码如下:

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]))

第二种提示的解决思路:

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

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]))

源码地址

链接:https://pan.baidu.com/s/1SMAgmlNHku0Le0BXGUfVXg?pwd=dx2b
提取码:dx2b

 类似资料: