Python-七、小游戏-组队PK

1、明确项目目标

PK规模:3V3

PK视觉:角色拥有姓名,且有变化(即随机生成)

PK策略:可排序,有一定策略性

2、分析过程,拆解项目

版本1.0:固定角色固定属性,自动计算扣血量,三局两胜,封装为函数并调用。

版本2.0:随机角色,随机属性。

版本3.0:让玩家选择出场顺序,并打印出来

版本4.0:根据出场顺序和对方进行三轮PK,并输出战果。

3、逐步执行,代码实现

版本1.0(封装函数,自定属性):

import time

def show_role(player_life,player_attack,enemy_life,enemy_attack):

    print('【玩家】\n血量:%s\n攻击:%s'%(player_life,player_attack))

    print('------------------------')

    print('【敌人】\n血量:%s\n攻击:%s'%(enemy_life,enemy_attack))

    print('-----------------------')

def pk_role(player_life,player_attack,enemy_life,enemy_attack):

    while player_life > 0 and enemy_life > 0:

        player_life = player_life - enemy_attack

        enemy_life = enemy_life - player_attack

        print('你发起了攻击,【敌人】剩余血量%s'%(enemy_life))

        print('敌人向你发起了攻击,【玩家】的血量剩余%s'%(player_life))

        print('-----------------------')

        time.sleep(1.2)

    show_result(player_life,enemy_life)

def show_result(player_life,enemy_life):

    if player_life > 0 and enemy_life <= 0:

        print('敌人死翘翘了,这局你赢了')

    elif player_life <= 0 and enemy_life > 0:

        print('悲催,这局敌人把你干掉了!')

    else:

        print('哎呀,这局你和敌人同归于尽了!')

    print('-----------------------')

def main(player_life,player_attack,enemy_life,enemy_attack):

    #别看这么长,其实就是三个函数,函数1:

    show_role(player_life,player_attack,enemy_life,enemy_attack)

    #函数2:

    pk_role(player_life,player_attack,enemy_life,enemy_attack)

main(100,35,105,33)

输出结果:

V1.0 输出结果

版本2.0(随机角色和属性):

虽然是随机,但是我们得先有一个池子存放底层数据,对吧?于是我们建立敌我双方共十二个角色,分别存储在player_list和enemy_list中。在程序中导入预制的随机函数random!

import random

#把敌人的属性也打印出来

player_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']

enemy_list = ['【暗黑战士】','【黑暗弩手】','【骷髅骑士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']

#敌我各随机抽三人上阵

players = random.sample(player_list,3) 

enemies = random.sample(enemy_list,3)

#敌我各建立两个空的存储字典

player_info = {}

enemy_info = {}

# 随机生成两种属性

def born_role():

    life = random.randint(100,180)

    attack = random.randint(30,50)

    return life,attack

# 给角色赋予随机属性,并展示角色信息。

def show_role():

    for i in range(3):

        player_info[players[i]] = born_role()

        enemy_info[enemies[i]] = born_role()

    # 这里要给敌人角色信息的字典添加键值对   

    print('----------------- 角色信息 -----------------')

    # 展示我方的3个角色

    print('你的人物:')

    for i in range(3):

        print('%s  血量:%d  攻击:%d'

        %(players[i],player_info[players[i]][0],player_info[players[i]][1]))

    print('--------------------------------------------')

    print('电脑敌人:')

    for i in range(3):

        print('%s  血量:%d  攻击:%d'

        %(enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))

    # 展示敌方3个角色,也是一个循环

show_role()

输出结果:

V2.0输出结果

在开始V3.0之前,我们做一个小小的总结。

V1.0~V2.0总结

版本3.0(询问玩家出场顺序):

3.0版本增加两个功能:询问玩家每个角色的出场顺序,根据排序战斗;战斗三轮,输出单轮和最终结果。

import time,random

#定义敌我属性

player_list =  ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']

enemy_list = ['【暗黑战士】','【黑暗弩手】','【骷髅骑士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']

#敌我各随机抽三人上阵

players = random.sample(player_list,3)

enemies = random.sample(enemy_list,3)

#敌我各建立两个空的存储字典

player_info = {}

