2017-05-09 8 views
1

私はこのサイトを初めて利用していますので、間違っていると私を許してください。私はプロジェクトに取り組んでおり、特定の鉱山を持ち、星座の形を作るバージョンのMinesweeperを作ろうとしています。グリッドを破棄して新しいものを作成する方法

私たちは、プレイヤーが勝った場合、次のレベルに進むレベルのように見せようとしています。唯一の問題は、勝利関数では、新しい鉱山で新しいグリッドを作成し、フレーム全体を積み重ねたり破壊したりせずに古いグリッドを削除する方法を理解できないということです。また、最新のコードを持っているhttps://github.com/Riddler6897/Star-Minesweeper

TestRun.pyというファイルにあるが、すべての画像がimagesフォルダにあります。

あなたは私たちのgithubのアカウントから画像ファイルを取得することができます。ここで

みんなの利便性、ここ4つの.GIFイメージは以下のとおりです。

plaintile.gif:plaintile.gif
clickedtile.gif:clickedtile.gif
minetile.gif:minetile.gif
flagtile.gif:flagtile.gif

from Tkinter import * #We could also use pygame# 
from time import time #To set a timer# 
from time import sleep #To make the RGBs turn on and off# 
#import RPi.GPIO as GPIO 
class Minesweeper(Frame): 

    def __init__(self, master): 

     self.images = [PhotoImage(file = "images/plaintile.gif"), 
         PhotoImage(file = "images/clickedtile.gif"), 
         PhotoImage(file = "images/minetile.gif"), 
         PhotoImage(file = "images/flagtile.gif")] 
     self.NoTile = [] 
     Frame.__init__(self, master) 
     self.master = master 
#populates NoTile with images corresponding to the number of mines adjacent to each tile 
     #for x in range (1,9): 
      #self.NoTile.append(PhotoImage(file = "images/tile_"+str(x)+".gif")) 

     self.button = [] 
#arrays containing the position of each mine that will make the shape of the constellations 
     self.Libra = [23, 63, 102, 124, 154, 161, 197, 209] 
     self.Orion = [0, 2, 16, 30, 62, 66, 73, 89, 93, 103, 113, 118, 125, 132, 139, 146, 153, 211, 217] 
     self.Phoenix = [22, 44, 45, 78, 85, 121, 148, 169, 203] 
     self.Taurus = [3, 30, 35, 64, 67, 83, 95, 99, 113, 129, 146, 163, 178, 204, 223] 
     self.CanisMajor = [21, 49, 69, 73, 81, 101, 140, 144, 186, 197, 203, 212] 
     self.Draco = [32, 51, 63, 67, 96, 127, 157, 161, 167, 173, 193, 195, 198, 212, 224] 
     self.CanesVenatici = [42, 182] 
     self.Chameleon = [66, 104, 106, 133, 140] 
     self.Crater = [4, 22, 98, 120, 142, 153, 164, 220] 
     self.Vulpecula = [2, 51, 61, 83, 114, 145, 178, 209] 
     self.levels = [self.CanesVenatici, self.Chameleon, self.Libra, self.Crater, self.Vulpecula, self.Phoenix, self.CanisMajor, self.Taurus, self.Draco, self.Orion] 
#an array containing all the constellations in order of "difficulty" 
     self.level = 0 
     self.score = 1 
     self.pressed = 0 
     self.tiles = 225-len(self.levels[self.level]) 
