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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
python访问sqlserver示例
Feb 10 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 Python
python实现简单登陆系统
Oct 18 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
Python的形参和实参使用方式
Dec 24 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
通过代码实例了解Python异常本质
Sep 16 Python
pycharm中leetcode插件使用图文详解
Dec 07 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校验ISBN码的函数代码
2011/01/17 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
php防止sql注入的方法详解
2017/02/20 PHP
javascript 图片上传预览-兼容标准
2009/06/01 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
javascript闭包入门示例
2014/04/30 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
微信分享调用jssdk实例
2017/06/08 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
浅谈vue 单文件探索
2018/09/05 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
解决python报错MemoryError的问题
2018/06/26 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python之mock模块基本使用方法详解
2019/06/27 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
python opencv如何实现图片绘制
2020/01/19 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
高分子材料与工程专业推荐信
2013/12/01 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
运动会报道稿300字
2014/10/02 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript