Diskuze: Velký nevyřešitelný problém s programováním Pokeru
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
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;
}
Tam problém není Problém
je určitě v SolveCards().
Tady je solution: https://www.dropbox.com/…km/Poker.rar?dl=0
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.
To jsem si taky myslel, akorát zkus to opravit sám Nefunguje to
Už jsem to zkoušel
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
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á.
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í.
Já už to chápu, jen to píšeš všechno složitě a hlavně je to jedna
velká špageta
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ší!
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í.
Aha!! Tak to mi nikdo nikdy neřekl že to takhle funguje!
Mockrát děkuji pánové
Bez vás bych u počítače strávil celej život
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
Zobrazeno 15 zpráv z 15.