《Python趣味工具》——文字RPG游戏的开发(附人生选择模拟器的详细讲解及其他多种RPG游戏的源码)_文字游戏开发-程序员宅基地

技术标签: 《Python项目实战》  python  游戏  开发语言  

今天我们来学习如何制作一个文字RPG游戏 。

  • 内容主要分为3个部分:
    part1. 文字游戏(MUD)的趣味历史
    part2. 文字游戏的设计方法
    part3. 文字游戏功能实现

在这里插入图片描述



一、文字游戏(MUD)的趣味历史:

你知道国内首款很火的文字游戏是哪个大V写的吗?
你知道国内文字游戏界的活化石是什么吗?
一起来看看吧~~

1. 什么是MUD游戏:

早期的网络游戏被称为MUD游戏(Multiple User Domain多用户虚拟空间游戏)

  • 这种类型的游戏没有图形,全部用文字和字符画来构成,很多人将它戏称为“泥巴游戏”。

在这里插入图片描述

  • 比如美剧《生活大爆炸》里Sheldon玩的《Zork》就是1980年的一款纯文字游戏。

2. MUD游戏的趣味历史:

知名打假斗士方舟子在1995年和他的4位朋友开发了一款MUD游戏《侠客行》,但没想到游戏太火很快就被黑客攻破了,方舟子一怒之下公布源码。借鉴了《侠客行》的武侠思路,清华北大的一些同学业余时间一起开发了《北大侠客行

这款诞生在北大物理楼的服务器上的游戏是中文史上持续运营最久的MUD游戏。

20年过去了,直到今天每天仍有几百人在线。(嘻嘻,最近还玩过一次)

在这里插入图片描述


3. 文字游戏的没落:

随着现代游戏的发展,文字游戏逐渐没落,但无论是国内还是国外仍然有很多独立开发者在开发文字游戏。

2021年9月一款叫做《人生重开模拟器》的游戏刷爆各大社交媒体,这款游戏的机制是在抽取天赋卡后自动生成重开的人生。

这款几乎没有UI和互动的游戏,因为文案有趣在短短3天内超过2亿访问量。
在这里插入图片描述


二、文字游戏的设计方法:

今天我们将制作一个简易版本的《人生选择模拟器》。

最终效果是这样的:
在这里插入图片描述
玩家根据不同的选择,触发相应的剧情,在短短1分钟里过完荒诞的一生。

制作这款互动文字游戏,第一步应该完成的是?

A. 立刻开始编写代码
B. 写游戏中用到的文案
C. 规划游戏剧情和游戏机制
解析
正确答案:C
原因:在开始编写游戏时,整理好游戏的剧情和核心功能会显著提高效率,降低bug率。


1. 游戏策划流程:

在专业的游戏设计中,通常来说需要游戏策划,制作详细的游戏功能说明书阐述玩法和关卡规则。


2. 游戏主体功能:

我们先来设置《人生选择模拟器》的游戏剧情和游戏机制:

1️⃣主要剧情:

模拟一个普通人,通过【天赋选择】和【职业选择】,产生不同的人生结果。

2️⃣ 游戏规则:

根据选择导向不同的分支结局,没有胜负之分。


3. 程序规划:

我们把主程序分为三个部分(即有3个交互的地方)

  1. 游戏开篇设置
  2. 天赋选择
  3. 成年后选择

总结到下面的流程图中:

人生选择模拟器
天赋选择
天赋1
天赋2
天赋3
剧情
剧情
剧情
选择1
选择2
结局1
结局2
选择1
选择2
结局1
结局2
选择1
选择2
结局1
结局2

每个玩家可以从3个天赋中选择一个,每个天赋又有不同的剧情选择,从而产生6种不同的结局。(当然,这这是初步设想)


三、文字游戏功能实现:

part1【游戏开篇设置】:

1️⃣ 打印游戏名称:

游戏开篇,我们在屏幕上打出游戏的名称。

在这里插入图片描述

  • 想要输出这样的效果,可以使用字符串拼接的方式: "a" + "b" + "c"

小tips:字符串拼接是指在输出时用"+"号连接需要输出的各部分内容。

示例如下:

# 使用print()函数在屏幕中打印出名称
print("*"*23+"人生选择模拟器"+"*"*23)

2️⃣ 优化游戏开始:

一个最简单的交互已经生成好啦。不过作为小游戏,我们可以把开篇游戏做得更炫酷些~

让我们一起试一试吧~

# 游戏开篇设置

# 游戏开篇显示游戏标题
print("*"*30)
print(" "*5+"人生选择模拟器")
print("*"*30)

想必你也发现了,文字都是同时打印出来的,感觉过于流畅了!不符合人生重开的那种意境!如果能每隔几秒打印一句就完美了!在这里插入图片描述
哈哈,time模块里的sleep()函数就很好地解决了这个问题!


3️⃣导入时间模块:

停顿函数:time.sleep():

time.sleep()time模块的内置函数,作用是让当前程序停顿一段时间后继续运行。和C语言中的Sleep()有点像,但这个函数中填写的数字代表停顿的秒数(sec),而C语言中是毫秒(ms)。
例如:

