资讯专栏INFORMATION COLUMN

从0开始用python写一个命令行小游戏(二)

chanjarster / 3332人阅读

摘要:我回来了今天,我们真正会亮相的植物要出来了哦还有,我们敌人的基础类我叫它也会闪亮登场。还有,这是第二篇。闲话少说,进入正题两种植物和向日葵是,豌豆射手是。注增强版,你怎么看种植向日葵损失,它又产生成功现在,该编豌豆射手了。

我回来了!今天,我们真正会亮相的植物要出来了哦!还有,我们敌人的基础类(我叫它BaseZombie)也会闪亮登(lai)场(xi)。很期待?那就开始吧!

注:我使用的是Python 3.7(但只要是3,变化应该都不大)。还有,这是第二篇。没看过上篇的话,这是链接。闲话少说,进入正题!

两种植物:SunflowerPeashooter

向日葵是Sunflower,豌豆射手是Peashooter。好,上代码!

向日葵
board = [0] * 10
sunlight = 50

class GameObject:
    indicating_char = ""       # 子类已经出现,所以把基础类的显示字符删除
    pass                       # 剩余部分同前

class Plant(GameObject):
    pass                       # 同前,但将显示字符删除

class Sunflower(Plant):
    """ 向日葵 """
    indicating_char = "s"
    
    def __init__(self, pos):
        """ 初始化,阳光50 """
        super().__init__(pos, 50)
    
    def step(self):
        """ 生产阳光 """
        global sunlight
        sunlight += 25

嗯,向日葵编好了。IPython(注:增强版Python shell),你怎么看?

In [1]: import game as g

In [2]: g.sunlight
Out[2]: 50

In [3]: g.Sunflower(0)
Out[3]: s

In [4]: g.board[0].step()

In [5]: g.sunlight
Out[5]: 25                    # 种植向日葵损失50,它又产生25

成功!现在,该编豌豆射手了。

豌豆射手
class Peashooter(Plant):
    indicating_char = "p"
    
    def __init__(self, pos):
        super().__init__(pos, 100)           # 豌豆射手需要100阳光
    
    def step(self):
        for obj in board[self.pos:]:
            if isinstance(obj, BaseZombie):  # 就当BaseZombie存在
                pass                         # 哎呀!

好好编程,“哎呀”什么?因为我突然发现,目前还没有定义角色的生命值(你们尽情吐槽吧)!于是,在GameObject__init__方法前面追加:

class GameObject:
    blood = 10             # 初始生命值
    pass                   # 剩余同前

然后又突然想到,角色死没死不也是用这个定义的吗?于是加了几个方法和属性:

class GameObject:
    indicating_char = ""
    blood = 10
    alive = True
    
    def __init__(self, pos):
        pass                   # 同前
    
    def step(self):
        pass
    
    def die(self):
        pass
    
    def check(self):
        if self.blood < 1:
            self.alive = False
    
    def full_step(self):
        self.check()
        if not self.alive:
            board[self.pos] = 0
            self.die()
        else:
            self.step()

好,现在把豌豆射手里的那个pass改成:

for obj in board[self.pos:]:
    if isinstance(obj, BaseZombie):
        obj.blood -= 1.5            # 这里原来是pass

但是因为没有BaseZombie,我们也不能使用Peashooter。好,现在,3,2,1,放僵尸!

僵尸基础类

我们即将亲手创造游戏中的大坏蛋:僵尸!来吧,面对这个基础类······

class BaseZombie(GameObject):
    indicating_char = "b"
    
    def __init__(self, pos, speed, harm, die_to_exit=False):
        super().__init__(pos)
        self.speed = speed
        self.harm = harm
        self.die_to_exit = die_to_exit
    
    def step(self):
        if board[self.pos - self.speed] == 0:
            orig_pos = self.pos
            self.pos -= self.speed
            board[orig_pos] = 0
            board[self.pos] = self
        elif isinstance(board[self.pos - 1], Plant):
            board[self.pos - 1].blood -= 1
        else:
            self.pos -= 1
            board[self.pos + 1] = 0
            board[self.pos] = self
    
    def die(self):
        if self.die_to_exit:
            import sys
            sys.exit()

