2017-05-09 2 views
1

Ich bin neu auf dieser Seite, also bitte vergib mir, wenn ich das falsch mache. Ich arbeite an einem Projekt und wir versuchen, eine Version von Minesweeper zu machen, die bestimmte Minen haben und Konstellationsformen machen wird.Wie man ein Gitter zerstört und ein neues erstellt

Wir versuchen, es wie Ebenen erscheinen, wo, wenn der Spieler gewinnt, sie auf das nächste Level gehen. Das einzige Problem ist, dass wir in unserer Gewinnfunktion nicht herausfinden können, wie man ein neues Gitter mit den neuen Minen erzeugt und das alte Gitter löscht, ohne dass es den gesamten Rahmen stapelt oder zerstört.

Sie können die Bilddateien aus unserem Github-Konto erhalten: https://github.com/Riddler6897/Star-Minesweeper

Es ist auch die aktuellste Code hat, ist in der TestRun.py und alle Bilder sind im images Ordner namens Datei.

Hier findet jeder Bequemlichkeit, hier sind die vier GIF-Bilder:

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

Damit jemand anderen versucht, Ihren Code auszuführen, wäre es hilfreich, wenn sie Kopien der 4 '.gif 'Bilder hätten, auf die verwiesen wird. Da Sie sie noch nicht in Ihre Frage einbetten können, empfehle ich, sie auf eine der kostenlosen Online-Websites für die gemeinsame Nutzung von Bildern, z. B. http://imgur.com, hochzuladen und ihnen Links in Ihre Frage hinzuzufügen. – martineau

+0

Wird der Link zu unserem GitHub-Account funktionieren? –

+0

Ja, ich denke schon, [bearbeiten] Sie Ihre Frage und fügen Sie den Link hinzu. – martineau

Antwort

0

Es kann einige andere Probleme geben, aber um Ihre Frage zu beantworten, können Sie einehinzufügenMethode zur Klasse und rufen Sie sie in der win() Funktion mit self.remove_button_grid (anstelle der self.master.grid_forget(), die Sie derzeit in Ihrem Code haben.

Dies ist, was die neue Methode soll wie folgt aussehen:

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

By the way, ich denke, self.buttons würde Attribut ein besserer Name für die Liste der Tasten sein. Außerdem denke ich, dass Sie die Minesweeper Klasse 'grid() Methode etwas anderes umbenennen sollten, da das der Name einer Layoutmanager-Methode ist, die er von Frame erbte und etwas völlig anderes als das in der Unterklasse definierte tut, weil das nicht verwirren kann Tkinter -wie es mir geschah, bis es indirekt in einen Kommentar kam.

+0

Vielen Dank für Ihre Hilfe! Es hat unser Problem vollständig gelöst. Ich schätze wirklich all die sehr schnellen und hilfreichen Antworten –

+1

Ich würde es nicht 'grid_forget' nennen, da das mit den eingebauten Funktionsnamen kollidiert. Während es funktioniert, wird es zu verwirrendem Code führen, da die meisten Leute, die es lesen, nicht erwarten, dass "grid_forget" ein Widget tatsächlich zerstört, anstatt es einfach zu vergessen. –

+1

@Bryan: Ausgezeichneter Point-und allgemein guter Rat.Abgesehen davon ist es ein toller Übergang zu einem verwandten, wenn auch etwas abwegigen Thema. Die Klasse 'Minesweeper', eine' Tkinter.Frame'-Unterklasse, definiert ihre eigene 'grid()' -Methode, die nichts mit dem 'Tkinter'-Layout-Manager desselben Namens zu tun hat. Diese Tatsache führte ironischerweise (und um den Punkt perfekt zu beweisen) dazu, dass ich die Methode des "Tkinter" -Layout-Managers vergessen habe, als ich den Code in meine Antwort geschrieben habe. Ein noch besserer Punkt ist das, was Sie sagen, dass es auch auf die existierende "Minesweeper.grid()" Methode angewendet wird. – martineau

Verwandte Themen