time.sleep(5)# 表示停顿5秒
time.sleep(3)# 表示停顿3秒
time模块:

time 模块是 Python 的内置模块,要使用 time.sleep() 函数,需要先导入 time 模块。(import time)

time.time()返回当前时间的时间戳;
time.clock()以浮点数计算的秒数返回当前的CPU时间
time.sleep()让当前程序停顿一段时间后继续运行。

修改后的代码如下:

# 游戏开篇设置

# 游戏开篇显示游戏标题
# 导入time模块
import time
print("*"*30)
# 停顿1s
time.sleep(1)  
print(" "*5+"人生选择模拟器")
# 再停顿1s
time.sleep(1)
print("*"*30)

现在让我们尝试再编写一段代码,看看使用停顿函数的效果

poem = [“《春夜洛城闻笛》(李白)”,“谁家玉笛暗飞声”,“散入春风满洛城”,“此夜曲中闻折柳”,“何人不起故园情”]

1.使用for循环遍历并输出列表poem中的诗歌。
2.使用停顿函数,设置每停顿2秒输出一句诗歌。

对比两种输出,感受设置了停顿的效果。

poem = ["《春夜洛城闻笛》(李白)","谁家玉笛暗飞声","散入春风满洛城","此夜曲中闻折柳","何人不起故园情"]

# 1.使用for循环遍历并输出列表poem中的诗歌
for i in poem:
    print(i)
    
# 2.使用停顿函数,设置每停顿2秒输出一句诗歌
# 导入time模块
import time
# 遍历列表poem
for i in poem:
    # 使用time.sleep()设置停顿2秒
    time.sleep(2)
    # 输出诗歌
    print(i)

4️⃣输入用户姓名(实现与玩家的交互):

接下来,我们需要玩家输入姓名,实现这样的效果:
在这里插入图片描述
那我们如何实现跟玩家的交互呢?

input()函数:

input()函数是Python的内置函数。它是实现人机交互的一个关键。它的执行过程分为以下3步:

  1. 搜集信息——在终端区输入内容
  2. 赋值——将输入内容赋值给一个变量
  3. 返回类型——字符串

在这里插入图片描述

使用input()函数后,我们可以在终端输入信息,该函数接收到数据,会返回string(字符串)类型

  • 输入:字符串,数字(包含整型和浮点型)都可以。
  • 输出:字符串。也就是说无论input()中输入什么内容,都会转换为字符串类型。

隐喻:连接现实世界与代码世界的一个信箱。
我们可以把input()函数当作一个连接现实世界与代码世界的信箱。当问题从代码世界传递给我们,可我们却没有回答时,等待输入的input()信箱,就会一直处于敞开状态,等着你往里送回答。而当我们输入信息后,信箱门便会关上,继续执行下面的命令。

good!有了input()函数之后,我们就可以进行简单的人机交互了!
在这里插入图片描述

# 游戏开篇设置

# 游戏开篇显示游戏标题
# 导入time模块
import time
# 打印30个"*"
print("*"*30)
# 停顿1s
time.sleep(1)  
print(" "*5+"人生选择模拟器")
# 再停顿1s
time.sleep(1)
# 再打印30个"*"
print("*"*30)

# 使用input()函数接收玩家输入名字,并将输入的名字赋值給变量name
name = input("在输入框中给自己取一个名字吧:")
# 使用print()函数格式化输出f"好的,谢谢你{name}"
print(f"好的,谢谢你{
      name}")

  • name一个变量,存储输入的内容。
  • =一个等号,表示将输入的字符串赋值给变量name

注意:输入名字后记得按回车键哦~


part2【天赋选择】:

进行天赋选择,并触发对应的剧情的流程如下:

  • step1:展示三种天赋的具体内容
  • step2:请玩家输入选择
  • step3:根据玩家的选择输出对应剧情

1️⃣输出三种天赋的具体内容:

因为文字较多,所以我们使用变量talent_choice来存储选择天赋的文案内容,存储形式为列表。

talent_choice = ["现有以下三种天赋可供选择:",
"1.中产离异家庭,乐观,网络狂魔",
"2.中法混血,超凡美貌,家道中落",
"3.早产儿,天资聪慧,生于乡村"]
  • 之后涉及到文字内容的部分,也都以列表的形式存储,一方面使代码更整洁美观,一方面也方便debug以及修改文案内容。

接下来我们需要输出三种天赋的具体内容:

  • 我们可以使用for循环,依次从列表talent_choice提取元素,使用print()函数打印在屏幕上:
for i in talent_choice:    
    print(i)

2️⃣请玩家输入选择:

talent = input("请选择一种天赋:")

咦?input()函数返回的数据类型为字符串(“str”)啊!难道我选择的时候要把那行字都打印进去吗?离谱啊!这可不行,太麻烦了!有没有什么简单一点的办法呢?如果能将字符串类型转化为整型, 也就是将字符串"1",“2”,"3"转化为整型1,2,3,再进行判断,输出对应的剧情,岂不美哉?
在这里插入图片描述

int() 取整函数:

int()函数,将一个字符串或数字转换为整型。

  • 举例:
    int() :结果为0
    int(“3”):结果为整型3
    int(3.6):结果为整型3

