Losowanie dwóch liczb pobieranie z własnej klasy

0

Chciałbym wylosować dwie liczby z przedziału od 1 do 50 kod działający poniżej(dopisany pod kliknięcie np. buttona):

   int[] tab = new int[2];
            Random gen = new Random();
            for (int i = 0; i < tab.Length; i++)
            {
                tab[i] = gen.Next(1, 50);
                //  Console.Write("{0}; ", tab[i]);
                label5.Text = tab[0].ToString();
                label6.Text = tab[1].ToString();

            }

Teraz chciałbym zrobić to samo ale żeby liczby były pobierane z własnej klasy i stworzone zostały obiekty. Kombinowałem na wiele sposób ale nie bardzo wiem jak to zrobić.

  public class Losowanie
    {
        public int WylosowanaLiczbaGracz1 { get; set; }
              
        public int WylosowanaLiczbaGracz2 { get; set; }
jakas metoda

Zrobiłem np tak

 
 public class Losowanie
    {
        public int WylosowanaLiczbaGracz1
        {
            get
            {
                
            Random rnd = new Random();
            return rnd.Next(1, 50);
            }
 public int WylosowanaLiczbaGracz2
        {
            get
            {
                
            Random rnd = new Random();
            return rnd.Next(1, 50);
            }
            
        }

Ale w obydwóch labelach zawsze jest ta sam wartość, więc myślę że na pewno muszę trzymać wyloswane liczby w tabeli. Jak to zrobić?

1

Ta sama wartość jest dlatego, bo źle używasz klasy Random. Utworzenie dwóch obiektów w tym samym czasie sprawia, że sekwencje generowanych liczb są identyczne.
Zdeklaruj obiekt klasy Random jako statyczne pole klasy i problem się rozwiąże.

0

Zrobiłem tak ale nadal pokazuje się ta sama wartość:

 
        public static int WylosowanaLiczbaGracz1
        {

            get
            {

                Random rnd = new Random();
                return rnd.Next(1, 50);
            }
        }
        public static int WylosowanaLiczbaGracz2
        {
            get
            {

                Random rnd2 = new Random();
                return rnd2.Next(1, 50);
            }

        }
1

Nie metody mają być statyczne tylko pole rnd ma być statyczne tak jak masz WylosowanaLiczbaGracz2 tylko bez gettera i settera.

0

Zrobiłem tak jak poniżej ale znowu po raz kolejny coś źle. Czy może mi to ktoś przepisać poprawnie??

 public class Losowanie
    {
        public static int rnd;
        public static int rnd2;
        public  int WylosowanaLiczbaGracz1
        {

            get
            {

                Random rnd = new Random();
                return rnd.Next(1, 50);
            }
        }
        public  int WylosowanaLiczbaGracz2
        {
            get
            {

                Random rnd2 = new Random();
                return rnd2.Next(1, 50);
            }

        }
 
1

Odpowiadam sam sobie. OK. Przeanalizowałem wszystko jeszcze raz poprawny, działający kod poniżej

public class Losowanie
    {
        public static  Random rnd = new Random();

      
        public  int WylosowanaLiczbaGracz1
        {

            get
            {
               return rnd.Next(1, 50);
            }
        }
        public  int WylosowanaLiczbaGracz2
        {
            get
            {             
                return rnd.Next(1, 50);
            }

        }
 

Dziękuje bardzo za odpowiedzi!

0

Jeszcze jedna sprawa tworzę metodę która wyświetla zwycięskiego gracza, ale nie działa to prawidłowo tzn. czasami wyświetli poprawnie że wygrał gracz1 czy drugi a czasami nie. Gdzie tkwi mój błąd?

 
 public void KtoWygral()
        {
            
            if (WylosowanaLiczbaGracz1 > WylosowanaLiczbaGracz2)
            {
                MessageBox.Show("Wygrał gracz1 ");
            
            }
            else 
                {
                MessageBox.Show("Wygrał gracz2 ");
            
            }

        }
1

Skąd wiesz, że komunikat jest poprawny (błędny)? Musisz zadać pytanie o odpowiednią właściwość, ale każde pytanie to kolejne losowanie. Liczby wylosowane w kodzie z komunikatami są inne niż liczby wyświetlane podczas kontroli poprawności komunikatu.
Edit Gra jest niesprawiedliwa, drugi gracz ma większe szanse na zwycięstwo. Jeśli chcesz mieć grę sprawiedliwą, to wprowadź remisy lub dogrywkę - dodatkowe losowanie jednej z dwóch liczb, gdy liczby wylosowane w pierwszym losowaniu są równe.

0

Dlaczego twierdzisz że działa źle? Za każdym razem kiedy odwołasz się do WylosowanaLiczbaGracz1 lub WylosowanaLiczbaGracz2 zostanie wylosowana nowa liczba. Czyli w Twoim warunku zostaną wylosowane 2 liczby i dopiero później zostaną one porównane.

0

Oto cały kod "gry". Twierdzę , że nie działa prawidłowo gdyż np. WylosowanaLiczbaGracz1 jest mniejsza od WylosowanaLiczbaGracz2 a MessageBox pokazuje że wygrał gracz WylosowanaLiczbaGracz1 i dowrotnie. Ale czasami komunikaty są poprawne. Proszę przetestować kilka razy losując nową liczbę.

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 Gra
{
    public partial class Form1 : Form
    {
        Losowanie los;
        public Form1()
        {
            InitializeComponent();
          los  = new Losowanie();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            label1.Text = los.WylosowanaLiczbaGracz1.ToString();
            label2.Text = los.WylosowanaLiczbaGracz2.ToString();

            los.KtoWygral();

        }
    }

    public class Losowanie
    {
        public static Random rnd = new Random();


        public int WylosowanaLiczbaGracz1
        {

            get
            {

                return rnd.Next(1, 50);

            }

        }
        public int WylosowanaLiczbaGracz2
        {
            get
            {
                return rnd.Next(1, 50);

            }


        }


        public void KtoWygral()
        {

            if (WylosowanaLiczbaGracz1 > WylosowanaLiczbaGracz2)
            {
                MessageBox.Show("Wygrał gracz1 ");


            }
            else
            {
                MessageBox.Show("Wygrał gracz2 ");

            }

        }

    }
}

 
1

Przeczytaj jeszcze raz dwa poprzednie posty, powolutku, ze zrozumieniem.

        private void button1_Click(object sender, EventArgs e)
        {
 
            label1.Text = los.WylosowanaLiczbaGracz1.ToString(); //tu losujesz i wypisujesz
            label2.Text = los.WylosowanaLiczbaGracz2.ToString(); //tu losujesz i wypisujesz
 
            los.KtoWygral(); //tu ponownie losujesz i porównujesz te nowo wylosowane, a nie te wypisane
 
        }
0

Rozumie to. Ale nie bardzo wiem jak to zapisać.Proszę o pomoc!

0

Nie znam języka, więc rozwiązanie może być mało eleganckie.

         private void button1_Click(object sender, EventArgs e)
        {
            int pierwszy = los.WylosowanaLiczbaGracz1;
            int drugi = los.WylosowanaLiczbaGracz2;
            label1.Text = pierwszy.ToString();
            label2.Text = drugi.ToString();
            los.KtoWygral(pierwszy,drugi);
        }
        public void KtoWygral(int pierwszy, int drugi)
        {
            if (pierwszy > drugi)
            {
                MessageBox.Show("Wygrał gracz1 ");
            }
            else
            {
                MessageBox.Show("Wygrał gracz2 ");
            }
        }
0

Ten kod owszem działa. Kod masz rację jest trochę mało "elegancki" wydaje mi się że możnaby to inaczej zapisać. Nie sądziłem, że z pozoru banalna sprawa losowania dwóch liczb może być tak skomplikowana!!

0

Poprawiłem i wydaje mi się, że tak jest najbardziej poprawnie i czytelnie. Co o tym sądzicie?

 
public class Losowanie
    {
            
        public  int WylosowanaLiczbaGracz1 { get; set; }
        
        public  int WylosowanaLiczbaGracz2 { get; set; }
        


        public void KtoWygral(int wylosowanaLiczbaGracz1, int wylosowanaLiczbaGracz2)
        {
            WylosowanaLiczbaGracz1 = wylosowanaLiczbaGracz1;
            WylosowanaLiczbaGracz2 = wylosowanaLiczbaGracz2;
            if (wylosowanaLiczbaGracz1 > wylosowanaLiczbaGracz2)
            {
                MessageBox.Show("Wygrał gracz1 ");


            }
            if (wylosowanaLiczbaGracz1 == wylosowanaLiczbaGracz2)
            {
                MessageBox.Show("Jest remis ");
            }
            else
            {
                MessageBox.Show("Wygrał gracz2 ");

            }

        }

    }

I dalej pod buttonem

 
 private void button1_Click(object sender, EventArgs e)
        {           
            Random rnd = new Random();
            int liczgracz1 = rnd.Next(1, 50);
            int liczgracz2 = rnd.Next(1, 50);

           
         
            label5.Text = liczgracz1.ToString();
            label6.Text = liczgracz2.ToString();
            los.KtoWygral(liczgracz1, liczgracz2);
        }

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