NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Lonesure

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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.

Odpovědět
5.8.2012 0:15
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá 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 :) )...

 
Odpovědět
5.8.2012 6:26
Avatar
matesax
Tvůrce
Avatar
Odpovídá 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;
   }
 
Odpovědět
5.8.2012 6:30
Avatar
matesax
Tvůrce
Avatar
Odpovídá 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()...

 
Odpovědět
5.8.2012 6:37
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:5.8.2012 6:42

Jo a název vznikl z:

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

 
Odpovědět
5.8.2012 6:42
Avatar
matesax
Tvůrce
Avatar
Odpovídá 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...

 
Odpovědět
5.8.2012 6:53
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:5.8.2012 7:12

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

Odpovědět
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
Odpovídá 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ší...

 
Odpovědět
5.8.2012 7:18
Avatar
Kit
Tvůrce
Avatar
Odpovídá 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.

Odpovědět
5.8.2012 7:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 10 zpráv z 19.