• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Program Zgadywanie liczb przy użyciu listy

Object Storage Arubacloud
0 głosów
341 wizyt
pytanie zadane 8 czerwca 2019 w C# przez MakaBresk Obywatel (1,060 p.)
zamknięte 21 czerwca 2019 przez MakaBresk

Dobry wieczór, mam problem z wyświetleniem listy w kontrolce DataGridView. Bardzo proszę, aby ktoś znalazł mi błąd, IDE nie pokazuje żadnego błędu, a lista się nie wyświetla.

 

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 Zadanie_12
{
    // Ikony z www.flaticon.com
    public partial class GuessNumber : Form
    {
        public GuessNumber()
        {
            InitializeComponent();
            dataGridView1.DataSource = StatisticsDataSource; // W konstruktorze okna inicjujemy DataGridView, żeby wiedział jaki typ danych będzie wyświetlał
        }

        private Random Seed { get; set; } // Globalne pole Random
        private int number; // Globalna zmienna Number

        private void Random_Click(object sender, EventArgs e)
        {
            Seed = new Random(DateTime.Now.Millisecond); // Pobranie czasu systemowego i rozpoczęcie generowania liczb pseudolosowych
            number = Seed.Next(1, 20); // Losowanie liczby pseudolosowej z przedziału <1,20>
        }

        public class PseudoRandomNumbers // Utworzenie globalnej klasy PseudoRandomNumbers, która będzie konterem dla naszych danych
        {
            public int Numbers { get; set; } // Wpisywane liczby przez gracza
            public int Hits { get; set; } // Liczba trafień pseudo-losowych liczb
        }

        public List<PseudoRandomNumbers> Statistics { get; set; } = new List<PseudoRandomNumbers>(); // Utworzenie globalnej listy przechowującej statystyki gracza
        public List<PseudoRandomNumbers> StatisticsDataSource { get; set; } = new List<PseudoRandomNumbers>(); // Utworzenie listy, która będzie źródłem dla kontroli dataGridView

        private void Display_History_Click(object sender, EventArgs e)
        {

        }

        private int answer; // Globalna zmienna answer

        private void Check_Number_Click(object sender, EventArgs e)
        {
            int hits = 0;
            string answer_str = textBox1.Text;

            try
            {
                answer = int.Parse(textBox1.Text); // Konwersja string na int
            }
            catch (FormatException)
            {
                richTextBox1.Text = "Wpisałeś niepoprawną liczbę! Popraw ją!";
            }

            if (answer == number) // Sprawdzenie czy użytkownik zgadł
                richTextBox1.Text = "Brawo zgadłeś!" + " Gramy dalej?" + "Jeżeli tak to kliknij Losuj.";
            else if (answer == number || answer != number)
            {
                hits++;

                Statistics = new List<PseudoRandomNumbers>(); // Czyszczenie aktualnego widoku poprzez ponowną inicjację listy

                PseudoRandomNumbers StatisticsAdd = new PseudoRandomNumbers(); // Utworzenie obiektu klasy PseudoRandomNumbers, który będzie dodany do listy
                StatisticsAdd.Hits = hits; // Dodanie liczby trafień do obiektu
                StatisticsAdd.Numbers = answer; // Dodanie podanych liczb przez użytkownika do obiektu

                Statistics.Add(StatisticsAdd); // Dodawanie statystyk do listy

                foreach (PseudoRandomNumbers statistics in Statistics)
                    StatisticsDataSource.Add(statistics);

                // Ponowne przypisanie nowego źródła
                dataGridView1.DataSource = StatisticsDataSource;
            }

            // Podpowiedzi
            if (answer < number)
                richTextBox1.Text = "Zgadywana liczba jest większa!";
            else if (answer > number)
                richTextBox1.Text = "Zgadywana liczba jest mniejsza!";
        }
    }
}

Pytanie dodatkowe czy można ukryć treść z dataGridView i wyświetlić ją w momencie kliknięcia przycisku Wyświetl historię?

komentarz zamknięcia: Problem rozwiązany

1 odpowiedź

+1 głos
odpowiedź 9 czerwca 2019 przez DarthMazut Bywalec (2,990 p.)
wybrane 21 czerwca 2019 przez MakaBresk
 
Najlepsza
Cześć, widzę że znowu się spotykamy :)
Po pierwsze zerknij tu:

