python文字版扫雷

python版本:2.7

游戏运行图:

这里写图片描述

代码已经注释得很清楚,不废话了,直接上代码:
2个算法:1、随机数生成算法,2、广度优先

#coding:utf-8
import sys
import random
import Queue

#保存不同游戏难度数据 格式:难度:(row,line,mine)
DIFFICUL_DATA = {1:(8,8,5),2:(10,10,20),3:(15,15,100)}
#保存不同游戏结果的一些数据
RESULT_DATA = {
    0:"         数据统计",
    1:"         游戏胜利",
    2:"         游戏失败"   
}


class Sweep_Mine(object):
    def __init__(self):
        """
        功能:实例化函数
        """
        self.row = 0
        self.line = 0
        self.mine_num = 0
        self.map_list = []
        self.clean_count = 0
        self.step_count = 0
        self.level = 0
        self.result = 0                  # 保存游戏结果、0:还未结束,1:游戏胜利,2:游戏失败   
        self.queue = Queue.Queue()

    def show_desc(self):
        """
        功能:打印游戏说明
        """
        print "=============================="
        print "|         游戏说明            |"
        print "|                             |"
        print "|                             |"
        print "|   #  为没扫雷过的位置       |"
        print "|   *  为地雷的位置           |"
        print "|   0  为空白区域             |"
        print "|   1-8为周围雷的数目         |"
        print "|                             |" 
        print "|                             |" 
        print "|  输入X/Y: 扫雷的位置        |"    
        print "|  X/Y输入99: 刷新地图        |"
        print "|  X/Y输入88: 退出游戏        |"
        print "|                             |" 
        print "=============================="  
        print "------------------------------"  

    def show_result(self):
        """
        功能:打印信息显示
        参数:
             select 0 打印数据统计
                    1 打印游戏胜利
                    2 打印游戏结束
        """
        print "\n============================"
        print RESULT_DATA.get(self.result)                  #从RESULT_DATA中打印结果数据
        print "\n 地雷数 : %d    步数 :%d      " %(self.mine_num,self.step_count)
        print " 已扫雷坑 : %d  剩余雷坑:%d " %(self.clean_count,\
                                               self.row*self.line - self.clean_count -self.mine_num)
        print "============================"    

    def init_data(self):                
        """
        功能:难度选择,数据初始化
        """
        self.clean_count = 0
        self.step_count = 0
        self.row = DIFFICUL_DATA[self.level][0]                                  #从全局变量Grade_Data获取难度数据
        self.line = DIFFICUL_DATA[self.level][1]
        self.mine_num = DIFFICUL_DATA[self.level][2]
        self.map_list = [['#' for i in range(self.row)] for i in range(self.line)]       #map_list填充'#'

        random_list = random.sample(range(self.row*self.line),self.mine_num)                 #获取mine_num个随机数
        for i in random_list:
            x = i%self.row                                                     #用随机数对横取余
            y = i/self.row                                                     #用随机数对横取商
            self.map_list[y][x] = '*'                                          #随机位置设置雷

    def set_level(self,lvl):
        """
        功能:设置游戏难度
        参数:
            lvl 为 1 2 3 不同难度
        返回: 
            True 设置等级成功
            False 设置等级失败
        """
        if lvl ==1 or lvl == 2 or lvl == 3: 
            self.level = lvl
            self.init_data()
            return True
        else:
            return False

    def check_result(self):
        """
        功能:判断游戏是否胜利
        返回: 
        self.result
            0 未结束            
            1 胜利
            2 失败
        """
        if self.row*self.line-self.clean_count <= self.mine_num:
            self.result = 1
        return self.result

    def bfs(self):
        """
        BFS广度优先搜索空白区
        """
        queue_temp = []
        around = [[-1,-1],[0,-1],[1,-1],[-1,0],[1,0],[-1,1],[0,1],[1,1]] 
        while not self.queue.empty():
            self.clean_count += 1  
            mine = 0
            q_x=self.queue.get()
            q_y=self.queue.get()
            for value in around:
                line = q_y + value[0]
                row = q_x + value[1]
                if line<0 or line>=self.line or row<0 or row>=self.row:
                    continue
                if self.map_list[line][row] == '*':
                    mine += 1
                elif self.map_list[line][row] == '#':
                    queue_temp.append([line,row])                      #暂时保存到queue_temp 
            if mine > 0: 
                self.map_list[q_y][q_x] = str(mine)                    #标注雷的数目
                queue_temp = []                                        #清空queue_temp 
            else:
                self.map_list[q_y][q_x] = '0'                          #设置为空白区'0'
                while len(queue_temp):                                 #将queue_temp里面的值放到queue队列里面
                    temp = queue_temp.pop(0)
                    self.map_list[temp[0]][temp[1]] = '0'              #防止回头
                    self.queue.put(temp[1])                            #将空白的点加入队列
                    self.queue.put(temp[0])

    def show_game(self,showmine=False):
        """
        功能:显示扫雷地图
        参数:默认showmine 为 False 普通显示,隐藏地雷的位置
                 showmine 为 True 特殊显示,显示地图中地雷的位置
        """
        output_temp = []                      #保存输出字符
        num_temp = []                         #保存横纵坐标的序号
        len = self.row if self.row >= self.line else self.line       #保存row或line长的一边
        for num in range(len):
            if num <10:
                num_temp.append(str(num)+'  ')
            else:
                num_temp.append(str(num)+' ')

        output_temp.append("  X  ")
        for x in range(self.row):
            output_temp.append(num_temp[x])
        output_temp.append('\nY   ')
        for x in range(self.row):
            output_temp.append('---')
        for y in range(self.line):
            output_temp.append('\n'+num_temp[y]+'| ')
            for x in range(self.row):
                if self.map_list[y][x] == '*':
                    if showmine == True:
                        output_temp.append('*  ')
                    else:
                        output_temp.append('#  ')
                else:
                    output_temp.append(self.map_list[y][x] + '  ')
        print ''.join(output_temp)

    def input_pos(self,y,x):
        """
        功能:输入扫雷位置
        参数:输入整型x,y
             表示要扫雷的位置,x为横坐标,y为纵坐标
             x/y = 99,刷新地图
             x/y = 88,结束游戏
        返回:
             True:扫雷成功
             False:扫雷失败
        """
        if x in range(self.row) and y in range(self.line):
            self.step_count += 1                  #步数加一
            if self.map_list[y][x] == '*':        #踩到地雷
                self.result = 2                   #游戏结果设置失败
                return True
            elif self.map_list[y][x] == '#':      #扫雷成功
                self.queue.put(x)
                self.queue.put(y)
                self.bfs()
                return True
            else:
                return False
        else:
            if x == 99 or y == 99:                #输入99,刷新地图
                self.init_data()
                return True
            elif x == 88 or y == 88:              #输入88,游戏结束
                self.result = 2
                return True
            else:
                return False

