0_Let's_Play_a_Game

在上一篇文章中,我们学习了input,print,while,for。在这篇文章中,我们将使用已经学到的这些知识,搭配if...else...来制作一个猜数机器人。效果如下图:
gif4_1.gif

功能如下:

  1. 在设置的范围内寻找玩家的数字
  2. 在玩家故意乱按的时候发出友好的问候

1_If_I...

我们首先介绍今天要用到的if...else...,Python中if语句的一般形式如下所示:

if condition_1:
    statement_block_1
elif condition_2:
    statement_block_2
else:
    statement_block_3
  • 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句
  • 如果 "condition_1" 为False,将判断 "condition_2"
  • 如果"condition_2" 为 True 将执行 "statement_block_2" 块语句
  • 如果 "condition_2" 为False,将执行"statement_block_3"块语句

pic_if

Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else。注意:

  1. 每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。
  2. 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
  3. 在Python中没有switch – case语句。

Gif_if.gif

下面为示例代码:

var1 = 100
if var1:
    print ("1 - if 表达式条件为 true")
    print (var1)
 
var2 = 0
if var2:
    print ("2 - if 表达式条件为 true")
    print (var2)
print ("Good bye!")

>>>1 - if 表达式条件为 true
>>>100
>>>Good bye!

下面列出if语句的常用判断操作符

操作符描述
<小于
<=小于或等于
>大于
>=大于或等于
==等于,比较两个值是否相等
!=不等于

下面的代码演示了判断符号的输出内容:

# 使用数字
print(5 == 6)
# 使用变量
x = 5
y = 8
print(x == y)
>>>False
>>>False

在嵌套 if 语句中,可以把 if...elif...else 结构放在另外一个 if...elif...else 结构中。

if 表达式1:
    语句
    if 表达式2:
        语句
    elif 表达式3:
        语句
    else:
        语句
elif 表达式4:
    语句
else:
    语句

2_Loooooop

在学习了if判断语句后,我们将它和while循环结合使用。在开始之前,我们先介绍这个小游戏用到的算法——折半查找法

在计算机科学中,折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
来自百度百科——折半查找法
下图展示了从1-64中搜索55的实现过程:
pic_two

在知道思路后我们开始着手代码部分。首先,我们通过上面的动图可以知道,这个查找需要用到循环。我们还是用while来实现。

min = 0
max = 20
while True:
    num = int((min+max)/2)
    print("这个数是 %d"% num)

以上,我们实现了一半的二分法算法。接下来我们需要完善他,怎么才能让程序知道自己猜没猜对该往哪边二分呢?我们可以看到我们的循环条件使用的是True,也就是说我们的循环将一直运行,直到出现一个外部中断。
回想上一篇文章,我们知道可以使用break去跳出循环,那么我们稍加改进,得到:

min = 0
max = 20
while True:
    num = int((min+max)/2)
    if num  == min or num == max:
        break

通过这条判断语句,就可以使程序在运行到可二分的最小值时,跳出循环。已经可以把循环停下来了,那怎么判断二分的方向呢?这个要猜的数字是在玩家的脑子里,没法写入到程序用if判断,那么就只有让用户自己按按钮告诉程序,它是猜对了,或者这个数比程序给的数字大或者小。

min = 0
max = 20
while True:
    num = int((min+max)/2)
    if num  == min or num == max:
        break
    print("你想的是%d么?"% num)
    flag = int(input("是按1,大于它按2,小于它按3:"))
    if flag == 1:
        print("猜对了,我真弔!")
        break
    elif flag == 2:
        min = num
    elif flag == 3:
        max = num

我们在这里用到了一个 flag,我们用它作为一个判断的依据,当flag等于不同的值,程序作出不同的响应。当输入2,玩家的数字比程序给的数字大,那么就把程序的最小值赋值为当前值,然后再次二分;输入3的情况同理。

最后稍作优化得到我们的成品代码:

[ppblock ex="密码上课公布"]

def guess():
    print("请想一个0-20之间(不含0,20)的整数...")
    k = input("按回车以继续...")
    min = 0
    max = 20
    while True:
        num = int((min+max)/2)
        if num  == min or num == max:
            print("你猜你马呢")
            break
        print("你想的是%d么?"% num)
        flag = int(input("是按1,大于它按2,小于它按3:"))
        if flag == 1:
            print("猜对了,我真弔!")
            break
        elif flag == 2:
            min = num
        elif flag == 3:
            max = num

if __name__ == "__main__":
    guess()

可视化运行:


!!!

源代码下载

!!! [/ppblock]
最后修改:2024 年 09 月 23 日
如果觉得我的文章对你有用,请随意赞赏