enemy_info = {}

# 随机生成两种属性

def born_role():

    life = random.randint(100,180)

    attack = random.randint(30,50)

    return life,attack

# 给角色赋予随机属性,并展示角色信息。

def show_role():

    for i in range(3):

        player_info[players[i]] = born_role()

        enemy_info[enemies[i]] = born_role() 

    print('----------------- 角色信息 -----------------')

    # 展示我方的3个角色

    print('你的人物:')

    for i in range(3):

        print('%s %s  血量:%d  攻击:%d'

        %(i+1,players[i],player_info[players[i]][0],player_info[players[i]][1]))

    print('--------------------------------------------')

    # 展示敌方3个角色

    print('电脑敌人:')

    for i in range(3):

        print('%s %s  血量:%d  攻击:%d'

        %(i+1,enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))

    input('请按回车键继续。\n')  # 为了让玩家更有控制感,可以插入类似的代码来切分游戏进程。

# 按照玩家的需求,指派人上阵

def order_role():

    global players

    order_dict = {}

    for i in range(3):

        order = int(input('你想将 %s 放在第几个上场?(请输入数字3,2,1):'

                          %(players[i])))

        order_dict[order]=players[i]

    players = []

    for i in range(1,4):

        players.append(order_dict[i])

    print(players)

def main():

    show_role()

    order_role()

main()

这里的重点是,将players字段做成global的,这样在两个函数间就可以调用了。

版本4.0(添加PK,不服就干):

互相PK,三局两胜。我们可以将其拆解为3部分:角色PK、打印单局战果和打印最终结果。设置一个变量为score = 0,玩家赢了加一分,输了扣一分,平局加零分。最终只要判断score是大于、小于或等于0就可以了。

为了保持函数的功能单一性,即每个功能尽量都封装成单独的函数,而pk_role()函数包含了战斗过程和战果统计两个功能。所以,可以考虑让统计单局战果的代码独立成一个函数,在pk_role()函数内部调用即可。

需要注意的是:有一些函数不会包含到主函数里,而是作为“辅助型”函数被其他函数调用,如一些返回数值的函数。这其实和之前在show_role()函数内部调用born_role()函数有些类似。

先单独把PK做出来,属性用直接定义,调试好。

import time

players = ['【狂血战士】','【森林箭手】','【光明骑士】']

enemies = ['【暗黑战士】','【黑暗弩手】','【暗夜骑士】']

player_info = {'【狂血战士】':(105,35),'【森林箭手】':(105,35),'【光明骑士】':(105,35)}

enemy_info = {'【暗黑战士】':(105,35),'【黑暗弩手】':(105,35),'【暗夜骑士】':(105,35)}

input('按回车开始简化版游戏:')

# 角色PK

def pk_role():

    round = 1 

    score = 0

    for i in range(3):  # 一共要打三局

        player_name = players[i]

        enemy_name = enemies[i] 

        player_life = player_info[players[i]][0]

        player_attack = player_info[players[i]][1]

        enemy_life = enemy_info[enemies[i]][0]

        enemy_attack = enemy_info[enemies[i]][1]

        # 每一局开战前展示战斗信息

        print('\n----------------- 【第%d局】 -----------------' % round)

        print('玩家角色:%s vs 敌方角色:%s ' %(player_name,enemy_name))

        print('%s 血量:%d  攻击:%d' %(player_name,player_life,player_attack))

        print('%s 血量:%d  攻击:%d' %(enemy_name,enemy_life,enemy_attack))

        print('--------------------------------------------')

        input('请按回车键继续。\n')

        # 开始判断血量是否都大于零,然后互扣血量。

        while player_life > 0 and enemy_life > 0:

            enemy_life = enemy_life - player_attack

            player_life = player_life - enemy_attack

            print('%s发起了攻击,%s剩余血量%d'%(player_name,enemy_name,enemy_life))

            print('%s发起了攻击,%s剩余血量%d'%(enemy_name,player_name,player_life))

            print('--------------------------------------------')

            time.sleep(1)

        else:  # 每局的战果展示,以及分数score和局数的变化。

            print(show_result(player_life,enemy_life)[1])

            # 调用show_result()函数,打印返回元组中的第一个元素result。

            score += int(show_result(player_life,enemy_life)[0])

            # 调用show_result()函数,完成计分变动。

            round += 1

    input('\n点击回车,查看比赛的最终结果\n')

    if score > 0:

        print('【最终结果:你赢了!】\n')

    elif score < 0:

        print('【最终结果:你输了!】\n')

    else:

        print('【最终结果:平局!】\n')

