この記事では、すべての人に地雷除去ゲームを実現するためのpythonの特定のコードを共有しています。参考までに、具体的な内容は次のとおりです。
この記事の例はmvcモデルを利用しており、コアデータはモデルであり、1つのマトリックスが維持され、0は雷がないことを意味し、1は私のものを意味し、-1はテスト済みを意味します。
この例では、Pythonのtkinterをguiとして使用しています。使いやすさが考慮されていないため、UIは醜く、pygameはより面白く、強力で、見栄えがよくなります。これらの小さなゲームを作成するのに適しています。興味のある読者は試してみることができます。
具体的な機能コードは次のとおりです。
# - *- coding: utf-8-*-import random
import sys
from Tkinter import*'''
Pythonを学びたいですか?
'''
classModel:"""
コアデータクラス、マトリックスを維持
"""
def __init__(self,row,col):
self.width=col
self.height=row
self.items=[[0for c inrange(col)]for r inrange(row)]
def setItemValue(self,r,c,value):"""
位置の値を値に設定します
"""
self.items[r][c]=value;
def checkValue(self,r,c,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つの場所の値の数を数えます
"""
count=0if r-1=0 and c-1=0:if self.items[r-1][c-1]==1:count+=1if r-1=0 and c =0:if self.items[r-1][c]==1:count+=1if r-1=0 and c+1<=self.width-1:if self.items[r-1][c+1]==1:count+=1if c-1=0:if self.items[r][c-1]==1:count+=1if c+1<=self.width-1:if self.items[r][c+1]==1:count+=1if r+1<=self.height-1 and c-1=0:if self.items[r+1][c-1]==1:count+=1if r+1<=self.height-1:if self.items[r+1][c]==1:count+=1if r+1<=self.height-1 and c+1<=self.width-1:if self.items[r+1][c+1]==1:count+=1return count
classMines(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 inrange(self.model.width)]for j inrange(self.model.height)]for r inrange(self.model.width):for c inrange(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 inrange(model.height):for c inrange(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):if0<=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):"""
イベントをクリック
case1:サンダーだ、すべてが表示され、ゲームオーバー
case2:周囲の地雷の数は0で、周囲の8つのボタンのクリックイベントが再帰的にトリガーされます
case3:周囲の地雷の数が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):"""
私の鉱山,各列の埋没高さ/width+2暫定
"""
r=random.randint(1,model.height/model.width+2)for r inrange(model.height):for i inrange(2):
rancol=random.randint(0,model.width-1)
model.setItemValue(r,rancol,1)
def printf(self):"""
印刷
"""
for r inrange(model.height):for c inrange(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()
以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。
Recommended Posts