昨天写的扫雷代码链接:https://blog.csdn.net/qq_37347705/article/details/87972126
根据部分功能和用户提示做了优化如下:
#coding:utf-8
import sys
import random
"""
地图标记: MAP_
"""
MAP_BLANK = 0 # 地图空白
MAP_MINE = 1 # 有雷存在
MAP_USED = 2 # 已经排除
"""
错误码:ERROR_
"""
ERROR_OK = 5 # 结果ok
ERROR_FAIL = 6 # 结果失败
ERROR_NULL = 7 # 无效的输入
ERROR_PASS = 8 # 游戏胜利
class mine_sweep():
def __init__(self, row = 10, column = 10, mine_num = 20):
self.row = row # 地图 行
self.column = column # 地图 列
self.mine_num = mine_num # 地雷数量
# map_list row * column 的地图
self.map_list = [0]*(self.row*self.column)
# 用来显示的地图,在显示时隐藏地雷
self.map_list_show = [0]*(self.row*self.column)
def init_data(self):
"""初始化玩家数据, 随机生成地雷"""
map_list = random.sample(range(self.row * self.column), self.mine_num)
print(self.map_list)
for val in map_list:
self.map_list[val] = MAP_MINE
"""打印地图"""
def printf_map_list(self):
print("=="*self.row)
for i in range(self.row*self.column):
if (i+1) % self.row == 0:
print(self.map_list[i])
else:
print(self.map_list[i]),
print('=='*self.row)
def set_pos(self, x, y):
idx = self.get_index(x,y)
if self.map_list[idx] == MAP_BLANK:
self.derived_mark(x, y, True)
self.derived_mark(x, y, False)
return ERROR_OK
elif self.map_list[idx] == MAP_MINE:
print("你踩到雷了,game over")
self.map_list_show[idx] = MAP_MINE
return ERROR_FAIL
else:
print("该处已经踩过了, 请选择其它地方")
return ERROR_NULL
def safe_input(self):
while True:
try:
pos = raw_input("x, y = ")
pos = pos.split(',')
x, y = int(pos[0]), int(pos[1])
print(x,y,self.row,self.column)
if x > 0 and x <= self.row \
and y > 0 and y <= self.column:
break
else:
print("输入的x=%d y=%d超出了地图(%d*%d)的边界" % (x, y, self.row, self.column))
except Exception:
print("输入的参数格式不正确,请重新输入")
return x,y
def check_win(self):
for i in range(self.row*self.column):
if self.map_list[i] == MAP_BLANK:
return ERROR_FAIL
return ERROR_PASS
def get_index(self, x, y):
return (x-1) * self.row + (y-1)
def run(self):
status = MAP_BLANK
self.printf_map_list()
while status != ERROR_FAIL:
print("请输入x y作为坐标,逗号隔开,如果输入多个参数,只选择前两个参数")
x,y = self.safe_input()
status = self.set_pos(x,y)
# 默认每次输入之后会及时刷新map_list,然后打印出来
self.printf_map_list()
res = self.check_win()
if res == ERROR_PASS:
print("恭喜你获得胜利")
break
"""衍生标记,当输入一个点后,横纵坐标没有雷的地方也都被扫空"""
def derived_mark(self, row, col, add):
x, y = row, col
while x >= 0 and x < self.row:
idx = self.get_index(x,y)
if self.map_list[idx] != MAP_MINE:
self.map_list[idx] = MAP_USED
self.map_list_show[idx] = MAP_USED
else:
break
if add:
x = x + 1
else:
x = x - 1
x, y = row, col
while y >= 0 and y < self.column:
idx = self.get_index(x,y)
if self.map_list[idx] != MAP_MINE:
self.map_list[idx] = MAP_USED
self.map_list_show[idx] = MAP_USED
else:
break
if add:
y = y + 1
else:
y = y - 1
def mine_game():
print(
"================ 扫雷 ==============\n"
"1:游戏开始\t"
"2:游戏介绍\t"
"3:退出游戏\n"
"====================================\n"
)
x, y = 8,8
mine_num = 20
while True:
try:
player = input("请输入:")
if player >=1 and player <= 3:
break
else:
print("输入的选项为:%d,超出界限,无可选项,请重试。"%(player))
except:
print("输入不合法,请检测输入是否为数字")
if player == 1:
obj = mine_sweep(x,y,mine_num)
obj.init_data()
obj.run()
elif player == 2:
print("x,y输入要选定的位置\n"
"如果触发地雷,游戏结束\n"
"非雷会衍生标记横纵坐标没有雷的地方\n"
"祝游戏愉快\n")
elif player == 3:
print("再见")
sys.exit()
if __name__ == "__main__":
while True:
mine_game()
有什么需要改进的请留言指正。