好了,今天终于到了你们期待已久的多行+新僵尸。其实我本来想把它们放在两个beta里解决的,但后来忘了,于是打包起来,跳过beta 5,直接发布了beta 6,就是今天的结束状态。好,开始吧!上篇链接:从0开始用python写一个命令行小游戏(八)。
多行游戏
一开始我为了尽可能简化游戏,我用了一个单行数组,以模拟只有一行的游戏。因为现在要多行,所以要把单行数组补充为多行数组。于是(因为创建多行数组有一系列方法),我进入IPython
环境进行测试各种可能的方法:
In [1]: test_list = [[0] * 10] * 5
In [2]: test_list
Out[2]:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
In [3]: test_list[0][0] = 1
In [4]: test_list
Out[4]:
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]] # 不太对!
In [5]: test_list = [[0] * 10 for i in range(5)]
In [6]: test_list
Out[6]:
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
In [7]: test_list[0][0] = 1
In [8]: test_list
Out[8]:
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] # 正常了
这里说一说In [5]
处我的代码意思:Python有一种叫做列表生成式
的语法,它由一个表达式(如[0] * 10
)和一个类似for
循环开头的语句(for i in range(5)
)组成,还有包裹整个列表生成式的方括号。一个形如[exp for i in seq]
的列表生成式等价于:
result = []
for i in seq:
result.append(exp)
运行后的result
列表。注意表达式可以包含i
(也可以不包含),就像在真正的for
循环里面一样。回到正题,将game_obj.py
中的board
修改为:
board = [[0] * 10 for i in range(5)]
然后,将所有类的__init__
方法的pos
参数都修改为x
和y
两个参数,并把所有board[self.pos]
都改为board[self.y][self.x]
。此外,game.py
中的Game
类也需要修改,具体方法可参见我的GitHub上的v1.0 release代码。然后,就···该让新僵尸出场了!
新的僵尸
说实话,你刚才是不是以为我会说“然后就没有然后了”?不管怎么样,开始吧!我想设计一种一来到植物身边就可以把它“踢飞”的僵尸,以增加游戏的刺激性。其实,它的难点在于设计,不是代码:
class KickerZombie(BaseZombie):
indicating_char = color(31, 'k') # 红色
def __init__(self, x, y, die_to_exit=False):
super().__init__(x, y, 1, 30, die_to_exit) # 超大伤害
然后就是配置,如果你有兴趣,可以效仿之前我的配置,这里我就不再多说了。
下集预告
下次,我们要做一些重构工作了!欢迎继续关注!