Avatar billede ClausGDP Nybegynder
25. maj 2011 - 13:13 Der er 2 kommentarer og
1 løsning

Memoryspil i C# og silverligt

Jeg er i gang med et memory/vendespil. Jeg bruger C# og Silverligt, da det skal kunne ligge på en hjemmeside. Jeg har oprettet et silverlight projekt, dog er det planen at bruge C# til spillogikken.

Jeg har et kort område 4x4 (16 billedkort), der bruger jeg et grid. Gridets column og rows er defineret i C#. I gridet column og rows er der lagt et billed ind, det er funger som forside. Jeg har så 16 andre billeder, som skal være skjult, dog blive vist når man trykker på et ad billederne. Jeg bruger tag til give hvert billed et nr, det kan kaldes med.

Hvordan får jeg skjult forside billede og vist bagside billedet?

\Claus

Jeg bruger win7 og Visual studio 2010
Hele min kode.
namespace SLtestbox
{
    public partial class MainPage : UserControl
    {
        Random R1 = new Random(); // Variable til Random funktion.
        public MainPage()
        {
            InitializeComponent();
        }
        /// <summary>
        /// Her starter man spillet, ved tryk på en knap.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void spilstart_Click(object sender, RoutedEventArgs e)
        {
            //Tilfældigt genrator
            int[] tal16 = new int[16] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; //array til brug til tilfældigt generator
            int tmptal; // tilbrug i løkken neden under.
            for (int i = 0; i < 1000; i++) // løkke på 1000
            {
                int Tal1 = R1.Next(0, 15); // tager et tilfældigt tal mellem 1 og 16
                int Tal2 = R1.Next(0, 15); // tager et tilfældigt tal mellem 1 og 16

                tmptal = tal16[Tal1];      //tmptal får værdigen af Tal1 Her bytter den man rundt på Tal1 og Tal2
                tal16[Tal1] = tal16[Tal2];  //Tal1 får værdigen af Tal2
                tal16[Tal2] = tmptal;      //Tal2 får værdigen af tmptal
            }
            //Ligger "forside" billedkort på spilleplade.
            for (int i = 0; i < 16; i++)
            {
                Image BK = new Image(); //forside af billedkort
                BK.Tag = i; // Hver billed får et tag nr. så det kan kaldes ved et nr.
                BK.Source = new BitmapImage(new Uri("trykpåmig.jpg", UriKind.RelativeOrAbsolute));
                BK.Stretch = Stretch.Uniform;
                BK.Visibility = System.Windows.Visibility.Visible;
                plade.Children.Add(BK); //Grid hedder plade x:Name="plade" i design delen.
                switch (i) // til at lægge billedkort ud i hele gridet.
                {
                    case 0: Grid.SetColumn(BK, 0); Grid.SetRow(BK, 0); break;
                    case 1: Grid.SetColumn(BK, 1); Grid.SetRow(BK, 0); break;
                    case 2: Grid.SetColumn(BK, 2); Grid.SetRow(BK, 0); break;
                    case 3: Grid.SetColumn(BK, 3); Grid.SetRow(BK, 0); break;

                    case 4: Grid.SetColumn(BK, 0); Grid.SetRow(BK, 1); break;
                    case 5: Grid.SetColumn(BK, 1); Grid.SetRow(BK, 1); break;
                    case 6: Grid.SetColumn(BK, 2); Grid.SetRow(BK, 1); break;
                    case 7: Grid.SetColumn(BK, 3); Grid.SetRow(BK, 1); break;

                    case 8:  Grid.SetColumn(BK, 0); Grid.SetRow(BK, 2); break;
                    case 9:  Grid.SetColumn(BK, 1); Grid.SetRow(BK, 2); break;
                    case 10: Grid.SetColumn(BK, 2); Grid.SetRow(BK, 2); break;
                    case 11: Grid.SetColumn(BK, 3); Grid.SetRow(BK, 2); break;

                    case 12: Grid.SetColumn(BK, 0); Grid.SetRow(BK, 3); break;
                    case 13: Grid.SetColumn(BK, 1); Grid.SetRow(BK, 3); break;
                    case 14: Grid.SetColumn(BK, 2); Grid.SetRow(BK, 3); break;
                    case 15: Grid.SetColumn(BK, 3); Grid.SetRow(BK, 3); break;
                }
                // sender musseklick ned til void BK_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
                BK.MouseLeftButtonDown += new MouseButtonEventHandler(BK_MouseLeftButtonDown);
            }
            // Ligger "Bagside" billedkort på spilelpladen
            for (int i = 0; i < 16; i++)
            {
                Image BSK = new Image(); //bagside af billedkort
                BSK.Tag = i;
                BSK.Source = new BitmapImage(new Uri(tal16[i].ToString() + ".jpg", UriKind.RelativeOrAbsolute));
                BSK.Stretch = Stretch.Uniform;
                BSK.Visibility = System.Windows.Visibility.Collapsed;
                plade.Children.Add(BSK);
                switch (i) // til at lægge billedkort ud i hele gridet.
                {
                    case 0: Grid.SetColumn(BSK, 0); Grid.SetRow(BSK, 0); break;
                    case 1: Grid.SetColumn(BSK, 1); Grid.SetRow(BSK, 0); break;
                    case 2: Grid.SetColumn(BSK, 2); Grid.SetRow(BSK, 0); break;
                    case 3: Grid.SetColumn(BSK, 3); Grid.SetRow(BSK, 0); break;

                    case 4: Grid.SetColumn(BSK, 0); Grid.SetRow(BSK, 1); break;
                    case 5: Grid.SetColumn(BSK, 1); Grid.SetRow(BSK, 1); break;
                    case 6: Grid.SetColumn(BSK, 2); Grid.SetRow(BSK, 1); break;
                    case 7: Grid.SetColumn(BSK, 3); Grid.SetRow(BSK, 1); break;

                    case 8: Grid.SetColumn(BSK, 0); Grid.SetRow(BSK, 2); break;
                    case 9: Grid.SetColumn(BSK, 1); Grid.SetRow(BSK, 2); break;
                    case 10: Grid.SetColumn(BSK, 2); Grid.SetRow(BSK, 2); break;
                    case 11: Grid.SetColumn(BSK, 3); Grid.SetRow(BSK, 2); break;

                    case 12: Grid.SetColumn(BSK, 0); Grid.SetRow(BSK, 3); break;
                    case 13: Grid.SetColumn(BSK, 1); Grid.SetRow(BSK, 3); break;
                    case 14: Grid.SetColumn(BSK, 2); Grid.SetRow(BSK, 3); break;
                    case 15: Grid.SetColumn(BSK, 3); Grid.SetRow(BSK, 3); break;
                }
                // sender musseklick til void BSK_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
                BSK.MouseLeftButtonDown += new MouseButtonEventHandler(BSK_MouseLeftButtonDown);
            }
          }
        /// <summary>
        /// Ved tryk på kanp. Gemme billed TrykPåMig.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void BK_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            ((Image)sender).Tag = 1;
            Tag = Visibility.Collapsed;
        }
        /// <summary>
        /// Ved tryk på et billed, vise billede under TrykPåMig.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void BSK_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            ((Image)sender).Tag = 1;
            Tag = Visibility.Visible;
        }
    }
}
Avatar billede johny Nybegynder
25. maj 2011 - 16:30 #1
Hvis du skal bruge din løsning, ville jeg nok lave enten (beklager eventuelle kompileringsfejl, er skrevet direkte her):
1) To lister med både forside og bagside i:
List<Image> forsider = new List<Image>();
List<Image> bagsider = new List<Image>();
...
forsider.Add(BK);
...
bagsider.Add(BSK);
...
void BK_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Image clickedImage = (Image)sender;
            int index = forsider.IndexOf(clickedImage);
            clickedImage.Visibility = Visibility.Collapsed;
            bagsider[index].Visibility = Visibility.Visible;
        }

