Python贪吃蛇双人大战-魔法豆登场
作者:哪吒游戏网 来源:哪吒游戏网 2020-06-27 08:14:47
Python贪吃蛇双人大战-魔法豆登场,哪吒游戏网给大家带来详细的Python贪吃蛇双人大战-魔法豆登场介绍,大家可以阅读一下,希望这篇Python贪吃蛇双人大战-魔法豆登场可以给你带来参考价值。
时隔两月之后,家里的小朋友再次对我之前改写的贪吃蛇游戏(过程可参考我之前写的 Python贪吃蛇双人大战 和 Python贪吃蛇双人大战-升级版,代码可以到此处玩法攻略介绍)提出了新的需求(用户永远会有新需求)。还好,这回需求不多魔法豆,就一个:要求增加魔法豆,要是蛇吃到了魔法豆,蛇身可以一次增加5格;魔法豆被吃后自动重新生成,且在屏幕上只出现2个魔法豆。
为了满足小朋友的愿望,老父亲只好又拿起了两个月没看的代码(已经忘的差不多了)。分析了一下需求,并不复杂,很明显需要增加一个魔法豆的类,然后在交互的地方修改一下就行了。
新增了几个全局常量如下,方便以后的修改。凭着多年编程的直觉,在命名的时候用了MAGIC1,预测以后大概率还会有MAGIC2,MAGIC3等等。当然,用1,2,3其实很不好,无法从名字看出意义,不过暂时也没有想到合适的名字,以后要是多了再根据特征来区分命名吧。(关于命名,可以参考变量名的力量)
MAGIC1_BEAN_NUM = 2
MAGIC1_BEAN_ADD_LEN = 5
MAGIC1_BEAN_COLOR = BLUE
魔法豆与普通的豆子差别不多,所以此类从NormalBeans修改而来,几乎没啥区别。关于一次增加多格的过程会在主循环里去实现,因为在实现的过程中这个多格不是一次增加的,那样方向未知,有可能引起碰撞什么的魔法豆,不好处理。于是增加多格会分多步实现,每一步还是只增加一格。效果如下动图(看那条绿色的蛇):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9MvsLGem-56)(./pic/snake_magic1_bean.gif)]
魔法豆类的代码如下:
class Magic1Beans: #魔法豆:吃了一次蛇身增加MAGIC1_BEAN_ADD_LEN格
def __init__(self, color, totalNum):
self.color = color
self.totalNum = totalNum
self.curNum = 0
self.beans = []
def generate(self, normalBeanss, snakeBeanss, snakes, magicBeanss):
while self.curNum < self.totalNum:
x = random.randrange(0,SCREEN_WIDTH/GRID_SIZE)
y = random.randrange(1,SCREEN_HEIGHT/GRID_SIZE)
newBeanPos = [int(x*GRID_SIZE),int(y*GRID_SIZE)]
#检查豆子位置是否重复
if isEmptyInArea([newBeanPos], normalBeanss, snakeBeanss, snakes, magicBeanss):
#新生成的豆子在不重复的地方
self.beans.append(Bean(self.color, newBeanPos))
self.curNum = self.curNum + 1
def beEaten(self, snakePos):
for bean in self.beans:
if bean.beEaten(snakePos):
self.beans.remove(bean)
self.curNum = self.curNum - 1
return True
return False
def show(self, playSurface):
for bean in self.beans:
pygame.draw.rect(playSurface,self.color,Rect(bean.pos[0],bean.pos[1],GRID_SIZE,GRID_SIZE))
新增了类当然也需要增加类的实例:
magic1Beans = Magic1Beans(MAGIC1_BEAN_COLOR,MAGIC1_BEAN_NUM)
magic1Beans.generate([normBeans],[snake1Beans,snake2Beans],[snake1,snake2],[])
类似于之前的豆子,魔法豆不能与其他豆子出现的位置重复,所以修改了判断是否有空位置的函数isEmptyInArea,增加了一个参数magicBeanss是魔法豆的列表,函数最后增加了对魔法豆位置的判断,代码如下:
def isEmptyInArea(area, normalBeanss=[], snakeBeanss=[], snakes=[], magicBeanss=[]):
''' area是位置的列表
'''
for pos in area:
if normalBeanss != []:
for nbs in normalBeanss:
for nb in nbs.beans:
if nb.pos == pos:
return False
if snakeBeanss != []:
for sbs in snakeBeanss:
if sbs != []:
for sb in sbs.beans:
if sb.pos == pos:
return False
if snakes != []:
for snake in snakes:
for snakePos in snake.segments:
if snakePos == pos:
return False
if magicBeanss != []:
for mbs in magicBeanss:
for mb in mbs.beans:
if mb.pos == pos:
return False
return True
因为修改了这个函数接口,所以代码中调用这个函数的地方都要相应的修改,蛇类的重生函数接口需要修改,如下:
def respawn(self, normalBeanss=[], snakeBeanss=[], snakes=[], magicBeanss=[]):
self.generate()
while not isEmptyInArea(self.segments, normalBeanss, snakeBeanss, snakes, magicBeanss):
self.generate()
self.vel = SNAKE_VEL_SLOW
self.velCount = 0
调用处修改如下:
if snake1VelCount > 1:
if snake1.moveAndAdd(snake2): #撞到了另一条蛇身
snake1Beans = SnakeBeans(snake1)
snake1.respawn([normBeans],[snake1Beans,snake2Beans],[snake2],[magic1Beans])
continue
if snake2VelCount > 1:
if snake2.moveAndAdd(snake1): #撞到了另一条蛇身
snake2Beans = SnakeBeans(snake2)
snake2.respawn([normBeans],[snake1Beans,snake2Beans],[snake1],[magic1Beans])
continue
# 若死亡则重生
if snake1VelCount > 1:
if snake1.isDead():
snake1.respawn([normBeans],[snake1Beans,snake2Beans],[snake2],[magic1Beans])
if snake2VelCount > 1:
if snake2.isDead():
snake2.respawn([normBeans],[snake1Beans,snake2Beans],[snake1],[magic1Beans])
普通豆子的生成函数也需要修改,如下:
def generate(self, snakeBeanss, snakes, magicBeanss):
while self.curNum < self.totalNum:
x = random.randrange(0,SCREEN_WIDTH/GRID_SIZE)
y = random.randrange(1,SCREEN_HEIGHT/GRID_SIZE)
newBeanPos = [int(x*GRID_SIZE),int(y*GRID_SIZE)]
#检查豆子位置是否重复
if isEmptyInArea([newBeanPos], [self], snakeBeanss, snakes, magicBeanss):
#新生成的豆子在不重复的地方
self.beans.append(Bean(self.color, newBeanPos))
self.curNum = self.curNum + 1
通过新增两个变量来实现,分别对应两条蛇:
snake1Magic1Count = 0
snake2Magic1Count = 0
这个值表示当前还需要增加的身体长度。当这个值为0时,意味着不需要增加身体长度,每次moveAndAdd之后需要pop,否则不pop。对于一次要加多格的情况,给这个值增加相应的值就好了,普通豆子加1就行。修改处理代码如下:
# 判断是否需要增加蛇身长度
if snake1VelCount > 1:
if snake1Magic1Count > 0:
snake1Magic1Count -= 1
if normBeans.beEaten(snake1.headPos):
normBeans.generate([snake1Beans,snake2Beans],[snake1,snake2],[magic1Beans]) # 如果普通豆子被吃掉,则重新生成豆子
snake1Magic1Count += 1
if magic1Beans.beEaten(snake1.headPos):
magic1Beans.generate([normBeans],[snake1Beans,snake2Beans],[snake1,snake2],[]) # 如果Magic1豆子被吃掉,则重新生成豆子
snake1Magic1Count += MAGIC1_BEAN_ADD_LEN
if snake1Beans != [] and snake1Beans.beEaten(snake1.headPos):
snake1Magic1Count += 1
if snake2Beans != [] and snake2Beans.beEaten(snake1.headPos):
snake1Magic1Count += 1
if snake1Magic1Count == 0:
snake1.pop()
if snake2VelCount > 1:
if snake2Magic1Count > 0:
snake2Magic1Count -= 1
if normBeans.beEaten(snake2.headPos):
normBeans.generate([snake1Beans,snake2Beans],[snake1,snake2],[magic1Beans]) # 如果普通豆子被吃掉,则重新生成豆子
snake2Magic1Count += 1
if magic1Beans.beEaten(snake2.headPos):
magic1Beans.generate([normBeans],[snake1Beans,snake2Beans],[snake1,snake2],[]) # 如果Magic1豆子被吃掉,则重新生成豆子
snake2Magic1Count += MAGIC1_BEAN_ADD_LEN
if snake1Beans != [] and snake1Beans.beEaten(snake2.headPos):
snake2Magic1Count += 1
if snake2Beans != [] and snake2Beans.beEaten(snake2.headPos):
snake2Magic1Count += 1
if snake2Magic1Count == 0:
snake2.pop()
这个简单,在绘制刷新的时候增加调用魔法豆的显示函数就行了。
magic1Beans.show(playSurface)
至此,又可以和我家小朋友一起愉快地玩耍了
总结:以上内容就是针对Python贪吃蛇双人大战-魔法豆登场详细阐释,如果您觉得有更好的建议可以提供给哪吒游戏网小编,Python贪吃蛇双人大战-魔法豆登场部分内容转载自互联网,有帮助可以收藏一下。
上一篇: 爆笑魔法豆-有趣的一件事作文500字
- 1 魔兽世界 考古(魔兽世界考古毁一生?这些装备幻化和坐骑值得你去玩考古)
- 2 普罗霍洛夫(卢布危机下俄土豪大甩卖 卖完豪宅卖球队)
- 3 龙之谷手柄(《龙之谷手游》手柄怎么连接 柄连接教学攻略)
- 4 普罗霍洛夫(俄罗斯土豪准备20亿抛售篮网! 最烂老板是怎样炼成的?)
- 5 天联网(天联网信息科技有限公司怎么样?)
- 6 附魔大师(魔兽世界怀旧服附魔大师在哪 附魔大师位置分享介绍)
- 7 wow烹饪食谱(魔兽世界怀旧服烹饪极品食谱)
- 8 陶谦让徐州(陶谦三让徐州,世界上真有这样的好人吗?)
- 9 lol神圣之剑(LOL如果神圣之剑回归,谁最受益?第1:只要不瞎都能上钻石!)
- 10 陶谦让徐州(陶谦三让徐州的原因是什么?)

机械战警
坦克射击
梦道满V版
火箭精英3d免费版
太古灵诀
小小帝国无敌破解版
厉害了我的娃
乐高无限
侠影双剑九游版