[Java] Dáma - problém při skoku s dámou

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Zdářa 5. 1. 2007 02:25

Zdravim, mám takový menší problém týkající se dámy v jave. Jak se pohybovat s dámou po šachovnici jsem už přišel, ale problém nastane když potřebuju zjistit jestli v cestě nestojí nějaké figurky. Tak sem si říkal, že by se to asi mělo řešit cyklem for, ale nevím si rady s tím jak procházet diagonálu, když znám počáteční a koncovy x a y.

Kód: Vybrat vše
public int tahBilaDama()
   {
      int x = mX;
      int y = mY;
      
      nactiTah("tahu: ");
      
      //podminka pro pohyb pouze po diagonalach (stejna podminka pro obe damy)
      if((Math.abs(x-mX) == Math.abs(y-mY)) && (getObsahPolicka(mX, mY) == BILE_POLE))
      {
         //pohyb o jedno policko
         if((Math.abs(x-mX) == 1 && Math.abs(y-mY) == 1))
         {
            provedTah(x, y, mX, mY, BILA_DAMA);
            return LEGALNI_POHYB;
         }
         else
         {
            //Tady by mel byt asi ten cyklus for
            return LEGALNI_POHYB;
         }
      }
      else
      {
         System.out.println("CHYBA: Provedli jste neplatny tah!");
         return NELEGALNI_POHYB;
      }
   }

Předem díky za odpovědi.
Zdářa
Junior

Odeslat příspěvekod Zdářa 5. 1. 2007 03:53

Jenom abyste měli představu jak to přibližně vypadá v textovym režimu...
Kód: Vybrat vše
   0  1  2  3  4  5  6  7
0| =  #  =  #  =  #  =  # |0
1| #  =  #  =  #  =  #  = |1
2| =  .  =  .  =  .  =  . |2
3| .  =  .  =  .  =  .  = |3
4| =  .  =  .  =  .  =  . |4
5| .  =  .  =  .  =  .  = |5
6| =  O  =  O  =  O  =  O |6
7| O  =  O  =  O  =  O  = |7

No není to hezké... ;-)
Zdářa
Junior

Odeslat příspěvekod Teeboy 5. 1. 2007 04:21

Nechapu v tom tvym zdrojaku jednu vec, kdyz na zacatku te metody prirazujes x hodnotu mX a y hodnotu mY, tak proc pak porovnavas absolutni hodnotu x-mX a y-mY kdyz to musi byt vzdy 0=0? Ale mozna jsem to spatne pochopil.
Teeboy
Junior
Uživatelský avatar

Odeslat příspěvekod Teeboy 5. 1. 2007 04:45

Ty jo, tak doufam ze jsem to napsal dobre a moc to nepomotal, ja totiz moc dobre neumim psat zdrojaky aniz bych to vyzkousel:
Kód: Vybrat vše
int pomocneX = soucasneX;
int pomocneY = soucasneY;

boolean dolu;
boolean doprava;

if (budouciX - soucasneX > 0) doprava = true; else doprava = false;
if (budouciY - soucasneY > 0) dolu = true; else dolu = false;

int pocetPohybu = Math.abs(budouciX-soucasneX);

