# 数字"炸弹"
数字炸弹小游戏,平时可以多个人一块玩。游戏规则也很简单:从0~100之间选一个数字,作为“炸弹”。每人轮流猜,数字的范围不断缩小,知道有人“踩到炸弹”为止。比如:炸弹数字为50,第一个人猜10,提示炸弹在“10到100”之间;第二个人猜60,提示炸弹在“10到60”之间,第三个人猜50,遇到炸弹,游戏结束。
规则很简单,如果人多的时候可以一块玩。如果没人的话,那就只能自己和自己玩。于是乎,我想到用程序写一个这样的游戏出来。嗯,应该很简单......
# 从1到......
事实上,打脸来得很快,本以为很轻松就搞定的东西,我花费了大概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是字符串类型数据。
1、input 接受用户输入信息传给answer,answer是字符串类型数据。
1、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]))
```
# 下一期内容:
如何用Python做一个“智能”的微信聊天机器人