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中二维阵列的变换实例
Oct 09 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
Python lambda函数基本用法实例分析
Mar 16 Python
Django实现学员管理系统
Feb 26 Python
Python matplotlib绘制饼状图功能示例
Sep 10 Python
Python hashlib常见摘要算法详解
Jan 13 Python
jenkins+python自动化测试持续集成教程
May 12 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
Django实现drf搜索过滤和排序过滤
Jun 21 Python
Python之matplotlib绘制折线图
Apr 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
浅谈PHP语法(1)
2006/10/09 PHP
php下intval()和(int)转换使用与区别
2008/07/18 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
node网页分段渲染详解
2016/09/05 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
python的文件操作方法汇总
2017/11/10 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
Keras自定义IOU方式
2020/06/10 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
python如何修改文件时间属性
2021/02/05 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
葡萄牙语专业个人求职信
2013/12/10 职场文书
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL
24年收藏2000多部退役军用电台
2022/02/18 无线电
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers