IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – Lonesure

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:5.8.2012 0:15

Hned zprvu by mě zajímal původ zkratky :)

Program se mi líbí, nicméně ta čísla jsou dost okoukaná. Vím, že si tam mohu dát co chci, ale proč třeba z iconarchive.com nestáhneš pár ikon? stejná velikost, dobrá licence, hezká grafika. Třeba zvířata: http://www.iconarchive.com/search?… (ty s tím žaludovitým tvarem jsou zadarmo a je jich hodně :D )

Určitě bych v programu naznačil, jak zapnout PC mód.

U počítače není vidět otočení druhé karty.

Zajímal by mě algoritmus počítače.

Odpovedať
5.8.2012 0:15
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovedá na David Hartinger
matesax:5.8.2012 6:26

Na PC módu se ustavičně pracuje pracuje - to co tam je teď, je jen dočasná záplata - a již teď mám mnohem lepší algoritmus - má však nepochopitelné problémy - tak snad dnes bude hotov... Mám to takto:

Každou první kartu ukládám do listu (její hodnotu + její picturebox) - a tak není možné za žádných okolností otočit stejnou první kartu. Ke každé první kartě se provede kontrola, zda její hodnota (ne její picturebox) není obsažena v tomto listu. Pokud ano, tak příští otočená karta není náhodná, ale právě ta, co je v onom listu. Jinak náhodný picture box dělám tak, že pomocí rekurze vypíchnu do dočasného listu ty pictureboxy, které splňují určité podmínky - musí být viditelné a pokud se jedná o první kartu, tak musí splňovat podmínky hoře (nesmí být již někdy otočena), anebo, pokud se jedná o druhou kartu, tak nesmí být její dvojice (první a druhá karta) obsažena ve stringu, kam ukládám již provedené kombinace - nikdy nesmí být provedena stejná kombinace. Rovnou dole přiložím kód, ve kterém by jsi mi mohl pomoci - vysvětlit mi, proč podlední 2 - nyní dokonce 4 karty mají problémy a sem tak se nenajde nic vyhovující podmínce provybrání karty - pochopíš z kódu...

Druhá karta není vidět nikdy - to jsem tu již řešil - prvně se provede kontrola ve větvení if else a až pak se provede otočení karty - takže když pc vyhodnotí kartu jako tu, která by se měla smazat, tak ji smaže dříve, než se otočí. A nakonec jsem se s tím smířil - alespoň to je originálnější a hra není tak rychlá... Celkově ta hra je jen narychlo uplácána - dělám ji do jednoho komunitného centra - takže s grafikou jsem chtěl počkat, až podle toho, co mi dají za materiáli - ovšem co se karet týče, rozhodně plánuji něco lepšího...

Kód:

private int Ran()
       {
           this.pol.Clear();
           this.Pol();

           int ou = this.pol[this.r.Next(this.pol.Count - 1)];

           if (this.s[0] != -5)
               this.k += "|" + this.s[0] + ";" + ou + "|";
           else
               this.za.Add(ou);

           return ou;
       }

       private void Pol(int hf = 15)
       {
           if ((this.p[hf].Visible && ((this.s[0] == -5 && !this.za.Contains(hf)) || (this.s[0] != -5 && !k.Contains("|" + this.s[0] + ";" + hf + "|")))))
               this.pol.Add(hf);

           if (hf > 0)
               this.Pol(hf - 1);
       }

       private void Pics(int pic, bool pc = false)
       {
           this.p[pic].Image = this.l[this.i[pic]];

           if (this.s[0] == -5)
           {
               if (this.de.Contains(this.i[pic]))
                   this.next = this.de[this.de.IndexOf(this.i[pic]) + 1];
               else
               {
                   this.de.Add(this.i[pic]);
                   this.de.Add(pic);
               }

               this.s[0] = pic;
               this.s[1] = this.i[pic];

               if (!pc && !this.za.Contains(pic))
                   this.za.Add(pic);
           }
           else
           {
               if (!k.Contains("|" + this.s[0] + ";" + pic + "|"))
                   this.k += "|" + this.s[0] + ";" + pic + "|";

               if (this.s[0] != pic && this.s[1] == this.i[pic])
               {
                   this.Zr(pic);
                   this.Zr(this.s[0]);

                   if (!pc)
                       MessageBox.Show("Good job!");

                   int h1 = int.Parse(this.label1.Text.Substring(name1.Length + 2)), h2 = int.Parse(this.label2.Text.Substring(name2.Length + 2));

                   if (this.b)
                   {
                       h1 = h1 + 1;
                       this.label1.Text = this.name1 + ": " + h1.ToString();
                   }
                   else
                   {
                       h2 = h2 + 1;
                       this.label2.Text = this.name2 + ": " + h2.ToString();
                   }

                   if ((h1 + h2) == this.poc * 8)
                   {
                       this.timer1.Enabled = false;

                       string vit;

                       if (h1 > h2)
                           vit = this.name1 + ".";
                       else if (h1 < h2)
                           vit = this.name2 + ".";
                       else
                           vit = "Nikdo - remíza.";

                       if (MessageBox.Show("Konec hry! Zvítězil: " + vit + Environment.NewLine + "Chcete pokračovat ve hře? Pokud ne, bude program ukončen...", "Předzavírací dialog", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
                       {
                           this.za.Clear();
                           this.de.Clear();
                           this.k = "";
                           this.poc++;
                           this.Zr();
                           this.p[0].Visible = this.p[1].Visible = this.p[2].Visible = this.p[3].Visible = this.p[4].Visible = this.p[5].Visible = this.p[6].Visible = this.p[7].Visible = this.p[8].Visible = this.p[9].Visible = this.p[10].Visible = this.p[11].Visible = this.p[12].Visible = this.p[13].Visible = this.p[14].Visible = this.p[15].Visible = true;
                           this.ShuffleList(this.i.Count);
                           this.timer1.Enabled = true;
                       }
                       else
                           this.Close();
                   }
               }
               else
               {
                   this.Zr();

                   if (this.s[1] != this.i[pic])
                   {
                       this.b = !this.b;

                       if (this.b == true)
                       {
                           this.label1.ForeColor = Color.RoyalBlue;
                           this.label2.ForeColor = Color.Black;
                       }
                       else
                       {
                           this.label2.ForeColor = Color.RoyalBlue;
                           this.label1.ForeColor = Color.Black;
                       }
                   }
               }

               this.s[0] = -5;
           }
       }

       private void Zr(int co = -5)
       {
           if (co == -5)
               this.p[0].Image = this.p[1].Image = this.p[2].Image = this.p[3].Image = this.p[4].Image = this.p[5].Image = this.p[6].Image = this.p[7].Image = this.p[8].Image = this.p[9].Image = this.p[10].Image = this.p[11].Image = this.p[12].Image = this.p[13].Image = this.p[14].Image = this.p[15].Image = this.def;
           else
               this.p[co].Visible = false;
       }

PC si parametr pic generuje sám podle kódu hoře Ran(), Pol() - jinak hráč volá pouze metodu Pics - s předefinovaným pic podle pictureboxu (pic jest zkratka pictureboxu :) )...

 
Odpovedať
5.8.2012 6:26
Avatar
matesax
Tvůrce
Avatar
Odpovedá na matesax
matesax:5.8.2012 6:30

Pardon za pravopis - psal jsem to zde, takže v tom malém okénku (vím, že se dá zvětšit :) ) se mi to blbě psalo... :)

