优化昨天写的扫雷代码

昨天写的扫雷代码链接: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()

有什么需要改进的请留言指正。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值