Python贪吃蛇双人大战-升级版
在玩了几天贪吃蛇游戏之后,(代码可参考我之前写的 Python贪吃蛇双人大战),家里小朋友提出了新的需求(用户反馈)如下:
- 豆子不能出现在豆子上。
- 豆子不能出现在蛇身上。
- 要显示得分,方便看出来谁的蛇比较长。
- 如果蛇头撞到另一条蛇,自己挂掉,变成豆子
- 蛇变成的豆子被吃了之后不重新生成
- 燃烧自己身体可以加速,每次燃烧身体减少一格,速度提升至两倍
趁着是周末,赶紧实现一下新需求,以满足小朋友的期望。
豆子不出现在重复的位置
为了实现豆子出现位置不与已有的豆子重复,也不与蛇所在位置重复,修改了豆类的generate函数如下:
def generate(self, snake1, snake2):
while self.curNum < self.totalNum:
x = random.randrange(0,SCREEN_WIDTH/GRID_SIZE)
y = random.randrange(0,SCREEN_HEIGHT/GRID_SIZE)
newBeanPos = [int(x*GRID_SIZE),int(y*GRID_SIZE)]
#检查豆子位置是否重复
isBeanRepeated = False
for bean in self.beans: #豆子不能与豆子位置重复
if bean.pos == newBeanPos:
isBeanRepeated = True
break
for pos in snake1.segments: #豆子不能与蛇位置重复
if pos == newBeanPos:
isBeanRepeated = True
break
for pos in snake2.segments: #豆子不能与蛇位置重复
if pos == newBeanPos:
isBeanRepeated = True
break
#新生成的豆子在不重复的地方
if not isBeanRepeated:
self.beans.append(Bean(self.color, newBeanPos))
self.curNum = self.curNum + 1
因为要判断蛇位置,所以把蛇作为参数传进去了,增加了两个参数。函数中每次生成豆子的位置之后进行判断,不重复再增加。
当然,因为改了函数接口,所以主循环中调用的地方也要增加相对应的参数,相关代码如下:
# 初始化豆子
yellowBeans = Beans(YELLOW, BEAN_NUM)
yellowBeans.generate(snake1, snake2)
# 如果豆子被吃掉,则重新生成豆子,否则蛇长度减少一格
if yellowBeans.beEaten(snake1.headPos):
yellowBeans.generate(snake1, snake2)
else:
snake1.pop()
if yellowBeans.beEaten(snake2.headPos):
yellowBeans.generate(snake1, snake2)
else:
snake2.pop()
显示得分
显示得分这个功能比较简单,就用蛇增加的长度表示得分即可,而蛇的长度就是蛇类中segments的长度。于是创建一个函数getLen直接返回segments的长度。
def getLen(self):
return len(self.segments)
在主循