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

C# - Visual Studio - Problem z porównywaniem obrazów

Object Storage Arubacloud
0 głosów
148 wizyt
pytanie zadane 18 września 2019 w C# przez Kochi Nowicjusz (120 p.)

Przychodzę do was z problemem aplikacji typu Memory. Mam tablice obrazów: obrazy[] oraz fragment kodu: 

if (obrazy[numer_pierwszego] == obrazy[numer_drugiego]) { ... }

jednak po odpaleniu aplikacji i odkryciu dwóch takich samych "kart" nadal mi wyskakuje komunikat "Niestety, spróbuj ponownie". Próbowałem także opcji:

obrazy[numer_pierwszego].Equals(obrazy[numer_drugiego]));

jednak taka zmiana nic nie zmieniła :/

Wiecie co może być problemem? Z góry dziękuję za pomoc wink

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;
using System.Threading;

namespace Memory
{
    public partial class Form1 : Form
    {
        bool[] czy_przyciski_maja_obraz = new bool[17];
        Image[] obrazy = new Image[17];
        bool[] zakryte = new bool[17];
        bool czy_pierwszy_klik = true;
        int numer_pierwszego = 0, numer_drugiego = 0;
        int ruchy = 0;

        public Form1()
        {
            InitializeComponent();

            losuj_przycisk(Memory.Properties.Resources.m1);
            losuj_przycisk(Memory.Properties.Resources.m1);
            losuj_przycisk(Memory.Properties.Resources.m2);
            losuj_przycisk(Memory.Properties.Resources.m2);
            losuj_przycisk(Memory.Properties.Resources.m3);
            losuj_przycisk(Memory.Properties.Resources.m3);
            losuj_przycisk(Memory.Properties.Resources.m4);
            losuj_przycisk(Memory.Properties.Resources.m4);
            losuj_przycisk(Memory.Properties.Resources.m5);
            losuj_przycisk(Memory.Properties.Resources.m5);
            losuj_przycisk(Memory.Properties.Resources.m6);
            losuj_przycisk(Memory.Properties.Resources.m6);
            losuj_przycisk(Memory.Properties.Resources.m7);
            losuj_przycisk(Memory.Properties.Resources.m7);
            losuj_przycisk(Memory.Properties.Resources.m8);
            losuj_przycisk(Memory.Properties.Resources.m8);

            for (int i = 1; i < 17; i++)
            {
                zakryte[i] = true;
            }
        }


        private void Button1_Click(object sender, EventArgs e)
        {
            if (button1.BackgroundImage != obrazy[1])
            {
                button1.BackgroundImage = obrazy[1];

                if (czy_pierwszy_klik == true)
                {
                    numer_pierwszego = 1;
                    czy_pierwszy_klik = false;
                }
                else
                {
                    numer_drugiego = 1;
                    czy_pierwszy_klik = true;
                    sprawdz();
                    zobrazuj_przyciski();
                }
            }
        }

        // ... pozostałe 14 przycisków ...

        private void Button16_Click(object sender, EventArgs e)
        {
            if (button16.BackgroundImage != obrazy[16])
            {
                button16.BackgroundImage = obrazy[16];

                if (czy_pierwszy_klik == true)
                {
                    numer_pierwszego = 16;
                    czy_pierwszy_klik = false;
                }
                else
                {
                    numer_drugiego = 16;
                    czy_pierwszy_klik = true;
                    sprawdz();
                    zobrazuj_przyciski();
                }
            }
        }

        private void losuj_przycisk(Image obraz)
        {
            Random gen = new Random();
            int numer_pola = gen.Next(1, 17);

            while (czy_przyciski_maja_obraz[numer_pola] == true)
            {
                numer_pola = gen.Next(1, 17);
            }

            czy_przyciski_maja_obraz[numer_pola] = true;
            obrazy[numer_pola] = obraz;
        }