哈哈,神器在手,天下我有!有了int()函数后,一切就简便了起来,我们现在只需要两步就可以搞定上面的问题了:

  1. 使用input()函数接收玩家输入的天赋。
  2. 使用int()函数将输入的内容转化为整型,并赋值给变量talent。

示例代码如下:

talent = int(input("请选择一种天赋:"))

int()函数传入小数后,小数点后的内容会全部“截断”(不会四舍五入哦~),只会保留整数部分


3️⃣根据玩家的选择输出对应剧情:

我们根据玩家的选择设置了3种不同的剧情:

talent_answer1 = ["4岁上幼儿园","5岁羡慕邻居一家三口去游乐场,而你只能在自己家的电影院独自看动画片","7岁老师在班上进行了IQ测试,你IQ平平","12岁努力学习的一年希望得到父亲的认可,但父亲只关注小三的儿子","13岁开始追星,在粉丝应援群中感受到了温暖","15岁考上重点中学,翘课去看爱豆演唱会,翻墙中摔断了腿","16岁收到第一封情书,开启了第一次恋爱","17岁爱豆被评为劣迹艺人,你哭着哭着秃头了","18岁遭遇初恋男友出柜,从此一心搞事业","20岁只身前往外国深造"]
talent_answer2 = ["3岁回到上海","5岁被星探挖掘,成为广告模特","6岁父亲欠下巨额债务并消失","7岁一边上学一边还债","9岁母亲运营自媒体账号,成为百万粉丝大V","10岁你被同班同学霸凌","12岁抑郁没考上中学","13岁在家修养一年,爱上画画","15岁一边学画画一边做模特","16岁回到学校,再次成为话题人物","17岁终于还清父亲欠下的债务","18岁搬家到成都","19岁以艺术生的方式考入大学","20岁和当红流量明星一起拍广告"]
talent_answer3 = ["刚出生父母双亡","3岁吃不起拉面,被预言是天选之子","6岁用放大镜对着太阳,把家里的院子烧了","9岁用弹弓打马蜂窝,蛰了自己一脸包","12岁以优异的成绩前往县城读中学","18岁考上名牌大学,成为全村的骄傲","19岁沉迷网游无法自拔,和名叫“阿美”网游恋爱","21岁网游面基发现对方和自己同为男性,一气之下戒了网瘾"]
for循环输出剧情:

通过if……elif……else判断输入的内容为1,2,3时,分别使用for循环遍历列表输出talent_answer1,talent_answer2,talent_answer3中的元素。

if talent == 1:
    for i in talent_answer1:
        print(i)
elif talent == 2:
    for i in talent_answer2:
        print(i)
elif talent == 3:
    for i in talent_answer3:
        print(i)
else:
    print("输入错误,请重新检查代码")

️这样做的确是一种方法,但我们现在只有3种情况,那如果有30种情况呢?我们是否还要一个一个地输出,如果还一个一个输出,岂不麻烦?想必你也想到了一种更为合理的解决方法——>使用函数!


定义函数简化代码:

for循环的部分都是相同的,我们可以通过定义函数的方法来简化代码。

定义一个get_list函数,函数的参数是一个列表,调用get_list函数可以实现将列表中的元素依次输出。

#定义get_list函数,参数为list,作用是依次获取列表中的元素并输出
def get_list(list):
    # 函数主体部分:依次从列表中提取元素
    for i in list:
        # 输出元素
        print(i)

使用关键字def定义函数,函数名为get_list,用()将参数list括起来后,添加冒号:

接着是函数的主体部分,需要用四个空格缩进。


调用函数:

可以直接使用函数名(参数)的格式,进行函数的调用。参数分别设置为talent_answer1talent_answer2talent_answer3

调用get_list函数,并结合判断语句,实现根据用户选择的天赋不同,输入不同的剧情作为get_list函数的参数,从而输出相应的剧情。

#使用if elif else条件判断,判断选择的天赋并输出相应的剧请
if talent == 1:
    get_list(talent_answer1)
elif talent == 2:
    get_list(talent_answer2)
elif talent == 3:
    get_list(talent_answer3)
else:
    print("输入错误,请重新检查代码")

part3 【成年后的选择】:

编写这部分代码的流程和【天赋选择】是一样的。不过对应的选择更多。

成年后的选择有两个:1.逐梦天涯 2.找一份安稳的工作(3种天赋,每种天赋对应2种选择,所以总共有6条分支剧情。)

人生选择模拟器
天赋选择
天赋1
天赋2
天赋3
剧情
剧情
剧情
选择1
选择2
结局1
结局2
选择1
选择2
结局1
结局2
选择1
选择2
结局1
结局2

1️⃣将剧情内容存储在变量中:

  1. 用变量choice1_talent1choice1_talent2choice1_talent3存储选择“逐梦天涯”时会触发的剧情

  2. 用变量choice2_talent1choice2_talent2choice2_talent3存储选择“找一份安稳工作”时会触发的剧情

注意:一般起变量名的时候最好和其实际意义挂钩,不要总是用a,b,c,str,name啥的作为变量名。

