• <人生重开模拟器>——《Python项目实战》


     目录

    1.模拟实现 "人生重开模拟器"

    1.1 问题导引:

    1.2 问题分析:

    2. 模拟实现分析及步骤: 

    3.完整源码:

    4.写在最后的话:

    后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                               ——By 作者:新晓·故知


    1.模拟实现 "人生重开模拟器"

    1.1 问题导引:

    GIF演示:
    “人生重开模拟器”是一款文字类小游戏. 玩家可根据提示输入角色的初始属性之后, 就可以开启不同的人生经历.  具体可以网上搜索“人生重启模拟器”,就能找到这款游戏的许多版本。

     

    这里我们找到了一款版本用于演示: (以下图片源于网络,这里只用于演示学习)
    链接网址:人生重启模拟器
    游戏界面:

     这里我们选择“技能”拉满选项(幻想一下那些我们所羡慕的故事里的开挂人生):

     根据个人选择调整初始属性:

     自动生成“重启”的人生:

     人生总结:

    以上就是我们在网上搜索用于演示的“人生重启模拟器”游戏,原来故事里的“开挂人生”是如此的顺利平坦,令人羡慕,作者自愧不如,而那终究是幻想,认清现实,依旧负重前行! 

    友情提示:适当参与游戏放松,过度游戏有害健康!

    1.2 问题分析:

    其实这款游戏的底层逻辑就是编程语言语句的交互运用。通过不同的语句交互(例如顺序语句、循环语句、判断语句等)根据不同的数据数值,执行相应的语句,打印相应的文字。

    那么我们接下来就使用Python语言模拟实现这款游戏。由于完整的程序代码较多, 此处我们只实现其中的一部分逻辑,用于演示并巩固我们之前所学的Python的知识。

    2. 模拟实现分析及步骤: 

    (1) 设置角色初始属性
    在游戏中我们设定四个属性 .
    • 颜值 (face)
    • 体质 (strong)
    • 智力 (iq)
    • 家境 (home)
    我们约定每个属性的范围为 [1, 10], 并且总和不能超过 20.
    如果玩家输入的初始属性不合理 , 就提示输入有误 , 重新输入。

    (2)  设置生成角色的性别
    通过 random.randint(1, 6) 生成一个 [1, 6] 的随机整数。
    • 如果是单数, 则性别设为男孩
    • 如果是双数, 则性别设为女孩.
    男孩和女孩会遇到不同的事件 .

    (3) 设置角色的出生环境及背景
    首先按照家境 (home), 分成四个档位 .
    • 10 是第一档. 加成最高
    • [7, 9] 是第二档. 也有一些加成
    • [4, 6] 是第三档. 加成较少
    • [1, 3] 是第四档. 会扣掉属性.
    生成 [1, 3] 的随机数 , 用来表示每一种细分情况 .
    这里的代码主要就是各种 if else 构成

    (4)对角色的不同人生阶段添加测试用例:
    按照年龄 , 把人生经历分成四个阶段 :
    • 童年阶段 [1, 10]
    • 青年阶段 [11, 20]
    • 壮年阶段 [20, 50]
    • 老年阶段 50 岁以上.
    每个阶段都会有不同的精力和事件发生 .
    • 童年阶段可塑性强, 体质, 颜值, 智力都会有较快变化
    • 青年阶段主要是求学, 同时父母一辈会有明显变化, 智力和家境会有明显变化.
    • 壮年阶段相对平稳, 属性变化不大, 主要是一些随机事件影响到属性.
    • 老年阶段体质, 颜值, 智力都会显著退化, 并且随着年龄的上升, 疾病/死亡的风险逐渐升高.
    此处我们以童年为例 , 简单实现一下这里的处理逻辑 .
    • 使用 for 循环, 按照年龄循环起来.
    • 针对每一年, 先生成[1, 3]档,  根据不同的随机数值, 来触发不同的事件.
    • 根据性别, 年龄, 各种属性, 来触发不同的事件. 这里都使用 if - else 的方式来组织.
    • 不同的事件可能会对属性有正面/负面的影响.
    • 在每一年的最后, 打印这一年遇到的事情.
    • 如果夭折, 则直接 sys.exit(0) 退出程序.
    • 使用 time.sleep(1) 使程序暂停执行 1s, 方便观察程序结果.

    童年阶段:

    说明:由于是模拟实现“人生重启模拟器”,因此我们把基本原理学会后,可自行添加“脑洞大开”的人生经历,这里只简单的举例用于演示。

    青年阶段:

     壮年阶段

     老年阶段:

    3.完整源码:

    1. # 人生重开模拟器
    2. import random
    3. import sys
    4. import time
    5. print("***************************************************")
    6. print('* *')
    7. print('* 《人生模拟重启器》——Python版 *')
    8. print('* *')
    9. print('* *')
    10. print('* 但惜今生,不问来世 *')
    11. print('* ——By 作者:新晓·故知 *')
    12. print('* *')
    13. print("***************************************************")
    14. #1. 设置角色初始属性
    15. # 颜值、体质、智力、家境,这几项属性点数总和不能超过设定的阈值(这里我们设置为20), 每一项取值都是 1-10 之间
    16. # 使用循环, 使玩家在输入错误的时候, 可以重新输入.
    17. while True:
    18. #尽管是while True,但不一定是死循环,可以在代码块里使用break跳出整个循环
    19. print("请设置初始属性(可用属性点总数为 20)")
    20. face = int(input("请输入颜值属性点数(1-10):"))
    21. strong = int(input("请输入体质属性点数(1-10):"))
    22. iq = int(input("请输入智力属性点数(1-10):"))
    23. home = int(input("请输入家境属性点数(1-10):"))
    24. # 通过使用条件语句, 对于玩家输入的属性值做出校验检查
    25. # 以下这段逻辑, 也可以使用elif:使用 elif 则是多个分支只能进一个, 一旦某个条件满足了, 就不会再走其他的分支了.
    26. # 这里虽然没有使用 elif , 但是使用了 continue, 一旦某个条件满足, continue 就会跳出本次循环, 后续的条件判定不再执行
    27. if face < 1 or face > 10:
    28. print("颜值属性点数设置有误!")
    29. continue
    30. if strong < 1 or strong > 10:
    31. print("体质属性点数设置有误!")
    32. continue
    33. if iq < 1 or iq > 10:
    34. print("智力属性点数设置有误!")
    35. continue
    36. if home < 1 or home > 10:
    37. print("家境属性点数设置有误!")
    38. continue
    39. if face + strong + iq + home > 20: # 如果当前的条件都没有被触发, 则认为玩家输入的数据是合法的.
    40. print("属性点数设置错误!属性点数之和超出阈值(20)")
    41. continue
    42. # 此时就可以跳出循环结束输入了
    43. print("初始属性设置完成!")
    44. print(f"颜值: {face}, 体质: {strong}, 智力: {iq}, 家境: {home}")
    45. break
    46. # 2.设置生成角色的性别
    47. # 使用 random.randint(beg, end), 就能生成 [beg, end] 随机整数
    48. point = random.randint(1, 6)
    49. #此处的random是python中的一个模块! 相当于C++中的STL(封装好的代码块,我们直接使用即可!)
    50. #这里使用其他模块,需要先使用import语句,把模块的名字“导入”进来,pycharm有自动导入的功能
    51. # print(f'point = {point}')
    52. if point % 2 == 1:
    53. gender = 'boy'
    54. print('你出生了,是个男孩。')
    55. else:
    56. gender = 'girl'
    57. print('你出生了,是个女孩。')
    58. # 3.设置角色的出生环境及背景
    59. # 为了简单方便, 这里我们就直接生成 1-3 的随机数进行模拟
    60. #这里我们将角色的家庭背景及环境设置四个档位梯度,不同档位会对属性有加成或减低
    61. point = random.randint(1, 3)
    62. if home == 10:
    63. # 第一档
    64. print('你出生在首都, 你的父母是高官政要')
    65. home += 1
    66. iq += 1
    67. face += 1
    68. elif 7 <= home <= 9:
    69. # 第二档
    70. if point == 1:
    71. print('你出生在大城市, 父母是公务员')
    72. face += 2
    73. elif point == 2:
    74. print('你出生在大城市, 父母是企业高管')
    75. home += 2
    76. else:
    77. print('你出生在大城市, 父母是大学教授')
    78. iq += 2
    79. elif 4 <= home <= 6:
    80. # 第三档
    81. if point == 1:
    82. print('你出生在县城, 你的父母是医生')
    83. strong += 1
    84. elif point == 2:
    85. print('你出生在乡镇, 你的父母是老师')
    86. iq += 1
    87. else:
    88. print('你出生在乡镇, 你的父母是个体户')
    89. home += 1
    90. else:
    91. # 第四档
    92. if point == 1:
    93. print('你出生在农村, 你的父母是辛苦劳作的农民')
    94. strong += 1
    95. face -= 2
    96. elif point == 2:
    97. print('你出生在农村, 你的父母奔波劳碌,家庭状况不是很好')
    98. home -= 1
    99. else:
    100. print('你出生在穷乡僻壤, 你的父母艰辛茹苦,抚养你长大')
    101. strong -= 1
    102. print(f'颜值: {face}, 体质: {strong}, 智力: {iq}, 家境: {home}')
    103. # 4.童年阶段
    104. for age in range(1, 11):
    105. # 把一整年的打印都整理到一个字符串中, 在这一年的结尾统一打印
    106. info = f'你今年 {age} 岁. '
    107. # 生成一个 [1, 3] 的随机整数.
    108. point = random.randint(1, 3)
    109. # 接下来编写各种事件的代码
    110. # 性别触发的事件
    111. if gender == 'girl' and home <= 3 and point == 1:
    112. info += '你的家庭封建思想重男轻女,你不幸被遗弃!'
    113. print(info)
    114. print('游戏结束!')
    115. sys.exit(0)
    116. #sys也是python中提供的一个模块,直接使用即可
    117. # 体质触发的事件
    118. # 使用 elif 是为了保证每年只触发一个事件!
    119. elif strong < 6 and point < 3:
    120. info += '你患了一场大病'
    121. if home >= 5:
    122. info += '在父母的悉心照料下, 你康复了'
    123. strong += 1
    124. home -= 1
    125. else:
    126. info += '你的父母无法照料你, 你的身体每况愈下'
    127. strong -= 1
    128. # 颜值触发的事件
    129. elif face <= 4 and age >= 7:
    130. info += '你由于很丑, 其他小朋友不喜欢你. '
    131. if iq > 5:
    132. info += '你决定通过学习提升自己!'
    133. iq += 1
    134. else:
    135. if gender == 'boy':
    136. info += '你和别的小朋友经常打架!'
    137. strong += 1
    138. iq -= 1
    139. else:
    140. info += '你经常被别的小朋友欺负!'
    141. strong -= 1
    142. # 智商触发的事件
    143. elif iq < 5:
    144. info += '你有点呆呆的 '
    145. if home >= 8 and age >= 6:
    146. info += '你的父母把你送到更好的学校学习'
    147. iq += 1
    148. elif 4 <= home <= 7:
    149. if gender == 'boy':
    150. info += '你有运动天赋,立志成为运动员'
    151. strong += 1
    152. else:
    153. info += '你学会了提升外在形象'
    154. face += 1
    155. else:
    156. # 家境 < 4
    157. info += '你虽然出身条件不好,但却有快乐的童年'
    158. if point == 1:
    159. strong -= 1
    160. elif point == 2:
    161. iq -= 1
    162. else:
    163. pass
    164. # 健康成长事件
    165. else:
    166. info += '你一生健康,没有患过大病 '
    167. if point == 1:
    168. info += '你的身体很强壮'
    169. strong += 1
    170. elif point == 2:
    171. info += '你的自身条件不断提升'
    172. face += 1
    173. else:
    174. # 无事发生
    175. pass
    176. # 打印这一年发生的事情
    177. print(info)
    178. print(f'颜值: {face}, 体质: {strong}, 智力: {iq}, 家境: {home}')
    179. print('------------------------------------------------------')
    180. # 为了方便观察, 加一个小小的暂停操作
    181. time.sleep(1)
    182. #5.青年阶段
    183. for age in range(11,20):
    184. info = f'你今年{age}岁.'
    185. point = random.randint(1,3)
    186. #性别触发的事件
    187. if gender == 'boy' and home <= 3 and point == 1:
    188. info += '你爱而不得,你喜欢的人很讨厌你...'
    189. #体质触发的事件
    190. elif strong > 6 and point < 3:
    191. info += '你参加省级运动会,并获得了金牌'
    192. if home >= 5:
    193. info += '你被以"体育特长生"的名义保送到顶尖大学深造'
    194. home += 1
    195. strong += 1
    196. else:
    197. info += '你的体育天赋被埋没...'
    198. home -= 2
    199. face -= 1
    200. #颜值触发的事件
    201. elif face >=5 and home >= 7:
    202. info += '你被许多人喜欢,如众星捧月'
    203. if iq > 5:
    204. info += '你颜值、家境、才华并存,人生顺利平坦'
    205. home += 1
    206. else:
    207. info += '你出身条件好,但却不能自立自强'
    208. iq -= 2
    209. # 打印这一年发生的事情
    210. print(info)
    211. print(f'颜值: {face}, 体质: {strong}, 智力: {iq}, 家境: {home}')
    212. print('------------------------------------------------------')
    213. # 为了方便观察, 加一个小小的暂停操作
    214. time.sleep(1)
    215. #6.壮年阶段
    216. for age in range(20,50):
    217. info = f'你今年{age}岁.'
    218. point = random.randint(1,3)
    219. #性别触发的事件
    220. if gender == 'boy' and iq > 7:
    221. info +='你事业有成,家庭和睦'
    222. home += 2
    223. face += 1
    224. else:
    225. if home <= 3:
    226. info += '你自立自强,不接受命运安排'
    227. home +=2
    228. strong +=2
    229. else:
    230. info += '你平庸一生...'
    231. # 打印这一年发生的事情
    232. print(info)
    233. print(f'颜值: {face}, 体质: {strong}, 智力: {iq}, 家境: {home}')
    234. print('------------------------------------------------------')
    235. # 为了方便观察, 加一个小小的暂停操作
    236. time.sleep(1)
    237. #7.老年阶段
    238. for age in range(50,110):
    239. info = f'你今年{age}岁.'
    240. point = random.randint(1,3)
    241. #性别触发的事件
    242. if gender == 'girl' and home >= 6:
    243. info += '你子孙满堂,晚年享福'
    244. home += 1
    245. strong += 1
    246. #体质触发的事件
    247. elif strong > 5 and iq > 6:
    248. info += '你是工作单位骨干,领导成员攻坚克难'
    249. if face >= 5:
    250. info += '你被应邀担任单位发言人'
    251. home += 2
    252. else:
    253. #Do Nothing!
    254. pass
    255. # 打印这一年发生的事情
    256. print(info)
    257. print(f'颜值: {face}, 体质: {strong}, 智力: {iq}, 家境: {home}')
    258. print('------------------------------------------------------')
    259. # 为了方便观察, 加一个小小的暂停操作
    260. time.sleep(1)

    说明:

    import random
    import sys
    import time

    这是导入的封装好的模块,直接使用,方便简单。

    4.写在最后的话:

     

     

    “从某一方面来说,人生是选择出来的。虽然我们不能选择和决定我们的原生家庭,但是我们以后的人生走向却取决于我们此刻的选择与努力!
    不必抱怨命运不公,我们从底层一路走来,见识过许许多多的人和事,也学会从不同角度看待这个社会。我们所经历的困苦与磨难,从某种角度而言,何尝不是独特的人生经历呢?
    我们的人生,非言语所能概括和衡量!那些外人看不出、猜不透的故事才组成了我们的这一生!不要轻易否定一切,从不同角度看待,或许又是另一种理解。
    我们的未来就在我们的脚下,但行好事,负重前行,别停留!”
     

    后记:
    ●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                               ——By 作者:新晓·故知

  • 相关阅读:
    LeetCode //C - 129. Sum Root to Leaf Numbers
    Mac电脑系统怎么样才能干干净净地卸载应用程序?
    RocketMQ与Kafka差异对比:从架构到性能细节,解析两者在可靠性、扩展性和可用性等方面的优劣
    职场上,这5种人最容易受领导冷落,有你吗?
    【Mybatis小白从0到90%精讲】04:Mybatis工具类
    类加载器分类以及著名的双亲委派机制
    es 存储文档得大小_Elasticsearch的用例:文档存储
    Effective C++条款22:将成员变量声明为private(Declare data members private)
    什么是粘性代理IP
    ArcGIS_重分类
  • 原文地址:https://blog.csdn.net/m0_57859086/article/details/127464321