IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
David Bubenik:18.3.2015 19:14

Dobrý den,
ve škole jsme dostali úkol naprogramovat hru v C# a já si jak jinak vybral obrovské sousto, protože se mi nechtěji dělat pitominky jako dáma, nebo pong.
Rozhodl jsem se, že udělám Poker. Narazil jsem ale na obludný problém v kódu, který je nevysvětlitelný i mým profesorem na IT.

Pokusím se popsat, jak to funguje:

  1. Vygenerují se 2 karty pro každého hráče.
  2. Vygeneruje se 5 karet na stůl
  3. Karty ve vykreslí do formu

----Nyní kámen úrazu---

  1. Karty jednoho hráče plus karty na stole se seberou a zjišťuje se "Pár" (metoda SolveCards())

----V této metodě se něco stane s kartama na stole. Karty se seřazují metodou SerializeCards(). A pak se zjištuje dvojice. Není možné aby se narušil vstupní List, ze kterého se karty seřazovali !!!ALE STANE SE!!
Proto poslední krok vyjde špatně:

  1. Vypsat 5 karet na stole do labelů. !!!!V tomto bodě už není List tak jako když se karty vykreslovali před zavoláním SolveCards(). Jsou seřazené i když se z Listu karet na stole pouze brali data ale nijak se neupravovali. Seřazené karty by totiž neměli opustit metodu IsPair().

Doufám, že mně alespon někdo pochopí, kde je problém a poradí mi, protože už se tomu věnuji 10 hodin a stále jsem nenašel způsob jak to opravit.

PŘIKLÁDÁM CELOU TŘÍDU V PASTEBINU!!

http://pastebin.com/JTtGPNLV

Odpovědět
18.3.2015 19:14
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Bubenik
Jan Vargovský:18.3.2015 19:49

Můžeš spíše někde upnout celý solution? Tohle je fajn, ale koukat na to ve VS je efektivnější než takhle na pastebinu :)

 
Nahoru Odpovědět
18.3.2015 19:49
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Bubenik
Jan Vargovský:18.3.2015 19:59

Tipuju problém tady:

public List<T> Randomize<T>(List<T> list)
        {
            List<T> randomizedList = new List<T>();
            Random rnd = new Random();
            while (list.Count > 0)
            {
                int index = rnd.Next(0, list.Count); //pick a random item from the master list
                randomizedList.Add(list[index]); //place it at the end of the randomized list
                list.RemoveAt(index);
            }
            return randomizedList;
        }
 
Nahoru Odpovědět
18.3.2015 19:59
Avatar
Odpovídá na Jan Vargovský
David Bubenik:18.3.2015 20:42

Tam problém není :) Problém je určitě v SolveCards().

Tady je solution: https://www.dropbox.com/…km/Poker.rar?dl=0

Nahoru Odpovědět
18.3.2015 20:42
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
hanpari
Člen
Avatar
Odpovídá na David Bubenik
hanpari:18.3.2015 20:47

Podle mne je problém tohle:

public List<int[]> SerializeCards(List<int[]> input)
 {
     for (int j = 0; j < input.Count(); j++)
     {
         for (int i = 0; i < input.Count() - 1; i++)
         {
             if (input[i][0] > input[i + 1][0])
             {
                 var pom = input[i][0];
                 var pom2 = input[i][1];
                 input[i][0] = input[i + 1][0];
                 input[i][1] = input[i + 1][1];
                 input[i + 1][0] = pom;
                 input[i + 1][1] = pom2;
             }
         }
     }
     return input;

Tipl bych si, že celou dobu pracuješ s listem, který jsi předal referencí, takže ve skutečnosti si vrtáš do stejných dat. Zkus jednoduše překopírovat input do nového listu, a s tou novou kopií potom pracuj.

V metodě Randomize jsi to pořešil pěkně. Vracíš jiný List než byl předchozí. Tak to ale u té první metody není. Tam měníš v místě List, na který si jen předáváš odkaz.

public List<T> Randomize<T>(List<T> list)
{
    List<T> randomizedList = new List<T>();
    Random rnd = new Random();
    while (list.Count > 0)
    {
        int index = rnd.Next(0, list.Count); //pick a random item from the master list
        randomizedList.Add(list[index]); //place it at the end of the randomized list
        list.RemoveAt(index);
    }
    return randomizedList;
}

Viz například tento jednoduchý příklad:

class Program
{
        public static void Main(string[] args)
        {

                var test = new List<int>();
                test.Add(10);
                var test2 = PridejHodnotu(test);

                Console.WriteLine(test.Count());
                Console.WriteLine(test2.Count());
                Console.ReadLine();



        }


        static List<int> PridejHodnotu(List<int> seznam)
        {
                seznam.Add(10);
                return seznam;
        }

Tipl bych si, že problém bude někde v tomhle.

Editováno 18.3.2015 20:47
 
Nahoru Odpovědět
18.3.2015 20:47
Avatar
David Bubenik:18.3.2015 20:52

To jsem si taky myslel, akorát zkus to opravit sám ;) Nefunguje to :) Už jsem to zkoušel