Toto dělá PC v timeru:

if ((((this.name1 == "PC" || this.name1 == "pc" || this.name1 == "Pc") && this.b == true) || ((this.name2 == "PC" || this.name2 == "pc" || this.name2 == "Pc") && this.b == false)))
   if (this.next == -5)
       this.Pics(this.Ran(), true);
   else
   {
       this.Pics(this.next, true);
       this.next = -5;
   }
 
Odpovedať
5.8.2012 6:30
Avatar
matesax
Tvůrce
Avatar
Odpovedá na David Hartinger
matesax:5.8.2012 6:37

Část problému jsem již vyřešil - přidal jsem podmínku, že picture box druhé karty nesmí být obsažen v prvním popisovvaném listu - a problém mi dělá již jen poslední dvojice - ani jedna karta z poslední dvojice nerpojde přes podmínky v Pol()...

 
Odpovedať
5.8.2012 6:37
Avatar
matesax
Tvůrce
Avatar
Odpovedá na David Hartinger
matesax:5.8.2012 6:42

Jo a název vznikl z:

Long Resource - dlouhý zdroják (to je totiž pravda)... :)

 
Odpovedať
5.8.2012 6:42
Avatar
matesax
Tvůrce
Avatar
Avatar
matesax
Tvůrce
Avatar
Odpovedá na David Hartinger
matesax:5.8.2012 6:53

Nuže z nového pozorování vyplynulo, že sem tam otočí již otočenou kartu - přičemž to samozřejmě nemá jít - tím to celé naruší a proto to pak selže. Zatím nefunguje kompabilita PC - člověk - jen PC - PC a člověk - člověk - ale to už pak bude sranda - teď se spíše snažím odstranit ten bug, kdy PC poruší podmínku...

 
Odpovedať
5.8.2012 6:53
Avatar
Kit
Tvůrce
Avatar
Odpovedá na matesax
Kit:5.8.2012 7:12

Rejp: Možná by to nebylo tak dlouhé, kdybys to napsal objektově.

Odpovedať
5.8.2012 7:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovedá na Kit
matesax:5.8.2012 7:18

Dost blbě by se takto dělalo ovládání pictureboxů - když je to takto malý program, tak mi to přijde zbytečné - navíc abych mohl zprovoznit to ovládání pictureboxů, tak by byl kód mnohem delší...

 
Odpovedať
5.8.2012 7:18
Avatar
Kit
Tvůrce
Avatar
Odpovedá na matesax
Kit:5.8.2012 7:39

Zatím těch karet máš jen 16. Zajímavější (nebo spíš nudnější) to bude, až jich bude 64.

Takhle se nedá programovat. Jednopísmenné názvy proměnných se používají jen u řídících proměnných krátkých cyklů. Špagetový kód je ukázkou nezvládnuté dekompozice problému. Proč se metoda pro otočení karty jmenuje Pics?

Nemáš vůbec oddělenou herní a prezentační logiku. V takových programech se chyby hledají velmi těžko.

Odpovedať
5.8.2012 7:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!