偶然看到一段很有意思的代码,模拟武侠小说中两派的遭遇战,拿来和大家分享一下。

原文出自:https://blog.csdn.net/yutu75/article/details/109035351

效果展示:

先看一下效果:

场景设置:

两个互为仇敌的派系偶然相见分外眼红,开始战斗,因为只是偶然遇见并没有提前预知,所以每个帮派人数不确定。战斗采用回合制的方式进行,比如少林派阵营的一个人随机选择逍遥派阵营的一个人进行攻击,逍遥派阵营被选择的这个人所受到的伤害值即为攻击他的人随机选择的技能输出值加上20%标准正态分布生成的随机数值(具体后面再说),结束一次攻击后开始下一会合,即逍遥派阵营的一个人随机选择少林派阵营的一个人进行攻击,计算方式同前面的形式一致,以此类推,直到其中某一门派参与战斗的所有人都阵亡(即血量HP=0)则战斗结束。

程序解析:

首先,我们需要编写一个叫做“武林人士”的父类,两派人(自己命名)均继承自武林人士这个父类,但有各个门派都有各自的技能包及对应的输出值(面向对象继承概念)。参与战斗的每个人都有名字、血量(HP) 、一系列技能及技能对应的攻击输出值,所有人的攻击方式一致,即随机从自己的技能包中抽取一个技能进行攻击,门派下每个人拥有的技能包都是在实例化对象的时候随机赋予的。
开始遭遇战的时候,每个帮派的人数不确定,战斗采用回合制的方式进行,即帮派A中的一个人随机选择帮派B中的一个人进行攻击,B受到的伤害值为A随机选择的技能的输出值加上20%的标准正态分布生成的随机数向下取整,即伤害值=输出值(1+0.2*N( 0,1)),技能被选择的概率和其对应的输出值成反比,如某人拥有两个技能,输出值分别为10、30,则技能1的被选择概率为 (1/10)/(1/10 + 1/30)。其中某一门派参与战斗的所有人都则阵亡(既HP降为0)则战斗结束。
几个随机数生成函数:
首先引入random包, import random; random.random()生成一个0-1的均匀分布随机数; random.randint(a,b)生成取值范围为[a.b]的随机整数。

代码展示:

