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面向对象编程中的类和对象学习教程
Mar 30 Python
Python如何为图片添加水印
Nov 25 Python
Python_LDA实现方法详解
Oct 25 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
python hmac模块验证客户端的合法性
Nov 07 Python
python3爬虫GIL修改多线程实例讲解
Nov 24 Python
基于python实现银行管理系统
Apr 20 Python
浅谈Python项目的服务器部署
Apr 25 Python
教你用python控制安卓手机
May 13 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
简单的php 验证图片生成函数
2009/05/21 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
Node.js事件驱动
2015/06/18 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python中标准模块importlib详解
2017/04/16 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
云南省召开党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
出国签证在职证明范本
2014/11/24 职场文书
交警失职检讨书
2015/01/26 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
Python中可变和不可变对象的深入讲解
2021/08/02 Python
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL