纪念我的第一个Python程序:猜数字


前言

新高一学生一枚,这几天网课时自学了下Python(就是那些最简单的输出输入),写了个猜数字,又认识到CSDN这个平台,发个贴纪念下
如果有啥错了的,还请各位大佬指教,感激不尽!!!


一、猜数字1.0

在小学的时候,我们一群小孩子拿着纸写数字让别人猜,那时还觉得很带劲(当然现在不玩了),当我学了print和if后,寻思着貌似理论上应该可以拿Python复原一个出来,于是就开始慢慢摸索

在小学时,有人会在纸上写一个数字,同理,我们需要随机生成一个数字,所以就有了

from random import randint
     num = randint(0,500)
     print('''Guess which number I'm thinking ?     Tips:The range is between 0 and 500''')
     bingo = False
     
     
     while bingo == False:
          answer = int(input() )
          if answer < num:
               print('%s is too small'% answer)

          if answer == num:
               print('''Bingo!You are right! 
               Print the number you have printed for a half might be a good choice to finish this game puickly
''')
               bingo = True
          if answer > num:
               print('%s is too big'% answer)

我承认,因为是第一次写这种程序,更多的是从网上一步一步看着写下来的,所以出来print的内容,其它的都不是原创。但是当它真正运行起来的时候,喜悦之情难以言表,就和最初成功print出“hello world”时的心情,很好奇,很兴奋。

二、猜数字2.0

写2.0版的时候有了个奇思妙想,既然if可以判断输入,那有没有可能,可以加一个步骤,让游戏者可以选择难易程度呢?
抱着试一试的想法,我试着在from random import randint前加上判断的选项,于是:

print('''Which level do you want to choose:
Easy: print 1 
Difficult :print 2''') 
a = int(input() ) 
if a == 1:
	.....
	.....
	.....
	.....
if a == 2:
	.....
	.....
	.....
	.....

结果一运行,真的能行,而且还没报错!而唯一的缺点就是重复的代码太多了(强迫症震怒),尤其是在判断大小那一块,要是能用一个东西表示就好了,像数学里的换元法一样。

三、猜数字2.2

略过2.1版本,和2.2差别不大,主要是bug修复

在写2.2的时候,我遇见了Pycharm,真就一见钟情,太好用了,最喜欢它的换行和代码检查功能,就是没法撤回很难受(或者说我不知道咋撤回?)

进入正题,因为需要是简化代码,重复执行,我学习到了函数这个东西,函数和数学里的意思差不多,但使用更加灵活,以至于我理解了好长时间。搞出来了个这玩意:

def f(x, y):
    if x < y:
        print('%s is too small' % x)
        return False

    if x == y:
        print('''Bingo!You are right!

"二分法"might be a good choice to finish this game quickly
''')
        print('Do you want to try again?')
        print('''print "0" to play again''')
        m = int(input())
        if m == 0:
            g()
        return True
    if x > y:
        print('%s is too big' % x)
        return False

print('''Which level do you want to choose(取值范围不同):
简单 请输入1 
困难 请输入2''')  
a = int(input())
if a == 1:
    from random import randint

    num = randint(0, 500)
    print('''Guess which number I'm thinking ?     Tips:The range is between 0 and 500''')
    win = False
    count = 0

    while win == False:
        count += 1
        answer = int(input())
        win = f(answer, num)

if a == 2:
    from random import randint

    num = randint(0, 2000)
    print('''Guess which number I'm thinking ?     Tips:The range is between 0 and 2000''')
    win = False
    count = 0

    while win == False:
    	count += 1
        answer = int(input())
        win = f(answer, num)

感觉困难的是在理解函数后面括号的值啥意思。我把它理解成一个“需要我去定义的一个东西”,这样在后续使用的时候,可以自行计算。

好比数学里的f(x)=x+1。此时令x = 1,则f(x) = 2,一个思路

这个版本中还加入了计分设置,也是从网上学的,却没想到坑了2.3版本

2.3版本,我试着加入另一个函数,从而更加简化代码,但是,两个函数的count没法共用,就一个问题一个问题的冒出,最后一不小心又全删了【微笑】,没办法,从头再来吧!

这里的主体的代码还是从网上学习,一字一句码下来的,但是在一些小地方已经有自己的思路了,所以就给我了继续更新下去的动力。此时的目的倒不是说为了玩游戏,更多的是在写这个程序中练习Python的语法。

四、猜数字3.0

上文说到,我把猜数字的2.3代码不小心删了,2.2的代码也不知道放哪去了,于是只得重写一份。

查找问题的原因,我就学习到了global,这家伙能让一个变量全局使用(我这么理解的),的亏了它,让整个程序得以成功运行。