import random  # 导入库
import numpy as np
import math
from matplotlib import pyplot as pltshaolin = {"玄难": 135, "玄寂": 132, "玄奘": 136, "玄苦": 137, "玄渡": 131}  # 人 及其 HP
carefree = {"康广陵": 91, "范百龄": 93, "薛慕华": 108}  # 人 及其 HP
s_skill = {"大金刚掌": 20, "如来千手": 30, "擒龙功": 25, "金刚指": 30, "少林长拳": 35}  # 技能及其输出值
c_skill = {"小无相功": 20, "天山折梅手": 30, "八荒六合唯我独尊功": 25, "天上六阳掌": 30}  # 技能及其输出值
d_sname = {}
d_cname = {}
s_suiji = {}
c_suiji = {}class Wulinpeople():def __init__(self):self.s_name = random.sample(list(s_skill), random.randrange(1, len(s_skill) + 1))self.c_name = random.sample(list(c_skill), random.randrange(1, len(c_skill) + 1))def Shaolin_Temple(self):s_name = random.sample(list(shaolin), 1)[0]  # 随机选取攻击方的人物s_hp = shaolin[s_name]  # 随机选取攻击方人物的hpc_name = random.sample(list(carefree), 1)[0]  # 随机选取被攻击方的人物c_hp = carefree[c_name]  # 随机选取被攻击方人物的hppt = d_sname[s_name]  # 随机分配的技能包qwq = random.random()for x in pt:  # 随机分配的技能包的输出值s_suiji[x] = s_skill[x]a = list(s_suiji.values())c = 0key = 0s_kill_name = ""  # 定义随机技能名的变量for i in s_suiji:i_1 = s_skill[i]b = 0for j in a:b += 1 / jkey += 1 / i_1 / b# print("c的值:{} key的值{}".format(c,key))if c < qwq < key:s_kill_name = i  # 根据输出值成反比的概率 分配的技能名# print('随机值:{},技能名:{},技能输出值{}'.format(qwq,i,i_1))c = key# s_kill_name = random.sample(pt, 1)[0]          # 随机分配的技能s_kill_hp = int(s_skill[s_kill_name])  # 随机分配的技能输出值random3 = np.random.randn()  # 随机生成1个服从正态分布的随机数hurt = math.floor(s_kill_hp * (1 + 0.2 * random3))  # 向下取整的伤害值# print("伤害是{:0.1f}".format(hurt))print("少林僧人{}使出了一招伤害为{}的{}".format(s_name, s_kill_hp, s_kill_name))c_kill_hp = c_hp - hurtif c_kill_hp <= 0:del carefree[c_name]  # 删除键 'shaolin'print("逍遥派{}受到{}点伤害,剩余HP{}".format(c_name, hurt, 0))print("逍遥派{}阵亡!!!!".format(c_name))else:carefree[c_name] = c_kill_hpprint("逍遥派{}受到{}点伤害,剩余HP{}".format(c_name, hurt, c_kill_hp))def Carefree(self):c_name = random.sample(list(carefree), 1)[0]  # 随机选取攻击方的人物c_hp = carefree[c_name]  # 随机选取攻击方人物的hps_name = random.sample(list(shaolin), 1)[0]  # 随机选取被攻击方的人物s_hp = shaolin[s_name]  # 随机选取被攻击方人物的hppt = d_sname[c_name]  # 随机分配的技能包qwq = random.random()for x in pt:  # 随机分配的技能包的输出值c_suiji[x] = c_skill[x]a = list(c_suiji.values())c = 0key = 0c_kill_name = ""  # 定义随机技能名的变量for i in c_suiji:i_1 = c_skill[i]b = 0for j in a:b += 1 / jkey += 1 / i_1 / b# print("c的值:{} key的值{}".format(c,key))if c < qwq < key:c_kill_name = i  # 根据输出值成反比的概率 分配的技能名# print('随机值:{},技能名:{},技能输出值{}'.format(qwq,i,i_1))c = key# s_kill_name = random.sample(pt, 1)[0]          # 随机分配的技能c_kill_hp = int(c_skill[c_kill_name])  # 随机分配的技能输出值random3 = np.random.randn()  # 随机生成1个服从正态分布的随机数hurt = math.floor(c_kill_hp * (1 + 0.2 * random3))  # 向下取整的伤害值# print("伤害是{:0.1f}".format(hurt))print("逍遥派{}使出了一招伤害为{}的{}".format(c_name, c_kill_hp, c_kill_name))s_kill_hp = s_hp - hurtif s_kill_hp <= 0:del shaolin[s_name]  # 删除键 'shaolin'print("少林僧人{}受到{}点伤害,剩余HP{}".format(s_name, hurt, 0))print("少林僧人{}阵亡!!!!".format(s_name))else:shaolin[s_name] = s_kill_hpprint("少林僧人{}受到{}点伤害,剩余HP{}".format(s_name, hurt, s_kill_hp))passdef Battle():sign = Truewhile sign:# 少林寺Wulinpeople.Shaolin_Temple(Wulinpeople)if not shaolin or not carefree:  # 判断双方是否完全阵亡if shaolin:print("战斗结束,少林寺获胜!留在战场的是:")for i in shaolin:print("少林僧人{}剩余血量{}".format(i, shaolin[i]))sign = Falseelse:print("战斗结束,逍遥派获胜!留在战场的是:")for i in carefree:print("逍遥派人{}剩余血量{}".format(i, carefree[i]))sign = Falseif not sign:  # 结束程序break# 逍遥派Wulinpeople.Carefree(Wulinpeople)def main():print("战斗开始了!出场人物是:")for i in range(len(shaolin) + len(carefree)):a = Wulinpeople()if i < len(shaolin):kill = ",".join(a.s_name)d_sname[list(shaolin)[i]] = a.s_nameprint("少林寺的少林僧人{},HP{},招数为{}".format(list(shaolin)[i], shaolin[list(shaolin)[i]], kill))else:i = i - len(shaolin)kill = ",".join(a.c_name)d_sname[list(carefree)[i]] = a.c_nameprint("逍遥派的逍遥派{},HP{},招数为{}".format(list(carefree)[i], carefree[list(carefree)[i]], kill))Battle()main()# 1)生成随机数
rdm = np.random.randn(10000)  # 随机生成10000个服从正态分布的随机数
# 2)结果验证
import seaborn as sns  # 使用seaborn 库画直方图验证结果sns.set_palette("hls")  # 设置所有图的颜色,使用hls色彩空间
sns.distplot(rdm, color="r", bins=1000, kde=True)  # 绘制直方图,color设置颜色,bins设置直方图的划分数
plt.show()

验证随机数:

代码最后一部分是生成了一张直方图来验证所生成的随机数是否服从正态分布,运行结果如下:
可看到随机数所呈现的中间高、两边低的钟型曲线服从标准正态分布。

