本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。
本例使用python的tkinter做gui,由于没考虑可用性问题,因此UI比较难看,pygame更有趣更强大更好看,做这些小游戏更合适,感兴趣的读者可以尝试一下!
具体的功能代码如下:
# -*- coding: utf-8 -*- import random import sys from Tkinter import * 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在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

Python3.6环境下加载Pickle文件报错:ModuleNotFoundError:Nomodulenamed...

如何解决jieba分词在景区评论分析中的问题?当我们在进行景区评论分析时,往往会使用jieba分词工具来处理文�...

如何使用正则表达式匹配到第一个闭合标签就停止?在处理HTML或其他标记语言时,常常需要使用正则表达式来�...

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

记事本++7.3.1
好用且免费的代码编辑器