#labels showing the current level and the number of mines in the level   
     self.label1 = Label(master, text = "Mines: "+str(len(self.levels[self.level]))) 
     self.label1.grid(row = 16, column = 0, columnspan = 5) 
     self.label2 = Label(master, text = "Level: "+ str(self.score)) 
     self.label2.grid(row = 16, column = 5, columnspan = 5) 
     self.label3 = Label(master, text = "Tiles Left: "+str(self.pressed)) 
     self.label3.grid(row = 16, column = 10, columnspan = 5) 



    def buttonPressed(self, i): 
     self.pressed += 1 
     self.tiles -= 1 
     self.label3 = Label(self.master, text = "Tiles Left: "+str(self.tiles)) 
     self.label3.grid(row = 16, column = 10, columnspan = 5) 
     self.button[i].config(image = self.images[1], state=DISABLED) 
     if self.tiles == 200: 
      self.win() 

    def minePressed(self, i): 
     self.button[i].config(image=self.images[2]) 
     #self.lose() 

    def constellation_plot(self): 
     for i in self.levels[self.level]: 
      self.button[i].config(command = lambda i=i: self.minePressed(i)) 

    #def update_mine(self): 
     #pass 

    def win(self): 
     self.master.grid_forget() 
     self.score += 1 
     self.level += 1 
     self.pressed = 0 
     self.tiles = 225-len(self.levels[self.level]) 
     self.grid() 



    def grid(self): #This will make the grid# 
     i = 0 
     for r in range(15): 
      for c in range(15): 
       self.mGrid = Button(self.master, image=self.images[0], command = lambda i=i :self.buttonPressed((i))) 
       self.button.append(self.mGrid) 
       self.mGrid.image = self.images[0] 
       self.mGrid.grid(row=r, column=c) 
       i += 1 

     self.constellation_plot() 


    def play(): #Will actually run the game# 
     pass 

    #def lose(self): #Will use GPIO for RGBs and allow the player to start the same level over# 
     #quit(1) 


    def time_out(): #timer. When the time goes out, the whole program will stop running while still showing score.# 
     pass 

    def sound(): #To play a sound if they win or lose. Can be put under the lose function# 
     pass 

window = Tk() 
minesweeper = Minesweeper(window) 
window.title("Minesweeper") 
minesweeper.grid() 
window.mainloop() 
+0

他の誰かがあなたのコードを実行しようとすると、参照されている4つの.gif画像のコピーがあったと便利です。あなたはあなたの質問にそれらをまだ埋め込むことはできないので、私はそれらをそれぞれhttp://imgur.comのような無料のオンライン画像共有サイトにアップロードし、あなたの質問にリンクを追加することをお勧めします。 – martineau

+0

githubアカウントの仕事へのリンクを送信しますか? –

+0

はい、私はあなたの質問を編集してリンクを追加すると思います。 – martineau

答えて

0

その他の問題がありますが、質問にお答えするには、remove_button_grid()メソッドをクラスに追加し、self.master.grid_forget()の代わりにself.remove_button_gridを使用してwin()関数で呼び出します。

これは新しいメソッドがどのように見えるかです:ところで

def remove_button_grid(self): 
     while self.button: 
      button = self.button.pop() 
      button.destroy() 

、私はself.buttonsボタン属性のリストのためのより良い名前だと思います。また、Minesweeperクラスの名前を「grid()」メソッドの名前に変更する必要があります。これは、Frameから継承したレイアウトマネージャメソッドの名前なので、サブクラスで定義されているメソッドとは完全に異なるものですTkinter - それは間接的にコメントになるまで私をしました。

+0

これを手伝ってくれてありがとう!私たちの問題を完全に解決しました。私は非常に速く、役に立つ応答に本当に感謝しています –

+1

これは 'grid_forget'という名前にはなりません。なぜなら、それは組み込みの関数名と衝突するからです。それが動作する間、それを読んだ人々の大部分は 'grid_forget'が実際にウィジェットを忘れるのではなく実際に破壊することを期待しないので、混乱するコードにつながります。 –

+1

@ブライアン:優れたポイント・アンド・オール・サウンド・アドバイス。それ以外にも、それは多少質問にはならないものの、関連するトピックには素晴らしいセグメントです。クラス 'Minesweeper'、' Tkinter.Frame'サブクラスは、同じ名前の 'Tkinter'レイアウトマネージャとは関係ない独自の' grid() 'メソッドを定義しています。皮肉なことに(そしてその点を完全に証明した)私の答えでコードを書くとき、私は 'Tkinter'レイアウトマネージャの方法について忘れてしまいました。ですから、既存の 'Minesweeper.grid()'メソッドにも適用されていると言えます。 – martineau

関連する問題