el. 2) Have en liste hvor de ligger parvis, f.eks. sådan her:
List<Tuple<Image,Image>> billeder = new List<Tuple<Image,Image>>();
billeder.Add(new Tuple<Image,Image>(BK, BSK));
...
void BK_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Image clickedImage = (Image)sender;
            Tuple<Image,Image> billedPar = billeder.Single(e => e.Prop1 == clickedImage);
            billedPar.Prop1.Visibility = Visibility.Collapsed;
            billedPar.Prop2.Visibility = Visibility.Visible;
        }

Håber ovenstående eksempler er nogenlunde forståelige. Hvis du bruger 2 skal du for i øvrigt også slå de to for løkker sammen, så du har BK og BSK inden for samme scope.

Umiddelbart ville jeg dog kode det en del anderledes, med meget mere objektorientering, så du f.eks. slipper for en index mapning af forside og bagside, samt brug af Tag propertien som mest er noget fra WinForms dagene.

Det ville gøre det noget lettere at styre med f.eks. en klasse som denne:
public class Billede{
  public Image Forside {get;set;}
  public Image Bagside {get;set;}
  public bool Valgt {get;set;}

  public void ÆndreValg()
  {
    if(this.Valgt){
      Forside.Visibility = Visibility.Collapsed;
      Bagside.Visibility = Visibility.Visible;
    } else {
      Bagside.Visibility = Visibility.Collapsed;
      Forside.Visibility = Visibility.Visible;
    }
    this.Valgt = !this.Valgt;
  }
}

Men ja, det er også bare et forslag til hvis du vil strukturere det, så der er bedre sammenbinding i dine data.
Avatar billede ClausGDP Nybegynder
26. maj 2011 - 08:15 #2
Tak for svaret. Lig et svar, så få du point. En bekendt har kigget på min kode, og kommet med nogle konstruktive ændringer.
\Claus
Avatar billede johny Nybegynder
26. maj 2011 - 14:26 #3
Ok, håber det kunne bruges. Held og lykke med projektet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester