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中字符编码简介、方法及使用建议
Jan 08 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
在scrapy中使用phantomJS实现异步爬取的方法
Dec 17 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
python实现字符串加密成纯数字
Mar 19 Python
Python上下文管理器全实例详解
Nov 12 Python
Python json转字典字符方法实例解析
Apr 13 Python
python输出数学符号实例
May 11 Python
浅谈Python中的模块
Jun 10 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
keras输出预测值和真实值方式
Jun 27 Python
Python sklearn分类决策树方法详解
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
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
jQuery实现的倒计时效果实例小结
2016/04/16 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
javascript实现延时显示提示框效果
2017/06/01 Javascript
JS中的BOM应用
2018/02/02 Javascript
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python抽象基类用法实例分析
2015/06/04 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
基于python求两个列表的并集.交集.差集
2020/02/10 Python
python logging通过json文件配置的步骤
2020/04/27 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
《绿色蝈蝈》教学反思
2014/03/02 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
个人安全生产责任书
2014/07/28 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
岁月神偷观后感
2015/06/11 职场文书
小学校长开学致辞
2015/07/29 职场文书
三八红旗手主要事迹材料
2015/11/04 职场文书