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 相关文章推荐
Zookeeper接口kazoo实例解析
Jan 22 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
用Python编写一个简单的CS架构后门的方法
Nov 20 Python
浅谈PySpark SQL 相关知识介绍
Jun 14 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
Jupyter notebook 启动闪退问题的解决
Apr 13 Python
基于Python测试程序是否有错误
May 16 Python
Python调用Redis的示例代码
Nov 24 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 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解析非标准json、非规范json的方式实例
2020/12/10 PHP
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
js substring从右边获取指定长度字符串(示例代码)
2013/12/23 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
vue.js项目中实用的小技巧汇总
2017/11/29 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
详解JavaScript中的强制类型转换
2019/04/15 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
详解vue高级特性
2020/06/09 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
pymssql ntext字段调用问题解决方法
2008/12/17 Python
Python中的类与对象之描述符详解
2015/03/27 Python
Python实现线程状态监测简单示例
2018/03/28 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python基于http下载视频或音频
2018/06/20 Python
numpy返回array中元素的index方法
2018/06/27 Python
Python 访问限制 private public的详细介绍
2018/10/16 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
基于spring boot 日志(logback)报错的解决方式
2020/02/20 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
Java的for语句中break, continue和return的区别
2013/12/19 面试题
三年级音乐教学反思
2014/01/28 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
大学军训感言800字
2014/02/27 职场文书
租房协议书怎么写
2014/04/10 职场文书
机关党员公开承诺书
2014/08/30 职场文书
房屋所有权证明
2014/10/20 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers