Jak losowo rozmieścić teksty w labelach, z List i i jednego stringa.

0

Jak losowo rozmieścić teksty w labelach, z List i i jednego stringa?
Mam

List<string> listaImion =new List<string>();

i

string prawidłowaOdpowiedź="Bronisław";

Jak zrobić taki jakby quiz? Przypadkowe imiona z listy można losować za pomocą Random i umieścić w właściwości label.Text, ale w jednym labelu musi pojawiać się prawidłowa odpowiedź, czyli ta która jest w prawidłowaOdpowiedź. Teraz jak zrobić żeby rozmieszczenie tego było losowe, tak żeby nie zawsze prawidłową odpowiedzią było np. C. Może lepiej to na buttonach zrobić? Proszę o pomoc jeśli ktoś ma pomysł jak to zrobić w prosty sposób. Dodam jeszcze screena, dla jasności.
user image

http://imageshack.us/photo/my-images/683/screenaoh.jpg/

0
 List<string> listanazwisk = new List<string>();

            listanazwisk.Add("Kowalski");
            listanazwisk.Add("Pała");
            listanazwisk.Add("Bober");
            listanazwisk.Add("Noob");
            listanazwisk.Add("Wtf");

            string[] ala = new string[3]; //Odpowiedzi

            string dobraodpowiedz = "asd"; //poprawna odpowiedz


            Random rand = new Random();


            int mgo = rand.Next(0,3); //losuje miejsce w którym znajduje sie dobra odpowiedz


            ala[mgo] = dobraodpowiedz;

            for (int i = 0; i <= 2; i++)
            {
                if (ala[i] == null) //sprawdza które odpowiedzi nie maja zawartosci
                {
                    ala[i] = listanazwisk[rand.Next(0,2)];
                }
            }

            for (int i = 0; i<= 2; i++)
            {
                Console.WriteLine(ala[i]);
            }
            Console.Read();

niestety konsolowa musisz przerobić...

Efekt:
http://imageshack.us/photo/my-images/194/23953499.png/
http://imageshack.us/photo/my-images/708/19896858.png/

0

No dzięki, wiem że losowanie jest proste. Tylko mam:
label1
label2
label3
string prawidlowaOdpowiedz="Bronisław";
int zmiennaWylosowana;

label1.Text=listaImion[zmiennaWylosowana]; 
label2.Text=listaImion[zmiennaWylowana];
label3.Text= prawidlowaOdpowiedz; tylko, że tu w tych przykładach przypisuję do labeli na sztywno, a chce żeby prawidłowaOdpowiedz, była losowa wybierana czy ma być w label1 czy label2 lub label3

No i oczywiście losowanie musi być bez powtórzeń.

0

Dodaj bibliotekę algorithm i tam masz taką funkcję jak next_permutation, losuje bez powtorzeń.
Wyciagnij wtedy np dwie pierwsze odpowiedzi i dodaj trzecia, a potem wykonaj jeszcze raz permutacje tylko na tym mniejszym zbiorze.

0

Wszystko ok, ale jak uniknąć tego:

label3.Text= prawidlowaOdpowiedz 

Wszystko było by proste gdyby można zrobić tak:

int wyloswonaLiczba
label+wyloswonaLiczba.Text=prawidłowaOdpowiedz;

Wylowało się 2 więc prawidłowa odpowiedź jest w label2.Text, wylosowało się 3 to prawidłowa odpowiedź jest w label3.Text. Oczywiście to co napisałem nie działa, tylko chciałem pokazać o co mi chodzi.

0

Dobry dział!

