文章目录
前言
今天,我们来做一款文字游戏《荒岛求生》,我会一步步完善荒岛求生的代码,让你学会制作。
注:这篇文章中的代码是我现场写的,这不得给我个赞?
我在编程开发的每个部分后面都会展示当前的总代码,可以了解一下进度。
我们先来讲一下python文字游戏的优点:
首先,文字游戏所用到的代码很简单,可以参考上一篇文章,都是基础代码。
其次,文字游戏只要你会打字就行了,不需要你插入图片、音效等等。
接着,文字游戏没有那么复杂,他可以直接在运行框里运行,不需要游戏窗口,也就不需要判断点击事件,按键事件。
总结,文字游戏的制作非常简单,不需要你会很多东西。
然后就是文字游戏的缺点了。
他的缺点就是他的优点,不用制作音效、图片、点击事件、游戏窗口、游戏动画这些固然可以让你更方便的制作游戏,但是,游戏的体验感会大大降低。
现在的网络游戏都是有游戏窗口,窗口里有精美的图片,让玩家的体验感更好。
而一个文字游戏,就有点十几年前的感觉······
总结,文字游戏制作虽然简单,但也会导致玩家的体验感降低。
(把游戏文件打包之后可以在终端运行,也勉强算是游戏窗口了······)
如果想要制作有游戏窗口、图片、点击事件、音效,可以去学习pygame。
开发游戏《荒岛求生》
游戏大纲
背景内容
首先我们来确定这个游戏的内容,我们以荒岛求生为题,先写一段背景:
你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。
但是你却在一个木屋里,木屋里有一张床,和一个售货机。
你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······
好的,这样游戏的背景就完成了。
通关条件
在我们拥有了上面的游戏背景之后,通关条件就很明确了:
存活100天,然后救援队就会把你接走
游戏过程
背景故事和通关条件都有了,那游戏要怎么玩呢?我们可以划分为3个部分
探索荒岛
主角在每天开始的时候可以选择去探索荒岛,探索后有可能可以获得一些物资、也可能遭遇猛兽袭击,这部分我们可以随机触发事件。
如果选择不去探索荒岛,哪么主角就会直接进入下一个阶段:购买物资
购买物资
前面的背景故事提到,房间里有一个售货机,这是一个关键物品。
玩家可以在探索中发现金币,可以用金币来向售货机购买物品。
在玩家探索之后会自动进入购买物资的阶段
休息
为什么要设置休息这个阶段呢,那是因为在游戏中是有饱食度、健康值的。
而玩家探索是需要耗费保食度的,而写还可能遇到野兽,会受伤,损失健康值。
那怎么补充饱食度和健康值呢?玩家可以在探索中发现食物和药品来进食和治疗。
所以,我们专门设置了一个休息阶段,来给玩家治疗和进食。
在玩家休息完成后,就睡觉了,第二天醒来,就从探索及荒岛从新开始。
总结
我们已经成功的完成了游戏大纲,现在进入编程开发阶段吧!
代码开发
定义变量
我们先定义几个变量
饱食度
健康值
心情
背包(需容纳多个元素)
其中,背包需要容纳多个变量,所以我们可以将它定义为列表(list)类型。
其他我们定义成数字。
food = 10
health = 10
mood = 10
bag = [] # 列表
当前代码
food = 10
health = 10
mood = 10
bag = []
引入背景故事
print('你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。')
print('但是你却在一个木屋里,木屋里有一张床,和一个售货机。')
print('你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······')
我们直接用print打印出之前写好的背景故事就可以。
当前代码
food = 10
health = 10
mood = 10
bag = []
print('你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。')
print('但是你却在一个木屋里,木屋里有一张床,和一个售货机。')
print('你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······')
循环问题解决:函数
通过我们的游戏大纲可以了解到,整个游戏基本上就是在探索荒岛、购买物资、休息三个阶段之间循环。
我们先假设三个阶段分别为a、b、c。
那我们要经历100天,就是100个abc。
那要这样制作吗
a
b
c
a
b
c
······
(98个abc省略)
这样未免也太麻烦了吧!
我们可以注意到,这组循环是有规律的,他是abcabc,不是abcde。
所以我们可以吧abc分别封装成一个函数,依次调用。
def a():
pass
def b():
pass
def c():
pass
这样,我们可以在a里面来到b,从b里面来到c,再从c里面来到a······
可能有点难理解,等实际操作的时候你就懂了。
当前代码
food = 10
health = 10
mood = 10
bag = []
def a():
pass
def b():
pass
def c():
pass
print('你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。')
print('但是你却在一个木屋里,木屋里有一张床,和一个售货机。')
print('你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······')
制作延时
背景故事不能一下子出来,因为这样不美观,我们可以用睡眠代码让他一行一行出来
time.sleep(1.5)
这行代码就相当于让整个程序停止1.5秒钟,也是在给你时间读上面的内容。
print('你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。')
time.sleep(1.5)
print('但是你却在一个木屋里,木屋里有一张床,和一个售货机。')
time.sleep(1.5)
print('你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······')
time.sleep(1.5)
这样是不是就可以了?不是的,你把这段代码放到pycharm上,肯定会报错。
应为你没有导入time的模块,在代码的最上方加一个导入time模块的代码。
import time
当前代码
import time
food = 10
health = 10
mood = 10
bag = []
def a():
pass
def b():
pass
def c():
pass
print('你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。')
time.sleep(1.5)
print('但是你却在一个木屋里,木屋里有一张床,和一个售货机。')
time.sleep(1.5)
print('你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······')
time.sleep(1.5)
制作a函数(探索荒岛阶段)
现在我们要开始制作探索荒岛阶段了,但在此之前,我们先解决一个问题。
把函数定义好之后,他就摆在那里,也没用啊!
背景故事讲完了之后,该结束还是结束,函数里的东西也展示不出来!
那是因为我们没有调用函数,不调用,那封装的内容就不出来。
在此之前我们要先调用函数。
在背景故事后面调用。
a()
这就是调用了,因为不用传参,所以括号里我们啥都不用写。
为了美观,我在背景故事后面加了一个\n,这是换行的意思,你也可以理解为空行
print('你缓缓睁开眼睛,发现自己正身处于一片孤岛,周围没有人。')
time.sleep(1.5)
print('但是你却在一个木屋里,木屋里有一张床,和一个售货机。')
time.sleep(1.5)
print('你找到了一个通讯器,你用他向外界求助,但是救援队告诉你他们要100天后才能来······')
time.sleep(1.5)
a()
那么接下来,我们就开始制作a函数里的内容吧!
展示数据
我们在询问前,先展示一下玩家目前的数据
print(f'饱食度:{
food} 健康值:{
health} 心情:{
mood}')
print(f'背包:{
bag}')
这样就可以了
是否探索?
在a函数里,玩家可以选择探索或者不探索,我们首先要制作这个功能。
我们先询问玩家要不要探索荒岛,并让玩家输入。
ask = input('天亮了,你要去探索荒岛吗(要/不要):')
接下来,我们判断玩家输入的是什么。
在这个时候,ask就是玩家输入的内容。
我们直接用if判断ask是什么。
if ask == '要':
pass
elif ask == '不要':
pass
else:
pass
其中if下面的内容是玩家要探索荒岛,
elif是不探索,
else则是乱输入。
我们一个个补充。
不探索
我们先不写探索里面的内容,先写不探索。
不探索的话,就是来到b函数,但是我们要先更改一下玩家的数据。
print('你没有选择去探索荒岛,而是待在家里,饱食度-1 心情-1')
food -= 1
mood -= 1
这里讲一个知识
food = food - 1 就是 food -= 1
然后调用函数前往b函数。
我照例美观了一下,加了一个换行的\n符号
print('你没有选择去探索荒岛,而是待在家里,饱食度-1 心情-1\n')
food -= 1
mood -= 1
b()
但是,你发现,输入这段代码,你发现程序报了个错
未解析的引用
为什么会这样呢,那是因为,你的这个变量,程序里没有啊!
你肯定很疑惑,我都已经定义了变量了,怎么会没有?
这就要讲一下作用域的关系了,我简单讲一下。
作用域:
变量分为全局变量和局部变量。
在函数外面定义的叫全局变量,在函数里面定义的叫局部变量。
我们的变量就是全局变量。
作用域规则:
在函数里面(局部作用域)不能调用全局变量
在函数外面(全局作用域)不能调用局部变量
那这不是完了吗!
没法调用游戏还怎么做啊?
那当然是有办法调用的!
用global啊!
global food, mood, health, bag
global就相当于是把全局变量导入进来了,把他放到函数的最上边,就没有问题、不会报错了。
展示一下a函数的目前内容。
def a():
global food, health, mood, bag
print(f'饱食度:{
food} 健康值:{
health} 心情:{
mood}')
print(f'背包:{
bag}')
ask = input('天亮了,你要去探索荒岛吗(要/不要):')
if ask == '要':
pass
elif ask == '不要':
print('你没有选择去探索荒岛,而是待在家里,饱食度-1 心情-1\n')
food -= 1
mood -= 1
b()
else:
pass
乱输入
乱输入指的就是你输入的内容既不是“要”也不是“不要”。
那么就会进入else里。
所以,我们在else里写的内容就是让用户重新输入
print('没有此选项')
a()
重新调用一遍函数,也就是再问一遍。
把这段代码填入else里。
如果1000次乱输入会报错!
探索
接下来,我们就要将a函数的核心部分了:探索。
但是,再讲之前,我们先导入一个模块。
random
这是随机模块,因为我们要随机生成事件,所以需要用到这个模块。
我们在程序的最上方导入,和time放在一起。
import random
那么接下来,我们开始制作事件吧!
我们先制作7个可能发生的事件,其中有5个是好事,2个是坏事。
用随机模块随机1道7之间的数字。
x = random.randint(1, 7)
判断数字是几(发生几号事件)。
if x == 1:
pass
if x == 2:
pass
if x == 3:
pass
if x == 4:
pass
if x == 5:
pass
if x == 6:
pass
if x == 7:
pass
我已经想好了7个事件就直接填进去了。
同样,在调用函数前加一个空行,这样更美观。
if x == 1:
print('你找到了一块面包!饱食度-1 健康值-1 心情+1\n')
food -= 1
health -= 1
mood += 1
bag.append('面包')
b()
elif x == 2:
print('你找到了一块牛肉!饱食度-1 健康值-1 心情 +2\n')
food -= 1
health -= 1
mood += 2
bag.append('牛肉')
b()
elif x == 3:
print('你捡到了一个金币!饱食度-1 健康值-1 心情+2\n')
food -= 1
health -= 1
mood += 2
bag.append('金币')
b()
elif x == 4:
print('你找到了一袋金币!饱食度-1 健康值-1 心情+3\n')
food -= 1
health -= 1
mood += 3
bag.append('一袋金币')
b()
elif x == 5:
print('你找到了一个急救包!饱食度-1 健康值-1 心情+2\n')
food -= 1
health -= 1
mood += 2
b()
bag.append('急救包')
elif x == 6:
print('你踩到了一个陷阱!饱食度-1 健康值-3 心情-2\n')
food -= 1
health -= 3
mood -= 2
b()
elif x == 7:
print('你遇到了一头牛!')
ask = input('要怎么样(和它打架/逃命):')
if ask == '和它打架':
print('你杀死了它,获得一块牛肉!饱食度-2 健康值-5 心情+1\n')
food -= 2
health -= 5
mood += 1
bag.append('牛肉')
b()
elif ask == '逃命':
print('你虽然受了伤,但是你甩掉了它!饱食度-2 健康值-3 心情-1\n')
food -= 2
health -= 3
mood -= 1
b()
else:
print('你站在原地犹豫不决,被它追上了,你受了很重的伤才甩掉她!饱食度-5 健康值-7 心情-5\n')
food -= 5
health -= 7
mood -= 5
b()
注意!在事件发生之后,会强制来到b函数!
那么,到目前为止,整个a函数已经做完了,展示a函数。
def a():
global food, health, mood, bag
标签:mood,探索,Python,荒岛,文字游戏,从零开始,food,pass,print
From: https://blog.csdn.net/yanjunting/article/details/140706262