示例代码如下:

#将选择“逐梦天涯”的剧情分别存储在变量choice1_talent1,choice1_talent2,choice1_talent3中
choice1_talent1 = ["23岁毕业,选择留美生活","25岁和同学一起创业,不断打怪升级","30岁公司做大做强,逐步实现财富自由","33岁拒绝了合伙人的求婚,去澳门赌场消费一个亿","35岁领养了一个10岁的小男孩,并取了初恋的名字","40岁,小三的儿子赌博,你拒绝帮他还债,并暴打他一顿","50岁重回祖国,在乡下买了块土地,种的西瓜被当地人偷了","60岁儿子宣布出家当和尚,放弃继承家业","65岁住进了养老院,和老太太因为当红明星谁最帅而大打出手","70岁患了癌症","71岁在睡梦中平静离世"]
choice1_talent2 = ["21岁和顶流拍广告成为话题女星","23岁放弃学业参加选秀","25岁出演偶像剧女主,但剧情拉垮被网友嘲讽","26岁和男明星隐婚生子","27岁离婚成为单亲妈妈","28岁,回法国学设计","32岁开设亲子服装网店","35岁在8个城市开了超过30家店铺","38岁财务自由","40岁儿子在学校遭遇校园霸凌","42岁成立基金会,帮扶被霸凌的儿童","44岁投资并参演校园霸凌题材的电影","45岁遭遇疫情,关闭20家实体店铺","50岁资产缩水但没有减少公益投入","60岁儿子去教堂当神父,你表示支持","70岁在海边别墅平静离开"]
choice1_talent3 = ["23岁和朋友炒期货,赚了人生第一桶金","24岁迷上了喝奶茶,利用第一桶金开了奶茶店","26岁奶茶店火了,你把业务拓展到了海外","30岁因长期喝太多奶茶,得了过度肥胖症","32岁努力减肥,重新变为帅小伙","40岁回到家乡,建设美丽乡村"]