czemu nie zrobisz listy Label`ów :0

List<Label> trolol = new List<Label>();
trolol.Add(label1);
0

O dzięki.

Przepraszam nie mam konta, więc nie mogę skasować poprzedniego postu. Jak poprawić ten kod poniżej, żeby nigdy nie wyświetliła się dwa razy prawidłowa odpowiedź?

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

namespace LosoweRozmieszczenieNapisówNa_przycisku
{
    public partial class Form1 : Form
    {
        public List<string> listaImion=new List<string>();
        string dobraOdpowiedz = "Bronisław";
        public List<Label> listaLabeli = new List<Label>();
        string[] odpowiedzi = new string[3];
        int indexLosowania;
        public Form1()
        {
            InitializeComponent();
            listaImion.Add("Jarosław");
            listaImion.Add("Lech");
            listaImion.Add("Marcin");
            listaLabeli.Add(label1);
            listaLabeli.Add(label2);
            listaLabeli.Add(label3);
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            Random rand = new Random();
            

            for (int i = 0; i < 3; i++)
            {
                listaLabeli[i].Text = dobraOdpowiedz;
                if (listaImion[i] != listaLabeli[i].Text)
                {
                    indexLosowania = rand.Next(0, 3); //losujemy miejsce w którym znajdzie się dobra odpowiedź
                    listaLabeli[indexLosowania].Text = listaImion[i];
                }
               
            }
         }
    }
}
0

dwa razy prawidłowa odpowiedź?

dwa razy masz poprawną odpowiedz ?

EDIT:
Nie zrozumiałeś mojego kodu

ja nie losuje labeli do których dam informacje
lecz informacje do labeli.

listaLabeli[indexLosowania].Text = listaImion[i];

zobacz pierw przypisałeś do wszystkich "Bronisław" prawda ?
a potem wylosowałes label róznie łatwo w ogóle nie musiałes dawac warunku

if (listaImion[i] != listaLabeli[i].Text)

bo jest zbędny

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public List<string> listaImion = new List<string>();
        string dobraOdpowiedz = "Bronisław";
        public List<Label> listaLabeli = new List<Label>();
        string[] odpowiedzi = new string[3];
        int indexLosowania;

        public Form1()
        {
            InitializeComponent();
            listaImion.Add("Jarosław");
            listaImion.Add("Lech");
            listaImion.Add("Marcin");
            listaLabeli.Add(label1);
            listaLabeli.Add(label2);
            listaLabeli.Add(label3);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
     
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Random rand = new Random();
            listaLabeli[0].Text = "label1";
            listaLabeli[1].Text = "label2";
            listaLabeli[2].Text = "label3";

            int mgo = rand.Next(0, 3); //losuje miejsce w którym znajduje sie dobra odpowiedz


            odpowiedzi[mgo] = dobraOdpowiedz;
            listaLabeli[mgo].Text = dobraOdpowiedz;

            for (int i = 0; i < 3; i++)
            {

                if (listaLabeli[i].Text == "label" + Convert.ToString(i+1))
                {
                    indexLosowania = rand.Next(0, 3); //losujemy miejsce w którym znajdzie się dobra odpowiedź
                    listaLabeli[i].Text = listaImion[indexLosowania];
                }

                switch (mgo)
                {
                    case 0:
                        {
                            if (listaLabeli[1].Text == listaLabeli[2].Text)
                            {
                                listaLabeli[2].Text = "Leonidas";
                            }
                            break;
                        }
                    case 1:
                        {
                            if (listaLabeli[2].Text == listaLabeli[0].Text)
                            {
                                listaLabeli[0].Text = "Krotos";
                            }
                            break;
                        }
                    case 2:
                        {
                            if (listaLabeli[0].Text == listaLabeli[1].Text)
                            {
                                listaLabeli[1].Text = "Mały koslawy";
                        
                            }
                            break;
                        }
                }

            }

            
        }
    }
}

0

A może lepiej byłoby zrobić to obiektowo? Z klasą Pytanie zawierającą tablicę obiektów klasy Odpowiedź, te zaś miałyby właściwość "CzyPoprawna". Do tego przydałaby się jakaś UserControl zawierająca 4 Labele i przyjmująca w konstruktorze obiekt Pytanie. Podczas jej wyświetlania sama losowałaby położenie odpowiedzi w pytaniach.
Co to da? Separację logiki od interfejsu użytkownika, czyli np. nie trzeba będzie w dziwaczny sposób zapamiętywać, w którym labelu znajduje się poprawna odpowiedź.

@konserwa - kod, w którym dajesz Random rand = new Random(); w metodzie na 99% nie zadziała tak, jak byś chciał.

0

Działa bo sprawdzałem :)

0

Nie prościej rozmieścić jak leci, a potem wywołać metodę shuffle()?

0

Somekind Twój pomysł brzmi interesująco, ale niestety z braku umiejętności i wiedzy będę musiał użyć mniej ładnej metody.

1 użytkowników online, w tym zalogowanych: 0, gości: 1