前言
新高一学生一枚,这几天网课时自学了下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