好,让我们的新类们去IPython里大展身手吧!

In [1]: import game as g

In [2]: def step():
   ...:     for obj in g.board:
   ...:         if isinstance(obj, g.GameObject):
   ...:             obj.step()
   ...: 

In [3]: g.Sunflower(0)

In [4]: step()

In [5]: step()

In [6]: step()

In [7]: step()

In [8]: g.sunlight
Out[8]: 100

In [9]: g.Peashooter(1)

In [10]: g.BaseZombie(9, 1, 1)

In [11]: step()

In [12]: step()

......
In [18]: step()

In [19]: g.board
Out[19]: [s, p, 0, 0, 0, 0, 0, 0, 0, 0]

看来,豌豆射手打败僵尸了!

下集预告

下次,赶快把BaseZombie的子类编出来后,我们就要开始开发用户界面了!欢迎来看!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42129.html

相关文章

  • 0开始python一个命令游戏(六)

    摘要:嗯,今天我们的从开始用写一个命令行小游戏系列总算走到了我发布的时候。玩过我的正式版的话,你会发现现在的游戏还和正式版差别很大。好,现在就来顺便补充一下,上次方法后追加僵尸被打败是完成了好好庆祝一下 嗯,今天我们的从0开始用python写一个命令行小游戏系列总算走到了我发布v1.0 beta 1的时候。玩过我的1.0正式版的话,你会发现现在的游戏还和正式版差别很大。不管怎么样,现在就开始...

    channg 评论0 收藏0
  • 0开始python一个命令游戏(四)

    摘要:讲点搞笑的,最近在开发时,发现最令程序猿头疼的一点就是没有语句。但自动的僵尸呢哎,别急,那是后话下集预告下次,我要把游戏变得全自动具体工作令僵尸自动出现,和让用户用命令控制游戏这些工作完成后,就可以发布了欢迎继续关注 嗯,还是我,我又回来了——以后文章就两天一篇吧。讲点搞笑的,最近在开发v1.1 beta 3时,发现Python最令程序猿头疼的一点就是没有switch/case语句。要...

    graf 评论0 收藏0
  • 0开始python一个命令游戏(五)

    摘要:今天我时间有点紧张,所以不说废话了,直接进入正题。好现在,游戏可以自动产生僵尸了。然后呢用户可控的植物真正的植物大战僵尸游戏可以让玩家用鼠标控制游戏。由于这是命令行游戏,所以我们得用命令控制。 今天我时间有点紧张,所以不说废话了,直接进入正题。前作链接: 从0开始用python写一个命令行小游戏(一) 从0开始用python写一个命令行小游戏(二) 从0开始用python写一个命令行...

    skinner 评论0 收藏0
  • 0开始python一个命令游戏(三)

    摘要:今天就开始由于整个游戏会有自己的一些属性和行为,所以我决定把它编写在类里。初始化游戏定义自己的属性先定义这些。我计划使用格式,以第几步出现作为键,以出现的僵尸类型以后可能会出现不同类型的僵尸和是否在它被消灭后结束游戏作为值。 Hey, everyone! 文章迟到了一天,但我今天心情很好,因为有两个好消息,你们想先听哪个?哎,算了,反正都是好消息,一起听吧。 本游戏的v1.1 bet...

    Tony_Zby 评论0 收藏0
  • 0开始python一个命令游戏(十)

    摘要:前几天出去旅游了,所以没能更新文章,但转眼间,从开始用写一个命令行小游戏系列已经更新到了第十篇。闲话少说,今天我们要开始重构了但第一件事还是上篇的链接从开始用写一个命令行小游戏九。所以,我们需要一个标志变量,以标志游戏的结束。 前几天出去旅游了,所以没能更新文章,但转眼间,从0开始用python写一个命令行小游戏系列已经更新到了第十篇。闲话少说,今天我们要开始重构了!但第一件事还是上篇...

    OnlyLing 评论0 收藏0

发表评论

0条评论

chanjarster

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<