2016-06-06 5 views
-1

Ich muss ein Memory-Spiel machen, aber der Code gibt einen Fehler, wenn Etiketten angeklickt werden und ich brauche eine Seite zu färben und ein Bild anzuzeigen wenn angeklickt.So zeigen Sie ein Bild in einem Etikett mit einem Klickereignis (Memory Game)

Dies ist der Code:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Memory 
{ 
    public partial class frmMain : Form 
    { 
     Random random = new Random(); 

     //images 
     List<Image> icons = new List<Image>() 
     { 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\apple.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\apple.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\bananas.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\bananas.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\grapes.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\grapes.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\kokosnoot.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\kokosnoot.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\lemon.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\lemon.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\orange.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\orange.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\peach.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\peach.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\pear.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\pear.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\pepper.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\pepper.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\pineapple.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\pineapple.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\strawberry.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\strawberry.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\watermelon.png"), 
     Image.FromFile(@"C:\Users\thomas\Documents\Visual Studio 2015\Projects\Memory\Resources\watermelon.png"), 
     }; 

     //pictures to labels 
     public void AssignPicsToLabels() 
     { 
      foreach (Control control in tableLayoutPanel1.Controls) 
      { 
       Label iconLabel = control as Label; 
       if (iconLabel != null) 
       { 
        int randomNumber = random.Next(icons.Count); 
        iconLabel.Image = icons[randomNumber]; 
        icons.RemoveAt(randomNumber); 
       } 
      } 
     } 

     public frmMain() 
     { 
      InitializeComponent(); 
      AssignPicsToLabels(); 
     } 

     //Images randomizing 
     private void RandomizeImages() 
     { 
      Shuffle(icons); 
      int Index = 0; 

      foreach (Control control in tableLayoutPanel1.Controls) 
      { 
       var imageLabel = control as Label; 
       if (imageLabel == null) 
       { 
        continue; 
       } 

       imageLabel.Tag = Index; 
       Index++; 
      } 
     } 

     private static Random rng = new Random(); 

     private static void Shuffle<T>(List<T> list) 
     { 
      int count = list.Count; 
      while (count > 1) 
      { 
       count--; 
       int L = rng.Next(count + 1); 
       T value = list[L]; 
       list[L] = list[count]; 
       list[count] = value; 
      } 
     } 

     private void label_Click(object sender, EventArgs e) 
     { 
      Label clickedLabel = sender as Label; 

      if (clickedLabel != null) 
      { 
       var Index = (int)clickedLabel.Tag; 
       clickedLabel.Image = icons[Index]; 

       clickedLabel.ForeColor = Color.Black; 
      } 
     } 
    } 
} 

Es gibt einen Fehler hier:

var Index = (int)clickedLabel.Tag 
+4

Nun, es ist nicht möglich, 'string' in' int' zu transformieren, nur mit expliziter Umwandlung '(int) str', weil' string' * nicht * ein 'int' ist. Sie könnten 'Convert.ToInt32 (" ")' stattdessen verwenden – Fabjan

+0

Ich habe es so: 'var Index = Convert.ToInt32 (clickedLabel.Tag);' hat nicht funktioniert – Rexon222

+0

Sie scheinen nicht 'RandomizeImages' Methode, die Index mit Label-Tag assoziiert. Stattdessen verwenden Sie 'AssignPicsToLabels', was etwas anderes macht und auch die Icon-Liste zerstört. –

Antwort

0

Es gibt ein paar Probleme hier - die Tag-Eigenschaft auf eine ganze Zahl tatsächlich gesetzt ist (im Gegensatz zu einigen Kommentaren) aber nur wenn RandomizeImages tatsächlich aufgerufen wird, was es nicht zu sein scheint, da das Shuffling tatsächlich in AssignPicsToLabels erfolgt, sonst wird die Tag-Eigenschaft null sein, was wahrscheinlich Ihren Fehler verursacht.

Ich denke, das Verhalten Sie erhalten, wenn Sie RandomizeImages vollständig löschen und ersetzen AssignPicsToLabels mit dem folgenden:

//pictures to labels 
public void AssignPicsToLabels() 
{ 
    var iconIndices = Enumerable.Range(0, icons.Count-1).ToList(); 
    Shuffle(iconIndices); 
    int nIcon = 0; 

    foreach (Control control in tableLayoutPanel1.Controls) 
    { 
     Label iconLabel = control as Label; 
     if (iconLabel != null) 
     { 
      // TODO - check for array out of bounds 
      iconLabel.Tag = iconIndices[nIcon++]; 
     } 
    } 
} 

Dies wird jeder gibt einen zufälligen und einzigartigen integer Bildindex in der Tag-Eigenschaft Label, das sollte dann die erwarteten Ergebnisse im Click-Handler geben. Möglicherweise möchten Sie auch die Elementliste der Symbole durch ein statisches Array ersetzen, da diese Liste nicht mehr selbst geändert wird.

+0

diese Zeile: 'Enumerable.Range (0, icons.Count - 1) .ToList();' sagt jetzt: 'Operator - kann nicht auf Operanden vom Typ Methode Gruppe und int angewendet werden' Ich machte das Array ein Bild-Array – Rexon222

+0

Sorry, bitte ändern .Count zu .Length jetzt ist es ein Array –

+0

Danke. Aber jetzt die Zeile: iconLabel.Tag = iconIndices [nIcon ++]; sagt: Eine unbehandelte Ausnahme vom Typ 'System.ArgumentOutOfRangeException' ist in mscorlib.dll aufgetreten. – Rexon222

Verwandte Themen