#将选择“找份安稳工作”的剧情分别存储在变量choice2_talent1,choice2_talent2,choice2_talent3中
choice2_talent1 = ["23岁研究生毕业选择回国发展","24岁被家长催考公务员","25岁考上地方财政局,成为父亲酒局上最大的谈资","27岁拒绝了所有相亲,成为恐婚一族","30岁下乡支教","31岁被同为支教老师的同事温暖,结婚,老公话不多但顾家","33岁老公希望你们有个孩子,但你坚决不生","35岁买了第二套房,同年生下龙凤胎","40岁老公冲动创业亏了一套","45岁每天下班鸡娃","女儿学霸儿子学渣","60岁退休给儿子带娃","65岁给女儿带娃","70岁国家补贴3胎家庭每月2万","75岁癌症已被攻克","80岁老伴离世","你吃斋念佛活到99"]
choice2_talent2 = ["21岁放弃演艺圈生活,安心读书","22岁进入传媒公司打工","25岁连升2级成为部门主管","27岁你养了1只猫咪","29岁你养了8只猫咪","32岁传媒公司不景气被裁员","33岁开启了自己的网店,并进行开启直播卖货","35岁因为直播卖货大火,成为某宝首席主播","40岁因常年高强度工作,身患乳腺癌","45岁癌症治愈,开始加入流浪宠物公益组织","60岁创立了流浪动物保护组织”,70岁,在社会各界的赞扬声中安然去世”]
choice2_talent3 = ["23岁为资本家打工,天天996","27岁凭借996的超高薪资,为父母在乡村买了大房子,并资助了两个穷苦大学生","35岁失业,在原公司楼下卖手抓饼","50岁发现当年资助的学生如今成为大学教授,每个月都来看望你"]

2️⃣剧情展开:

最后我们完成选择后剧情展开的部分:

当选择为1时,再判断天赋值为1、2或3,输出对应的剧情:

choice==1:逐梦天涯
talent==1:天赋选择1
talent==2:天赋选择2
talent==3:天赋选择3
choice1_talent1:剧情支线1
choice1_talent2:剧情支线2
choice1_talent3:剧情支线3

当选择为2时,再判断天赋值为1、2或3,输出对应的剧情

choice==1:安稳工作
talent==1:天赋选择1
talent==2:天赋选择2
talent==3:天赋选择3
choice2_talent1:剧情支线1
choice2_talent2:剧情支线2
choice2_talent3:剧情支线3

示例代码如下:

# 使用input()函数接收选择,并将选择的内容存储到变量choice中,并使用int()函数将输入的内容转化为整型
choice = int(input("成年后你面临两种选择:1.逐梦天涯  2.找一份安稳的工作,你的选择是:")) 

# 使用if elif else条件判断,判断玩家选择逐梦天涯时(choice == 1)
# 输出对应玩家天赋的剧情

if choice == 1:
    # 输出"你选择了逐梦天涯。"
    print("你选择了逐梦天涯。")
    # 判断当天赋选择为1时
    if talent == 1:
        # 调用get_list函数依次输出choice1_talent1中的剧情
        get_list(choice1_talent1)
    # 判断当天赋选择为2时
    elif talent ==2:
        # 调用get_list函数依次输出choice1_talent2中的剧情
        get_list(choice1_talent2)
    # 判断当选择情况为3时    
    elif talent ==3:
        # 调用get_list函数依次输出choice1_talent3中的剧情
        get_list(choice1_talent3)
# 使用if elif else条件判断,判断玩家选择安稳工作时(choice == 2)输出对应玩家天赋的剧情
elif choice == 2:
    # 输出"你选择了找一份安稳工作。"
    print("你选择了找一份安稳工作。")
    # 判断当天赋选择为1时
    if talent == 1:
        # 调用get_list函数依次输出choice2_talent1中的剧情
        get_list(choice2_talent1)
    # 判断当天赋选择为2时   
    elif talent ==2:
        # 调用get_list函数依次输出choice2_talent2中的剧情
        get_list(choice2_talent2)
    # 判断当选择情况为3时    
    elif talent ==3:
        # 调用get_list函数依次输出choice2_talent3中的剧情
        get_list(choice2_talent3)
else:
    print("输入错误,请重新检查代码")  

part4 【完善游戏体验】:

现在我们的人生选择模拟器已经基本完成啦~不过游戏还有很多需要提升的空间。

比如,现在的文字信息出现的很快,阅读体验不好。

可以在for循环依次遍历列表元素并输出的时候,使用time.sleep(2),可以使每次输出前,停顿2s

# 使用print()函数依次输出变量talent_choice中存储的内容
for i in talent_choice:    
    print(i)
    #停顿2s
    time.sleep(2)

自定义设置停顿时间:

只要有文案输出的部分,我们都想自定义设置停顿时间该怎么办呢?

还记得我们定义了输出列表元素的函数get_list()吗~~~我们可以在函数中增加停顿时间的设置time.sleep(s)。即只需要再为get_list()增加一个时间参数就好了!之后在调用函数时,自定义设置停顿的秒数即可,例如:

get_list(talent_answer1,1),停顿1秒
get_list(talent_answer1,2),停顿2秒
get_list(talent_answer1,3),停顿3秒

示例代码如下:

# 定义get_list函数,参数为list,s作用是依次获取列表list中的元素并输出,每次输出前停顿s秒
def get_list(list,s):
    # 函数主体部分:依次从列表中提取元素
    for i in list:
        # 每次输出前,停顿s秒
        time.sleep(s)
        # 输出元素
        print(i)
# 使用if elif else条件判断,判断选择的天赋并输出相应的剧请
if talent == 1:
    get_list(talent_answer1,1)
elif talent == 2:
    get_list(talent_answer2,1)
elif talent == 3:
    get_list(talent_answer3,1)
else:
    print("输入错误,请重新检查代码")


#第二个剧情点:成年后的选择

# 使用input()函数接收选择,并将选择的内容存储到变量choice中,并使用int()函数将输入的内容转化为整型
choice = int(input("成年后你面临两种选择:1.逐梦天涯  2.找一份安稳的工作,你的选择是:")) 

# 使用if elif else条件判断,判断玩家选择逐梦天涯时(choice == 1)输出对应玩家天赋的剧情
if choice == 1:
    # 输出"你选择了逐梦天涯。"
    print("你选择了逐梦天涯。")
    # 判断当天赋选择为1时
    if talent == 1:
        # 调用get_list函数依次输出choice1_talent1中的剧情
        get_list(choice1_talent1,1)
    # 判断当天赋选择为2时
    elif talent ==2:
        # 调用get_list函数依次输出choice1_talent2中的剧情
        get_list(choice1_talent2,1)
    # 判断当选择情况为3时    
    elif talent ==3:
        # 调用get_list函数依次输出choice1_talent3中的剧情
        get_list(choice1_talent3,1)
        
# 使用条件判断,判断玩家选择安稳工作时(choice == 2)输出对应天赋的剧情
elif choice == 2:
    # 输出"你选择了找一份安稳工作。"
    print("你选择了找一份安稳工作。")
    # 判断当天赋选择为1时
    if talent == 1:
        # 调用get_list函数依次输出choice2_talent1中的剧情
        get_list(choice2_talent1,1)
    # 判断当天赋选择为2时   
    elif talent ==2:
        # 调用get_list函数依次输出choice2_talent2中的剧情
        get_list(choice2_talent2,1)
    # 判断当选择情况为3时    
    elif talent ==3:
        # 调用get_list函数依次输出choice2_talent3中的剧情
        get_list(choice2_talent3,1)
else:
    print("输入错误,请重新检查代码") 

part5 【完结撒花~】:

到此为止,我们已经完成了第一个文字RPG游戏,太棒啦!

回顾代码编写的过程:

1.我们通过input()函数来进行交互。

2.使用条件判断来引导分支剧情。

3.定义函数get_list(list,s)来简化代码。

4.使用time.sleep()来设置停顿。

当然,你也可以在此基础上设置更加复杂的剧情哦~
下面就让我们附上完整的源码:

️完整源码:

#-*- coding:utf-8 -*-
# 将选择三种天赋的文案存储在变量talent_choice中
talent_choice = ["现有以下三种天赋可供选择:",
"1.中产离异家庭,乐观,网络狂魔",
"2.中法混血,超凡美貌,家道中落",
"3.早产儿,天资聪慧,生于乡村"]
# 将选择3种天赋所触发的剧情分别存储在变量talent_answer1,talent_answer2,talent_answer3中
talent_answer1 = ["4岁上幼儿园","5岁羡慕邻居一家三口去游乐场,而你只能在自己家的电影院独自看动画片","7岁老师在班上进行了IQ测试,你IQ平平","12岁努力学习的一年希望得到父亲的认可,但父亲只关注小三的儿子","13岁开始追星,在粉丝应援群中感受到了温暖","15岁考上重点中学,翘课去看爱豆演唱会,翻墙中摔断了腿","16岁收到第一封情书,开启了第一次恋爱","17岁爱豆被评为劣迹艺人,你哭着哭着秃头了","18岁遭遇初恋男友出柜,从此一心搞事业","20岁只身前往外国深造"]
talent_answer2 = ["3岁回到上海","5岁被星探挖掘,成为广告模特","6岁父亲欠下巨额债务并消失","7岁一边上学一边还债","9岁母亲运营自媒体账号,成为百万粉丝大V","10岁你被同班同学霸凌","12岁抑郁没考上中学","13岁在家修养一年,爱上画画","15岁一边学画画一边做模特","16岁回到学校,再次成为话题人物","17岁终于还清父亲欠下的债务","18岁搬家到成都","19岁以艺术生的方式考入大学","20岁和当红流量明星一起拍广告"]
talent_answer3 = ["刚出生父母双亡","3岁吃不起拉面,被预言是天选之子","6岁用放大镜对着太阳,把家里的院子烧了","9岁用弹弓打马蜂窝,蛰了自己一脸包","12岁以优异的成绩前往县城读中学","18岁考上名牌大学,成为全村的骄傲","19岁沉迷网游无法自拔,和名叫“阿美”网游恋爱","21岁网游面基发现对方和自己同为男性,一气之下戒了网瘾"]

# 将选择“逐梦天涯”的剧情分别存储在变量choice1_talent1,choice1_talent2,choice1_talent3中
choice1_talent1 = ["23岁毕业,选择留美生活","25岁和同学一起创业,不断打怪升级","30岁公司做大做强,逐步实现财富自由","33岁拒绝了合伙人的求婚,去澳门赌场消费一个亿","35岁领养了一个10岁的小男孩,并取了初恋的名字","40岁,小三的儿子赌博,你拒绝帮他还债,并暴打他一顿","50岁重回祖国,在乡下买了块土地,种的西瓜被当地人偷了","60岁儿子宣布出家当和尚,放弃继承家业","65岁住进了养老院,和老太太因为当红明星谁最帅而大打出手","70岁患了癌症","71岁在睡梦中平静离世"]
choice1_talent2 = ["21岁和顶流拍广告成为话题女星","23岁放弃学业参加选秀","25岁出演偶像剧女主,但剧情拉垮被网友嘲讽","26岁和男明星隐婚生子","27岁离婚成为单亲妈妈","28岁,回法国学设计","32岁开设亲子服装网店","35岁在8个城市开了超过30家店铺","38岁财务自由","40岁儿子在学校遭遇校园霸凌","42岁成立基金会,帮扶被霸凌的儿童","44岁投资并参演校园霸凌题材的电影","45岁遭遇疫情,关闭20家实体店铺","50岁资产缩水但没有减少公益投入","60岁儿子去教堂当神父,你表示支持","70岁在海边别墅平静离开"]
choice1_talent3 = ["23岁和朋友炒期货,赚了人生第一桶金","24岁迷上了喝奶茶,利用第一桶金开了奶茶店","26岁奶茶店火了,你把业务拓展到了海外","30岁因长期喝太多奶茶,得了过度肥胖症","32岁努力减肥,重新变为帅小伙","40岁回到家乡,建设美丽乡村"]

# 将选择“找份安稳工作”的剧情分别存储在变量choice2_talent1,choice2_talent2,choice2_talent3中
choice2_talent1 = ["23岁研究生毕业选择回国发展","24岁被家长催考公务员","25岁考上地方财政局,成为父亲酒局上最大的谈资","27岁拒绝了所有相亲,成为恐婚一族","30岁下乡支教","31岁被同为支教老师的同事温暖,结婚,老公话不多但顾家","33岁老公希望你们有个孩子,但你坚决不生","35岁买了第二套房,同年生下龙凤胎","40岁老公冲动创业亏了一套","45岁每天下班鸡娃","女儿学霸儿子学渣","60岁退休给儿子带娃","65岁给女儿带娃","70岁国家补贴3胎家庭每月2万","75岁癌症已被攻克","80岁老伴离世","你吃斋念佛活到99"]
choice2_talent2 = ["21岁放弃演艺圈生活,安心读书","22岁进入传媒公司打工","25岁连升2级成为部门主管","27岁你养了1只猫咪","29岁你养了8只猫咪","32岁传媒公司不景气被裁员","33岁开启了自己的网店,并进行开启直播卖货","35岁因为直播卖货大火,成为某宝首席主播","40岁因常年高强度工作,身患乳腺癌","45岁癌症治愈,开始加入流浪宠物公益组织","60岁创立了流浪动物保护组织","70岁,在社会各界的赞扬声中安然去世"]
choice2_talent3 = ["23岁为资本家打工,天天996","27岁凭借996的超高薪资,为父母在乡村买了大房子,并资助了两个穷苦大学生","35岁失业,在原公司楼下卖手抓饼","50岁发现当年资助的学生如今成为大学教授,每个月都来看望你"]

# 游戏开篇设置

# 游戏开篇显示游戏标题
# 导入time模块
import time
# 打印30个"*"
print("*"*30)
# 停顿1s
time.sleep(1)  
print(" "*5+"人生选择模拟器")
# 再停顿1s
time.sleep(1)
# 再打印30个"*"
print("*"*30)

# 使用input()函数接收玩家输入名字,并将输入的名字赋值给变量name
name = input("在输入框中给自己取一个名字吧:")
# 使用print()函数格式化输出f"好的,谢谢你{name}"
print(f"好的,谢谢你{
      name}")

# 第一个剧情点;天赋选择
# for循环依次输出变量talent_choice中存储的内容
for i in talent_choice:  
    # 每次输出前,停顿1秒
    time.sleep(2)
    # 输出元素
    print(i)
# 使用input()函数接收玩家输入选择的天赋,使用int()函数转化为整型,并赋值给变量talent
talent = int(input("请选择一种天赋:"))

# 定义get_list函数,参数为list,s作用是依次获取列表list中的元素并输出,每次输出前停顿s秒
def get_list(list,s):
    # 函数主体部分:依次从列表中提取元素
    for i in list:
        # 每次输出前,停顿s秒
        time.sleep(s)
        # 输出元素
        print(i)
# 使用if elif else条件判断,判断选择的天赋并输出相应的剧请
if talent == 1:
    get_list(talent_answer1,1)
elif talent == 2:
    get_list(talent_answer2,1)
elif talent == 3:
    get_list(talent_answer3,1)
else:
    print("输入错误,请重新检查代码")


# 第二个剧情点:成年后的选择

# 使用input()函数接收选择,并将选择的内容存储到变量choice中,并使用int()函数将输入的内容转化为整型
choice = int(input("成年后你面临两种选择:1.逐梦天涯  2.找一份安稳的工作,你的选择是:")) 

# 使用if elif else条件判断,判断玩家选择逐梦天涯时(choice == 1)输出对应玩家天赋的剧情
if choice == 1:
    # 输出"你选择了逐梦天涯。"
    print("你选择了逐梦天涯。")
    # 判断当天赋选择为1时
    if talent == 1:
        # 调用get_list函数依次输出choice1_talent1中的剧情
        get_list(choice1_talent1,1)
    # 判断当天赋选择为2时
    elif talent ==2:
        # 调用get_list函数依次输出choice1_talent2中的剧情
        get_list(choice1_talent2,1)
    # 判断当选择情况为其他时    
    elif talent ==3:
        # 调用get_list函数依次输出choice1_talent3中的剧情
        get_list(choice1_talent3,1)
        
# 使用条件判断,判断玩家选择安稳工作时(choice == 2)输出对应天赋的剧情
elif choice == 2:
    # 输出"你选择了找一份安稳工作。"
    print("你选择了找一份安稳工作。")
    # 判断当天赋选择为1时
    if talent == 1:
        # 调用get_list函数依次输出choice2_talent1中的剧情
        get_list(choice2_talent1,1)
    # 判断当天赋选择为2时   
    elif talent ==2:
        # 调用get_list函数依次输出choice2_talent2中的剧情
        get_list(choice2_talent2,1)
    # 判断当选择情况为其他时    
    elif talent ==3:
        # 调用get_list函数依次输出choice2_talent3中的剧情
        get_list(choice2_talent3,1)
else:
    print("输入错误,请重新检查代码") 

如果你仔细观察的话,会发现我在第一行加了这么一句话:

#-*- coding:utf-8 -*-

本来python3默认使用UTF-8格式,所以开头一般不用加 # – coding:utf-8 –
但是有的中文中还是会出现无法识别的情况,这时候就需要在第一行加上这句。我们这里主要是因为文字列表里文字中间的英文逗号可能和中文逗号混淆的问题,如果不加的话可能就无法运行:

在这里插入图片描述


好了,到这里第一个项目算是完美结束了,相信你对RPG游戏也有了一定的了解,或许你已经准备着手制作自己的RPG游戏了!!!哈哈,如果是这样的话那就恭喜你了,我中华游戏界又将新添一位大神了!后续还会陆续发布新的项目,敬请期待吧!

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_73453526/article/details/132553775

智能推荐

ffmpeg获取设备支持的分辨率_FFmpeg 基础知识-程序员宅基地

文章浏览阅读632次。FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库 libavcodec。官方网站:http://www.ffmpeg.org/项目组成libavformat封装模块,封装了Protocol层和Demuxer、Muxer层,使得协议和格式对于..._ffmpeg读取分辨的库

OpenWRT编译 -- 静态编译驱动到内核中的方法_openwrt中添加驱动编译进内核-程序员宅基地

文章浏览阅读9.6k次。申明:小弟openwrt初学,很多东西都不知道,在偶然的机会用到openwrt,想要将自己写的驱动程序编译进内核中,费了九牛二虎之力,最终还是直接在内核源码中进行增加才搞定,过程尽可能的详细,也是自己的一个学习过程,也是给自己做一个笔记后面遇到可以借鉴。另外,第一次写博客,希望大家不喜勿喷哦,当然文档中有任何问题都欢迎能指出来,而且在过程中遇到了一个问题到现在没有找出为什么,希望大家看到了..._openwrt中添加驱动编译进内核

Unity2D 面向目标方向-程序员宅基地

文章浏览阅读1.7k次。在2d空间上,假设角色的自身的y轴方向为正方向,如果要让角色随时面向一个目标点。这里假设(0,0)点为目标点第一种:Vector3 v = Vector3.zero - transform.position; //首先获得目标方向 v.z = 0; ..._unity 2d中哪个方向是forward

基于XDMA 的PCIE读写DDR_xdma ddr-程序员宅基地

文章浏览阅读7.4k次,点赞16次,收藏100次。基于XDMA 的PCIE读写DDR概述:  想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。实现功能:PC通过PCIE读写DDR,同时用户通过逻辑代码可以读取被写入DDR内的数据(我是通过VIO实现DDR任意地址,任意数据大小的读取。)。实践实践!!!说明:参考文档:PCI Express Base Specification Revision 3.0P_xdma ddr

缓存穿透与布隆过滤器_缓存穿透 布隆过滤器-程序员宅基地

文章浏览阅读1.7k次。本文主要介绍在使用缓存过程中经常会遇到的几个问题:缓存击穿、缓存雪崩、缓存穿透,以及其解决方案。之后会对缓存穿透的解决方案之一布隆过滤器,进行详细讲解。_缓存穿透 布隆过滤器

pandas写入oracle,python pandas dataframe 读取和写入Oracle-程序员宅基地

文章浏览阅读1.4k次。1、代码:主要写入时表要为小写,否则报错Could not reflect: requested table(s) not available in Enginefrom sqlalchemy import create_engineconn_string='oracle+cx_oracle://admin:[email protected]:1521/ORCL?charset=utf8'..._pandas cx_oracle 写入

随便推点

【数学建模】元胞自动机-程序员宅基地

文章浏览阅读3.1k次,点赞55次,收藏63次。【数学建模】元胞自动机_元胞自动机

python 基因序列提取_Python + 生物信息 05 : 提取 CDS 等其他特征序列-程序员宅基地

文章浏览阅读1.4k次。1 介绍在基因结构分析或其他生物功能分析中会时常用到 CDS 序列,以及其他诸如 mRNA 序列,misc RNA序列等具有生物意义的序列片段。而NCBI 的基因库中已经包含有这些的信息,但是只有一部分是整理可下载的。而剩下的一部分可以通过 genbank给出的位点信息来提取,个人能力有限,这里只做抛转之用。下面以提取 CDS 为例,记录提取序列过程,其他特征序列类似。2 结构目录3 Python..._提取dna中cds序列

php 获取 mysql多行数据 存在数组中_mysql 将多行数据添加到数组-程序员宅基地

文章浏览阅读753次。个人习惯使用面向对象的方式来操作mysql。首先定义一个二维数组,用来存储结果。结果集取得一行就是一个数组,因为有多行数据,所以是二维。$data=array();这条代码$result->fetch_assoc()是: 从结果集中取得一行作为关联数组:那么就有:while($row = $result->fetch_assoc()){ array_push($data,$row);}不断从结果集读取数据,并将每行数据加到二维数组data中,直到读取完毕_mysql 将多行数据添加到数组

Python学习系列之zip函数_python in zip-程序员宅基地

文章浏览阅读677次。目录一、zip函数(内建函数)1.1 定义基本语法:参数说明:返回值:示例:1.2 处理列表1.3 处理元组 1.4 处理字典 1.5 处理一个参数和空列表一、zip函数(内建函数)1.1 定义 Python 2:zip() 函数用于将可迭代的对象(字典,列表,元组,集合,字符串等)作为参数,将对象中..._python in zip

探索网络攻防技术:自学之道_网络攻防自学-程序员宅基地

文章浏览阅读383次。网络攻防技术在不断演进,新的威胁和安全措施不断出现。因此,持续学习和跟进是至关重要的。订阅安全博客、参加安全研讨会、阅读最新的安全报告等方式,可以帮助你保持对新技术和趋势的了解。_网络攻防自学

0-1字典树总结和经典例题(ing)_字典树例题 poj-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏5次。Table of Contents0-1字典树例题1. CSU 1216:异或最大值:给定一些数,任意两个数的最大异或值例题2.HDU 4825Xor Sum:每次询问给出一个数,找出一个与它异或结果最大的数例题3.HDU 5536Chip Factory: 计算(s[i] + s[j]) ^ s[k] 的最大值例题4.POJ 3764The xor-longe..._字典树例题 poj

推荐文章

热门文章

相关标签