if __name__ == '__main__':
    game = Sweep_Mine()
    game.show_desc()                        #打印游戏说明

    while True:                             #大循环输入游戏难度
        level = raw_input("请选择游戏的难度\n输入:1、2、3\n")
        if level.isdigit() != True:               #如果输入不是数字
            print("无效,请输入数字!")
            continue
        else:
            level = int(level)
            if game.set_level(level) == True:              #选择难度成功推出
                break
            else:
                print("难度选择失败!")

    while game.check_result() == 0:                      #游戏没结束,一直循环输入x/y
        game.show_game() 
        game.show_result()
        x = raw_input("Input X:")
        y = raw_input("Input Y:")
        if x.isdigit() != True or y.isdigit() != True:    #如果输入不是数字
            print "无效,请输入数字!"
            continue
        else:
            x = int(x)
            y = int(y)
            if game.input_pos(y,x):                  #输入扫雷的位置
                print "扫雷成功!"
            else:
                print "输入位置错误!"
    game.show_game(True)                                #游戏结束
    game.show_result()
    sys.exit(0)
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的Python实现扫雷的示例代码: ```python import random # 游戏参数 ROWS = 10 COLUMNS = 10 MINES = 10 # 方格状态 UNREVEALED = -1 MINE = -2 # 创建游戏面板 board = [[UNREVEALED for _ in range(COLUMNS)] for _ in range(ROWS)] # 随机布雷 mines = random.sample(range(ROWS * COLUMNS), MINES) for mine in mines: row, col = divmod(mine, COLUMNS) board[row][col] = MINE # 计算周围地雷数量 for row in range(ROWS): for col in range(COLUMNS): if board[row][col] == MINE: continue count = 0 for r in range(max(0, row - 1), min(row + 2, ROWS)): for c in range(max(0, col - 1), min(col + 2, COLUMNS)): if board[r][c] == MINE: count += 1 board[row][col] = count # 显示游戏面板 def print_board(): print(" ", end="") for col in range(COLUMNS): print(f"{col:2d}", end="") print() for row in range(ROWS): print(f"{row:2d} ", end="") for col in range(COLUMNS): if board[row][col] == UNREVEALED: print(" .", end="") elif board[row][col] == MINE: print(" *", end="") else: print(f" {board[row][col]}", end="") print() # 点击方格 def click(row, col): if board[row][col] == MINE: print("你踩到了地雷,游戏结束!") return False elif board[row][col] == UNREVEALED: board[row][col] = 0 for r in range(max(0, row - 1), min(row + 2, ROWS)): for c in range(max(0, col - 1), min(col + 2, COLUMNS)): if board[r][c] == UNREVEALED: click(r, c) return True else: return True # 开始游戏 print_board() while True: row = int(input("请输入行号:")) col = int(input("请输入列号:")) if not click(row, col): break print_board() ``` 这个简易扫雷游戏使用的是命令行界面,先随机生成地雷,然后根据地雷数量计算每个方格周围的地雷数量。玩家输入行号和列号来点击方格,如果踩到地雷,则游戏结束,否则会递归地展开周围未点击过的方格,直到点击到有地雷的方格或者所有非地雷方格都被点击为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值