|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
复制代码 |
|