鱼C论坛

 找回密码
 立即注册
查看: 2777|回复: 6

[技术交流] 新人贴!!python菜鸟学习笔记之我遇到的问题与反思(第四课:改进我们的小游戏)

[复制链接]
发表于 2019-1-11 11:27:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        本人菜鸟  刚刚学习python,刚刚学到第四课,纯雏鸟一只,这里谈谈我的学习理解和我遇到的错误问题以及反思,有不妥之处还请大神老鸟们指出,也希望广大菜鸟们能将自己写代码中遇到的问题分享下,不胜感激!!
        本人遇到的问题主要是针对课件中的游戏代码改进,这里先将题目发下:、

        游戏名:猜猜小甲鱼(哈哈)心里想的是什么数字。
        游戏要求:
                1.用户提供三次机会尝试,机会用完或者用户猜中答案均退出游戏(即循环)
                2.小甲鱼心里想的数字为随机生成的整数,范围(1,10),调用random模块中的randint()函数;
                3.使用while循环完成(我只学到while循),if else分支语句,也可使用逻辑符and
                4.当玩家猜错时,比较猜错数值和随机生成的数字的数值,提示玩家数值是打了还是小了

下面说下本人在未看到课后习题答案自己写的代码,这里先称为方法1:
import random
secret = 5
frequency = 0
print ('----------------我爱鱼c工作室----------------')
temp = input('不妨猜一猜小甲鱼现在心里想的是哪个数字:')
guess = int(temp)
while guess != secret:
    frequency=frequency + 1
    attempt = str(3 - frequency)
    if frequency <= 2:
        if guess > secret:
            temp = input('哥,大了大了~~,还有'+attempt+'次机会,再试试吧:')
        else:
            temp = input('哥,小了小了~~,还有'+attempt+'次机会,再试试吧:')
        guess = int(temp)
    else:
        print('你个笨蛋,没机会了,游戏结束,滚!!!')
        break;
if guess == secret:
    if frequency == 0:
        print ('卧槽,你是小甲鱼心里的蛔虫吗?!')
        print ('哼,猜中了也没有奖励!')
        print('游戏结束,^-^')
    else:
        print('呦吼吼,猜对啦!')
        print('游戏结束,^-^')

        在方法一这段代码中,本人是通过分布判断的方法来完成游戏的功能要求,while的循环条件为guess != secret,即猜想的答案guess不等于答案secret,进入while循环;如guess == secret跳出while循环,进入if条件分支在判断。在这里本人自己添加了一个为玩家显示还有几次游戏尝试的功能,使用frequency来表示,并使用str()转换frequency,将frequency从int类型转换为string类型并赋值给变量attempt,再在input中使用连接字符+实现功能显示。
同时改进了游戏中的逻辑正确性,即只有一次猜中答案才会print ('卧槽,你是小甲鱼心里的蛔虫吗?!');print ('哼,猜中了也没有奖励!') {操,第一次都猜错了还啥子蛔虫哦,要的就是一发入魂 }

        在本段代码中,本人遇到的错误是python中拼接功能的使用问题,在一开始的尝试中为设置变量attempt,直接使用frequency拼接字符串,结果报错,错误代码如下:
                temp = input('哥,大了大了~~,还有'+frequency+'次机会,再试试吧:')       
        教训与总结:在python中拼接的使用只能在同一种类型中使用,不同类型中使用会出现TypeError(类型错误)报错!

接下来说说小甲鱼提供的代码:
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):
    temp = input()
    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("游戏结束,不玩啦^_^")


        说下本人在看到这段代码时的感受,1.加深了对and逻辑运算符的使用的理解,并导致本人之后一系列错误的罪恶之源
                                                           2.对guess先赋值为0以便程序直接在while循环中完成全部判断表示有想法;
                                                           3.首次知道print()默认是打印完字符串会自动添加一个换行符 以及不换行的方法;
                                                           4.python中对代码的注释使用#;
                                                           4.虽然现在小甲鱼比我牛逼,但本人是不承认的,打不打得过先打了再说!


说干就干,于是本人的第一次尝试出炉,这里称为方法二:
import random
secret = random.randint(1,10)
opportunity = 2
guess = 0
print('------------------我爱鱼C工作室------------------')
print('不妨猜一下小甲鱼现在心里想的是哪个数字:',end=' ');temp = input()
while (opportunity > 0) and (guess != secret):
    guess = int(temp)
    times = str(opportunity)
    if opportunity > 0:
        if guess > secret:
            temp = input('哥,大了大了~~,还有'+times+'次机会,再试试吧:')
            opportunity = opportunity - 1
        else:
            if guess < secret:
                temp = input('哥,小了小了~~,还有'+times+'次机会,再试试吧:')
                opportunity = opportunity - 1
    else:
        opportunity = opportunity - 1
