当前位置:   article > 正文

python+pygame实现小游戏连连看之三_python小游戏教程

python小游戏教程

之二请看:python+pygame实现小游戏连连看之二

五、之前我们已经实现了小图标的切割,初始化游戏界面等基本内容,下面是连连看的核心逻辑内容。首先连连看里面判断两个小图标能不能消除,一般有以下三种类型(当然前提是两个小图标是一样的):直连 ---  ,单拐连 !--,双拐连!---!,而单拐连本质就是两个直连,双拐连本质是两个单拐连。

1、增加枚举常量

  1. def main():
  2. ...
  3. EMPTYCELL = -1
  4. NONE_LINK = 0 #不连 #新增
  5. DIRECT_LINK = 1 #直连 --- #新增
  6. ONE_CORNER_LINK = 5 #单拐连 !_
  7. TWO_CORNER_LINK = 8 #双拐连 !_! #新增
  8. ...

2、新增方法 :getTwoIconsLinkType,参数是两个小图标,返回就是上述定义的枚举常量。

  1. def main():
  2. ...
  3. '''
  4. 获得两个点连通类型
  5. '''
  6. def getTwoIconsLinkType(Cell0, Cell8):
  7. #第一步:两个cell里面的图片是否相同,不同就不谈
  8. if cur_game[Cell0[0]][Cell0[1]] != cur_game[Cell8[0]][Cell8[1]]:
  9. return {'type':NONE_LINK}
  10. if isDirectLink(Cell0,Cell8):
  11. return {'type':DIRECT_LINK}
  12. if isOneCornerLink(Cell0,Cell8):
  13. return {'type':ONE_CORNER_LINK}
  14. if isTwoCornerLink(Cell0,Cell8):
  15. return {'type':TWO_CORNER_LINK}
  16. return {'type':NONE_LINK}
  17. ...

代码中首先看图片是否相同,图片相同再看是哪种连通方式。

3、getTwoIconsLinkType中涉及到isDirectLink,isOneCornerLink,isTwoCornerLink三个函数,下面逐一添加:isDirectLink

  1. def main():
  2. ...
  3. '''
  4. DIRECT_LINK = 1 #直连 ---
  5. '''
  6. def isDirectLink(C1, C2):
  7. start = -1
  8. end = -1
  9. # Y方向
  10. if C1[1] == C2[1]:
  11. # 大小判断
  12. if C2[0] < C1[0]:
  13. start = C2[0]
  14. end = C1[0]
  15. else:
  16. start = C1[0]
  17. end = C2[0]
  18. for x in range(start + 1, end):
  19. if cur_game[x][C1[1]] != EMPTYCELL:
  20. return False
  21. return True
  22. # X方向
  23. elif C1[0] == C2[0]:
  24. if C1[1] > C2[1]:
  25. start = C2[1]
  26. end = C1[1]
  27. else:
  28. start = C1[1]
  29. end = C2[1]
  30. for y in range(start + 1, end):
  31. if cur_game[C1[0]][y] != EMPTYCELL:
  32. return False
  33. return True
  34. return False
  35. ...

由于传入的是两个小图标的下标,所以用下标可以判断是同行还是同列。以同行为例(第一个下标相同),首先比较两者的第二个下标,将小的赋值给start,大的赋值给end,然后从start到end,这之间的所有小图标都为空EMPTYCELL,即没有阻挡的,可以认为是直连类型。也就是怎么把要解决的问题转化为数学模型,然后通过计算机的程序语言来实现,就是我们码农要掌握的技能,这也是常常说的逻辑思维能力的一种表现。当然,你不是码农就不要理会。

下面继续讲解单拐连的代码:isOneCornerLink

  1. def main():
  2. ...
  3. '''
  4. ONE_CORNER_LINK = 5 #单拐连 !_
  5. '''
  6. def isOneCornerLink(C1, C2):
  7. corner = (C1[0], C2[1])
  8. if isDirectLink(C1, corner) and isDirectLink(corner, C2) and isEmptyCell(corner[0],corner[1]):
  9. return True
  10. corner = (C2[0], C1[1])
  11. if isDirectLink(C1, corner) and isDirectLink(corner, C2) and isEmptyCell(corner[0],corner[1]):
  12. return True
  13. return False

逻辑设计如下:

紧接着,再完成双拐连的函数:isTwoCornerLink

  1. def main():
  2. ...
  3. '''
  4. TWO_CORNER_LINK = 8 #双拐连 !_!
  5. '''
  6. def isTwoCornerLink(C1, C2):
  7. # Y方向
  8. for y in range(-1, game_rows + 1):
  9. corner1 = (C1[0], y)
  10. corner2 = (C2[0], y)
  11. if y == C1[1] or y == C2[1]:
  12. continue
  13. if y == -1 or y == game_rows:
  14. if isDirectLink(C1, corner1) and isDirectLink(corner2, C2):
  15. return True
  16. else:
  17. if isDirectLink(C1, corner1) and isDirectLink(corner1, corner2) and isDirectLink(corner2, C2) and isEmptyCell(corner1[0],corner2[1]) and isEmptyCell(corner2[0],corner2[1]):
  18. return True
  19. # X方向
  20. for x in range(-1, game_cols + 1):
  21. corner1 = (x, C1[1])
  22. corner2 = (x, C2[1])
  23. if x == C1[0] or x == C2[0]:
  24. continue
  25. if x == -1 or x == game_cols:
  26. if isDirectLink(C1, corner1) and isDirectLink(corner2, C2):
  27. return True
  28. else:
  29. if isDirectLink(C1, corner1) and isDirectLink(corner1, corner2) and isDirectLink(corner2, C2) and isEmptyCell(corner1[0],corner2[1]) and isEmptyCell(corner2[0],corner2[1]):
  30. return True
  31. return False
  32. ...

至此,我们的核心逻辑已经实现。

六、修改mouseClick事件

  1. def main():
  2. ...
  3. '''
  4. 鼠标点击响应
  5. '''
  6. def mouseClick(posX,posY):
  7. nonlocal isFirst
  8. nonlocal compareCell
  9. nonlocal isStart
  10. if isStart:
  11. curCell = getPoint(posX,posY)
  12. # print (curCell)
  13. if isUseful(curCell[0],curCell[1]) and not isEmptyCell(curCell[0],curCell[1]):
  14. if isFirst :
  15. drawRedRect(curCell[0],curCell[1])
  16. isFirst = False
  17. compareCell = curCell
  18. else:
  19. if compareCell[0] == curCell[0] and compareCell[1] == curCell[1]:
  20. isFirst = True
  21. delRedRectangle(curCell[0],curCell[1])
  22. else:
  23. linkType = getTwoIconsLinkType(compareCell, curCell) #新增
  24. if linkType['type'] != NONE_LINK: #新增
  25. pass
  26. #消掉匹配的小图标
  27. #删除红色的首次选中框
  28. #设置isFirst为True
  29. #if 游戏结束:
  30. '''
  31. 通关后重置isStart,isFirst参数
  32. '''
  33. else: #新增 无法消掉的时候,去掉首个选中的红框,将第二个赋值为首个选中,给它画红框
  34. delRedRectangle(compareCell[0],compareCell[1]) #新增
  35. compareCell = curCell #新增
  36. drawRedRect(curCell[0],curCell[1]) #新增

待更新...

python+pygame实现连连看小游戏之四

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/946253
推荐阅读
相关标签
  

闽ICP备14008679号