zoukankan      html  css  js  c++  java
  • 课时4:改进我们的小游戏

    目录:

    一、改进我们的小游戏

    二、条件分支

    三、while循环

    四、引入外援

    五、课时04课后习题及答案

    **************************

    一、改进我们的小游戏

    **************************

    很多鱼油对改善这个游戏提出了建议,小甲鱼做了一下总结,大概有以下几个方面需要改进:
    >猜错的时候程序应该给点提示,例如告诉用户输入的值是大了还是小了。
    >每运行一次程序只能猜一次,应该提供多次机会给用户猜测。
    >每次运行程序,答案可以是随机的。因为程序答案固定,容易导致答案外泄。

    ****************

    二、条件分支

    ****************

    第一个改进要求:猜错的时候程序提示用户当前的输入比答案大了还是小了。

                                                                   

    例如:

     1 >>> 1<3
     2 True
     3 >>> 1 < 3
     4 True
     5 >>> 1 <= 3
     6 True
     7 >>> 1 == 3
     8 False
     9 >>> 1 != 3
    10 True

    这里1和3进行比较,判断1是否小于3,在小于号左右分别留了一个空格,这不是必需的,但是代码量一多,看上去会美观很多。

    Python的条件分支语法:

    ****************

    三、while循环

    ****************

    第二个改进要求:程序应该提供多次机会给用户猜测,专业点来讲就是程序需要重复运行某些代码。

    temp =input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
    while guess!=8:
          temp = input("猜错了哦,重新猜一猜:")
          guess = int(temp)
          
          if guess == 8:
                  print("哇草,你是小甲鱼心里的蛔虫吗?")
                  print("哼,猜中了也没有奖励")
          else:
                  if guess > 8:
                          print("哥,大了大了~~")
                  else:
                          print("嘿,小了!小了!!")
    print("游戏结束,不玩啦~~")

    说一说自己对这一段代码的理解:while循环条件为假的话,运行最后一行的代码。为真的话运行while循环里缩进的内容。值得一提的是,循环体内if-else的guess变量是重新赋值了的。

    运用了if-else的嵌套结构。看代码时首先把大的缩进代码区域判断清楚,在判断好每个小的缩进代码区域,这样有便于理清思路。

    这里的代码好像跟第2个要求有点不同,后面会进行完善。这里我们给大家的提示是:使用and逻辑操作符Python的and逻辑操作符可以将任意表达式连接在一起,并得到一个布尔类型的值。

    ****************

    四、引入外援

    ****************

    第三个改进要求:每次运行程序产生的答案是随机的。
    我们需要引入外援random模块
    这个random模块里边有一个函数叫做:randint(),Ta会返回一个随机的整数。
    我们可以利用这个函数来改造我们的游戏!

    import random
    
    secret = random.randint(1,10)
    temp =input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
    
    while guess!=secret:
          temp = input("猜错了哦,重新猜一猜:")
          guess = int(temp)
    
          if guess > secret:
                print("哥,大了大了~~")
          else:
                print("嘿,小了!小了!!")
                          
          if guess == secret:
                  print("哇草,你是小甲鱼心里的蛔虫吗?")
                  print("哼,猜中了也没有奖励")
                  
    print("游戏结束,不玩啦~~")

    *******************************

    五、课时04课后习题及答案

    *******************************

    测试题:

    0. 请问以下代码会打印多少次“我爱鱼C!”

    while 'C':  
        print('我爱鱼C!')  

    1.请问以下代码会打印多少次“我爱鱼C!”

    i = 10  
    while i:  
        print('我爱鱼C!')  
        i = i - 1  

    每经过循环体一次,循环体内的i减去1,因而i-=1写在print语句前和语句后都一样!

    2.请写出与10 < cost < 50等价的表达式

    3.Python3中,一行可以书写多个语句吗?

    4.Python3中,一个语句可以分成多行书写吗?

    5.请问Python的and操作符和C语言的&&操作符有何不同?

    6.听说过“短路逻辑(short-circuitlogic)”吗?

    动动手:

    0. 完善第二个改进要求(为用户提供三次机会尝试,机会用完或者用户猜中答案均退出循环)并改进视频中小甲鱼的代码。

    1.尝试写代码实现以下截图功能:

     

     2.尝试写代码实现以下截图功能:

     

    答案:

    测试题:

    0. 请问以下代码会打印多少次“我爱鱼C!”

    死循环,会一直打印我爱鱼C(嗯,这也算是永远支持鱼C的方法之一),直到崩溃或者用户按下快捷键 CTRL + C(强制结束)
    造成死循环的原因是 while 后边的条件永远为真(True),在 Python 看来,只有以下内容会被看作假(注意冒号括号里边啥都没有,连空格都不要有!):False None 0 "" '' () [] {}
    其他一切都被解释为真!
    不妨试试:

    while '':
        print('进入循环')
    print('退出循环')
    while Flase:
        print('进入循环')
    print('退出循环')

    或者:

    while 0:
        print('进入循环')
    print('退出循环')   

    1.请问以下代码会打印多少次“我爱鱼C!” 

    10次,每次循环i减1,10次后i=0,while语句不成立,停止打印。

    2.请写出与10 < cost < 50等价的表达式

    (cost > 10) and (cost < 50)  

    3.Python3中,一行可以书写多个语句吗?

    可以。如果有括号(小括号{}、中括号[]、大括号()),可以在任意地方断行。如果没有,需要在断开的地方添加 字符,表示这一行尚未结束。例如:

    >>> d={
        1,
        2
        }
    >>> d
    {1, 2}
    >>> print(d)
    {1, 2}
    >>> a=1;b=2
    >>> c=a+
           b
    >>> c
    3

    一行过长的语句可以使用反斜杠或者括号分解成几行,不妨试试

    >>> 3 < 4 and 1 < 2
    True
    >>> 3 < 4 and 
        1 < 2
    True
    >>> (3 <4 and
         1 < 2)
    True

    4.Python3中,一个语句可以分成多行书写吗?

    可以。

    5.请问Python的and操作符和C语言的&&操作符有何不同?

    and 布尔”与” ——如果aFalse(a and b)返回False,否则它返回b的计算值。
    or 布尔”或” —— 如果aTrue(a or b)返回True,否则它返回b的计算值。
    not 布尔”非” —— 如果aTruenot a 返回False。如果aFalsenot a返回True
    在C中,0&&3 = 0,1&&3 = 1。在python中,,0 and 3 = 0,1 and 3 = 3。

    >>> 0 and 3
    0
    >>> 1 and 3
    3
    >>> 1 or 3
    1
    >>> 0 or 3
    3

    6.听说过“短路逻辑(short-circuitlogic)”吗?

    逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。举个例子,表达式 a and b,需要 a 和 b 两个变量同时为真(True)的时候,结果才为真。             因此,如果当 a 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 b 变量的值。 这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation) 这种行为同样也应用与 or 操作符。

    逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,举个例子,表达式 x and y,需要 x 和 y 两个变量同时为真(True)的时候,结果才为真。因此,如果当 x 变量得知是假(False)的时候,表达式就会立刻返回 False,而不用去管 y 变量的值。
    这种行为被称为短路逻辑(short-circuit logic)或者惰性求值(lazy evaluation),这种行为同样也应用与 or 操作符,这个后边的课程小甲鱼会讲到,不急。
    实际上,Python 的做法是如果 x 为假,表达式会返回 x 的值(0),否则它就会返回 y 的值(例子参考楼上那题)。

    值得注意的是 0 代表的是False。and式子是同真为真,or式子是有真为真。

    也就是说,判断式子是否为真,and 式子中a都为false了,还管b干嘛,无论它是真是假,and式子都为假了。or式子中a都为true了,还管b干嘛,无论它是真是假,or式子都为真了。

    动动手:

     0. 完善第二个改进要求(为用户提供三次机会尝试,机会用完或者用户猜中答案均退出循环)并改进视频中小甲鱼的代码。

    import random
    secret = random.randint(1,10)
    i = 3
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    number = int(temp)
    while i > -1: #并不意味着在这里 i=0 时,判断语句就会为False;单独写个 while 0: 才是False。
          if number == secret:
                print("哇草,你是小甲鱼心里的蛔虫吗?")
                print("哼,猜中了也没有奖励")
                break
          else:  
                if number < secret:
                      print("小了小了")
                else:
                      print("大了大了")
                #次数的判断 就可以用if-else语句!!!     
                if i != 0:
                      temp = input("请重新猜,还有"+ str(i) +"机会:")
                      number = int(temp)
                else:
                      print("三次机会已用完,游戏结束")
                       
                i = i - 1 #为什么i>-1 因为i=1 时还要有一次机会,这里执行了i-1 此时i等于0 要使判断语句为True。
                  

     !!!! if 不是循环体!!!!!

    以下是大佬提供的简化版本,学习了。

    import random
    secret = random.randint(1,10)
    i = 3
    number = int(input("不妨猜一下小甲鱼现在心里想的是哪个数字:"))
    while i > -1:
          if number == secret:
                print("哇草,你是小甲鱼心里的蛔虫吗?
    哼,猜中了也没有奖励")
                break
          else:
                print("小了小了") if number < secret else print("大了大了")
                number = int(input("请重新猜,还有"+ str(i) +"机会:")) if i != 0 else print("三次机会已用完,游戏结束")
          i -= 1

    使用了三元运算符和自运算等等的简化版本。
    最好少用三元运算符,因为这是个不好的习惯,这会导致你的代码可读性极差。

    以下是小甲鱼的代码!

    import random
    times = 3
    secret = random.randint(1,10)
    print('------------------我爱鱼C工作室------------------')
    # 这里先给guess赋值(赋一个绝对不等于secret的值)
    guess = 0
    # print()默认是打印完字符串会自动添加一个换行符,end=" "参数告诉print()用空格代替换行!
    # 嗯,小甲鱼觉得富有创意的你应该会尝试用 end="JJ"?
    print("不妨猜一下小甲鱼现在心里想的是哪个数字:", end=" ")
    while (guess != secret) and (times > 0):# 先前定义guess为0 有此妙用 直接可以输入一次数字。将接下来两行代码纳入循环体系,减少了代码量。
        temp = input() #因为end=“ ” 所以在print输出到屏幕的语句后面直接输入
        guess = int(temp)
        times = times - 1 # 用户每输入一次,可用机会就-1
        if guess == secret:
            print("我草,你是小甲鱼心里的蛔虫吗?!")
            print("哼,猜中了也没有奖励!")
        else:
            if guess > secret:
                print("哥,大了大了~~~")
            else:
                print("嘿,小了,小了~~~")
            if times > 0:
                print("再试一次吧:", end=" ")
            else:
                print("机会用光咯T_T")
    print("游戏结束,不玩啦^_^")

    值得学习的思维方式有两点:其一 在while循环外用print,并用了end,循环体内用了input(),后面的代码print("再试一次",end" "),与input很好的切合,以便于在用户输入数字前可以写不同的说明语句。其二 while判断语句中 and的用法 同时结合了guess等于0 这一妙用。其实这里不必要用and也可以实现。总有条件下可以用到的,学到啦!!

    通过实践证明,在if-else中,先判断输入是否一样,会方便许多。

    1. 尝试写代码实现以下截图功能:

    temp = input('请输入一个整数:')
    number = int(temp)
    i = 1
    while number:
        print(i)
        i = i + 1
        number = number - 1

    2. 尝试写代码实现以下截图功能:

    temp = input('请输入一个整数:')
    number = int(temp)
    while number:
        i = number - 1
        while i:
            print(' ', end = '')
            i = i - 1
        j = number
        while j:
            print('*', end = '')
            j = j - 1
        print()
        number = number - 1

    谈一谈我对这一段程序的理解:先观察最终实现的效果图,结合代码,很清楚的知道,3个循环体分别代表的含义,外循环表明有多少行,内循环,一个循环打出空格,一个循环打出*(星号),各个循环自成一体,所以都会有类似于 i -= 1的代码,以便终止当前循环。而end = " ",因为空格和*是一个一个循环打出的,所以是避免换行。而两次内循环的结束,print()语句实现了换行。

    简化版本:

    temp = input("输入一个数字:")
    number = int(temp)
    while number:
          print(" "*(number-1) + "*"*number)
          number -= 1

    补充:

    称述:在写程序的时候,不小心将 -=写成了 =- 因而程序并没有得到想要的结果,过后我查阅了相关的资料,可以借鉴这一网址:网址(多看两遍就明白了)

    >>> a = 2
    >>> b = a
    >>> id(a)
    140728562340928
    >>> id(b)
    140728562340928
    >>> a = a + 3
    >>> id(a)
    140728562341024
    >>> id(b)
    140728562340928
    
    >>> c = 5
    >>> d = 5
    >>> id(c)
    140728562341024
    >>> id(d)
    140728562341024
    >>> c += 1
    >>> id(c)
    140728562341056
    >>> id(d)
    140728562341024

    这一部分首先要理解python内存机制,Python中万物皆对象。

    对于不可变对象,改变了原来的值,其别名(变量名)绑定到了新值上面,id肯定会改变

    >>> aa = [3,4,5]
    >>> bb = aa
    >>> id(aa)
    3007589114056
    >>> id(bb)
    3007589114056
    >>> aa = aa + [10]
    >>> id(aa)
    3007588801672
    >>> id(bb)
    3007589114056
    >>> aa
    [3, 4, 5, 10]
    >>> bb
    [3, 4, 5]

    对于可变对象,+ 操作改变了值,id肯定会变,而+= 是本地操作,其值原地修改

    >>> aa = [3,4,5]
    >>> bb = aa
    >>> id(aa)
    1985188852296
    >>> id(bb)
    1985188852296
    >>> aa += [10]
    >>> aa
    [3, 4, 5, 10]
    >>> bb
    [3, 4, 5, 10]
    >>> id(aa)
    1985188852296
    >>> id(bb)
    1985188852296
    >>> cc = [2,3,4]
    >>> dd = [2,3,4]
    >>> id(cc)
    3007586184840
    >>> id(dd)
    3007589046728
    >>> cc += [0]
    >>> cc
    [2, 3, 4, 0]
    >>> id(cc)
    3007586184840
    >>> dd = dd + [0]
    >>> dd
    [2, 3, 4, 0]
    >>> id(dd)
    3007589105160

    对于+号操作,可变对象和不可变对象调用的都是__add__操作

    对于+=号操作,可变对象调用__add__,不可变对象调用的是__iadd__(不可变对象没有__iadd__)   __iadd__是原地修改

     总结一下:对于不可变的对象,例如数字啥的,你用 a = a + 10,亦或者用 a += 10的形式 其id值都会发生改变。而对于可变的对象,例如列表之类的,这里有另种情况要讨论,<1>aa = bb的前提下,aa 和bb的id是相同的,用 aa = aa + [10] 的形式只会改变aa的id,bb的id还是原来的id,不会改变;倘若用aa += [10]的形式,aa和bb的值会同时发生改变,但aa和bb的id还是原来的味道,不会改变!!!<2>cc = [2,3,4] dd = [2,3,4]的前提下,虽然两者的值相同,但是他俩的id是不同的,不同的!!!不明白的看看上面的例子就懂了。好绕,多看两遍就记在心中了,emmm。脑阔痛。

    爱笑的男孩运气都不会差
  • 相关阅读:
    [BJWC2018]Border 的四种求法
    [51nod1847]奇怪的数学题
    [51nod1965]奇怪的式子
    [BZOJ3283]运算器
    [TJOI2015]概率论
    [SDOI2017]遗忘的集合
    [HDU5709]Claris Loves Painting
    [Atcoder AGC032C]Three Circuits
    [Atcoder ARC103D]Robot Arms
    [Atcoder AGC030C]Coloring Torus
  • 原文地址:https://www.cnblogs.com/DC0307/p/9361799.html
Copyright © 2011-2022 走看看