https://social.msdn.microsoft.com/Forums/windows/en-US/1d5ea36d-1c44-4d2c-bde7-aa6d0cb5c839/how-to-populate-a-datagridview?forum=winformsdatacontrols

Jeśli chodzi o drugie pytanie to pewnie tak, ale nie mam czasu Ci tego szuakć,
poszukaj sam np na StcakOverflow, na pewno coś znajdziesz a jeśli nie to prawdopodobnie będzie jakiś workaround ;)

Tu masz jeszcze kilka uwag odnośnie kodu:

22: w .NET framework przyjęło się, że nazwy zmiennych piszemy z małej litery, łatwiej jest je wtedy odróżnić od typów.
Po drugie obiektem klasy Random nie jest ziarno, ziarno to to, czego używa generator liczb losowych podczas losowania. Ja lubie nazywać sobie zmienne typu Random np. kostka <-- służy do losowania :)

23: Ciekawi mnie czy jeśli stosujesz modyfikator dostępu 'private' a w komentarzu piszesz, że to zmienna 'globalna' to nie czujesz jakiejś logicznej sprzeczności w tym miejscu?

63: chyba wystarczy samo else :)

67: hmm... czy jeżeli za każdym razem czyścisz te kolekcję 'Statistics', to czy w linii 75 ta kolekcja nie ma przypadkiem zawsze w sobie tylko 1 elementu?

75: ja bym nazwał iterator statistic bez 's' na końcu

79: tę linię można pominąć - DataSource to typ referencyjny, dane będą aktualne.

Jeśli chodzi o sam kod to zakładam, że działa jak powinien? Nie sprawdzałem pod względem logicznym.

P.S. często stosuję się konwencję, że nazwy zmiennych prywatnych poprzedza się podkreślnikiem np. private Random _rnd;

Pozdrawiam.
komentarz 9 czerwca 2019 przez MakaBresk Obywatel (1,060 p.)
edycja 9 czerwca 2019 przez MakaBresk

