基于Python實(shí)現(xiàn)的掃雷游戲?qū)嵗a
本文實(shí)例借鑒mvc模式,核心數(shù)據(jù)為model,維護(hù)1個(gè)矩陣,0表無雷,1表雷,-1表已經(jīng)檢測過。
本例使用python的tkinter做gui,由于沒考慮可用性問題,因此UI比較難看,pygame更有趣更強(qiáng)大更好看,做這些小游戲更合適,感興趣的讀者可以嘗試一下!
具體的功能代碼如下:
# -*- coding: utf-8 -*-
import random
import sys
from Tkinter import *
class Model:
"""
核心數(shù)據(jù)類,維護(hù)一個(gè)矩陣
"""
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):
"""
設(shè)置某個(gè)位置的值為value
"""
self.items[r][c]=value;
def checkValue(self,r,c,value):
"""
檢測某個(gè)位置的值是否為value
"""
if self.items[r][c]!=-1 and self.items[r][c]==value:
self.items[r][c]=-1 #已經(jīng)檢測過
return True
else:
return False
def countValue(self,r,c,value):
"""
統(tǒng)計(jì)某個(gè)位置周圍8個(gè)位置中,值為value的個(gè)數(shù)
"""
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):
"""
點(diǎn)擊事件
case 1:是雷,所有都顯示出來,游戲結(jié)束
case 2:是周圍雷數(shù)為0的,遞歸觸發(fā)周圍8個(gè)button的點(diǎn)擊事件
case 3:周圍雷數(shù)不為0的,顯示周圍雷數(shù)
"""
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個(gè)暫定
"""
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貪吃蛇游戲代碼
- 14 個(gè)Python小游戲 源碼分享
- 二十種Python代碼游戲源代碼分享
- 13個(gè)有趣又好玩的Python游戲代碼分享
- python基礎(chǔ)練習(xí)之幾個(gè)簡單的游戲
- Python實(shí)現(xiàn)我的世界小游戲源代碼
- 用Python設(shè)計(jì)一個(gè)經(jīng)典小游戲
- 20行python代碼的入門級(jí)小游戲的詳解
- 用python制作游戲外掛
- Python寫的貪吃蛇游戲例子
- python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a
- python開發(fā)的小球完全彈性碰撞游戲代碼
- Python實(shí)現(xiàn)打磚塊小游戲代碼實(shí)例
- Python開發(fā)文字版密室逃脫游戲的實(shí)例(含代碼)
相關(guān)文章
利用python實(shí)現(xiàn)終身免費(fèi)的聽書工具
本文通過實(shí)際案例,詳細(xì)介紹了作者如何利用Python庫實(shí)現(xiàn)文本轉(zhuǎn)語音的過程,從安裝庫到實(shí)際操作案例,都有詳細(xì)的說明,為讀者提供了一定的參考價(jià)值2024-03-03
python3 如何使用 goto 跳轉(zhuǎn)執(zhí)行到指定代碼行
這篇文章主要介紹了python3 使用goto跳轉(zhuǎn)執(zhí)行到指定代碼行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
python PIL Image 圖像處理基本操作實(shí)例
這篇文章主要介紹了python PIL Image 圖像處理基本操作實(shí)例包括圖片加載、灰度圖,圖像通道分離和合并,在圖像上輸出文字,圖像縮放,圖像閾值分割、 二值化,圖像裁剪需要的朋友可以參考下2022-04-04
Python如何獲取當(dāng)前路徑并列出當(dāng)前路徑下的所有文件
這篇文章主要介紹了Python如何獲取當(dāng)前路徑并列出當(dāng)前路徑下的所有文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
pandas中concat函數(shù)實(shí)現(xiàn)橫向連接
在pandas中,concat函數(shù)可用于合并不同的Series和DataFrame對(duì)象,本文主要介紹了pandas中concat函數(shù)實(shí)現(xiàn)橫向連接,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04

