当前位置:   article > 正文

扫雷——如何实现点击“0”打开一大片“雷区”_扫雷怎么才能点开一片区域

扫雷怎么才能点开一片区域

首先先说一下,最近事情挺多的,加上出去了一段时间,所以一直没有时间搞出新的项目

(听见没有!不更新不是因为我懒哈 (doge)

​​​​​​​ 

最近打算做一个图形化扫雷的项目,

直接做图形化不太现实,便先在控制台做个文字版的

一开始挺顺利,觉得差不多了,到最后上C站一查,

突然觉得自己做的什么也不是…… 

话入正题,想做一个点开“0”块就翻开它周边地区的块,如果周边还有“0”就在翻,循环往复

一开始先做了“初次翻0”de函数 :
 

  1. def check_zero(zero_flag, frequency, set):
  2. global list_set
  3. for setx in zero_flag:
  4. for sety in zero_flag:
  5. try:
  6. index = list[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety]
  7. zero_set.append(str(int(set[0]) - 1 + setx) + str(int(set[1]) - 1 + sety))
  8. except:
  9. pass
  10. else:
  11. index = index + ' '
  12. list_set[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety] = index
  13. frequency += 1
  14. return zero_set

(try……except……else语句拿来保证“0”在边角块时不报错)

试验了下,发现可以解决问题

 现在问题在于“多次翻0”如何解决:

多次翻“0”,也就是多次在不同的坐标调用这个函数

我的代码如下:

  1. while str(mine) == '0':
  2. index_flag = 0
  3. zero_list = check_zero(zero_flag, frequency, set)
  4. check_zero = list[zero_list[index_flag][0]][zero_list[index_flag][1]]
  5. index = str(zero_list[index_flag][0] + 1) + str(zero_list[index_flag][1] + 1)
  6. mine = check_zero
  7. set = index
  8. index_flag += 1

这回就连“初次翻0”都实现不了了……

完整源码:

  1. import random
  2. while True:
  3. zero_flag = [1, 0, -1]
  4. zero_set = []
  5. list = []
  6. for setx in range(1, 9):
  7. list_0 = []
  8. for sety in range(1, 9):
  9. list_0.append('')
  10. list.append(list_0)
  11. list_set = []
  12. for setx in range(1, 9):
  13. list_0 = []
  14. for sety in range(1, 9):
  15. set = str(setx) + str(sety)
  16. list_0.append(set)
  17. list_set.append(list_0)
  18. list_flag = []
  19. for setx in range(1, 9):
  20. for sety in range(1, 9):
  21. set = str(setx) + str(sety)
  22. list_flag.append(set)
  23. def mine(list):
  24. setx = random.randint(0, 7)
  25. sety = random.randint(0, 7)
  26. if list[setx][sety] == 'B':
  27. mine(list)
  28. else:
  29. list[setx][sety] = 'B'
  30. return list
  31. for index in range(10):
  32. list = mine(list)
  33. def check_mine(list):
  34. for setx in range(8):
  35. for sety in range(8):
  36. if list[setx][sety] != 'B':
  37. mine_number = 0
  38. if setx != 7:
  39. if list[setx+1][sety] == 'B':
  40. mine_number += 1
  41. if setx != 0:
  42. if list[setx-1][sety] == 'B':
  43. mine_number += 1
  44. if setx != 7 and sety != 7:
  45. if list[setx+1][sety+1] == 'B':
  46. mine_number += 1
  47. if setx != 7 and sety != 0:
  48. if list[setx+1][sety-1] == 'B':
  49. mine_number += 1
  50. if setx != 0 and sety != 7:
  51. if list[setx-1][sety+1] == 'B':
  52. mine_number += 1
  53. if setx != 0 and sety != 0:
  54. if list[setx-1][sety-1] == 'B':
  55. mine_number += 1
  56. if sety != 7:
  57. if list[setx][sety+1] == 'B':
  58. mine_number += 1
  59. if sety != 0:
  60. if list[setx][sety-1] == 'B':
  61. mine_number += 1
  62. list[setx][sety] = str(mine_number)
  63. return list
  64. def list_to_str(list, setx, sety):
  65. list_str = ''
  66. for indexx in range(setx):
  67. for indexy in range(sety):
  68. res = list[indexx][indexy]
  69. list_str = list_str + res
  70. list_str = list_str + ' '
  71. list_str = list_str + '\n'
  72. return list_str
  73. list = check_mine(list)
  74. frequency = 0
  75. flag = 0
  76. mine_flag = 10
  77. mine_good_flag = 0
  78. tips = 3
  79. while True:
  80. print(list)
  81. print('还有' + str(10 - mine_good_flag) + '个地雷')
  82. print('雷阵(B代表雷,Q代表红旗,括号内代表你做的标记):')
  83. str_set = list_to_str(list_set, 8, 8)
  84. print(str_set)
  85. tips_flag = input('是否要用提示?还有' + str(tips) + '次')
  86. if tips_flag == '是':
  87. tip_set = input('请输入你要查看的坐标(Q代表你标的红旗):')
  88. if tip_set in list_flag:
  89. tips -= 1
  90. mine = list[int(tip_set[0]) - 1][int(tip_set[1]) - 1]
  91. mine = mine + ' '
  92. list_set[int(tip_set[0]) - 1][int(tip_set[1]) - 1] = mine
  93. print('这个位置的数字是:' + mine)
  94. if mine != 'B':
  95. frequency += 1
  96. else:
  97. print('坐标不正确,请根据上图中坐标填写')
  98. choose = input('请选择查看/排雷/标记')
  99. if choose == '查看':
  100. set = input('请输入您要查看的坐标:(Q代表你标的红旗)')
  101. if set in list_flag:
  102. mine = list[int(set[0]) - 1][int(set[1]) - 1]
  103. if mine == 'B':
  104. print('boom!')
  105. print('你输了(╥╯^╰╥)')
  106. print('雷池埋雷情况为:(B代表雷)')
  107. list_str = list_to_str(list, 8, 8)
  108. print(list_str)
  109. flag = 1
  110. else:
  111. mine = mine + ' '
  112. list_set[int(set[0]) - 1][int(set[1]) - 1] = mine
  113. print('这个位置的数字是:' + mine)
  114. frequency += 1
  115. def check_zero(zero_flag, frequency, set):
  116. global list_set
  117. for setx in zero_flag:
  118. for sety in zero_flag:
  119. try:
  120. index = list[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety]
  121. zero_set.append(str(int(set[0]) - 1 + setx) + str(int(set[1]) - 1 + sety))
  122. except:
  123. pass
  124. else:
  125. index = index + ' '
  126. list_set[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety] = index
  127. frequency += 1
  128. return zero_set
  129. while str(mine) == '0':
  130. index_flag = 0
  131. zero_list = check_zero(zero_flag, frequency, set)
  132. check_zero = list[zero_list[index_flag][0]][zero_list[index_flag][1]]
  133. index = str(zero_list[index_flag][0] + 1) + str(zero_list[index_flag][1] + 1)
  134. mine = check_zero
  135. set = index
  136. index_flag += 1
  137. elif set not in list_flag:
  138. print('坐标不正确,请根据上图中坐标填写')
  139. elif choose == '排雷':
  140. mine_set = input('请输入你要标/取红旗的坐标')
  141. if mine_set in list_flag:
  142. if list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1].count('Q') == 0:
  143. if mine_flag == 0:
  144. print('十个红旗已用完,若还想标注,请取出一些红旗')
  145. else:
  146. number = list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1]
  147. list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1] = number + 'Q'
  148. if list[int(mine_set[0]) - 1][int(mine_set[1]) - 1] == 'B':
  149. mine_good_flag += 1
  150. mine_flag -= 1
  151. else:
  152. mine_flag -= 1
  153. if mine_good_flag == 10:
  154. print('恭喜你,游戏胜利!')
  155. print('雷池埋雷情况为:(B代表雷)')
  156. list_str = list_to_str(list, 8, 8)
  157. print(list_str)
  158. flag = 1
  159. else:
  160. number = list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1]
  161. number = number.replace('Q', '')
  162. list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1] = number
  163. if list[int(mine_set[0]) - 1][int(mine_set[1]) - 1] == 'B':
  164. mine_good_flag -= 1
  165. mine_flag += 1
  166. else:
  167. mine_flag += 1
  168. else:
  169. print('坐标不正确,请根据上图中坐标填写')
  170. elif choose == '标记':
  171. set = input('请输入你要标记的坐标:')
  172. if set in list_flag:
  173. label = input('请输入你要标记什么:')
  174. if len(label) == 0:
  175. print('标记不能为空')
  176. elif len(label) > 3:
  177. print('标记最多3个字符')
  178. else:
  179. if list_set[int(set[0]) - 1][int(set[1]) - 1].count('(') == 0:
  180. number = list_set[int(set[0]) - 1][int(set[1]) - 1]
  181. number = number + '(' + label + ')'
  182. list_set[int(set[0]) - 1][int(set[1]) - 1] = number
  183. else:
  184. print('提示:一个坐标的标记如有多个,则以旧换新')
  185. number = list_set[int(set[0]) - 1][int(set[1]) - 1]
  186. number = number[:2]
  187. number = number + '(' + label + ')'
  188. list_set[int(set[0]) - 1][int(set[1]) - 1] = number
  189. else:
  190. print('输入的坐标不合理')
  191. else:
  192. print('请输入查看/排雷/标记')
  193. if flag == 1:
  194. print('游戏结束')
  195. flag_gameover = input('是否再来一局?(输入是或否)(输入其他默认退出)')
  196. if flag_gameover == '是':
  197. break
  198. if flag_gameover != '是':
  199. print('欢迎下次再来~(*^▽^*)')
  200. flag = 2
  201. break
  202. if flag == 2:
  203. break

任何只言片语都行,望大神指教! 

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