python实现文字版扫雷

本文实例为大家分享了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)

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Python实现的扫雷游戏实例代码

    本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过. 本例使用python的tkinter做gui,由于没考虑可用性问题,因此UI比较难看,pygame更有趣更强大更好看,做这些小游戏更合适,感兴趣的读者可以尝试一下! 具体的功能代码如下: # -*- coding: utf-8 -*- import random import sys from Tkinter import * class Model: """ 核心数据类,维护一

  • 如何基于Python实现自动扫雷

    这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: win32api win32gui win32con Pillow numpy opencv 可通过 pip install --upgrade Som

  • 用python写扫雷游戏实例代码分享

    扫雷是一个非常经典的WIN游戏,我们教给大家用python语言来写出这个游戏,以下是全部实例代码: #!/usr/bin/python #coding:utf-8 #python 写的扫雷游戏 import sys import random class MineSweeping(): #扫雷主程序 def __init__(self,row = 8 ,line= 8,mineNum = 15): self.row = row self.line = line self.score = 0 #分

  • python实现扫雷游戏

    本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下 本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过. 本例使用python的tkinter做gui,由于没考虑可用性问题,因此UI比较难看,pygame更有趣更强大更好看,做这些小游戏更合适,感兴趣的读者可以尝试一下! 具体的功能代码如下: # -*- coding: utf-8 -*- import random import sys from Tkinter import

  • python实战教程之自动扫雷

    前言 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 1.扫雷游戏 我是win10,没有默认的扫雷,所以去扫雷网下载 http://www.saolei.net/BBS/ 2.python 3 我的版本是 python 3.6.1 3.python的第三方库 win32api,win32gui,win32con,Pillow,numpy,opencv 可通过 pip install --upgrade Some

  • Python自动扫雷实现方法

    本文实例讲述了Python自动扫雷实现方法.分享给大家供大家参考.具体如下: #pyWinmineCrack.py # coding: utf-8 import win32gui import win32process import win32con import win32api from ctypes import * #雷区最大行列数 MAX_ROWS = 24 MAX_COLUMNS = 30 #雷区格子在窗体上的起始坐标及每个格子的宽度 MINE_BEGIN_X = 0xC MINE_

  • python实现文字版扫雷

    本文实例为大家分享了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)} #保

  • 利用python将图片版PDF转文字版PDF

    图片版PDF无法复制,转化成文字版的PDF后使用更方便. 我们需要用到python3.6,pypdf2,ghostscript,PythonMagick,百度文字识别服务和pdfkit. 安装 安装python3.6 略 安装ghostscript https://ghostscript.com/download/gsdnld.html 安装wkhtmltopdf https://wkhtmltopdf.org/downloads.html pip安装PyPDF2,ghostscript,bai

  • Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程

    以此文记录Python与Tensorflow及其开发环境的安装与配置过程,以备以后参考. 1 硬件与系统条件 Win7 64位系统,显卡为NVIDIA GeforeGT 635M 2 安装策略 a.由于以上原因,选择在win7下安装cpu版的tensorflow,使用anconda安装,总结下来,这么做是代价最小的. b. 首先,不要急于下载Python,因为最新的版本可能会与Anaconda中的Python版本发生冲突.以目前(截止2017-06-17日)的情况,Anaconda选择Anaco

  • C语言实现简易版扫雷小游戏

    本文实例为大家分享了C语言实现简易版扫雷的具体代码,供大家参考,具体内容如下 声明 本次扫雷小游戏用多文件来编写.首先,要自定义的一个头文件 mine.h,里面有扫雷程序里面所需要的头文件.常量和所有函数的声明.其次,创建主函数 test.c,用自己喜欢的方式构建一个游戏的框架,最后,创建自定义函数 mine.c,编写各项功能. 设计思路 1.先写主函数,理清整个游戏流程. int main() { int quit = 0; do{ int select = 0; Menu(); scanf(

  • 使用 python 实现单人AI 扫雷游戏

    AI玩扫雷 很高兴又见面了!

  • Python制作简易版2048小游戏

    目录 目标效果 设计开始 步骤一 步骤二 步骤三 步骤四 步骤五 今天我们来动手实现一款2048小游戏.这款游戏的精髓就玩家能够在于通过滑动屏幕合并相同数字,直到不能再合并为止.玩法可以说是非常的简单,但挑战性也是十足的.话不多说,让我们从0开始实现! 目标效果 大致要实现的效果如下: 设计开始 首先简单分析一下游戏的逻辑: 输入移动方向,游戏内所有方块都朝指定方向移动 同方向移动的方块,数字相同则合并,然后生成一个合并的方块 合并后生成新的方块,无法生成新方块时游戏结束 用一系列的颜色来区分不

  • C语言开发简易版扫雷小游戏

    前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地

  • Python实现简易版的Web服务器(推荐)

    下面给大家介绍python实现简易版的web服务器,具体内容详情大家通过本文学习吧! 1.请自行了解HTTP协议 http://www.jb51.net/article/133883.htm(点击跳转) 2.创建Socket服务,监听指定IP和端口 3.以阻塞方式等待客户端连接 4.读取客户端请求数据并进行解析 5.准备服务器运行上下文 6.处理客户端请求数据 7.根据用户请求路径读取文件 8.返回响应结果给客户端 9.程序入口 10.目录结构 11.运行 python wsgiserver.p

  • Python之文字转图片方法

    Pygame模块一览表: 引入pygame模块 ,若本机没有请自行pip install pygame #载入必要的模块 import pygame #pygame初始化 pygame.init() # 待转换文字 text = u"文字转图片" #设置字体和字号 font = pygame.font.SysFont('Microsoft YaHei', 64) #渲染图片,设置背景颜色和字体样式,前面的颜色是字体颜色 ftext = font.render(text, True, (

  • Python将文字转成语音并读出来的实例详解

    前言 本篇文章主要介绍,如何利用Python来实现将文字转成语音.将文字转成语音主要有两种不同的实现方法:先将文字转成语音,然后再通过读取语音实现发音.直接调用系统内置的语音引擎实现发音,后一种方法的实现主要利用第三方库. 环境 Python版本:Anaconda 4.4.10 操作系统:win10 注意:在使用第三方库的时候,不同的操作系统和Python版本代码可能有所差别. 调用api 可以调用第三方的语音合成api生成音频文件,然后再播放音频文件即可,这里我使用的是百度语音合成api. 1

随机推荐