Nahoru Odpovědět
18.3.2015 20:52
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Bubenik
Jan Vargovský:18.3.2015 21:01

Dobrá, jakým způsobem vyvolám ten tvůj bug? Jediné co tam můžu dělat je kliknout na button1 a nevím na co koukat :)

 
Nahoru Odpovědět
18.3.2015 21:01
Avatar
David Bubenik:18.3.2015 21:05

Po kliknutí se vygenerují karty. Zobrazí se obrázky. Pak se provede solve.
Potom se do textových polí udělá to samé co se udělalo předtím (Pět karet) akorát textově.
Měli by to být naprosto stejné hodnoty! Zkus smazat řádek kde se volá SolveCards. Pak to to ukazuje to co má.

Nahoru Odpovědět
18.3.2015 21:05
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
hanpari
Člen
Avatar
Odpovídá na David Bubenik
hanpari:18.3.2015 21:06

Ted sice nevím, na koho jsi reagoval, ale souhlasím s Pakem, že ta aplikace něco provede, ale pak už to začíná být chaotické. Jediné, co jsem dokázal, bylo mačkat jediný button a dívat se, jak se karty mění.

 
Nahoru Odpovědět
18.3.2015 21:06
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:18.3.2015 21:10

Já už to chápu, jen to píšeš všechno složitě a hlavně je to jedna velká špageta :D

 
Nahoru Odpovědět
18.3.2015 21:10
Avatar
David Bubenik:18.3.2015 21:10

Ano. Karty se mění. Ale textové pole které jsou na kartách jsou jiné! Mají být naprosto stejné, ale jsou seřazené od nejmenší po největší!

Nahoru Odpovědět
18.3.2015 21:10
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Bubenik
Jan Vargovský:18.3.2015 21:22
public List<int[]> SerializeCards(List<int[]> input)
{
    List<int[]> output = new List<int[]>(input);

    for (int j = 0; j < output.Count(); j++)
    {
        for (int i = 0; i < output.Count() - 1; i++)
        {
            if (output[i][0] > output[i + 1][0])
            {
                var pom = output[i];
                output[i] = output[i + 1];
                output[i + 1] = pom;
            }
        }
    }
    return output;
}

Musíš si prohazovat prvky a né hodnoty na referenčním typu. Právě proto, že je pole referenční typ, tak ty potom prohozením hodnot změníš úplně všude nějakou kartu X (která je typu int[2]) a kartu Y(která je typu int[2]).

Je to úplně stejný případ, jako kdybys měl tohle:

int[] card1 = new int[] {1,2};
int[] card2 = card1;
card1[0] = 3;

Výsledek by jsi asi očekával jako {3,2} a {1,2}, ale protože to jsou reference, tak máš karty {3,2} a {3,2}.

Mimochodem, když jsi mluvil o tom, že karty zmizí, tak jsem koukal na místa v prgoramu, kde něco mažeš a mezi námi, ta randomize metoda není úplně korektní.

Editováno 18.3.2015 21:25
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.3.2015 21:22
Avatar
Odpovídá na Jan Vargovský
David Bubenik:18.3.2015 21:27

Aha!! Tak to mi nikdo nikdy neřekl že to takhle funguje! :D
Mockrát děkuji pánové :D Bez vás bych u počítače strávil celej život :D

Nahoru Odpovědět
18.3.2015 21:27
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na David Bubenik
Jan Vargovský:18.3.2015 21:38

Jinak kdybys to chtěl vylepšit (z programátorského hlediska), tak si vytvoř minimálně něco takového:

struct Card{
public int Value;
public CardType Type;

public Card(int v, CardType t)
{
Value = v;
Type = t;
}
}
enum CardType{
Srdce,
Piky,
Trefy,
Kary
}

Tam by to chtělo anglické názvy, ale nechce se mi to překládat :D

Editováno 18.3.2015 21:39
 
Nahoru Odpovědět
18.3.2015 21:38
Avatar
Odpovídá na Jan Vargovský
David Bubenik:18.3.2015 21:50

Jojo to jsem už někde viděl :) Díky.

Nahoru Odpovědět
18.3.2015 21:50
Hardware je to, do čeho můžež kopnout, když nefunguje software.
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 15 zpráv z 15.