• Python实现连连看12


    4.2.5 获取图片连接方式

    通过自定义函数getLinkType()获取图片的连接方式,代码如下所示。

    1. def getLinkType(pre_row, pre_col, cur_row, cur_col):
    2.     if pics_map[pre_row][pre_col] != pics_map[cur_row][cur_col]:
    3.         return NONE_LINK
    4.     if isNoCornerLink(pre_row, pre_col, cur_row, cur_col):
    5.         return NO_CORNER_LINK
    6.     if isOneCornerLink(pre_row, pre_col, cur_row, cur_col):
    7.         return ONE_CORNER_LINK
    8.     if isTwoCornerLink(pre_row, pre_col, cur_row, cur_col):
    9.         return TWO_CORNER_LINK
    10. return NONE_LINK

    其中,getLinkType()函数的前两个参数表示第一次选中图片的行号和列号,后两个参数表示第二次选中图片的行号和列号。第2-3行表示当选中的两张图片不同时,返回自定义常量NONE_LINK;之后分别调用自定义函数isNoCornerLink()、isOneCornerLink()和isTwoCornerLink()判断两张图片是否是直接连通、单拐点连通和双拐点连通;如果不是以上三种连通方式,则返回NONE_LINK。

    4.2.6 根据连通状态处理图片

    回到“4.2.2 取消图片的标识”中提到的clickCanvas()函数中。如果两次选中的不是同一张图片,则调用“4.2.5 获取图片连接方式”中提到的getLinkType()判断两张图片的连通状态,代码如下所示。

    linktype = getLinkType(PRE_CLICK_ROW, PRE_CLICK_COL, click_row, click_col)

    之后,根据linktype的值进行后续处理,代码如下所示。

        

    1. if linktype != NONE_LINK:
    2.        delLinkedPic(PRE_CLICK_ROW, PRE_CLICK_COL, click_row, click_col)
    3.        canvas.delete("rectRedOne")
    4.        FIRSTCLICK = True
    5. else:
    6.         FIRSTCLICK = True
    7.         canvas.delete('rectRedOne')

    第1行代码表示返回值不是NONE_LINK,也就是两张图片是连通状态,之后第2行代码调用自定义函数delLinkedPic()删除两张图片,该函数将在后面详细描述;第3行代码输出标识图片的红框;第4行代码将第一次点击的标志设置为True;如果返回值是NONE_LINK,则说明选中的两张图片没有处于连通状态,此时将第一次点击的标志设置为True,然后删除第一张图片的红框标识,让玩家重新选择。

    4.2.7 消除连通的图片

    通过自定义函数delLinkedPic()消除连通的图片,代码如下所示。

    1. def delLinkedPic(pre_row, pre_col, cur_row, cur_col):
    2.     pics_map[pre_row][pre_col] = MAP_EMPTY
    3.     pics_map[cur_row][cur_col] = MAP_EMPTY
    4.     canvas.delete('im%d%d'%(pre_row, pre_col))
    5. canvas.delete('im%d%d'%(cur_row, cur_col))

    其中,第1行代码显示了delLinkedPic()函数的四个参数,前两个参数表示第一张图片所在行号和列号,后两个参数表示第二张图片所在的行号和列号;第2-3行代码在图片地图上将这两个图片所在的位置设置为MAP_EMPTY;第4-5行代码消除这两张图片,这两张图片的标签格式是“im行号列号”,在导入图片时进行的设置。

    4.2.8 完整代码

    1. GAMESTART = False
    2. FIRSTCLICK = True
    3. PRE_CLICK_ROW = 0
    4. PRE_CLICKY_COL = 0
    5. NONE_LINK = 0
    6. NO_CORNER_LINK = 1
    7. ONE_CORNER_LINK = 2
    8. TWO_CORNER_LINK = 3
    9. def getLinkType(pre_row, pre_col, cur_row, cur_col):
    10. if pics_map[pre_row][pre_col] != pics_map[cur_row][cur_col]:
    11. return NONE_LINK
    12. if isNoCornerLink(pre_row, pre_col, cur_row, cur_col):
    13. return NO_CORNER_LINK
    14. if isOneCornerLink(pre_row, pre_col, cur_row, cur_col):
    15. return ONE_CORNER_LINK
    16. if isTwoCornerLink(pre_row, pre_col, cur_row, cur_col):
    17. return TWO_CORNER_LINK
    18. return NONE_LINK
    19. def isNoCornerLink(pre_row, pre_col, cur_row, cur_col):
    20. start = -1
    21. end = -1
    22. if pre_row == cur_row:
    23. if pre_col
    24. start = pre_col
    25. end = cur_col
    26. else:
    27. start = cur_col
    28. end = pre_col
    29. for i in range(start+1, end):
    30. if pics_map[pre_row][i] != MAP_EMPTY:
    31. return False
    32. return True
    33. elif pre_col == cur_col:
    34. if pre_row
    35. start = pre_row
    36. end = cur_row
    37. else:
    38. start = cur_row
    39. end = pre_row
    40. for i in range(start+1, end):
    41. if pics_map[i][pre_col] != MAP_EMPTY:
    42. return False
    43. return True
    44. return False
    45. def isOneCornerLink(pre_row, pre_col, cur_row, cur_col):
    46. if isNoCornerLink(pre_row, pre_col, pre_row, cur_col)\
    47. and isNoCornerLink(pre_row, cur_col, cur_row, cur_col):
    48. return True
    49. if isNoCornerLink(pre_row, pre_col, cur_row, pre_col)\
    50. and isNoCornerLink(cur_row, pre_col, cur_row, cur_col):
    51. return True
    52. return False
    53. def isTwoCornerLink(pre_row, pre_col, cur_row, cur_col):
    54. for col in range(-1, COL_PIC+1):
    55. if col==pre_col or col==cur_col:
    56. continue
    57. if col==-1 or col==COL_PIC:
    58. if isNoCornerLink(pre_row, pre_col, pre_row, col)\
    59. and isNoCornerLink(cur_row, cur_col, cur_row, col):
    60. return True
    61. else:
    62. if isNoCornerLink(pre_row, pre_col, pre_row, col) \
    63. and isNoCornerLink(cur_row, cur_col, cur_row, col) \
    64. and isNoCornerLink(pre_row, col,cur_row, col) \
    65. and pics_map[pre_row][col]==MAP_EMPTY \
    66. and pics_map[cur_row][col]==MAP_EMPTY:
    67. return True
    68. for row in range(-1, ROW_PIC+1):
    69. if row==pre_row or col==cur_row:
    70. continue
    71. if row==-1 or row==COL_PIC:
    72. if isNoCornerLink(pre_row, pre_col, row, pre_col)\
    73. and isNoCornerLink(cur_row, cur_col, row, cur_col):
    74. return True
    75. else:
    76. if isNoCornerLink(pre_row, pre_col, row, pre_col) \
    77. and isNoCornerLink(cur_row, cur_col, row, cur_col) \
    78. and isNoCornerLink(row, pre_col,row, cur_col) \
    79. and pics_map[row][pre_col]==MAP_EMPTY \
    80. and pics_map[row][cur_col]==MAP_EMPTY:
    81. return True
    82. return False
    83. def delLinkedPic(pre_row, pre_col, cur_row, cur_col):
    84. pics_map[pre_row][pre_col] = MAP_EMPTY
    85. pics_map[cur_row][cur_col] = MAP_EMPTY
    86. canvas.delete('im%d%d'%(pre_row, pre_col))
    87. canvas.delete('im%d%d'%(cur_row, cur_col))
    88. def clickCanvas(event):
    89. if GAMESTART:
    90. click_col, click_row = getClickedMap(event.x, event.y)
    91. if(click_col>=0 and click_row>=0) and (not pics_map[click_row][click_col] == MAP_EMPTY):
    92. global FIRSTCLICK
    93. if FIRSTCLICK:
    94. drawRect(click_row, click_col)
    95. FIRSTCLICK = False
    96. global PRE_CLICK_ROW, PRE_CLICK_COL
    97. PRE_CLICK_ROW = click_row
    98. PRE_CLICK_COL = click_col
    99. else:
    100. if PRE_CLICK_ROW==click_row and PRE_CLICK_COL==click_col:
    101. FIRSTCLICK = True
    102. canvas.delete('rectRedOne')
    103. else:
    104. linktype = getLinkType(PRE_CLICK_ROW, PRE_CLICK_COL, click_row, click_col)
    105. if linktype != NONE_LINK:
    106. delLinkedPic(PRE_CLICK_ROW, PRE_CLICK_COL, click_row, click_col)
    107. canvas.delete("rectRedOne")
    108. FIRSTCLICK = True
    109. else:
    110. FIRSTCLICK = True
    111. canvas.delete('rectRedOne')

    此时,我们编写的这个连连看游戏就基本上成型了。您可以试着玩一下了!

  • 相关阅读:
    Shiro
    数据库备份
    HDLBits-Edgecapture
    SQL基础理论篇(一):什么是SQL
    Pytest----如何通过filterwarnings配置不显示告警或将告警报错
    从传统到智能化:汽车内部通信的安全挑战与SecOC解决方案
    Mac安装rabbitmq延迟队列插件
    springboot使用切面记录接口访问日志
    TS的类型规则 类型排名
    C++ 多态之虚函数表
  • 原文地址:https://blog.csdn.net/hou09tian/article/details/139747499