马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
根据小甲鱼老师课后布置的自动动手写一个自己想写的东西。我准备写一个扫雷的小程序,
但在pycharm打印调试时发现我的s2_list的值变动后s1_list的值也变了,但我s2_list并不是赋值而是切片来的啊!
想了半天没想清楚,希望有大神解答?代码如下:# sel: 级别选择 s1_list: 总的矩阵列表 s2_list:屏幕打印矩阵 landmine:地雷个数 all_c_list:所有坐标的列表
# landmine_list:地雷坐标的列表
import easygui as g
import random
import pickle
def sweeping():
"""
开始游戏--选择级别--生成相符的矩阵--进入游戏--第一次点击-即输入坐标(检查输入是否合法)--随机生成一定数量的雷(第一次坐标处除外)
--循环输入坐标开始扫雷(两种选择Y/N,选y输入坐标打开数字,选n输入坐标标记雷)--雷用‘@’符号显示--若打开了雷则游戏失败结束,显示后
更新历史记录的数据--若最后未打开的坐标与雷数相同则游戏成功结束,显示后更新记录的数据--询问是否开始下一局--否定则退出游戏
"""
g.msgbox('欢迎来到木有界面的小游戏——扫雷(希望您能完成一次完整游戏)')
while True:
all_c_list = [] #可以选择的坐标列表
sel = g.indexbox('请选择您的游戏级别', title='难度选择', choices=('低级(9×9,10个雷)', '中级(16×16,40个雷)', '高级(16×30,99个雷)'))
if sel == 0: # 根据选择来定义矩阵的大小
x, y = 10, 10
landmine = 9
elif sel == 1:
x, y = 17, 17
landmine = 40
else:
x, y = 31, 17
landmine = 99
s1_list = matrix(x, y) # 总的矩阵
s2_list = s1_list[:]
for i in range(1, y): # 将所有的坐标值传入可选择的坐标列表
for j in range(1, x):
all_c_list.append(s1_list[i][j]) # 取得所有可用坐标,并放入列表
x1, y1 = c_input(x, y) # 获取输入坐标的值
all_c_list.remove((x1, y1)) # 将第一次输入坐标删除 确保第一次无雷
landmine_list = random.sample(all_c_list, landmine) # 随机获得地雷坐标的列表
for i in range(1, y):
for j in range(1, x):
if (j, i) in landmine_list:
s2_list[i][j] = '■'
else:
s2_list[i][j] = '■'
for i in range(y): # 打印测试
for j in range(x):
if (i == 0 and j < 10) or (j == 0 and i < 10):
print(s2_list[i][j], end=' ')
else:
print(s2_list[i][j], end=' ')
print('\n')
# file_list = pickle.load(open('历史记录.pkl', 'rb')) # 读取历史数据存入sl_list列表中 [已玩游戏数, 胜利游戏数, 获胜占比]
def matrix(x, y):
"""根据传入的参数定义矩阵,然后将矩阵返回"""
matrix_list = []
for i in range(y):
matrix_list.append([])
for j in range(x):
matrix_list[i].append([])
for i in range(y):
for j in range(x):
if i == 0:
matrix_list[i][j] = j
elif j == 0:
matrix_list[i][j] = i
else:
matrix_list[i][j] = (i, j)
return matrix_list
def c_input(x, y):
"""对输入坐标做判断"""
while True:
try:
c_list = input('请输入坐标(x,y)(,号隔开):').split(',', 1)
a = int(c_list[0])
b = int(c_list[1])
if (0 < a < x) and (0 < b < y):
break
else:
continue
except (EOFError, KeyboardInterrupt, ValueError):
g.msgbox('您的输入有误')
return a, b
sweeping()
|