python基础——经营第一个项目,如何将python学得更6 ?

Posted wakeyo_J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python基础——经营第一个项目,如何将python学得更6 ?相关的知识,希望对你有一定的参考价值。

python基础——经营第一个项目,如何将python学得更6 ?


  hello!我是wakeyo_J,每天一个konwledge point,一起学python,让技术无限发散。

  想要学好一门技术,最重要的是兴趣,兴趣是支持你前进的动力。

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流程图

  1. 设定【奥特曼】和【BOSS】的属性,及【血量】和【攻击力】。
print('【奥特曼】血量:100攻击力:25')   # 自定义奥特曼角色的血量和攻击
print('【怪兽】血量:100攻击力:20')   # 自定义怪兽角色的血量和攻击
  1. 双方攻击人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量75') #人工计算怪兽剩余血量100-25 = 75
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量80') #人工计算奥特曼剩余血量100-20 = 80
  1. 继续攻击,人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量50') #人工计算怪兽剩余血量75-25 = 50
print('怪兽向奥特曼发起了攻击,【奥特曼】剩余血量60') #人工计算奥特曼剩余血量80-20= 60
  1. 继续攻击,人工计算各自剩余血量。
print('奥特曼发起了攻击,【怪兽】剩余血量25') #人工计算怪兽剩余血量50-25= 25
print('怪兽向李逍遥发起了攻击,【奥特曼】剩余血量40') #人工计算奥特曼剩余血量60-20=40
  1. 继续攻击,人工计算各自剩余血量。
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与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》

Python基础第一课

Python之路第二十四篇:Python学习路径及练手项目合集

django基础,环境搭建,开始第一个项目