# 返回单局战果和计分法所加分数。

def show_result(player_life,enemy_life):  # 注意:该函数要设定参数,才能判断单局战果。

    if player_life > 0 and enemy_life <= 0:

        result = '\n敌人死翘翘了,你赢了!'

        return 1,result  # 返回元组(1,'\n敌人死翘翘了,你赢了!')

    elif player_life <= 0 and enemy_life > 0:       

        result = '\n悲催,敌人把你干掉了!'

        return -1,result

    else :

        result = '\n哎呀,你和敌人同归于尽了!'

        return 0,result

pk_role()

运行结果

回过头看,我们已经一步步写出了游戏需要的所有代码,定义了5个函数:born_role()/show_role()/order_role()/pk_role()/show_result()。

现在,我们将从零开始,完成这个练习。

# 导入需要的自带函数

import random,time

# 敌我全员名单

player_list = ['【狂血战士】','【森林箭手】','【光明骑士】','【独行剑客】','【格斗大师】','【枪弹专家】']

enemy_list = ['【暗黑战士】','【黑暗弩手】','【暗夜骑士】','【嗜血刀客】','【首席刺客】','【陷阱之王】']

#敌我上阵三人

players = random.sample(player_list,3)

enemies = random.sample(enemy_list,3)

# 需要的字典,用于存储随机生成的玩家和敌人的属性

player_info = {}

enemy_info = {}

# 1、定义随机生成属性的函数

def born_role():

life = random.randint(100,180)

attack = random.randint(30,50)

return (life,attack)

# 2、定义随机生成角色和属性、并打印出来的函数

def show_role():

#随机生成属性

    for iin range(3):

player_info[players[i]] = born_role()

enemy_info[enemies[i]] = born_role()

# 打印角色信息

    print('欢迎来到战场')

input('按下回车抽取角色。\n')

print('--------------你的角色----------------')

for iin range(3):

print('|%s 角色:%s 血量:%s 攻击:%s|'

              %(i+1,players[i],player_info[players[i]][0],player_info[players[i]][1]))

print('-------------------------------------')

print('-------------电脑的角色---------------')

for iin range(3):

print('|%s 角色:%s 血量:%s 攻击:%s|'

              %(i+1,enemies[i],enemy_info[enemies[i]][0],enemy_info[enemies[i]][1]))

print('-------------------------------------')

# 定义玩家自选上阵顺序的函数

def order_role():

# 将players定义为全局变量

    global players

# 定义一个order_list用于保存players的数据

    order_list = {}

# 将玩家希望的上阵清单保存到order_list中

    for iin range(3):

x =int(input('你想派 %s 第几个上场?'%(players[i])))

order_list[x] = players[i]

# 清空players

    players = []

# 将玩家希望的上阵清单填入players列表中

    for iin range(1,4):

players.append(order_list[i])

# 打印玩家最终选择的上阵顺序

    print('你选择的上阵顺序是 %s '%(players))

# 定义pk函数

def pk_role():

order_role()

input('按回车开始游戏:\n')

# 定义回合计数以及玩家得分,得分用于判断最终胜负

    round =1

    sorce =0

    for iin range(3):

# 每一局开始打印战斗信息

        print('现在是第 %s 局' % (round))

# 我发现直接用元组的数据太痛苦了,太长了,我还是“转译”一下吧

        player_name = players[i]

player_life = player_info[players[i]][0]

player_attack = player_info[players[i]][1]

enemy_name = enemies[i]

enemy_life = enemy_info[enemies[i]][0]

enemy_attack = enemy_info[enemies[i]][1]

# 角色登场!

        print('玩家%s出场! 血量:%s 攻击:%s' % (player_name,player_life,player_attack))

