首页 > 编程语言 >Python从零开始制做文字游戏(荒岛求生)

Python从零开始制做文字游戏(荒岛求生)

时间:2024-07-26 14:24:22浏览次数:15  
标签:mood 探索 Python 荒岛 文字游戏 从零开始 food pass print

文章目录

前言

今天,我们来做一款文字游戏《荒岛求生》,我会一步步完善荒岛求生的代码,让你学会制作。
注:这篇文章中的代码是我现场写的,这不得给我个赞?
我在编程开发的每个部分后面都会展示当前的总代码,可以了解一下进度。

我们先来讲一下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

相关文章

  • 使用 Python 进行数据分析:入门指南
    使用Python进行数据分析:入门指南1.简介本指南将介绍如何使用Python进行数据分析,涵盖从数据加载到可视化分析的各个方面。2.必要的库NumPy:用于数值计算和数组操作。Pandas:用于数据处理和分析,提供DataFrame结构。Matplotlib:用于数据可视化,创建各种图表。Seab......
  • IT实战课堂计算机毕业设计源码精品基于Python的高校教育教材采购出入库进销存储信息管
    项目功能简介:《[含文档+PPT+源码等]精品基于Python的高校教育教材信息管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:开......
  • 为什么我的 Python 脚本失败并出现 TypeError?
    我正在编写一个Python脚本,该脚本应该计算数字列表的总和。但是,当我运行代码时遇到TypeError这是一个最小的例子:numbers=[1,2,3,'4']total=sum(numbers)print(total)Theerrormessageis:TypeError:unsupportedoperandtype(s)for+:'int'and'str......
  • 如何通过socks代理传递所有Python的流量?
    有如何通过http代理传递所有Python的流量?但是,它不处理sock代理。我想使用sock代理,我们可以通过ssh隧道轻松获得它。ssh-D5005user@server你可以使用socks库,让你的Python代码通过SOCKS代理传递所有流量。这个库可以让你在套接字级别上指定代......
  • 如何在streamlit python中流式传输由LLM生成的输出
    代码:fromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchainimportPromptTemplatefromlangchain_community.llmsimportLlamaCppfromlangchain.chainsimportRetrievalQAimports......
  • python mysql操作
    pipinstallmysql-connector-pythonimportmysql.connector#配置数据库连接参数config={'user':'your_username','password':'your_password','host':'your_host','database'......
  • Python 中的面向对象编程
    一.介绍在本文中,我们将使用Python中的类和对象来探索基本的OOP概念。面向对象编程(OOP)是一种强大的方法,可帮助开发人员组织代码,使其易于理解、重用和维护。Python是一种灵活的语言,可以很好地支持OOP概念。1.类和对象类是创建对象的蓝图。它定义了该类的对象将......
  • 学习资源系列之《Python深度学习基于PyTorch》
     前言近期应部分读者朋友的强烈邀请,希望推荐一本python深度学习实操的书籍。呐,今天为大家推荐小编偶然发现的这一本珍藏好书:《Python深度学习基于PyTorch》,文末附电子版获取方式《Python深度学习基于PyTorch》BriefIntroduction前言面对众多的深......
  • 如何使用Python实现语音转文字/字幕
    文章目录......
  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......