if  opportunity == 0:
    print('你个笨蛋,没机会了,游戏结束,滚!!!')
else:
    if opportunity == 2:
        print ('卧槽,你是小甲鱼心里的蛔虫吗?!')
        print ('哼,猜中了也没有奖励!')
    else:
        print('呦吼吼,猜对啦!')
print('游戏结束,^-^')

        于是我的噩梦来了,万恶之源开始!一开始跑的时候还没有发现问题,觉得还口以。然后在翻看笔记温习时突然发现, 呦,不对呀!重新跑了代码,将secret改为常数5,在前两次输出错误后,第三次输入5时,打印的结果还是 “你个笨蛋,没机会了,游戏结束,滚!!!”。然后我就找啊找啊,着了半天才发下我的问题所在,那就是:我的第三次输入是无效的!!!问题的根源在于我的guess = int(temp)是放在while循环中的,当第三次输入时,opportunity值为0,无法进入while循环中,也就是说当我再IDLE中运行这段程序时,再第三次输入的结果可以返回给变量temp,但guess无法获得temp的值。于是第三次运行时guess的值还是我在第二次输入的结果,这就导致了第三次输入无效的结果。

既然问题找到了,那就改呗,于是我的第三个代码出现,这里称为方法三:
import random
secret = random.randint(1,10)
opportunity = 2
guess = 0
print('------------------我爱鱼C工作室------------------')
print('不妨猜一下小甲鱼现在心里想的是哪个数字:',end=' ');temp = input()
while (opportunity > 0) and (guess != secret):
    guess = int(temp)
    times = str(opportunity)
    if guess > secret:
            temp = input('哥,大了大了~~,还有'+times+'次机会,再试试吧:')
            opportunity = opportunity - 1
    else:
            if guess < secret:
                    temp = input('哥,小了小了~~,还有'+times+'次机会,再试试吧:')
                    opportunity = opportunity - 1
guess = int(temp)
if (opportunity == 0) and (guess!= secret):
    print('你个笨蛋,没机会了,游戏结束,滚!!!')
else:
    if opportunity == 2:
        print ('卧槽,你是小甲鱼心里的蛔虫吗?!')
        print ('哼,猜中了也没有奖励!')
    else:
        print('呦吼吼,猜对啦!')
print('游戏结束,^-^')

        在这段代码中,我的改进思路与遇到的新问题:1.既然第三次输入结果无效的原因是出现在guess变量无法获取到第三次输入的结果,而造成这一结果
                                                                              的原因是我的guess获取值的路径只在while循环中,那我就在while循环外后面添加一句guess =
                                                                              int(temp)就可以重新获取了;       
                                                                           2.将while后面的if  opportunity == 0改为if (opportunity == 0) and (guess!= secret),不然出现的问题               
                                                                              将是第三次输入的结果guess能够获取,但opportunity在第三次输入时已经为0,这就造成最后的结果
                                                                              还是print('你个笨蛋,没机会了,游戏结束,滚!!!'),故需添加guess !=secret这一条件。

       
代码写完,问题也解决了,但是心里还是不舒服的,主要是代码显得太过碎片,这与python提倡的简洁有效是不符的,于是有了下面的代码,方法四:
import random
secret = random.randint(1,10)
opportunity = 2
guess = 0
print('------------------我爱鱼C工作室------------------')
print('不妨猜一下小甲鱼现在心里想的是哪个数字:',end=' ');temp = input()
while (opportunity >= 0) and (guess != secret):
    guess = int(temp)
    times = str(opportunity)
    if opportunity > 0
        if guess > secret:
            temp = input('哥,大了大了~~,还有'+times+'次机会,再试试吧:')
            opportunity = opportunity - 1
        else:
            if guess < secret:
                temp = input('哥,小了小了~~,还有'+times+'次机会,再试试吧:')
                opportunity = opportunity - 1
    else:
        opportunity = opportunity - 1
if (opportunity < 0) and guess != secret:
    print('你个笨蛋,没机会了,游戏结束,滚!!!')
else:
    if opportunity == 2:
        print ('卧槽,你是小甲鱼心里的蛔虫吗?!')
        print ('哼,猜中了也没有奖励!')
    else:
        print('呦吼吼,猜对啦!')
print('游戏结束,^-^')

        在这段代码中,我的改进思路主要是解决只使用一个guess = int(temp),即直接在while循环内完成全部三次数值的获取。改进的关键在于while循环中
