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


Posted in Python onAugust 01, 2014

本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。
本例使用python的tkinter做gui,由于没考虑可用性问题,因此UI比较难看,pygame更有趣更强大更好看,做这些小游戏更合适,感兴趣的读者可以尝试一下!

具体的功能代码如下:

# -*- coding: utf-8 -*-
import random
import sys
from Tkinter import *

class Model:
  """
  核心数据类,维护一个矩阵
  """
  def __init__(self,row,col):
    self.width=col
    self.height=row
    self.items=[[0 for c in range(col)] for r in range(row)]

  def setItemValue(self,r,c,value):
    """
    设置某个位置的值为value
    """
    self.items[r][c]=value;

  def checkValue(self,r,c,value):
    """
    检测某个位置的值是否为value
    """
    if self.items[r][c]!=-1 and self.items[r][c]==value:
      self.items[r][c]=-1 #已经检测过
      return True
    else:
      return False
    
  def countValue(self,r,c,value):
    """
    统计某个位置周围8个位置中,值为value的个数
    """
    count=0
    if r-1>=0 and c-1>=0:
      if self.items[r-1][c-1]==1:count+=1
    if r-1>=0 and c>=0:
      if self.items[r-1][c]==1:count+=1
    if r-1>=0 and c+1<=self.width-1:
      if self.items[r-1][c+1]==1:count+=1
    if c-1>=0:
      if self.items[r][c-1]==1:count+=1
    if c+1<=self.width-1 :
      if self.items[r][c+1]==1:count+=1
    if r+1<=self.height-1 and c-1>=0:
      if self.items[r+1][c-1]==1:count+=1
    if r+1<=self.height-1 :
      if self.items[r+1][c]==1:count+=1
    if r+1<=self.height-1 and c+1<=self.width-1:
      if self.items[r+1][c+1]==1:count+=1
    return count

  
class Mines(Frame):
  def __init__(self,m,master=None):
    Frame.__init__(self,master)
    self.model=m
    self.initmine()
    self.grid()
    self.createWidgets()

 
  
  def createWidgets(self):
    #top=self.winfo_toplevel()
    #top.rowconfigure(self.model.height*2,weight=1)
    #top.columnconfigure(self.model.width*2,weight=1)
    self.rowconfigure(self.model.height,weight=1)
    self.columnconfigure(self.model.width,weight=1)
    self.buttongroups=[[Button(self,height=1,width=2) for i in range(self.model.width)]
              for j in range(self.model.height)]
    for r in range(self.model.width):
      for c in range(self.model.height):
        self.buttongroups[r][c].grid(row=r,column=c)
        self.buttongroups[r][c].bind('<Button-1>',self.clickevent)
        self.buttongroups[r][c]['padx']=r
        self.buttongroups[r][c]['pady']=c

  def showall(self):
    for r in range(model.height):
      for c in range(model.width):
        self.showone(r,c)

  def showone(self,r,c):
    if model.checkValue(r,c,0):
      self.buttongroups[r][c]['text']=model.countValue(r,c,1)
    else:
      self.buttongroups[r][c]['text']='Mines'

  def recureshow(self,r,c):
    if 0<=r<=self.model.height-1 and 0<=c<=self.model.width-1:
      if model.checkValue(r,c,0) and model.countValue(r,c,1)==0:
        self.buttongroups[r][c]['text']=''
        self.recureshow(r-1,c-1)
        self.recureshow(r-1,c)
        self.recureshow(r-1,c+1)
        self.recureshow(r,c-1)
        self.recureshow(r,c+1)
        self.recureshow(r+1,c-1)
        self.recureshow(r+1,c)
        self.recureshow(r+1,c+1)
      elif model.countValue(r,c,1)!=0:
        self.buttongroups[r][c]['text']=model.countValue(r,c,1)
    else:
      pass
        
      
  def clickevent(self,event):
    """
    点击事件
    case 1:是雷,所有都显示出来,游戏结束
    case 2:是周围雷数为0的,递归触发周围8个button的点击事件
    case 3:周围雷数不为0的,显示周围雷数
    """
    r=int(str(event.widget['padx']))
    c=int(str(event.widget['pady']))
    if model.checkValue(r,c,1):#是雷
      self.showall()
    else:#不是雷
      self.recureshow(r,c)
    
    
  def initmine(self):
    """
    埋雷,每行埋height/width+2个暂定
    """
    r=random.randint(1,model.height/model.width+2)
    for r in range(model.height):
      for i in range(2):
        rancol=random.randint(0,model.width-1)
        model.setItemValue(r,rancol,1)

  
  def printf(self):
    """
    打印
    """
    for r in range(model.height):
      for c in range(model.width):
        print model.items[r][c],
      print '/n'
      

def new(self):
  """
  重新开始游戏
  """
  pass

if __name__=='__main__':
  model=Model(10,10)
  root=Tk()
  
  #menu
  menu = Menu(root)
  root.config(menu=menu)
  filemenu = Menu(menu)
  menu.add_cascade(label="File", menu=filemenu)
  filemenu.add_command(label="New",command=new)
  filemenu.add_separator()
  filemenu.add_command(label="Exit", command=root.quit)

  #Mines
  m=Mines(model,root)
  #m.printf()
  root.mainloop()
Python 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
Python的Flask框架中web表单的教程
Apr 20 Python
Python中的ConfigParser模块使用详解
May 04 Python
python监控键盘输入实例代码
Feb 09 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
python3 字符串知识点学习笔记
Feb 08 Python
浅谈python3打包与拆包在函数的应用详解
May 02 Python
使用python绘制横竖条形图
Apr 21 Python
python脚本实现查找webshell的方法
Jul 31 #Python
用python删除java文件头上版权信息的方法
Jul 31 #Python
Python datetime时间格式化去掉前导0
Jul 31 #Python
python处理文本文件并生成指定格式的文件
Jul 31 #Python
Python中关键字is与==的区别简述
Jul 31 #Python
python处理文本文件实现生成指定格式文件的方法
Jul 31 #Python
Python中zip()函数用法实例教程
Jul 31 #Python
You might like
php获取字段名示例分享
2014/03/03 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
js传值 判断
2006/10/26 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
电子信息专业自荐书
2014/02/04 职场文书
遗嘱继承公证书
2014/04/09 职场文书
媒体宣传策划方案
2014/05/25 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
银行业务授权委托书
2014/10/10 职场文书
2014年实习期工作总结
2014/11/27 职场文书
前台文员岗位职责
2015/02/04 职场文书
罗马假日观后感
2015/06/08 职场文书
MongoDB支持的索引类型
2022/04/11 MongoDB
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript