Avatar
dave.bubenik
Člen
Avatar
dave.bubenik:

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
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na dave.bubenik
Jan Vargovský:

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ý
Redaktor
Avatar
Odpovídá na dave.bubenik
Jan Vargovský:

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
dave.bubenik
Člen
Avatar
Odpovídá na Jan Vargovský
dave.bubenik:

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
Avatar
hanpari
Redaktor
Avatar
Odpovídá na dave.bubenik
hanpari:

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
dave.bubenik
Člen
Avatar
dave.bubenik:

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
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na dave.bubenik
Jan Vargovský:

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
dave.bubenik
Člen
Avatar
dave.bubenik:

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
Avatar
hanpari
Redaktor
Avatar
Odpovídá na dave.bubenik
hanpari:

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ý
Redaktor
Avatar
Jan Vargovský:

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
dave.bubenik
Člen
Avatar
dave.bubenik:

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
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na dave.bubenik
Jan Vargovský:
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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 18.3.2015 21:22
Avatar
dave.bubenik
Člen
Avatar
Odpovídá na Jan Vargovský
dave.bubenik:

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  +1 18.3.2015 21:27
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na dave.bubenik
Jan Vargovský:

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
dave.bubenik
Člen
Avatar
Odpovídá na Jan Vargovský
dave.bubenik:

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

 
Nahoru Odpovědět 18.3.2015 21:50
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.