opportunity的条件判断与while循环下面大if条件分支中opportunity的条件判断。方法二、三中第三次输入之所以guess无法在while循环中获取而需要在while循环外获取的原因就在于while条件中opportunity > 0 ,而第三次输入时opportunity的值是0.既然如此那我就改变while中opportunity为opportunity >= 0,这样玩家第三次输入的结果guess就可以直接在while循环中        获取而不需要跳出while循环额外添加guess = int(temp)来获取了。
        于此同时第三次输入为最后一次机会,第三次输入后只有两种结果:1.正确:print('呦吼吼,猜对啦!');2.错误:print('你个笨蛋,没机会了,游戏结束,滚!!!')。由于我改变了while中opportunity的条件为opportunity为opportunity >= 0,这样一来为实现不出现玩家输入第三次结果为错误时,还是进入判断大小打印'哥,大了大了~~,还有'+times+'次机会,再试试吧:' or '哥,小了小了~~,还有'+ti+'次机会,再试试吧:'  为此添加了if opportunity > 0:这一分支语句。同时添加else: opportunity = opportunity - 1(这里自己想吧,不会写了


       
你以为这就结束了吗?!!!

import random
secret = random.randint(1,10)
opportunity = 2
guess = 0
print('------------------我爱鱼C工作室------------------')
print('不妨猜一下小甲鱼现在心里想的是哪个数字:',end=' ');temp = input()
while (opportunity >= 0) and (guess != secret):
    guess = int(temp)
    times = str(opportunity)
    if opportunity > 0:
        if guess > secret:
            temp = input('哥,大了大了~~,还有'+times+'次机会,再试试吧:')
            opportunity = opportunity - 1
        else:
            if guess < secret:
                temp = input('哥,小了小了~~,还有'+times+'次机会,再试试吧:')
                opportunity = opportunity - 1
            else:
                if opportunity == 2:
                    print ('卧槽,你是小甲鱼心里的蛔虫吗?!')
                    print ('哼,猜中了也没有奖励!')
    else:
        opportunity = opportunity - 1
if (opportunity < 0) and guess != secret:
    print('你个笨蛋,没机会了,游戏结束,滚!!!')
else:
    if opportunity < 2:
        print('呦吼吼,猜对啦!')
print('游戏结束,^-^')
                               
        这是本人最后的改进代码,目的吗是将第一次的输入判断也放在while循环中完成。解释代码???不存在的,已敲到吐血  自己看吧

        最后再次声明,本人新人,第一次发帖,如有不妥之处请见谅,同时欢迎广大大神、老鸟、菜鸟和我这样的雏鸟分享自己的经验心得,这也是我不辞辛苦发帖的初衷,谢谢!!!
               
       

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
白衣剑客 + 5 + 5 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-11 11:39:25 | 显示全部楼层
记得点赞,各位老铁们
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-12 19:25:21 | 显示全部楼层
秀得我头皮发麻
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-14 11:35:21 | 显示全部楼层
同为学习新手,你的学习态度,令我汗颜
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-3 22:36:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-6 12:03:43 | 显示全部楼层
同为新手,我把我改进的帖上来共同学习
  1. import random


  2. def loop():
  3.     scc_ret = random.randint(1, 10)
  4.     print(scc_ret)
  5.     times = 3
  6.     guess = 0
  7.     while guess != scc_ret and times > 0:
  8.         print(f"你还有{times}次机会,", end="")
  9.         times = times - 1
  10.         temp = input("请输入1-10的整数:")
  11.         if len(temp) == 0:
  12.             print("你什么也没有输入!")
  13.         elif temp.isdigit() is False:
  14.             print(f"你输入的是 ”{temp}“ 不是数字.")
  15.         else:
  16.             guess = int(temp)
  17.             if guess == scc_ret:
  18.                 print(f"你输入的是 ”{temp}“ ")
  19.                 print(f"恭喜你猜对了.我隐藏的数字是 “{guess}” ^_^")
  20.                 break
  21.             else:
  22.                 if guess < scc_ret:
  23.                     print(f"你输入的是 ”{guess}“ 猜小了")
  24.                 else:
  25.                     print(f"你输入的是 ”{guess}“ 猜大了")
  26.         if times == 0:
  27.             print("你的机会用光了.")
  28.     new_loop()


  29. def new_loop():
  30.     print("是否重新开始?yes,y重新开始。no或n游戏结束。")
  31.     r = input("请输入:")
  32.     if r == "yes" or r == "y":
  33.         loop()
  34.     if r == "n" or r == "no":
  35.         print("游戏结束")


  36. if __name__ == '__main__':
  37.     print("猜猜我隐藏的数字是多少?")
  38.     loop()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-8-28 11:20:17 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 10:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表