NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Pavel Odehnal:3.9.2017 23:50

Ahoj. Jako začátečník jsem dostal za úkol naprogramovat jednoduchou hru ve WPF.
Vše se podařilo. Až na poslední krok. Seřazení prvků při startu programu má být náhodné.
Zjišťuju, že příkaz "SHUFFLE" je naprostým nesmyslem.

Budu rád za jakoukoliv radu nebo nakopnutí. Sám nejsem schopnej nic vymyslet. :(( Děkuju předem. Pavel.

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)


        {
            int gedrückterKnopf = 0;
            Button[] knöpfe = {button01, button02, button03, button04, button05, button06, button07, button08, button09, button10, button11, button12, button13, button14, button15, button16 };
           Shuffle(knöpfe);     //    <------------------------------ TADY JE CHYBA :((

            for (int i = 0; i < 16; i++)
            {
                if (knöpfe[i] == sender)
                {
                    gedrückterKnopf = i;
                    break;
                }
            }

            int leerstelle = 0;
            for (int i = 0; i<16; i++)
            {
                if (!knöpfe[i].IsEnabled)
                {
                    leerstelle = i;
                }

            }
            //MessageBox.Show(gedrückterKnopf.ToString() + " " + leerstelle.ToString());

            int zeile1 = Grid.GetRow(knöpfe[gedrückterKnopf]);
            int spalte1 = Grid.GetColumn(knöpfe[gedrückterKnopf]);
            int zeile2 = Grid.GetRow(knöpfe[leerstelle]);
            int spalte2 = Grid.GetColumn(knöpfe[leerstelle]);

            if ( (zeile1 == zeile2 - 1 || zeile1 == zeile2 + 1) && spalte1 == spalte2
                ||
                (spalte1 == spalte2 - 1 || spalte1 == spalte2 + 1) && zeile1 == zeile2
                )
            {
                //MessageBox.Show("Huhu!")
                Grid.SetRow(knöpfe[gedrückterKnopf], zeile2);
                Grid.SetColumn(knöpfe[gedrückterKnopf], spalte2);
                Grid.SetRow(knöpfe[leerstelle], zeile1);
                Grid.SetColumn(knöpfe[leerstelle], spalte1);
            }
        }
    }
}
 
Odpovědět
3.9.2017 23:50
Avatar
Mimi Moore
Člen
Avatar
Mimi Moore:4.9.2017 7:14
using System.Linq;

Jednoduchá verzia:

Random r = new Random();
knöpfe = knöpfe.OrderBy(x => r.Next()).ToArray();

Generická funkcia na pole ľubovoľného typu:

static T[] Shuffle<T>(T[] array)
      {
          Random r = new Random();
          return array.OrderBy(x => r.Next()).ToArray();
      }

Ak by čísla neboli dosť náhodné, dá sa na generovanie použiť RNGCryptoServi­ceProvider class z namespace System.Securi­ty.Cryptograp­hy, ale pre tvoje účely by to malo stačiť.

Ešte rada - je dobrým zvykom používať diakritiku maximálne v komentároch (najlepšie ani tam nie) :)

 
Nahoru Odpovědět
4.9.2017 7:14
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Mimi Moore
Jan Vargovský:4.9.2017 9:52

Na tohle fakt nepotřebuje RNG crypto generator ..

Pavel Odehnal mrkni na Fisher-Yates shuffle algoritmus.

 
Nahoru Odpovědět
4.9.2017 9:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.