Dzięki wielkie za wskazówki, kod poprawiłem. Problemem nie wyświetlania danych w dataGridView było tak jak napisałeś czyszczenie listy zawierającej statystyki, a nie Listy będącej źródłem dla dataGridView. Co powiesz na ten kod:

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 Zadanie_12
{
    // Ikony z www.flaticon.com
    public partial class GuessNumber : Form
    {
        public GuessNumber()
        {
            InitializeComponent();
            dataGridView1.DataSource = StatisticsOfUserDataSource; // W konstruktorze okna inicjujemy DataGridView, żeby wiedział jaki typ danych będzie wyświetlał
        }

        private Random Cube_cb { get; set; }
        private int pseudo_random_number;

        private void Random_Click(object sender, EventArgs e)
        {
            Cube_cb = new Random(DateTime.Now.Millisecond); // Pobranie czasu systemowego i rozpoczęcie generowania liczb pseudolosowych
            pseudo_random_number = Cube_cb.Next(1, 20); // Losowanie liczby pseudolosowej z przedziału <1,20>
            number_of_game++; // Rozpoczęcie kolejnej gry przez użytkownika
            hits_of_number = 0; // Wyzerowanie liczby trafień
        }

        public class Statistics // Utworzenie globalnej klasy PseudoRandomNumbers, która będzie konterem dla naszych danych
        {
            public string NumberOfGame { get; set; } // Numer gry, którą rozpoczął użytkownik
            public string Numbers { get; set; } // Wpisywane liczby przez gracza
            public string HitsOfNumber { get; set; } // Liczba trafień pseudo-losowych liczb
        }

        public List<Statistics> StatisticsOfUser { get; set; } = new List<Statistics>(); // Utworzenie globalnej listy przechowującej statystyki gracza
        public List<Statistics> StatisticsOfUserDataSource { get; set; } = new List<Statistics>(); // Utworzenie globalnej listy, która będzie źródłem dla kontrolki DataGridView

        private void Display_History_Click(object sender, EventArgs e)
        {

        }

        private int answer_of_user;
        private int hits_of_number = 0;
        private int number_of_game = 0;

        private void Check_Number_Click(object sender, EventArgs e)
        {
            try
            {
                answer_of_user = int.Parse(textBox1.Text); // Konwersja string na int
            }
            catch (FormatException)
            {
                richTextBox1.Text = "Wpisałeś niepoprawną liczbę! Popraw ją!";
            }

            if (pseudo_random_number == 0)
                richTextBox1.Text = "Liczba nie została jeszcze wylosowana! Kliknij przycisk Losuj";
            else
            {

                if (answer_of_user == pseudo_random_number) // Sprawdzenie czy użytkownik zgadł
                {
                    richTextBox1.Text = "Brawo zgadłeś!" + " Gramy dalej?" + "Jeżeli tak to kliknij Losuj.";
                    hits_of_number++;

                    StatisticsOfUserDataSource = new List<Statistics>(); // Czyszczenie aktualnego widoku poprzez ponowną inicjację listy

                    Statistics StatisticsOfGame = new Statistics // Utworzenie obiektu klasy PseudoRandomNumbers, który będzie dodany do listy
                    {
                        // Przypisanie wartości zmiennych do właściwości obiektu
                        NumberOfGame = number_of_game.ToString(), // Dodanie numeru gry, którą rozpoczął użytkownik
                        HitsOfNumber = hits_of_number.ToString(), // Dodanie liczby trafień
                        Numbers = answer_of_user.ToString() // Dodanie podanych liczb przez użytkownika 
                    };

                    StatisticsOfUser.Add(StatisticsOfGame); // Dodawanie statystyk do listy

                    foreach (Statistics statistics in StatisticsOfUser)
                        StatisticsOfUserDataSource.Add(statistics);

                    dataGridView1.DataSource = StatisticsOfUserDataSource; // Ponowne przypisanie nowego źródła
                }
                else
                {
                    hits_of_number++;

                    StatisticsOfUserDataSource = new List<Statistics>(); // Czyszczenie aktualnego widoku poprzez ponowną inicjację listy

                    Statistics StatisticsOfGame= new Statistics // Utworzenie obiektu klasy PseudoRandomNumbers, który będzie dodany do listy
                    {
                        // Przypisanie wartości zmiennych do właściwości obiektu
                        NumberOfGame = number_of_game.ToString(), // Dodanie numeru gry, którą rozpoczął użytkownik
                        HitsOfNumber = "-", // Użytkownik jeszcze nie trafił
                        Numbers = answer_of_user.ToString() // Dodanie podanych liczb przez użytkownika 
                    };

                    StatisticsOfUser.Add(StatisticsOfGame); // Dodawanie statystyk do listy

                    foreach (Statistics statistics in StatisticsOfUser)
                        StatisticsOfUserDataSource.Add(statistics);

                    dataGridView1.DataSource = StatisticsOfUserDataSource; // Ponowne przypisanie nowego źródła
                }

                // Podpowiedzi
                if (answer_of_user < pseudo_random_number)
                    richTextBox1.Text = "Zgadywana liczba jest większa!";
                else if (answer_of_user > pseudo_random_number)
                    richTextBox1.Text = "Zgadywana liczba jest mniejsza!";
            }
        }
    }
}

Zauważyłem jeszcze kilka problemów, które może później rozwiążę np. Gdy wylosuję liczbę Number = Cube.Next(1, 20) nie wiem dlaczego Number = 0? Czy ta liczba nie powinna być z przedziału podanego w nawiasach <1, 20> ??

To powoduje kolejny problem tzn. nie łapie wyjątku dla pustego pola oraz wpisania tekstu w pole textBox1, ponieważ answer_of_user = 0 i pseudo_random_number = 0 zwraca mi komunikat Brawo trafiłeś.

Dlaczego int.Parse(text) zwraca mi wartość 0 dla pustego pola oraz dla wartości tekstowej?

try
            {
                answer_of_user = int.Parse(textBox1.Text); // Konwersja string na int
            }
            catch (FormatException)
            {
                richTextBox1.Text = "Wpisałeś niepoprawną liczbę! Popraw ją!";
            }

 

Podobne pytania

0 głosów
1 odpowiedź 684 wizyt
pytanie zadane 24 maja 2020 w C# przez Jakubok Nowicjusz (200 p.)
0 głosów
1 odpowiedź 950 wizyt
pytanie zadane 11 stycznia 2020 w C# przez assassin Gaduła (3,260 p.)
0 głosów
1 odpowiedź 415 wizyt
pytanie zadane 24 kwietnia 2019 w C# przez Vorczu Początkujący (390 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...