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工程师面试题 与Python Web相关
Jan 14 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
python验证码识别的示例代码
Sep 21 Python
python下实现二叉堆以及堆排序的示例
Sep 29 Python
python如何将图片转换为字符图片
Aug 19 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python实现打印实心和空心菱形
Nov 23 Python
Python devel安装失败问题解决方案
Jun 09 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
python 提高开发效率的5个小技巧
Oct 19 Python
OpenCV项目实践之停车场车位实时检测
Apr 11 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
php结合ajax实现赞、顶、踩功能实例
2014/05/12 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
php框架知识点的整理和补充
2021/03/01 PHP
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Python如何定义有默认参数的函数
2020/08/10 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
CAD制图设计师自荐信
2014/01/29 职场文书
高级工程师英文求职信
2014/03/19 职场文书
大专学生求职信
2014/07/04 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
刘公岛导游词
2015/02/05 职场文书
财政局长个人总结
2015/03/04 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
幼儿园教学反思范文
2016/03/02 职场文书