python实现扫雷游戏


Posted in Python onMarch 03, 2020

本文为大家分享了python实现扫雷游戏的具体代码,供大家参考,具体内容如下

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

具体的功能代码如下:

# -*- coding: utf-8 -*-
import random
import sys
from Tkinter import *
'''
想要学习Python?

'''
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 and、or以及and-or语法总结
Apr 14 Python
深入解析Python中的urllib2模块
Nov 13 Python
python采用django框架实现支付宝即时到帐接口
May 17 Python
Python复数属性和方法运算操作示例
Jul 21 Python
python实现读取大文件并逐行写入另外一个文件
Apr 19 Python
python numpy格式化打印的实例
May 14 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
Python的in,is和id函数代码实例
Apr 18 Python
Django模板获取field的verbose_name实例
May 19 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 Python
python实现从ftp服务器下载文件
Mar 03 #Python
python实现简单的购物程序代码实例
Mar 03 #Python
python实现跨excel sheet复制代码实例
Mar 03 #Python
python剪切视频与合并视频的实现
Mar 03 #Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 #Python
基于python 等频分箱qcut问题的解决
Mar 03 #Python
python实现快递价格查询系统
Mar 03 #Python
You might like
PHP foreach循环使用详解与实例代码
2010/05/08 PHP
php单例模式示例分享
2015/02/12 PHP
stripos函数知识点实例分享
2019/02/11 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
深入理解JavaScript系列(3) 全面解析Module模式
2012/01/15 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
函数window.open实现关闭所有的子窗口
2015/08/03 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
JavaScript中双向数据绑定详解
2017/05/03 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
python进阶教程之模块(module)介绍
2014/08/30 Python
浅谈MySQL中的触发器
2015/05/05 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
四年的大学生生活自我评价
2013/12/09 职场文书
火锅店营销方案
2014/02/26 职场文书
小学生开学第一课活动方案
2014/03/27 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
师德培训心得体会2016
2016/01/09 职场文书
500字作文之关于爸爸
2019/11/14 职场文书