for(int i = 0; i < pocetPohybu; i++)
{
   if(doprava) pomocneX++; else pomocneX--;
   if(dolu) pomocneY++; else pomocneY--;
   
   ted zjistis jestli tam je ta nejaka figurka volanim s parametrem (pomocneX, pomocneY)
   pripadne bych "casem" odlisil jaka ta figurka je, pripadně ji sebral, nebo ukončil for,
   pokud bys mel přeskočit svojí.
}[/cod
Teeboy
Junior
Uživatelský avatar

Odeslat příspěvekod Zdářa 5. 1. 2007 13:59

Teeboy píše:Nechapu v tom tvym zdrojaku jednu vec, kdyz na zacatku te metody prirazujes x hodnotu mX a y hodnotu mY, tak proc pak porovnavas absolutni hodnotu x-mX a y-mY kdyz to musi byt vzdy 0=0? Ale mozna jsem to spatne pochopil.


aha to jsem zapomňel napsat, že když voláš tu funkci, tak v mX a v mY jsou souřadnice te figurky(v našem případě dáma) a tak si je uložím do x a y a do mX a mY pomoci nactiTah() nactu souradnice políčka, kde by měla figurka skončit....

díky za kód hned to půjdu zkusit....
Zdářa
Junior

Odeslat příspěvekod Teeboy 5. 1. 2007 16:02

Ok, tak pak napis jak to dopadlo. Jinak tedy v tom mem zdrojaku ma byt nejspis budouciX ... mX, budouciY ... mY, soucasneX ... X a soucasneY ma byt Y podle toho jak jsi psal. A pak az probehne ten cely cykl for uspesne a nebude nikde zadna prekazka tak by snad hodnota pomocneY mela byt stejna jako mY a pomocneX stejne jako mX.
Teeboy
Junior
Uživatelský avatar

Odeslat příspěvekod Zdářa 5. 1. 2007 18:41

No tak takhle to nějak vypadá.. Mělo by to řešit snad všechny možnosti, ktery můžou nastat... Snad by to ještě chtělo doladit vícenásobny skákání, ale to až se mi zase bude chtít :D
Tak díky moc za rady a za ochutu
Kód: Vybrat vše
public int tahBilaDama()
   {
      int x = mX;
      int y = mY;
      
      nactiTah("tahu: ");
      
      //podminka pro pohyb pouze po diagonalach (stejna podminka pro obe damy)
      if((Math.abs(x-mX) == Math.abs(y-mY)) && (getObsahPolicka(mX, mY) == BILE_POLE))
      {
         //pohyb o jedno policko
         if((Math.abs(x-mX) == 1 && Math.abs(y-mY) == 1))
         {
            provedTah(x, y, mX, mY, BILA_DAMA);
            return LEGALNI_POHYB;
         }
         else
         {
            int pomX = x;
            int pomY = y;
            
            boolean nahoru;
            boolean doleva;
            
            //zjistujem smer pohybu damy
            if (mX - x > 0)   doleva = true;   else doleva = false;
            if (mY - y > 0)   nahoru = true;   else nahoru = false;

            int pocetPohybu = Math.abs(mX-x);
            int pocetCernychPanacku = 0;
            int pX=0;
            int pY=0;
            
            //v cyklu prochazime vsechna policka, pres ktera dama tahne
            for(int i=0; i<pocetPohybu; i++)
            {
               if(doleva) pomX++; else pomX--;
               if(nahoru) pomY++; else pomY--;
               
               //pokud po ceste narazi na vlastni figurku, neprovede zadny tah
               if((getObsahPolicka(pomX, pomY) == BILY_PANACEK) ||
                  getObsahPolicka(pomX, pomY) == BILA_DAMA)
               {
                  System.out.println("CHYBA: Provedli jste neplatny tah!");
                  return NELEGALNI_POHYB;
               }
               //pokud po ceste narazi na cizi, inkrementuje pocet cernych panacku a zapamatuje
               //si pozici tohoto panacka
               if((getObsahPolicka(pomX, pomY) == CERNY_PANACEK) ||
                      getObsahPolicka(pomX, pomY) == CERNA_DAMA)
               {
                  pocetCernychPanacku++;
                  pX = pomX;
                  pY = pomY;
               }
            }
            if(pocetCernychPanacku == 0)
            {
               provedTah(x, y, mX, mY, BILA_DAMA);
               return LEGALNI_POHYB;
            }
            else if(pocetCernychPanacku == 1)
            {
               odstranKamen(pX, pY);
               POCET_CERNYCH_PANACKU--;
               provedTah(x, y, mX, mY, BILA_DAMA);
               return LEGALNI_POHYB;
            }
            else
            {
               System.out.println("CHYBA: Provedli jste neplatny tah!");
               return NELEGALNI_POHYB;
            }   
         }
      }
      else
      {
         System.out.println("CHYBA: Provedli jste neplatny tah!");
         return NELEGALNI_POHYB;
      }
   }
Zdářa
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků