之前已经写出了墙,现在要要把小蛇写出来,这里的小蛇是那种长度不变的,仅会随着键盘敲转变方向。
在根据键盘敲下的按键转变方向时,如果是直接掉头的方式,比如小蛇在向前走,但直接向后方转,这显然是无法做到的,所以对于这样的命令,我们认为它是无效的。
后一个点获得前一个点的坐标,蛇头根据按键转变方向
class Snake:
def init(self):
self.__position = [] # 存储位置信息
self.__position.append(Point(1, 2)) # 两个初始位置
self.__position.append(Point(1, 1))
self.speed = 1.6 # 移动速度
self.__toward = “d” # 移动方向 开始时默认向右走
@property
def toward(self): # 跟之前一样,把移动方向设定为property属性
return self.__toward
@toward.setter
def toward(self, t): # "t"为传入的字符("w","s","a","d")
s = self.__toward + t # 这里这样设置是为了防止出现能直接掉头的尴尬场面
if not (s == "ws"or s == "sw"or s == "ad"or s == "da"):
self.__toward = t
# 移动
def step(self):
# 只有头需要按照方向移动,其它“骨节”只需获取前一个骨节的坐标就可以了
# 获取顺序为从尾到头
for i in range(len(self.__position)-1, 0, -1):
self.__position[i] = self.__position[i-1]
go = { # wsad分别对应上下左右
"w": Point(0, -1),
"s": Point(0, +1),
"a": Point(-1, 0),
"d": Point(+1, 0)
}
# 蛇头的移动
# 因为不能直接对x, y 两个属性进行修改(这里牵扯到内存的问题,如果直接修改
# 两个属性值的话self.__position[1]的x, y属性值同样会被修改,因为此时两个对象
# 指向的是同一块内存地址)所以这里实际应该是重新生成一个新的对象来替换
self.__position[0] = Point(self.__position[0].x+go[self.__toward].x, self.__position[0].y+go[self.__toward].y)
def get_position(self):
return self.__position # 返回位置信息,之后同样传给display用于打印