网络编程
位置:首页>> 网络编程>> Python编程>> 基于Python实现的扫雷游戏实例代码

基于Python实现的扫雷游戏实例代码

作者:shichen2014  发布时间:2023-06-26 12:29:34 

标签:Python,扫雷,游戏

本文实例借鉴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()
0
投稿

猜你喜欢

  • 实体有五种预定义的XML实体,HTML编码者应该熟悉。XML文档中的字符&、<、>、"和'被分别表示为
  • 直接看代码: 代码如下:Class GoogleTranslator sub Class_Initialize
  • Asp开发 联通CDMA以下是在开发wap中的随笔,其中一些对于“老鸟”来说,谈不上什么,希望对初学者有所帮助,大家有什么小技巧,欢迎顶上来
  • 好东西找起来很麻烦,好用的又不太容易找到,之前看到很多用JS写的,固定漂浮这种效果拖动时难免会产生抖动,自己对CSS还是蛮有好感的,找来找去
  • 在业界,普遍认为Oracle数据库的安全性要比SQL Server数据库高。下面笔者就来谈谈这两种数据库在安全性设计上面的异同。掌握好这些内
  • 整个重装步骤大致分四个步骤进行,第一步,备份原mysql中的所有数据库。第二步,完全卸载mysql第三步,下载安装新版mysql第四步,导入
  • Logo是品牌图形区别的点睛之处,我们每天都要接触很多logo - 在高速公路上,在购买商品时,以及浏览各种网站。我们查看很多logo设计,
  • Dump ALL MySQL Databasesmysqldump --user=XXXXXXXX --password=XXXXXXX -
  • 可能有些地方翻译得不好,请见谅在这个冠冕堂皇的标题之下,我想回答一个土方,有人在博客提出很久了。该土方很好的描述了很多图标设计师所面临的典型
  • 在Vista IIS 7 中用 vs2005 调试 Web 项目核心是要解决以下几个问题:1、Vista 自身在安全性方面的User Acc
  • 和数据库打交道要频繁地用到SQL语句,除非你是全部用控件绑定的方式,但采用控件绑定的方式存在着灵活性差、效率低、功能弱等等缺点。因此,大多数
  • 在软件开发过程中经常会遇到数据库升迁的问题,原因比较多,如acsess访问速度比sql server慢、删除数据记录后access会留下空档
  • 1.func Fields(s string) []string,这个函数的作用是按照1:n个空格来分割字符串最后返回的是[]string的
  • 我页面上有控制了只能输入数字的控件,禁止了输入法切换的,但是搜狗的云输入却控制不了,有没有办法在页面里面禁止它运行啊?发现这玩意儿真的很讨厌
  • 您是否记得关闭所有的XHTML元素,在HTML中一些元素没有必要被关闭。当下一个元素开始的时候,上一个元素就自动被关闭。XHTML中是不允许
  • 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。RACLE 不论是数据库管理能力还是安全性都是无可非
  • 最近一直在“深山老林”中修炼“支付宝新版收银台”,经历了白板设计,视觉设计,前端开发,前后端联调各个阶段。点点滴滴……重点谈谈对交互设计的感
  • 通过HTTP_USER_AGENT判断用户是从手机上访问,还是电脑IE上访问。 asp代码片段:主要使用了正则匹配手机环境,大家可以补充手机
  • 传统行业里,缺做互联网资深的人;互联网行业里,缺玩传统业务资深的人。于是会造成很多问题,比如两边难沟通,在传统行业者心目中,网络营销e-Ma
  • 导言到目前为止,我们探讨的教程是由表现层,业务逻辑层和数据访问层构成的层次体系结构。数据访问层和业务逻辑层分别在教程第一和第二章提到。在Di
手机版 网络编程 asp之家 www.aspxhome.com