python基础——经营第一个项目,如何将python学得更6 ?
Posted wakeyo_J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础——经营第一个项目,如何将python学得更6 ?相关的知识,希望对你有一定的参考价值。
python基础——经营第一个项目,如何将python学得更6 ?
hello!我是wakeyo_J,每天一个konwledge point,一起学python,让技术无限发散。
经营第一个项目,如何将python学得更6 ?
想要学好一门技术,最重要的是兴趣,兴趣是支持你前进的动力。
1. 明确项目目的
学了python的基础后,怎样编写出“人类高质量”的程序 ?一是自己的思维,二是循环往复+举一反三的练习。才能把python学得更6,进入正题:
古人云,“纸上得来终觉浅,绝知此事要躬行”,编程更是如此,要想编好程序,项目实战是成长最快的途径。我依稀记得当我第一次完成一个项目,有种“会当凌绝顶”的感觉,强大的成就感让自己有点膨胀。
学习python必不可少的是要做几个让自己满意的项目。
项目的设置,主要带大家了解专业程序员一般是如何思考和解决问题的,再一遍遍分析问题、拆解问题及解决问题,在整个过程中充分理解所学知识。运用所学知识,也会适当补充一些新知识,一起完成一个文字版的「奥特曼大战怪兽」。
好了,在开始我们的项目之前,我们先说一说一个项目一般是怎么完成的,说白了就是程序员是如何思考的。
1.1 项目实现步骤
(1)问题拆解
问题拆解就是说,在面对一个问题时,将一个大问题拆解成多个步骤或者多个方面,逐步解决,最后完成整个问题,达到所要结果。
其实,这种拆解问题的思维很常见,你也遇到过。比如,你需要洗衣服,怎么完成洗衣服呢? 1.把衣服放进洗衣机;2.倒入洗衣液;3.然后点击开始按钮;4.洗衣机洗衣服;5.晾衣服。
在编程中,我们拆解问题就需要按照编写代码的思维方式来拆解。
如:
明确项目目的,指的就是我们希望这个程序干什么,达到什么样的效果,从而帮助我们分析整个项目流程,拆解项目;然而,一个完美的拆解方案,应当是按照从上往下的逻辑自然拆解,难度逐渐增加;逐步解决问题,逐渐完善整个项目功能。
1.2 明确项目目的
这次我们要实现的是「奥特曼大战怪兽」,具体效果参考如下:
用文字描述一下,在这个游戏中,奥特曼(ATM)大战怪兽(BOSS),在这个游戏中,会随机生成奥特曼与怪兽的属性,相互攻击,直到有一方的血量为0。并且,这样的战斗采取三局两胜制,最后显示战斗结果,公布获胜方。
2. 分词流程,拆解项目
编写代码,谁都不能一步到位,尤其对于初入门的来说,逐步解决,逐渐完善才是最好的过程,按照“难度递增,功能叠加”的思路,将这个游戏拆解成三个版本。
版本1.0主要是帮我们理清战斗逻辑,而版本2.0与3.0会涉及到新的知识点,到时候再讲解。
3. 逐步解决,逐渐完善
3.1 版本1.0
理清战斗逻辑
在游戏中,都有哪些基础元素?
根据这些元素,我们要做的主要有三步:
1、规定奥尔特曼和怪兽的属性。
2、双方攻击时,失血量根据对方的攻击来计算。
3、如果有一方的血量减少到0以下,GAMEu3000OVER。
版本1.0流程图
- 设定【奥特曼】和【BOSS】的属性,及【血量】和【攻击力】。
print('【奥特曼】血量:100攻击力:25') # 自定义奥特曼角色的血量和攻击
print('【怪兽】血量:100攻击力:20') # 自定义怪兽角色的血量和攻击
- 双方攻击人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量75') #人工计算怪兽剩余血量100-25 = 75
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量80') #人工计算奥特曼剩余血量100-20 = 80
- 继续攻击,人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量50') #人工计算怪兽剩余血量75-25 = 50
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量60') #人工计算奥特曼剩余血量80-20= 60
- 继续攻击,人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量25') #人工计算怪兽剩余血量50-25= 25
print('怪兽向李逍遥发起了攻击,【奥特曼】剩余血量40') #人工计算奥特曼剩余血量60-20=40
- 继续攻击,人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量0') #人工计算怪兽剩余血量25-25=0,此时怪兽血量为0,怪兽死亡,游戏结束。
print('怪兽向李逍遥发起了攻击,【奥特曼】剩余血量20') #人工计算奥特曼剩余血量40-20=20
print('怪兽死了,奥特曼赢了')
完整代码
time.sleep()就是制作延迟效果的,让代码能够延迟出现,那我们就让代码延迟2s出现。
import time #调用time模块
print('【奥特曼】血量:100攻击力:25') # 自定义奥特曼角色的血量和攻击
print('【怪兽】血量:100攻击力:20') # 自定义怪兽角色的血量和攻击
print('-----------------------')
time.sleep(2)
print('奥特曼发起了攻击,【怪兽】剩余血量75') #人工计算怪兽剩余血量100-25 = 75
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量80') #人工计算奥特曼剩余血量100-20 = 80
print('-----------------------')
time.sleep(2)
print('奥特曼发起了攻击,【怪兽】剩余血量50') #人工计算怪兽剩余血量75-25 = 50
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量60') #人工计算奥特曼剩余血量80-20= 60
print('-----------------------')
time.sleep(2)
print('奥特曼发起了攻击,【怪兽】剩余血量25') #人工计算怪兽剩余血量50-25= 25
print('怪兽向李逍遥发起了攻击,【奥特曼】剩余血量40') #人工计算奥特曼剩余血量60-20=40
print('-----------------------')
time.sleep(2)
print('奥特曼发起了攻击,【怪兽】剩余血量0') #人工计算怪兽剩余血量25-25=0,此时怪兽血量为0,怪兽死亡,游戏结束。
print('怪兽向李逍遥发起了攻击,【奥特曼】剩余血量20') #人工计算奥特曼剩余血量40-20=20
print('-----------------------')
time.sleep(2)
print('怪兽死了,奥特曼赢了')
3.2 版本2.0
随机属性,自动PK
这个阶段,我们主要增加【随机属性】和【自动战斗】两个功能,画出流程图:
版本1.0中,我们自定义双方属性,这不等于暗箱操作吗。所以,为了公平起见,我们要让计算机随机生成双方属性。
授人以鱼不如授人以渔,我们要养成独立思考的习惯。遇到问题,问问度娘吗?看看度娘怎么说?
度娘有好多答案,点进第一个进去看看。
度娘告诉我们的答案。看到教程中,要生成随机数,要使用random随机数模块中的randint(a,b)函数,括号内为a,b两个数字为生成随机数的范围,a是小数字,b是大数字。
import random
#调用random模块
num = random.randint(1,100)
# 随机生成1-100范围内(含1和100)的一个整数,并赋值给变量a
print(num)
版本2.0要求
1、定义两个变量,用来存储奥特曼的血量和攻击力。
2、血量是100-150之间的随机数,攻击力是20-30之间的随机数。
3、打印两个变量。
import random
ATM_life = random.randint(100,150)
#表示奥特曼血量
ATM_attack = random.randint(20,30)
#表示奥特曼攻击
print(ATM_life )
print(ATM_attack)
import time
import random
#也可合并写成一行:import time,random
# 生成随机属性
ATM_life = random.randint(100,150) # “freeLi_life” 代表奥特曼血量
ATM_attack = random.randint(20,30) # “freeLi_attack” 代表奥特曼攻击
BOSS_life = random.randint(100,150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20,30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【奥特曼】\\n'+'血量:'+str(ATM_life)+'\\n攻击:'+str(ATM_attack))
#ATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
#暂停一秒再执行后续代码
print('【怪兽】\\n'+'血量:'+str(BOSS_life)+'\\n攻击:'+str(BOSS_attack))
print('------------------------')
实现“自动PK”
发现5-7这三行代码是重复出现的结构,除了数字是变化的,其余的一模一样。并且这3行代码出现了4次,解决重复工作用什么?
现在是奥特曼和怪兽双方互相攻击,到底要打斗多少次,我们不知道,打斗多长时间我们也不知道,我们只知道,有一个的血量为0时,战斗结束。也就是我们只知道循环的条件。OK。如何让这个循环一直执行,也就是双方的血量都大于0嘛。
while(ATM_life>0) and (BOSS_life>0) #and两边用()括起来,更方便大家阅读。
条件找到了,接下来就是while的循环体,双方互相攻击:
print('奥特曼发起了攻击,【怪兽】剩余血量XXX')
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量XXX')
其中【怪兽】剩余血量=怪兽当前血量-奥特曼攻击力,【奥特曼】剩余血量=奥特曼当前血量-怪兽攻击力
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
#赋值语句的执行顺序是先计算等号右边,再赋值给左边的变量
版本2.0 完整代码
import time
import random
#也可合并写成一行:import time,random
# 生成随机属性
ATM_life = random.randint(100,150) # “ATM_life” 代表奥特曼血量
ATM_attack = random.randint(20,30) # “ATM_attack” 代表奥特曼攻击
BOSS_life = random.randint(100,150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20,30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【奥特曼】\\n'+'血量:'+str(ATM_life)+'\\n攻击:'+str(ATM_attack))
#ATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
#暂停一秒再执行后续代码
print('【怪兽】\\n'+'血量:'+str(BOSS_life)+'\\n攻击:'+str(BOSS_attack))
print('------------------------')
# 自动PK阶段
while(ATM_life>0) and (BOSS_life>0):
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
print('奥特曼发起了攻击,【怪兽】剩余血量'+str(BOSS_life))
#ATM_life是整数,所以拼接时要先用str()转换
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量'+str(ATM_life))
print('------------------------')
time.sleep(2)
# 为了体现出战斗回合,这里停顿2秒
3.3 版本3.0
打印出每局结果,三局两胜打印最终战果。这就是版本3.0需要做的事情
打印战果,三局两胜。
版本3.0 新增功能
1、打印战果:每局战斗后,根据胜负平的结果打印出不同的提示。
2、三局两胜:双方战斗三局,胜局多的为最终赢家。
当奥特曼与怪兽PK的时候,血量都会开始递减,经过多次攻击,会出现如下结果。
增加这次战局结果的判定。
import time
import random
#也可合并写成一行:import time,random
# 生成随机属性
ATM_life = random.randint(100,150) # “ATM_life” 代表奥特曼血量
ATM_attack = random.randint(20,30) # “ATM_attack” 代表奥特曼攻击
BOSS_life = random.randint(100,150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20,30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【奥特曼】\\n'+'血量:'+str(ATM_life)+'\\n攻击:'+str(ATM_attack))
#ATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
#暂停一秒再执行后续代码
print('【怪兽】\\n'+'血量:'+str(BOSS_life)+'\\n攻击:'+str(BOSS_attack))
print('------------------------')
# 自动PK阶段
while(ATM_life>0) and (BOSS_life>0):
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
print('奥特曼发起了攻击,【怪兽】剩余血量'+str(BOSS_life))
#ATM_life是整数,所以拼接时要先用str()转换
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量'+str(ATM_life))
print('------------------------')
time.sleep(2)
# 为了体现出战斗回合,这里停顿2秒
# 打印战果
if ATM_life > 0 and BOSS_life <= 0:
print('怪兽挂了,奥特曼赢了')
elif ATM_life <= 0 and BOSS_life > 0:
print('悲催,怪兽把奥特曼干掉了!')
else:
print('哎呀,奥特曼和怪兽同归于尽了!')
三局两胜,怎么办?
双方3局2胜,得记录胜负的结果,那我们引入一个变量,来记录胜负得分结果,最后进行判断,输出战果。
import time
import random
# 也可合并写成一行:import time,random
for i in range(1, 4):
time.sleep(1) # 让局与局之间有较明显的有时间间隔
print(' \\n——————现在进行第' + str(i) + '局,3,2,1,go!——————') # 作为局的标记
# 生成随机属性
ATM_life = random.randint(100, 150) # “ATM_life” 代表奥特曼血量
ATM_attack = random.randint(20, 30) # “ATM_attack” 代表奥特曼攻击
BOSS_life = random.randint(100, 150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20, 30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【奥特曼】\\n' + '血量:' + str(ATM_life) + '\\n攻击:' + str(ATM_attack))
# ATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
# 暂停一秒再执行后续代码
print('【怪兽】\\n' + '血量:' + str(BOSS_life) + '\\n攻击:' + str(BOSS_attack))
print('------------------------')
# 自动PK阶段
while (ATM_life > 0) and (BOSS_life > 0):
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
print('奥特曼发起了攻击,【怪兽】剩余血量' + str(BOSS_life))
# ATM_life是整数,所以拼接时要先用str()转换
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量' + str(ATM_life))
print('------------------------')
time.sleep(2)
# 为了体现出战斗回合,这里停顿2秒
# 打印战果
if ATM_life > 0 and BOSS_life <= 0:
print('怪兽挂了,奥特曼赢了')
elif ATM_life <= 0 and BOSS_life > 0:
print('悲催,怪兽把奥特曼干掉了!')
else:
print('哎呀,奥特曼和怪兽同归于尽了!')
给计算机制定“计分牌”, 用于存放【奥特曼】和【怪兽】的每一局得分。
import time
import random
ATM_score = 0
# 存放奥特曼赢的局数。
BOSS_score = 0
# 存放怪兽赢的局数
for i in range(1, 4):
time.sleep(1) # 让局与局之间有较明显的有时间间隔
print(' \\n——————现在进行第' + str(i) + '局,3,2,1,go!——————') # 作为局的标记
# 生成随机属性
ATM_life = random.randint(100, 150) # “ATM_life” 代表奥特曼血量
ATM_attack = random.randint(20, 30) # “ATM_attack” 代表奥特曼攻击
BOSS_life = random.randint(100, 150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20, 30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【奥特曼】\\n' + '血量:' + str(ATM_life) + '\\n攻击:' + str(ATM_attack))
# ATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
# 暂停一秒再执行后续代码
print('【怪兽】\\n' + '血量:' + str(BOSS_life) + '\\n攻击:' + str(BOSS_attack))
print('------------------------')
# 自动PK阶段
while (ATM_life > 0) and (BOSS_life > 0):
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
print('奥特曼发起了攻击,【怪兽】剩余血量' + str(BOSS_life))
# ATM_life是整数,所以拼接时要先用str()转换
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量' + str(ATM_life))
print('------------------------')
time.sleep(2)
# 为了体现出战斗回合,这里停顿2秒
# 打印战果
if ATM_life > 0 and BOSS_life <= 0:
ATM_score = ATM_score + 1
print('怪兽挂了,奥特曼赢了')
elif ATM_life <= 0 and BOSS_life > 0:
BOSS_score = BOSS_score + 1
print('悲催,怪兽把奥特曼干掉了!')
else:
print('哎呀,奥特曼和怪兽同归于尽了!')
最后,再做一次判断,比较一下奥特曼赢得局数和怪兽赢得局数。
import time
import random
ATM_score = 0
#存放奥特曼赢的局数。
BOSS_score = 0
#存放怪兽赢的局数
将奥特曼和怪兽各自赢得局数算出来。
import time
import random
ATM_score = 0
# 存放奥特曼赢的局数。
BOSS_score = 0
# 存放怪兽赢的局数
for i in range(1, 4):
time.sleep(1) # 让局与局之间有较明显的有时间间隔
print(' \\n——————现在进行第' + str(i) + '局,3,2,1,go!——————') # 作为局的标记
# 生成随机属性
ATM_life = random.randint(100, 150) # “ATM_life” 代表奥特曼血量
ATM_attack = random.randint(20, 30) # “ATM_attack” 代表奥特曼攻击
BOSS_life = random.randint(100, 150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20, 30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【奥特曼】\\n' + '血量:' + str(ATM_life) + '\\n攻击:' + str(ATM_attack))
# ATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
# 暂停一秒再执行后续代码
print('【怪兽】\\n' + '血量:' + str(BOSS_life) + '\\n攻击:' + str(BOSS_attack))
print('------------------------')
# 自动PK阶段
while (ATM_life > 0) and (BOSS_life > 0):
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
print('奥特曼发起了攻击,【怪兽】剩余血量' + str(BOSS_life))
# ATM_life是整数,所以拼接时要先用str()转换
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量' + str(ATM_life))
print('------------------------')
time.sleep(2)
# 为了体现出战斗回合,这里停顿2秒
# 打印战果
if ATM_life > 0 and BOSS_life <= 0:
ATM_score = ATM_score + 1
print('怪兽挂了,奥特曼赢了')
elif ATM_life <= 0 and BOSS_life > 0:
BOSS_score = BOSS_score + 1
print('悲催,怪兽把奥特曼干掉了!')
else:
print('哎呀,奥特曼和怪兽同归于尽了!')
if ATM_score > BOSS_score:
time.sleep(1)
print('【 大战3个回合:奥特曼赢了!】')
elif BOSS_score > ATM_score:
print('【大战3个回合:奥特曼输了!】')
else:
print('【大战3个回合:平局!】')
终于做完项目了。做完人生中的第一个Python项目,开心不?为自己鼓掌,仅仅不到50行的代码,完成了奥特曼大战怪兽游戏,感觉Python是不是很简单?还是那一句,人生苦短,我学Python!
项目已经做完了,但还是要追求尽善尽美。有个地方需要【格式化字符串】
import time
import random
#也可合并写成一行:import time,random
ATM_score = 0
#存放奥特曼赢的局数。
BOSS_score = 0
#存放怪兽赢的局数
for i in range(1,4):
time.sleep(1) # 让局与局之间有较明显的有时间间隔
print(' \\n——————现在进行第'+str(i)+'局,3,2,1,go!——————') # 作为局的标记
# 生成随机属性
ATM_life = random.randint(100,150) # “ATM_life” 代表奥特曼血量
ATM_attack = random.randint(20,30) # “ATM_attack” 代表奥特曼攻击
BOSS_life = random.randint(100,150) # “BOSS_life” 代表怪兽血量
BOSS_attack = random.randint(20,30) # “BOSS_attack” 代表怪兽攻击
# 展示双方角色的属性
print('【怪兽】\\n血量:%s\\n攻击力:%s' %( ATM_life, ATM_attack))
#fATM_life和ATM_attack的数据类型都是整数,所以拼接时需要先用str()转换
print('------------------------')
time.sleep(1)
#暂停一秒再执行后续代码
print('【怪兽】\\n血量:%s\\n攻击力:%s' %(BOSS_life, BOSS_attack))
print('------------------------')
# 自动PK阶段
while(ATM_life>0) and (BOSS_life>0):
ATM_life = ATM_life - BOSS_attack
BOSS_life = BOSS_life - ATM_attack
print('奥特曼发起了攻击,【怪兽】剩余血量'+str(BOSS_life))
#ATM_life是整数,所以拼接时要先用str()转换
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量'+str(ATM_life))
print('------------------------')
time.sleep(2)
# 为了体现出战斗回合,这里停顿2秒
# 打印战果
if ATM_life > 0 and BOSS_life <= 0:
freeLi_score=ATM_score+1
print('怪兽挂了,奥特曼赢了')
elif ATM_life <= 0 and BOSS_life > 0:
BOSS_score = BOSS_score +1
print('悲催,怪兽把奥特曼干掉了!')
else:
print('哎呀,奥特曼和怪兽同归于尽了!')
if ATM_score > BOSS_score :
time.sleep(1)
print('【 大战3个回合:奥特曼赢了!】')
elif BOSS_score > ATM_score:
print('【大战3个回合:奥特曼输了!】')
else:
print('【大战3个回合:平局!】')
总结
本文属于作者原创,转载请注明出处,不足之处,希望大家能过给予宝贵的意见,如有侵权,请私信。每天一个knowledge point,一起学python,让技术无限发散。
以上是关于python基础——经营第一个项目,如何将python学得更6 ?的主要内容,如果未能解决你的问题,请参考以下文章
本人python新手,现在在看python基础教程,这几天敲了一下后面的项目5,出现了很奇怪的错误,大神帮看看
量化资料学习《Python与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》