見出し画像

例のマインスイーパーを改造した

いらっしゃいませ
本日のおすすめはチーズかまぼこです
それでは、ごゆっくりどうぞ

やあ、今日も遅くなってごめんね

僕はようやくゆっくりできる時期に入ってきたよ。

君はどうだい?健康第一で頑張るんだよ

またかね、と言われそうだけど今回はマインスイーパーについてはなそう。


さて、久しぶりに前回のマインスイーパーのプログラムを改造した。

ずっと改造したいとは思っていたのだが、ずっと着手できないままだった。

今回はフラッグを作ることに成功した。

もちろん、数字が書かれているマスの周囲にその数だけ旗があるとき、そのマスをクリックすれば周りのマスを開けることができるようにした。

あんなに悩んでいたのが嘘であったかのようにすんなりと書くことができた。

それに加え、クリアやミスの後10秒後に強制的に画面を閉じるようにプログラムした。

回答が表示される機能もある。

複数回、テストをしたけれど、どこかミスをしているかもしれない。

その時は大目に見てほしい。

冗長な部分を少し簡略化するなど、少し工夫を凝らしてみた。

さて、ある程度は目標は達成できたことだし、次は何のプログラムを書こうか。

今気になっているのは機械学習である。

もしおすすめの本やPDFがあれば教えてほしい。

よろしく頼む


今日はこのくらいかな。

あ、そのコードはこの後に書いておくよ。

毎度のことながら、クオリティーとマナーは期待しないでね。

それじゃあ、また今度





import tkinter as tk
import random
safe=0
cite=[]
flags=[]
for i in range(81):
    cite.append(0)
    flags.append(0)
l = [1,1,1,1,1,1,1,1,1,1]
for i in range(11,82):
    l.append(0)
random.shuffle(l)
v=0

def getbomb(n,l):
    # 爆弾か否か nは地区番号 周囲の爆弾の数を数える。
    if l[n]==0:
        if n in [0]:
            p = l[1]+l[9]+l[10]
        elif n in [1,2,3,4,5,6,7]:
            p = l[n+1] + l[n-1] + l[n+9] + l[n+8] + l[n+10]
        elif n in [8]:
            p = l[7] + l[16] + l[17]
        elif n in [9,18,27,36,45,54,63]:
            p = l[n+1] + l[n+9] + l[n-9] + l[n-8] + l[n+10]
        elif n in [17,26,35,44,53,62,71]:
            p = l[n-9] + l[n+9] + l[n-1] + l[n-10] + l[n+8]
        elif n in [72]:
            p = l[n+1] + l[n-9] + l[n-8]
        elif n in [73,74,75,76,77,78,79]:
            p = l[n+1] + l[n-1] + l[n-9] + l[n-10] + l[n-8]
        elif n in [80]:
            p = l[n-1] + l[n-9] + l[n-10]
        else :
            p = l[n+1] + l[n+9] + l[n-9] + l[n-10] + l[n+8] + l[n-1] + l[n-8] + l[n+10]
    else:
        p = -1
    return p

def corner(n):
    global v
    v+=1
    if n in [0]:
        for i in (1,9,10):
            open(i)
    elif n in [1,2,3,4,5,6,7]:
        for i in (n-1,n+1,n+9,n+8,n+10):
            open(i)
    elif n in [8]:
        for i in (7,16,17):
            open(i)
    elif n in [9,18,27,36,45,54,63]:
        for i in (n+1,n+9,n-9,n-8,n+10):
            open(i)
    elif n in [17,26,35,44,53,62,71]:
        for i in (n-1,n+9,n-9,n-10,n+8):
            open(i)
    elif n in [72]:
        for i in (n+1,n-9,n-8):
            open(i)
    elif n in [73,74,75,76,77,78,79]:
        for i in (n+1,n-1,n-9,n-10,n-8):
            open(i)
    elif n in [80]:
        for i in (n-1,n-9,n-10):
            open(i)
    else :
        for i in (n+1,n+9,n-9,n-10,n+8,n-1,n-8,n+10):
            open(i)
    v-=1


def open(n):
    global l,b,safe,cite ,v,flags
    if cite[n]==0 and flags[n]==0:
        cite[n]=1
        #n番地を開ける。 色をグレーから白に、番号を から数字に 
        #爆弾ならゲームオーバー 開けた数が71に達すればクリア
        p = getbomb(n,l)
        if p == -1:
            cite[n]=-1
            for i in range(81):
                if l[i]==1:
                    b[i].configure(text='b')
                if l[i]==0 and cite[i]==0:
                    b[i].configure(state=tk.DISABLED)
            b[n].configure(text="x")
            print('gameover')
            root.after(10000,lambda:root.destroy())
        else :
            b[n].configure(bg='#ffffff')
            if p==0:
                b[n].configure(state=tk.DISABLED)
                b[n].configure(text=' ')
                corner(n)
            else :
                b[n].configure(text=str(p))
    elif v==0 and flags[n]==0:
        p = getbomb(n,flags)
        if p == getbomb(n,l):
            corner(n)
    if sum(cite) ==71 and v==0:
        print('Game Clear!!!')
        for i in range(81):
            if l[i]==1:
                b[i].configure(text='P')  
        root.after(10000,lambda:root.destroy())

def flag(n):
    global flags
    if flags[n]==0 and cite[n]==0:
        b[n].configure(text='P')
        flags[n]=1
    elif cite[n]==0 :
        b[n].configure(text=' ')
        flags[n]=0




first = random.randint(0,80)
while getbomb(first,l) != 0:
    first = random.randint(0,80)

root = tk.Tk()
f = tk.Frame(root)
f.grid()




class Mybutton(tk.Button):
    __num = 0
    def event_open(self,n,event=None):
        open(n)
    def event_flag(self,n,event=None):
        flag(n)
    def __init__(self, master=None, cnf={}, **kw):
        tk.Button.__init__(self, master=None, cnf={}, **kw)
        self.__number = Mybutton.__num
        self['text']=' '
        self['bg']='#999999'
        self.bind("<Button-1>",(lambda event:self.event_open(self.__number)))
        self.bind('<Button-3>',(lambda event:self.event_flag(self.__number)))
        #self['command']=lambda:open(self.__number + 1)
        self['width']=2
        self['font']=('Helvetica', 14)
        self.grid(row= Mybutton.__num//9 ,column= Mybutton.__num % 9)
        Mybutton.__num += 1
    
a = []
b = []
for j in range(81):
    a.append('b'+str(j+1))
for i in a:
    i = Mybutton(f)
    b.append(i) 


b[first].configure(text='X')

root.mainloop()


投げるな危険