        private void zobrazuj_przyciski()
        {
            if (zakryte[1] == false) { button1.BackgroundImage = obrazy[1]; } else { button1.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[2] == false) { button2.BackgroundImage = obrazy[2]; } else { button2.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[3] == false) { button3.BackgroundImage = obrazy[3]; } else { button3.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[4] == false) { button4.BackgroundImage = obrazy[4]; } else { button4.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[5] == false) { button5.BackgroundImage = obrazy[5]; } else { button5.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[6] == false) { button6.BackgroundImage = obrazy[6]; } else { button6.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[7] == false) { button7.BackgroundImage = obrazy[7]; } else { button7.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[8] == false) { button8.BackgroundImage = obrazy[8]; } else { button8.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[9] == false) { button9.BackgroundImage = obrazy[9]; } else { button9.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[10] == false) { button10.BackgroundImage = obrazy[10]; } else { button10.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[11] == false) { button11.BackgroundImage = obrazy[11]; } else { button11.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[12] == false) { button12.BackgroundImage = obrazy[12]; } else { button12.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[13] == false) { button13.BackgroundImage = obrazy[13]; } else { button13.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[14] == false) { button14.BackgroundImage = obrazy[14]; } else { button14.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[15] == false) { button15.BackgroundImage = obrazy[15]; } else { button15.BackgroundImage = Memory.Properties.Resources.back; }
            if (zakryte[16] == false) { button16.BackgroundImage = obrazy[16]; } else { button16.BackgroundImage = Memory.Properties.Resources.back; }
        }

        private void sprawdz()
        {
            ruchy += 1;

            if (obrazy[numer_pierwszego] == obrazy[numer_drugiego])
            {
                MessageBox.Show("Brawo! Para odgadnieta!");
                zakryte[numer_pierwszego] = false;
                zakryte[numer_drugiego] = false;
            }
            else
            {
                MessageBox.Show("Niestety, probuj dalej!");
            }

            int odkryte = 0;

            for (int i = 1; i < 17; i++)
            {
                if (zakryte[i] == false)
                {
                    odkryte++;
                }
            }

            if (odkryte == 16) { MessageBox.Show("Koniec gry! Gratulacje! Twoje ruchy: " + ruchy); }
        }
    }
}

 

2 odpowiedzi

+2 głosów
odpowiedź 18 września 2019 przez jankustosz1 Nałogowiec (35,880 p.)

https://www.google.com/search?q=c%23+compare+images

Tak trudno wpisać w google? Już w pierwszym linku w do stackoverflow masz kilka różnych rozwiązań.

1) Porównywanie na pałę za pomocą GetPixel (jest to bardzo wolne, ale jeżeli porównujesz rzadko to w sumie bez różnicy)

2) Użycie LockBits dzięki czemu porównywanie jest dużo szybsze 

3) Zapisanie w MemoryStream a następnie zamiana na base64 (bardzo mało kodu to zajmuje i ładnie wygląda)

4) Policzenie hashCode'ów i porównywanie tylko wartości hasha (bardzo szybkie)

5) Masa zewnętrznych bibliotek

I co więcej w żadnym z tych rozwiązań nie musisz pisać kodu, a wystarczy przekopiować gotową funkcję. Podstawa programowania to umiejętność research'u, bez tego ciężko Ci będzie cokolwiek zrobić.

komentarz 19 września 2019 przez Kochi Nowicjusz (120 p.)

Dzięki wielkie za pomoc smiley

0 głosów
odpowiedź 21 września 2019 przez JakSky Stary wyjadacz (14,770 p.)
A czy te obrazy będą się zmieniały? Jeżeli kolekcja obrazów jest zawsze taka sama to wystarczy porównać nazwy nadane dla danego obrazu.
komentarz 21 września 2019 przez jankustosz1 Nałogowiec (35,880 p.)
W sumie to w tym przepadku najlepsze wyjście, nie pomyślałem o tym.

Jeżeli w tej tablicy nie ma duplikatów to wystarczy sprawdzić czy pozycja w tablicy jest taka sama.

Podobne pytania

0 głosów
0 odpowiedzi 293 wizyt
+1 głos
2 odpowiedzi 906 wizyt
pytanie zadane 9 kwietnia 2021 w C# przez kubaa322 Użytkownik (710 p.)
0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 10 maja 2021 w C# przez Iskiereczka Użytkownik (880 p.)

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

61,940 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!

...