作业名称(项目名称?):PK小游戏
目的:熟练运用循环和条件判断
进阶:初识调用模块,掌握完成项目的流程
一·明确项目目标
模拟与敌人PK环境,文字输出过程和最终结果。
制作游戏:
1.0版本–手动设置玩家与敌人属性,进行PK。
2.0版本–自动设置属性进行PK
3.0版本–设置3局2胜制。
二·分析过程,拆解项目
1.0版本分析:
1.玩家与敌人的血量和攻击力需手动设置,即添加对应变量:hp_player,attack_player,hp_enemy,attack_enemy。
2.输出PK过程:
剩余血量 = 原血量 - 对方的攻击力(用最简单的计算方法,毕竟实际游戏的属性和计算方法实在太复杂,2333)
既然不是一击毙命,那么就要一直打下去,所以要用循环来处理这个过程;打多少回合不确定,所以这里选用while循环合适。
3.输出最终结果:当玩家和敌人有一方血量 <= 0 时,游戏结束,输出结果为玩家胜利或玩家输了;当双方血量同时 <= 0时,游戏结束,输出结果为同归于尽。
既然有“当…时”,当然用if条件句!ᕙ( ~ . ~ )ᕗ充满power~
然后,1.0版本就新鲜出炉啦~
hp_player = 124
attack_player = 38
hp_enemy = 110
attack_enemy = 31
print('【玩家血量】:',hp_player,'【玩家战力】:',attack_player)
print('【敌人血量】:',hp_enemy,'【敌人战力】:',attack_enemy)
while hp_player > 0 and hp_enemy > 0:
hp_player = hp_player - attack_enemy
hp_enemy = hp_enemy - attack_player
print('你发起了攻击,【敌人】剩余血量:',hp_enemy)
print('敌人向你发起了攻击,【玩家】的血量剩余:',hp_player)
if hp_enemy <= 0 and hp_player < 0:
print('玩家和敌人同归于尽了!')
elif hp_enemy < 0 and hp_player >= 0:
print('欧耶!敌人被玩家干掉了!')
elif hp_player < 0 and hp_enemy > 0:
print('悲催,玩家被敌人干掉了!')
由于这样直接打印出来,没有PK时的感觉,于是做了一些优化,比如每回合之间的停顿(调用time模块),以及用分割线美化界面。
import time
hp_player = 124
attack_player = 38
hp_enemy = 110
attack_enemy = 31
print('【玩家血量】:',hp_player,'【玩家战力】:',attack_player)
print('【敌人血量】:',hp_enemy,'【敌人战力】:',attack_enemy)
print('-'*30)
time.sleep(1.5)
while hp_player > 0 and hp_enemy > 0:
hp_player = hp_player - attack_enemy
hp_enemy = hp_enemy - attack_player
print('你发起了攻击,【敌人】剩余血量:',hp_enemy)
print('敌人向你发起了攻击,【玩家】的血量剩余:',hp_player)
print('-'*30)
time.sleep(1.5)
if hp_enemy <= 0 and hp_player < 0:
print('玩家和敌人同归于尽了!')
elif hp_enemy < 0 and hp_player >= 0:
print('欧耶!敌人被玩家干掉了!')
elif hp_player < 0 and hp_enemy > 0:
print('悲催,玩家被敌人干掉了!')
2.0版本分析:
相比于1.0版本,区别只是自动设置玩家与敌人的血量与攻击力,所以调用random模块就OK啦~由于对random不是很了解,所以为了保证能取到180和50,我把范围分别改到了181和51.
import random
hp_player = random.randint(100,181)
attack_player = random.randint(30,51)
hp_enemy = random.randint(100,181)
attack_enemy = random.randint(30,51)
3.0版本分析:
在2.0版本的前提下,增加了三局两胜制,所以可以直接在上面代码的基础上,在最外面套一层循环就行了,在循环次数已知的情况下,用for循环轻松搞定!
for i in range(3):
print('-'*10+'第'+str(i+1)+'局'+'-'*10)
此时因为添加了三局两胜制,所以结果就有了变化:
1.每局结束后,要统计输的一方,以便做最终结果统计,即添加变量:失败次数。
2.当3局中双方各有胜负时,失败次数==2的一方输,并结束游戏。
3.当3局中存在平局时,失败次数不叠加,当游戏完成3局后结束游戏,比较此时玩家与敌人的失败次数,多的一方输;若一样多,则为平局。
所以在for循环内部加上if条件,用来控制游戏结束的时机(即当3局内有一方输了两次,游戏结束);在for循环后跟上else语句,用来处理3局中有平局的情况分析。
最终代码如下:
import time
import random
lose_player = 0
lose_enemy = 0
for i in range(3):
print('-'*10+'第'+str(i+1)+'局'+'-'*10)
hp_player = random.randint(100,181)
attack_player = random.randint(30,51)
hp_enemy = random.randint(100,181)
attack_enemy = random.randint(30,51)
print('【玩家血量】:',hp_player,'【玩家战力】:',attack_player)
print('【敌人血量】:',hp_enemy,'【敌人战力】:',attack_enemy)
print('-'*30)
time.sleep(1.5)
while hp_player > 0 and hp_enemy > 0:
hp_player = hp_player - attack_enemy
hp_enemy = hp_enemy - attack_player
print('你发起了攻击,【敌人】剩余血量:',hp_enemy)
print('敌人向你发起了攻击,【玩家】的血量剩余:',hp_player)
print('-'*30)
time.sleep(1.5)
if hp_enemy <= 0 and hp_player < 0:
print('玩家和敌人同归于尽了!')
elif hp_enemy < 0 and hp_player >= 0:
print('欧耶!敌人被玩家干掉了!')
lose_enemy += 1
elif hp_player < 0 and hp_enemy > 0:
print('悲催,玩家被敌人干掉了!')
lose_player += 1
print('-'*30)
time.sleep(1.5)
if lose_enemy == 2:
print('【最终结果:玩家获胜!】')
break
elif lose_player == 2:
print('【最终结果:你输了!】')
break
else:
if lose_enemy > lose_player:
print('【最终结果:玩家获胜!】')
elif lose_player > lose_enemy:
print('【最终结果:玩家输了!】')
else:
print('【最终结果:平局】')
自己手动测试了十几次,游戏能完美运行,只是平局的次数略多,应该是设置属性的问题,会导致玩家和敌人的血量同时小于0的情况出现偏多。这个不太知道怎么处理。
以上!