python猜密码游戏规则_"数字炸弹"——练习Python基础语法的小游戏

# 数字"炸弹"

数字炸弹小游戏,平时可以多个人一块玩。游戏规则也很简单:从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做一个“智能”的微信聊天机器人

你可能感兴趣的:(python猜密码游戏规则)