基于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 相关文章推荐
python 查找文件夹下所有文件 实现代码
Jul 01 Python
Python性能优化的20条建议
Oct 25 Python
Python进程间通信用法实例
Jun 04 Python
python+Django+apache的配置方法详解
Jun 01 Python
Python 中 Virtualenv 和 pip 的简单用法详解
Aug 18 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
在Django中实现添加user到group并查看
Nov 18 Python
python tkinter之 复选、文本、下拉的实现
Mar 04 Python
python环境下安装opencv库的方法
Mar 05 Python
使用pytorch 筛选出一定范围的值
Jun 28 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
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
js仿百度音乐全选操作
2017/01/13 Javascript
javaScript基础详解
2017/01/19 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
JS文件/图片从电脑里面拖拽到浏览器上传文件/图片
2017/03/08 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
vue使用swiper实现左右滑动切换图片
2020/10/16 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
2018/05/19 Python
python @classmethod 的使用场合详解
2019/08/23 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
存储过程的优缺点是什么
2015/01/10 面试题
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
经营理念标语
2014/06/21 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js