以上为本文全部内容,全篇代码融合了Python基础部分多种知识,非常适合初学者在学完基础部分语法之后的实践练习,给作者的创意点赞!

Python基础实战之文字游戏——模拟武侠类场景中的两派战斗场面相关推荐

  1. python基础 实战作业 ---Excel基本读写与数据处理

    代码地址如下: http://www.demodashi.com/demo/11650.html 看完本篇需要: 10min 作业练习需要: 0.5h~3h(依练习者对python熟悉程度而定) 看完 ...

  2. python基础语法复习[二] 函数、类

    python基础语法复习[二] 前言 一.函数 1.基本概念 2.一般实例 3.参数传递 (1)传不可变对象 (2)传可变对象 4.函数递归调用实例 (1)eg:实现字符串的反转: (2)递归思想画树 ...

  3. python 基础(十六)面向对象----类与对象

    目录 16.1 面向对象 16.2 面向过程与面向对象 16.3 类与对象 16.3.1 对象的创建 16.3.2 实例成员 16.3.3 类成员 16.3.4 魔法方法 16.3.4.1 综合案例 ...

  4. Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 1. python模拟登录淘宝网页 2. 获取登录用户的 ...

  5. Python爬虫实战五之模拟登录淘宝并获取所有订单

    本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 学会应对出现验证码的情况 体会一下复杂的模拟登录机制 探索部分成果 淘宝的密码用了AES加密算法,最终将密码转化为256位,在POS ...

  6. Python基础-不要对实例属性和类属性使用相同的名字

    示例 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # 不要对实例属性和类属性使用相同的名字class Duck(object):name = &quo ...

  7. Python基础实战项目——学生信息管理系统(内涵完整项目代码)

    写在前面,hello,各位朋友大家好.最近一直因为各种事情没有怎末写python,有点手生,刚好朋友大作业需要一个用python写的学员信息管理系统(非常简单的),就写一个简单的与大家共同探讨,有问题 ...

  8. Python基础实战之函数的参数讲解(三)

    ●参数可以是任意类型. ●比如可以是列表. library=['python精通','MySQL','数据分析','人工智能'] #形参 def add_book(bookname): library ...

  9. python基础实战项目——ATM+购物车代码大全

    需求分析 1.实现用户的登录注册功能,并且用户分为普通用户和管理员用户,登录时需要先输入验证码 2.用户注册时会自动添加 20000 元的余额,与 0 元的银行卡信用余额 3.用户拥有–充值,提现,转 ...

  10. Python基础合集 练习19(类与对象3(多态))

    多态 class Horse: def init(self, name) -> None: self.name = name def fature(self):return '父亲-----马的 ...

最新文章

  1. 商业大佬提醒:如果不采取措施,美国在人工智能领域将落后于中国
  2. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)
  3. python提升计算速度的方法
  4. [开源] .NETCore websocket 即时通讯组件---ImCore
  5. 笔试真题及其答案解析:国内各大银行计算机方向笔试之计算机基础知识—选择题120题
  6. python opencv 内存泄露_解决python中显示图片的plt.imshow plt.show()内存泄漏问题
  7. 我的2018知乎大数据分析
  8. 创建 Image - 每天5分钟玩转 OpenStack(21)
  9. mongodb数组字段prefix匹配返回
  10. Strategic game(树的最小点覆盖)
  11. java ftp获取文件名的方法_小猿圈Java学习-URL地址的组成格式
  12. jmu-Java-07多线程-同步访问 (10分)
  13. iOS 下如果存在UIScrollerView 使用UIScreenEdgePanGestureRecognizer实现侧滑效果失效的问题...
  14. mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...
  15. Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池
  16. 微软公司软件开发模式简介
  17. 实体关系抽取任务方法及SOTA模型总结
  18. html修改列表内的audio样式,如何修改H5中的audio样式
  19. mkfs.ext3 快速格式化_U盘格式化
  20. 快速批量创建文件夹的方法

热门文章

  1. 你的性格是什么颜色的?乐嘉《性格色彩学》测试题
  2. 回归创业本质:生意的本质就是赚钱
  3. 微信小程序对接微信支付详细教程
  4. elementui分页插件使用总结
  5. php重构求圆柱圆锥的体积,圆锥的体积 - 彭阳县第二小学数学教研社区 - 宁夏教育云...
  6. Backlog Order
  7. ZJOI 2010 贪吃的老鼠 最大流
  8. github代理地址
  9. SAP中多层扩展有效地bom
  10. 91p3.space/index.php,writeup_for_SCTF2016