Diskuze: Výpočet tahů koně po šachovnici

C# .NET .NET (C# a Visual Basic) Výpočet tahů koně po šachovnici American English version English version

Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:

Zdravim,
prolejzam si různý cvičení na netu a zasek sem se u jednoho, kde máte za úkol vytvořit šachovnici, kde uživatel zadá souřadnice koně, počet tahů a program mu následně vypočte která místa může kůň ohrozit, popřípadně kolik tahů je potřeba aby z tohoto pole navštívil každé políčko šachovnice ( je-li to vůbec možné).
Problém je v tom, že už nad tím bádam tejden a nenapadlo mě jeniný rozumný řešení, jak vypočítat možný tahy. Pár nápadů bylo, ale to byla hromada proměných a výpočtů.
Takže vás prosím o nějakou nápoveďu nebo jak na to.
Předem dík

Odpovědět 18.3.2014 15:52
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Petr Domes (petrds):

Ahoj,jde to jednoduše :) šachovnice má nějaké souřadnice(x,y). K souřadnicím vybraného koně přičteš hodnotu o jakou se může posunout. Kůň se posouvá o 3 pole do jedné osy a o 1 do druhé, pohyb ve tvaru L jestli se nemýlím. Tohle jsou možné pohyby:

x+3, y+1 ; x+3, y-1
x-3, y+1 ; x-3, y-1
x+1, y+3 ; x-1, y+3
x+1, y-3 ; x-1, y-3

Pak je třeba kontrolovat jestli ta souřadice je ještě na šachovnici nebo tam není jiná figurka a pod...

 
Nahoru Odpovědět 18.3.2014 16:12
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Petr Domes (petrds)
Adam Ježek:

kůň se posouvá jenom o dvě, ne o tři(šachy sem už pár let nehrál, ale mam za to že o dva).
pokud sem tě dobře pochopil, tak jak to popisuješ ty mě napadlo, ale když koně umístíš do prostředka, tak hned po prvním tahu už máš 8 možnejch míst, kam může. z těch se dostane zase na další a jenom v druhym tahu aspoň na dvaceti. a kdyby to tahle mělo jít dokud nepokrejeme celou šachovnici, tak by to bylo na opravdu hodně řádků.
v jednom z mejch pokusů to vypadá takhle:

if (x + 2 >= 1 && x + 2 <= 8 && y + 1 >= 1 && y + 1 <= 8) // ověří zda je v rozsahu šachovnice, mam dojem že tam mam i zbytečný podmínky
           {
               x2 = x + 2; // x,y je počáteční místo koně
               y2 = y + 1; // x2, y2 jsou souřadky k překreslení
               using (Graphics g = pictureBox1.CreateGraphics())
               vykreslovani.vykreslidanepolicko(typ, x2, y2, g); // typ jenom určuje, co se na poliděje a jaká barva se má zvolit
           }

to je jenom k jednomu v možnejch polí, potom by to bylo k dalším možnejm 7, od těch 8 by se zase zkontrolovalo těch dalších 8 a tak dál.
takže pokud tim nemyslíš vytvořit nějakou metodu, která by tohle všechno dělala za mě, tak ta mě eště nenapadla

Editováno 18.3.2014 16:39
Nahoru Odpovědět 18.3.2014 16:39
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Petr Domes (petrds):

Jo posouvá se o 2 pole. Na tohle by se hodila rekurze. Tvůj kod je špatně.

public void MoveFrom(int x, int y)
       {
           if (x < 0 || x > 8 || y > 8 || y < 0) return; // prostor na sachovnici
           //zde si musis ukladat a kontrolovat pozice, na kterych uz jsi byl. Bez teto podminky se tato rekurze nikdy neukončí
           MoveFrom(x + 2, y + 1);
           MoveFrom(x + 2, y - 1);
           MoveFrom(x - 2, y + 1);
           MoveFrom(x - 2, y - 1);
           MoveFrom(x + 1, y + 2);
           MoveFrom(x - 1, y + 2);
           MoveFrom(x + 1, y - 2);
           MoveFrom(x - 1, y - 2);
       }

Tohle by ti melo doufám stačit k pochopení. Co se týká ukládání pozic, něco si vymysli jak, možností je hodně :) (kolekce, pole, 2D pole,...)

Editováno 18.3.2014 17:23
 
Nahoru Odpovědět  +1 18.3.2014 17:19
Avatar
Lako
Člen
Avatar
Odpovídá na Petr Domes (petrds)
Lako:

Nejsem si jistý, jestli ti to pomůže, ale tohle je zajímavé video:
http://www.wimp.com/…mathematics/

 
Nahoru Odpovědět 18.3.2014 19:41
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Petr Domes (petrds)
Adam Ježek:

upřímě řečeno, nemam nejmenší páru, co movefrom je.
na devbooku sem nic nenašel a google mi vyhazuje přesuny souborů. takže jestli bych moh poprosit odkaz na stránku kde si se to naučil?

Nahoru Odpovědět 18.3.2014 20:06
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Odpovídá na Adam Ježek
Petr Domes (petrds):

Řešení je momentálně nad Tvé schopnosti, když ani nechápeš definici metody(funkce). Vygoogli si to. Pak se mrkni jak funguje rekurze, např tady
http://www.itnetwork.cz/…java-rekurze sice v Jave ale v Csharpu to je stejne vice mene

 
Nahoru Odpovědět 18.3.2014 20:27
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Petr Domes (petrds)
Adam Ježek:

ted mi to taky doslo :D ja sem zvyklej si to pojmenovavat cesky a jakmile je to v angline, tak v tom hledam hned nejakou funkci :D

Nahoru Odpovědět 19.3.2014 16:43
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
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 9 zpráv z 9.