print('敌人%s出场! 血量:%s 攻击:%s' % (enemy_name,enemy_life,enemy_attack))

# 开始PK循环,直到一方的生命值小于1

        while player_life >0 and enemy_life >0:

enemy_life -= player_attack

player_life -= enemy_attack

print('%s攻击,敌%s血量降为%s' % (player_name, enemy_name, enemy_life))

print('敌%s攻击,%s血量降为%s' % (enemy_name, player_name, player_life))

print('-------------------------------------')

time.sleep(1)

# 出PK循环,意味着PK结束了,我们需要判断当前的玩家和敌人的生命,输出PK结果

        else:

sorce += show_result(player_name,enemy_name,player_life,enemy_life)

#每局结束,局数+1

        round +=1

    print('---------------PK结束-----------------')

#三局两胜,得分大于等于2就是两胜啦!

    if sorce >=2:

print('大侠果然高招!快去领取你的奖品吧!')

else:

print('胜败乃兵家常事,别灰心,回去练个千儿八百年的再来挑战吧!')

# 定义打印结果的函数

def show_result(player_name,enemy_name,player_life,enemy_life):

# 玩家生命大于敌人生命,玩家胜利

    if player_life >0 and enemy_life <=0:

print('%s:我内瓦,世界一!!'%(player_name))

print('-------------------------------------')

return 1

    # 敌人生命大于玩家生命,敌人胜利

    elif player_life <=0 and enemy_life >0:

print('%s:岂可休,输了!'%(player_name))

print('-------------------------------------')

return -1

    # 其它情况,平局

    else:

print('纳尼,竟然打平了?')

print('-------------------------------------')

return 0

# 定义主函数main

def main():

show_role()

pk_role()

main()

习题集【石头剪刀布】:

电脑先出拳,我们再出拳,判断胜负,三局两胜。

import random,time

punches = ['石头','剪刀','布']

# 定义出拳的过程,游戏内容简单,戏要多

def slp():

time.sleep(1)

def piantou():

print('伞兵一号卢本伟准备就绪!!!!')

slp()

print('他捏紧了拳头!!!!')

slp()

print('你轻蔑的笑:“我的大斧已经饥渴难耐了……”')

slp()

def chuquan():

# 电脑随机出拳

    global computer_choice

computer_choice = random.choice(punches)

# 让玩家知道怎么出拳

    print('-----------出拳规则------------')

for iin range(len(punches)):

print('%s.%s'%(i+1,punches[i]))

# 玩家输入数字出拳

    x =int(input('“来~吧~(请输入数字出拳)”\n'))

# 将出拳结果返还

    return x-1,computer_choice;

# 定义PK的过程,游戏内容简单,戏要多

def pk():

#定义玩家分数

    sorce =0

    round =1

    pk =0

    while round <=3:

print('--------性感兔女郎登场----------')

slp()

print('-----------第%s局PK啦-----------'%(round))

slp()

(x,y) = chuquan()

print('----------大战一触即发----------')

slp()

print('----------双方同时出拳----------')

slp()

print('----------你出了~%s-----------' % (punches[x]))

slp()

print('---------他慢慢张开手掌---------')

slp()

print('-------------%s!-------------' % (computer_choice))

slp()

if punches[x] =="石头" and computer_choice =="剪刀":

print('我用石头……锤爆你。')

print('------------------------------')

sorce +=1

            round +=1

        elif punches[x] =="布" and computer_choice =="石头":

print('我的布,容纳天地!')

print('------------------------------')

sorce +=1

            round +=1

        elif punches[x] =="剪刀" and computer_choice =="布":

print('神来一剪……将你切片。')

print('------------------------------')

sorce +=1

            round +=1

        elif punches[x] == computer_choice:

print('你真是好狗运,容许你再出拳一次。')

print('------------------------------')

else:

print('啊!尼玛!……我,我又一次失利了!')

round +=1

        print('你的得分 %s', sorce)

if sorce >=2:

print('你赢了,你挥一挥衣袖,留他在原地哭泣。')

else:

print('他赢了,他轻蔑一笑,三脚猫回家吃奶去吧!')

def main():

piantou()

pk()

main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容