global count

在运行时,我又觉得在后面的显示太突兀了,瞬间来几条print,眼睛看不过来,于是学习到了如何让程序停止几秒钟

import time
time.sleep(1

此时我还发现…Python3.10.8好似可以直接输入中文(2.2的时候还没注意到),所以全部汉化了。

于是,猜数字3.0长这样:

import time

count = 0



def g():
    print('''您想体验哪个难度的游戏 :
    简单 请输入1  
    困难 请输入2   ''')
    a = int(input())

    if a == 1:
        print('您可以输入2来获得取值范围,如果不想知道取值范围,请输入1')
        b = int(input())
        if b == 2:
            print('0到800之间')
            from random import randint
            num = randint(0, 800)
            print('''猜猜我在想哪个数字 ?  ''')
            bingo = False

            while bingo == False:
                global count
                count += 1
                answer = int(input())
                bingo = f(answer, num)

        if b == 1:
            from random import randint
            num = randint(0, 800)
            print('''猜猜我在想哪个数字 ?  ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)

    if a == 2:
        print('您可以输入2来获得取值范围,如果不想知道取值范围,请输入1')
        c = int(input())
        if c == 1:
            from random import randint
            num = randint(0, 2400)
            print('''这是困难模式,猜猜我在想哪个数字 ? ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)

        if c == 2:
            print('取值范围是0到2400')
            from random import randint
            num = randint(0, 2400)
            print('''这是困难模式,猜猜我在想哪个数字 ? ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)


def f(x, y):
    global count
    if x < y:
        print('%s 太小了,试着猜大一点' % x)

        return False

    if x == y:
        print('''恭喜你,猜对了! 不妨试一下“二分法”,这可以加快猜数字的速度''')
        time.sleep(1)
        print('''您输入了 %d 次''' % count)
        print('想再来一次吗?')
        time.sleep(0.7)
        print('''输入“0”再来一局''')
        m = int(input())
        if m == 0:
            g()
        return True
    if x > y:
        print('%s 太大了,不妨猜小一点试试' % x)

        return False


g()

(所以这个程序只有一个g(),在运行是吧)

五、猜数字3.8

没错直接从3.0跑到了3.8,其原因是因为没时间上CSDN,学习任务还是有点多的。

进入正题,我改进的第一个方向就是加了一个自定义范围的模式,长这样:

if a == 3:
     print('您可以自定义取值范围')
          j = int(input('请输入最小范围:'))
          k = int(input('请输入最大范围:'))
          h = ('%s ,%s' % (j, k))
          y(j, k)
          print('猜猜我在想你规定范围内的哪个数字')
          bingo = False
  
          while bingo == False:
              count += 1
              answer = int(input())
              bingo = f(answer, num)

之所以有这个灵感,是因为我每次调试新功能时,都要一个个去猜,耗费时间还没准报错,在
pycharm代码检查时还查不出来,所以加上这个功能后,调试会舒服很多。

这个功能加上去后就鸽了好一段时间了,不得不感叹啊,高中生活实在是超出了我在初中的想象,直到我某个中午睡觉起来,突然想到能不能给它加一个记录战绩的功能,于是一番学习,就有了:

        if w == 1:
            q = datetime.datetime.now()
            file = open('E:\\猜数字战绩.txt', 'a')
            file.write('%s\n%s 在 (%s) 范围下 输入了 %d 次 最终答案是%s\n\n ' % (q, name, h, count, num))
            file.close()
            print('战绩已保存至E盘')
            time.sleep(0.7)
            print('想再来一次吗?')
            time.sleep(0.7)
            print('''输入“0”再来一局''')
            m = int(input())
            if m == 0:
                g()
            return True

        if w == 2:
            print('想再来一次吗?')
            time.sleep(0.7)
            print('''输入“0”再来一局''')
            m = int(input())
            if m == 0:
               g()
            return True

###这一大堆代码是最终的结果,里面有些内容是还没交代的,我在后文中会说

是的,在这个保存战绩的代码里面,我加入了保存玩家名字,保存玩的时间的功能,虽然不得不承认,我发布这个程序到我们班同学群里,没几个人下载(其实我也不怎么玩),但是这让游戏的可玩性增强了,还有更多我自己的点子。嗯……到这里代码基本上都是我自己写出来的了,也让我有了更大的自信继续下去。

之后呢,我在学校发的书上看见了清屏的功能,就是这玩意:

import os 
os.system("cls")

这波,灵感不就来了吗,我在先前代码,就是那个g()上面加上了这行代码,这样再来一次时会更加简洁。

但是,在我第一次测试的时候(没错,我鸽了大概2周才测试最新的游戏),直接报错,试了无数个global,但是就是没法展现分数,在那一栏是空白的。

经过我大概2个小时的摸索,干脆在新建一个函数,让他来代替保存战绩中“保存值域”的功能,这可不容易哦,一个全局变量折腾好久,报错好多次,最后结果是这样:

def y(ka, kb):
    global num
    num = randint(ka, kb)
    ......
    ......
    ......
    h = ('%d ,%d' % (m, n))

解决方案就是:把那个h给global了四五次,因为不知道哪里该用哪里不该用,好在最后成了。

再就是加入了音效,这个没啥好说的,增强游戏体验?感觉没有GUI来的快,但是我还不会搞GUI界面,没办法先放一下咯。

最后展现一下3.8的全部代码:

import os
import time
import datetime

count = 0
global num, h  # h为取值范围


def y(ka, kb):
    global num
    num = randint(ka, kb)


def g():
    global num, count, h
    print('''您想体验哪个难度的游戏 :
          简单 请输入1   
          困难 请输入2  
          自定义 请输入3''')
    a = int(input())

    if a == 1:
        m = 0
        n = 800
        h = ('%d ,%d' % (m, n))
        y(m, n)
        print('您可以输入2来获得取值范围,如果不想知道取值范围,请输入1')
        b = int(input())
        if b == 2:
            print('%d 到 %d 之间' % (m, n))
            print('''猜猜我在想哪个数字 ?  ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)

        if b == 1:
            from random import randint
            num = randint(m, n)
            print('''猜猜我在想哪个数字 ?  ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)

    if a == 2:
        ma = 0
        mb = 2400
        y(ma, mb)
        h = ('%d ,%d' % (ma, mb))
        print('您可以输入2来获得取值范围,如果不想知道取值范围,请输入1')
        c = int(input())

        if c == 1:
            print('''这是困难模式,猜猜我在想哪个数字 ? ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)

        if c == 2:
            print('%d 到 %d 之间' % (ma, mb))
            print('''这是困难模式,猜猜我在想哪个数字 ? ''')
            bingo = False

            while bingo == False:
                count += 1
                answer = int(input())
                bingo = f(answer, num)

    if a == 3:
        print('您可以自定义取值范围')
        j = int(input('请输入最小范围:'))
        k = int(input('请输入最大范围:'))
        h = ('%s ,%s' % (j, k))
        y(j, k)
        print('猜猜我在想你规定范围内的哪个数字')
        bingo = False

        while bingo == False:
            count += 1
            answer = int(input())
            bingo = f(answer, num)


def f(x, y):
    global count, name, num, h
    if x < y:
        playsound('Windows Default.wav')
        print('%s 太小了,试着猜大一点' % x)

        return False

    if x == y:
        playsound('tada.wav')
        print('''恭喜 %s ,猜对了! 不妨试一下“二分法”,这可以加快猜数字的速度''' % name)
        print('''您输入了 %d 次''' % count)
        print('您是否想保存记录至E盘 1 保存 2 不保存')
        w = int(input())
        if w == 1:
            q = datetime.datetime.now()
            file = open('E:\\猜数字战绩.txt', 'a')
            file.write('%s\n%s 在 (%s) 范围下 输入了 %d 次 最终答案是%s\n\n ' % (q, name, h, count, num))
            file.close()
            print('战绩已保存至E盘')
            time.sleep(0.7)
            print('想再来一次吗?')
            time.sleep(0.7)
            print('''输入“0”再来一局''')
            m = int(input())
            if m == 0:
                os.system("cls")
                g()
            return True

        if w == 2:
            print('想再来一次吗?')
            time.sleep(0.7)
            print('''输入“0”再来一局''')
            m = int(input())
            if m == 0:
                os.system("cls")
                g()
            return True

    if x > y:
        playsound('Windows Default.wav')
        print('%s 太大了,不妨猜小一点试试' % x)

        return False


name = input('您的游戏名是 :')
from random import randint
from playsound import playsound

g()

OK,这就是3.8更新的内容了,主要就是功能更新,希望下次能有更多好功能加进去吧!!!
更新日志:
1.增加自定义难度模式,玩家可以自己选择范围
2.新定义函数 h(ka,kb),方便简化后续代码
3.新增了保存战绩功能
4.增加了猜错与猜对音效
5.增加了os函数,使“再来一次”时可以删除之前操作的过程,使界面更简洁
6.加强了全局函数的引用
7.优化了部分代码和中文,删除了无效代码
8.修复了一大堆bug

感谢您的阅读,祝您生活愉快,事事顺意!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值