赞
踩
首先先说一下,最近事情挺多的,加上出去了一段时间,所以一直没有时间搞出新的项目
(听见没有!不更新不是因为我懒哈 (doge)
最近打算做一个图形化扫雷的项目,
直接做图形化不太现实,便先在控制台做个文字版的
一开始挺顺利,觉得差不多了,到最后上C站一查,
突然觉得自己做的什么也不是……
话入正题,想做一个点开“0”块就翻开它周边地区的块,如果周边还有“0”就在翻,循环往复
一开始先做了“初次翻0”de函数 :
- def check_zero(zero_flag, frequency, set):
- global list_set
- for setx in zero_flag:
- for sety in zero_flag:
- try:
- index = list[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety]
- zero_set.append(str(int(set[0]) - 1 + setx) + str(int(set[1]) - 1 + sety))
- except:
- pass
- else:
- index = index + ' '
- list_set[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety] = index
- frequency += 1
- return zero_set
(try……except……else语句拿来保证“0”在边角块时不报错)
试验了下,发现可以解决问题
现在问题在于“多次翻0”如何解决:
多次翻“0”,也就是多次在不同的坐标调用这个函数
我的代码如下:
- while str(mine) == '0':
- index_flag = 0
- zero_list = check_zero(zero_flag, frequency, set)
- check_zero = list[zero_list[index_flag][0]][zero_list[index_flag][1]]
- index = str(zero_list[index_flag][0] + 1) + str(zero_list[index_flag][1] + 1)
- mine = check_zero
- set = index
- index_flag += 1
这回就连“初次翻0”都实现不了了……
完整源码:
- import random
-
- while True:
- zero_flag = [1, 0, -1]
- zero_set = []
- list = []
- for setx in range(1, 9):
- list_0 = []
- for sety in range(1, 9):
- list_0.append('')
- list.append(list_0)
- list_set = []
- for setx in range(1, 9):
- list_0 = []
- for sety in range(1, 9):
- set = str(setx) + str(sety)
- list_0.append(set)
- list_set.append(list_0)
- list_flag = []
- for setx in range(1, 9):
- for sety in range(1, 9):
- set = str(setx) + str(sety)
- list_flag.append(set)
- def mine(list):
- setx = random.randint(0, 7)
- sety = random.randint(0, 7)
- if list[setx][sety] == 'B':
- mine(list)
- else:
- list[setx][sety] = 'B'
- return list
-
- for index in range(10):
- list = mine(list)
- def check_mine(list):
- for setx in range(8):
- for sety in range(8):
- if list[setx][sety] != 'B':
- mine_number = 0
- if setx != 7:
- if list[setx+1][sety] == 'B':
- mine_number += 1
- if setx != 0:
- if list[setx-1][sety] == 'B':
- mine_number += 1
- if setx != 7 and sety != 7:
- if list[setx+1][sety+1] == 'B':
- mine_number += 1
- if setx != 7 and sety != 0:
- if list[setx+1][sety-1] == 'B':
- mine_number += 1
- if setx != 0 and sety != 7:
- if list[setx-1][sety+1] == 'B':
- mine_number += 1
- if setx != 0 and sety != 0:
- if list[setx-1][sety-1] == 'B':
- mine_number += 1
- if sety != 7:
- if list[setx][sety+1] == 'B':
- mine_number += 1
- if sety != 0:
- if list[setx][sety-1] == 'B':
- mine_number += 1
- list[setx][sety] = str(mine_number)
- return list
-
- def list_to_str(list, setx, sety):
- list_str = ''
- for indexx in range(setx):
- for indexy in range(sety):
- res = list[indexx][indexy]
- list_str = list_str + res
- list_str = list_str + ' '
- list_str = list_str + '\n'
- return list_str
-
- list = check_mine(list)
- frequency = 0
- flag = 0
- mine_flag = 10
- mine_good_flag = 0
- tips = 3
- while True:
- print(list)
- print('还有' + str(10 - mine_good_flag) + '个地雷')
- print('雷阵(B代表雷,Q代表红旗,括号内代表你做的标记):')
- str_set = list_to_str(list_set, 8, 8)
- print(str_set)
- tips_flag = input('是否要用提示?还有' + str(tips) + '次')
- if tips_flag == '是':
- tip_set = input('请输入你要查看的坐标(Q代表你标的红旗):')
- if tip_set in list_flag:
- tips -= 1
- mine = list[int(tip_set[0]) - 1][int(tip_set[1]) - 1]
- mine = mine + ' '
- list_set[int(tip_set[0]) - 1][int(tip_set[1]) - 1] = mine
- print('这个位置的数字是:' + mine)
- if mine != 'B':
- frequency += 1
- else:
- print('坐标不正确,请根据上图中坐标填写')
- choose = input('请选择查看/排雷/标记')
- if choose == '查看':
- set = input('请输入您要查看的坐标:(Q代表你标的红旗)')
- if set in list_flag:
- mine = list[int(set[0]) - 1][int(set[1]) - 1]
- if mine == 'B':
- print('boom!')
- print('你输了(╥╯^╰╥)')
- print('雷池埋雷情况为:(B代表雷)')
- list_str = list_to_str(list, 8, 8)
- print(list_str)
- flag = 1
- else:
- mine = mine + ' '
- list_set[int(set[0]) - 1][int(set[1]) - 1] = mine
- print('这个位置的数字是:' + mine)
- frequency += 1
- def check_zero(zero_flag, frequency, set):
- global list_set
- for setx in zero_flag:
- for sety in zero_flag:
- try:
- index = list[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety]
- zero_set.append(str(int(set[0]) - 1 + setx) + str(int(set[1]) - 1 + sety))
- except:
- pass
- else:
- index = index + ' '
- list_set[int(set[0]) - 1 + setx][int(set[1]) - 1 + sety] = index
- frequency += 1
- return zero_set
- while str(mine) == '0':
- index_flag = 0
- zero_list = check_zero(zero_flag, frequency, set)
- check_zero = list[zero_list[index_flag][0]][zero_list[index_flag][1]]
- index = str(zero_list[index_flag][0] + 1) + str(zero_list[index_flag][1] + 1)
- mine = check_zero
- set = index
- index_flag += 1
- elif set not in list_flag:
- print('坐标不正确,请根据上图中坐标填写')
- elif choose == '排雷':
- mine_set = input('请输入你要标/取红旗的坐标')
- if mine_set in list_flag:
- if list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1].count('Q') == 0:
- if mine_flag == 0:
- print('十个红旗已用完,若还想标注,请取出一些红旗')
- else:
- number = list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1]
- list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1] = number + 'Q'
- if list[int(mine_set[0]) - 1][int(mine_set[1]) - 1] == 'B':
- mine_good_flag += 1
- mine_flag -= 1
- else:
- mine_flag -= 1
- if mine_good_flag == 10:
- print('恭喜你,游戏胜利!')
- print('雷池埋雷情况为:(B代表雷)')
- list_str = list_to_str(list, 8, 8)
- print(list_str)
- flag = 1
- else:
- number = list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1]
- number = number.replace('Q', '')
- list_set[int(mine_set[0]) - 1][int(mine_set[1]) - 1] = number
- if list[int(mine_set[0]) - 1][int(mine_set[1]) - 1] == 'B':
- mine_good_flag -= 1
- mine_flag += 1
- else:
- mine_flag += 1
- else:
- print('坐标不正确,请根据上图中坐标填写')
- elif choose == '标记':
- set = input('请输入你要标记的坐标:')
- if set in list_flag:
- label = input('请输入你要标记什么:')
- if len(label) == 0:
- print('标记不能为空')
- elif len(label) > 3:
- print('标记最多3个字符')
- else:
- if list_set[int(set[0]) - 1][int(set[1]) - 1].count('(') == 0:
- number = list_set[int(set[0]) - 1][int(set[1]) - 1]
- number = number + '(' + label + ')'
- list_set[int(set[0]) - 1][int(set[1]) - 1] = number
- else:
- print('提示:一个坐标的标记如有多个,则以旧换新')
- number = list_set[int(set[0]) - 1][int(set[1]) - 1]
- number = number[:2]
- number = number + '(' + label + ')'
- list_set[int(set[0]) - 1][int(set[1]) - 1] = number
- else:
- print('输入的坐标不合理')
-
- else:
- print('请输入查看/排雷/标记')
- if flag == 1:
- print('游戏结束')
- flag_gameover = input('是否再来一局?(输入是或否)(输入其他默认退出)')
- if flag_gameover == '是':
- break
- if flag_gameover != '是':
- print('欢迎下次再来~(*^▽^*)')
- flag = 2
- break
- if flag == 2:
- break

任何只言片语都行,望大神指教!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。