Avatar
vtpc
Člen
Avatar
vtpc:

Ahoj.
Potřebovala bych pomoc dořešit jeden úkol. Dostali jsme za úkol vytvořit síť (šachovnici) ve které jsou "překážky" (#) a taky pohybující se hráč (*). To jsem snad společně s učitelem nějak vytvořila. Potřebovala bych nějakou pomoc s tím, že když se hráč dostane na konec řádku, automaticky přeskočí na začátek řádku. Prosila bych tedy o nějakou radu, jak to vytvořit.
Děkuju

#include <stdio.h>
#define MAX 8
#define X 0
#define Y 1


char sachovnice [MAX][MAX];
int pozice [2];
unsigned int cas1,cas2,cas3;

int NahrajZeSouboru(){
     FILE *soubor;
     int radek, sloupec;
     int znak;
     if (soubor=fopen("sachovnice.txt","r")) {


          for (radek=0; radek<MAX; radek++){
          printf ("%d", radek);
         for (sloupec=0; sloupec<MAX; sloupec++){
         znak=getc(soubor);
             sachovnice [radek][sloupec]=znak;
             }
            while (getc(soubor)!='\n' && !feof(soubor));

                }
         return 1;
         }
         else printf ("Soubor se nepodarilo otevrit\n") ;
         return 0;

     }

void inicializace (){
     int radek, sloupec;
     for (radek=0; radek<MAX; radek++)
         for (sloupec=0; sloupec<MAX; sloupec++)
             sachovnice [radek][sloupec]='*';


}

void vypis (){
     int radek, sloupec;
     system ("cls");
     for (sloupec=0; sloupec<MAX; sloupec++)
            printf ("+-", sachovnice [radek][sloupec]);
            printf ("+\n");

      for (radek=0; radek<MAX; radek++){
        for (sloupec=0; sloupec<MAX; sloupec++)
            if (radek==pozice [Y]&& sloupec==pozice [X])
            printf ("|*");
            else
            printf ("|%c", sachovnice [radek][sloupec]);
          printf ("|\n");
         for (sloupec=0; sloupec<MAX; sloupec++)
            printf ("+-", sachovnice [radek][sloupec]);
          printf ("+\n");}

    cas2=(unsigned int) time (NULL);
    printf ("cas %d\n", cas2-cas1);


}

int main (){
   int klavesa='z';

    pozice [X]=0;
    pozice [Y]=0;
    cas1=(unsigned int) time (NULL);
    if (NahrajZeSouboru()==0)
    return 0;
    printf ("Konec");
    vypis ();

    while (klavesa!='q' && !(pozice [X]==MAX-1 && pozice [Y]==MAX-1)){
    while (kbhit()==0);

    klavesa=getch();
    if (klavesa==224) klavesa=getch();

    switch(klavesa){
         case 77: if(sachovnice [pozice[Y]][pozice[X]+1]!='#')
                  pozice [X]=pozice[X]+1;
                  break;
         case 75: if(sachovnice [pozice[Y]][pozice[X]-1]!='#')
                  pozice[X]=pozice[X]-1;
                  break;
         case 72: if (sachovnice [pozice[Y]-1][pozice[X]]!='#')
                  pozice[Y]=pozice[Y]-1;
                  break;
         case 80: if(sachovnice [pozice[Y]+1][pozice[X]]!='#')
                  pozice[Y]=pozice[Y]+1;
                  break;

                    };




    vypis ();
    }

    }
 
Odpovědět 13.5.2014 18:35
Avatar
Ondrca
Redaktor
Avatar
Odpovídá na vtpc
Ondrca:

Chápu to správně, jako že potřebuješ to jako je třeba ve snake, že projedeš zdí uplně vzadu a vynořuješ se vepředu?

Nahoru Odpovědět 13.5.2014 19:10
Zase jsem o něco chytřejší
Avatar
vtpc
Člen
Avatar
Odpovídá na Ondrca
vtpc:

Ano, přesně tak.

 
Nahoru Odpovědět 13.5.2014 19:11
Avatar
Ondrca
Redaktor
Avatar
Odpovídá na vtpc
Ondrca:

Hoď si tam podmínku třeba k šipce doprava pokud je poziceX max tak se nastaví poziceX na 0 a takhle to udělej všude až na to že to poměníš, u šipky nahoru to bude pokud je poziceY == 0 tak se to hodí na poziciY = Max.
Doufám, že jsem to napsal srozumitelně :)

Nahoru Odpovědět 13.5.2014 19:17
Zase jsem o něco chytřejší
Avatar
Alesseon
Člen
Avatar
Alesseon:

Zajímalo by mě, jak dlouho jsi se nad tím zamýšlela? :)
Je to přesně tak jak říká Ondrca, nastav si podmínku že pokud je pozice figurky větší jak Max tak se pozice nastaví na Minimum..

Doporučuji si to trošku lépe formátovat, takhle je to dost nepřehledné, ale v tom IDE ve kterém vyvíjíte to asi takhle (doufám) nevypadá, pokud to tedy neděláte v notepadu, nebo jakémkoliv jiném textovém editoru...

Jen ještě dotaz, je tohle kompletní kód nebo jen část?

A mohl by mi prosím někdo osvětlit význam těhle řádků?

printf ("+-", sachovnice [radek][sloupec]);
Nahoru Odpovědět 13.5.2014 19:46
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
Odpovídá na Alesseon
vtpc:

Udělala jsme to tak jak Ondrca psal. Jenže ono se to nevrátí na první pozici. Prostě po kliknutí jakoby dal za zeď zmizí.
Upřímě já nevím v jakým editoru to děláme a bohužel (i když si sama myslím, že bude existovat něco lepšího než v čem to děláme) s tím nic neudělám.
Ten kód je kompletní + ta "sachovnice" která se na začátku "vyvolává" nebo jak to říct.
A tohleto nám vykresluje jakoby to pole...takže jsou tam vidět ty čtverečky.
Opravdu se snažím, ale jsem prakticky začátečník, ale jsem ráda, když mě to někdo vysvětlí.

 
Nahoru Odpovědět 13.5.2014 19:58
Avatar
vtpc
Člen
Avatar
vtpc:

Tak takhle jsem to za pomoci Ondrca upravila, ale proste to nejde tak, jak by mělo.

switch(klavesa){
         case 77: if(sachovnice [pozice[Y]][pozice[X]+1]!='#')
                  pozice [X]=pozice[X]+1;
                   if (pozice [X]==MAX) pozice[X]=0;
                  break;
         case 75: if(sachovnice [pozice[Y]][pozice[X]-1]!='#')
                  pozice[X]=pozice[X]-1;
                   if (pozice [X]==0) pozice [X]=MAX;
                  break;
         case 72: if (sachovnice [pozice[Y]-1][pozice[X]]!='#')
                  pozice[Y]=pozice[Y]-1;
                  if (pozice [Y]==0) pozice [Y]=MAX;
                  break;
         case 80: if(sachovnice [pozice[Y]+1][pozice[X]]!='#')
                  pozice[Y]=pozice[Y]+1;
                  if (pozice[Y]==MAX) pozice[Y]=0;
                  break;

                    };
 
Nahoru Odpovědět 13.5.2014 20:17
Avatar
Ondrca
Redaktor
Avatar
Odpovídá na vtpc
Ondrca:

Už vím kde je chyba - tu druhou podmínku co kontroluje jestli je uplně na konci musíš dát jako první !

Nahoru Odpovědět 13.5.2014 20:19
Zase jsem o něco chytřejší
Avatar
vtpc
Člen
Avatar
Odpovídá na Ondrca
vtpc:

stále bohužel nefunguje...

 
Nahoru Odpovědět  +1 13.5.2014 20:26
Avatar
Alesseon
Člen
Avatar
Odpovídá na Ondrca
Alesseon:

Není tam chyba, to ti nic nevyřeší, tedy vyřeší ale nevyřeší ti to jiný problém, když budeš tu hodnotu mít větší tak je jedno jestli to máš před, vedle, za, někde, musí tam být větší/menší, tím předejdeš jakýmkoliv problémům...

Zkus si tam dát větší popř. menší porovnávací znaménko.. Ne větší/menší nebo rovno, jen větší/menší...

Ondrca:
Nevíš prosím tě jak se jmenuje hlavička která obsahuje kbhit, getc, atd na linuxu? Já vím že pod windows to bylo conio.h, ale na linuxu teď nevím, vím že to je hlavička z řady posix, ale fakt nevím teď která to je...

Nahoru Odpovědět 13.5.2014 20:31
This is a bad day to be human...
Avatar
coells
Redaktor
Avatar
Odpovídá na vtpc
coells:

Musíš ten kód upravit trochu jinak:

  1. nejprve si vypočítáš novou pozici: t
  2. zkontroluješ, jestli není mimo rozsah a případně skočíš na druhou stranu
  3. pak otestuješ, jestli je pole volné a případně provedeš skok

A nezapomeň, že rozsah pozice je 0 .. MAX-1

Takhle by měl vypadat kód pro X

int t;
switch(klavesa) {
          case 77:
                   t = pozice[X]+1;
                   if (t >= MAX)
                     t = 0;
                   if(sachovnice [pozice[Y]][t]!='#')
                     pozice [X]=t;
                   break;
          case 75:
                   t = pozice[X]-1;
                   if (t < 0)
                     t = MAX-1;
                   if(sachovnice [pozice[Y]][t]!='#')
                     pozice[X]=t;
                   break;
                     };
 
Nahoru Odpovědět 13.5.2014 20:32
Avatar
Ondrca
Redaktor
Avatar
Odpovídá na Alesseon
Ondrca:

Opravdu nevím, já v c nedělám :)

Nahoru Odpovědět 13.5.2014 20:34
Zase jsem o něco chytřejší
Avatar
coells
Redaktor
Avatar
Odpovídá na vtpc
coells:

Ondrcu radši neposlouchej, mele nesmysly. Kdyby se alespoň trochu zamyslel, neradil by ti špatně.

 
Nahoru Odpovědět  -1 13.5.2014 20:34
Avatar
Alesseon
Člen
Avatar
Odpovídá na Ondrca
Alesseon:

To není o C, to je o logice, v čem děláš? Java? C#? PHP? Ze syntaxe si odvodíš co to dělá, pak už je to logika... :)

coells Plně souhlasím, a jsem blbec, neuvědomil jsem si že se to rovná vlastně MAX - 1... A to t není potřeba, pokud to bude za tím, to jsem si také neuvědomil...

Nahoru Odpovědět 13.5.2014 20:37
This is a bad day to be human...
Avatar
Ondrca
Redaktor
Avatar
Odpovídá na Alesseon
Ondrca:

Dělám v C#, vím že je to o logice, to co kód dělá si umím odvodit, ale tím komentem, že nedělám v céčku jsem odpovídal na tu tvoji otázku co to je za hlavičku :)

Nahoru Odpovědět 13.5.2014 20:39
Zase jsem o něco chytřejší
Avatar
Alesseon
Člen
Avatar
Odpovídá na Ondrca
Alesseon:

Jo aha, omlouvám se, špatně jsem to pochytil. :)

Nahoru Odpovědět 13.5.2014 20:41
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:

Vážně moc děkuju. Já jsme asi idiot (i když bych se dneska nějak nedivila), ale neustále mě to neskáče na začátek. Jakmile dojedu na konec "tabulky", tak při dalším kliknutí to prostě zase zmizí. Ale opravdu moc děkuju za pomoc i za popis postupu.

 
Nahoru Odpovědět 13.5.2014 20:45
Avatar
Alesseon
Člen
Avatar
Alesseon:

Vtpc, neztrácej hlavu, to zvládneš dát dohromady, možná je nakonec chyba jinde, já se na to podívám a zkusím něco vykoumat, mám trošku času tak se ti na to podívám. :) Jen co najdu tu zatracenou hlavičku...

Nahoru Odpovědět 13.5.2014 20:48
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:

Já se nad tím taky budu snažit nějak zamyslet. Vážně všem moc děkuji za pomoc a za obětovaný čas.

 
Nahoru Odpovědět 13.5.2014 20:50
Avatar
coells
Redaktor
Avatar
Odpovídá na Alesseon
coells:

je to knihovna <ncurses>

 
Nahoru Odpovědět 13.5.2014 20:57
Avatar
Alesseon
Člen
Avatar
Alesseon:

coells Díky, už jsem jí taky oběvil, ale pořád mi hlásí že chybí kbhit, nevím proč, ale to je teď jedno, mám přístup k windows, tak se na to podívám tady...

vtpc Mohl bych tě poprosit o soubor sachovnice.txt? Jeho obsah nejlépe.. :)

Nahoru Odpovědět 13.5.2014 21:33
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:

Jasně, ale je to prostě jenom poznámkový blok a v tom nějak rozmístěné #.

    #
    #
   #    #
    #     #
    #
   #     #
##     #
  ###     #
Editováno 13.5.2014 21:36
 
Nahoru Odpovědět 13.5.2014 21:35
Avatar
Alesseon
Člen
Avatar
Odpovídá na vtpc
Alesseon:

Tak jo, hele, nechce se mi to složitě teď vysvětlovat, ale pokud budeš chtít tak způsob napíši do zpráv, myslím že většina pochopí oč tu jde, takže to nebude snad třeba vysvětlovat, kdyby to někdo chtěl ať si napíše. :)

switch(klavesa)
{
case 77: // right
    if ((pozice [X]+1)>MAX-2) pozice[X]=0;
    if(sachovnice[pozice[Y]][pozice[X]+1] !='#')
        pozice[X] = pozice[X] + 1;
        /*Tady se da pouzit nejlepe pozice[x]++ nebo pozice[x]+=konstanta, ale v podstate je to jedno*/
    break;
case 75: // left
    if ((pozice [X]-1)<1) pozice[X]=MAX-1;
    if(sachovnice [pozice[Y]][pozice[X]-1]!='#')
        pozice[X]=pozice[X]-1;
    break;
case 72: //up
    if((pozice[Y]-1)<1) pozice[Y] = MAX -1;
    if (sachovnice [pozice[Y]-1][pozice[X]]!='#')
        pozice[Y]=pozice[Y]-1;
    break;
case 80: // down
    if((pozice[Y]+1)> MAX-2) pozice[Y] = 0;
    if(sachovnice [pozice[Y]+1][pozice[X]]!='#')
        pozice[Y]=pozice[Y]+1;
    break;
}
Nahoru Odpovědět 13.5.2014 22:22
This is a bad day to be human...
Avatar
Alesseon
Člen
Avatar
Odpovídá na Alesseon
Alesseon:

Tedy způsob ti zítra napíšu do zpráv, dnes už ne. :)
A děkuji za mapku, už jsem to vykoumal a napsal jsem si dřív vlastní, ale i tak děkuji. :)

S touhle jsem to testoval:

########
#000000#
#000000#
#000000#
#000000#
#000000#
#000000#
########
Nahoru Odpovědět 13.5.2014 22:24
This is a bad day to be human...
Avatar
coells
Redaktor
Avatar
Odpovídá na Alesseon
coells:

:-)) Chápu to docela dobře, takže ti aspoň můžu vysvětlit, proč potřebuješ tu proměnnou 't'.

Tvůj kód dělá následující:

  1. při kroku doprava se zeptáš, jestli stojíš na kraji
  2. pokud ano, uděláš krok na pozici 0
  3. zjistíš, jestli na pozici 1 není překážka
  4. pokud ne, uděláš krok na pozici 1

Takže buď skočíš o dvě políčka najednou nebo skočíš do překážky...

 
Nahoru Odpovědět 13.5.2014 22:27
Avatar
Alesseon
Člen
Avatar
Odpovídá na coells
Alesseon:

No, už jsem na to přišel sám že je potřeba, myslel jsem si že nebude, že to půjde za tím, ale to by nebylo moc dobré, tak jsem to obešel jinak, měl jsi pravdu. :)

To vím, pohrál bych si s tím víc, ale nemám moc času, brzy ráno vstávám, tak jsem to nechal jak to leží a běží... Každopádně máš pravdu, a měl jsi i před tím. :)

Každopádně ani tvá implementace není bez problémů, když totiž budeš mít na nulté pozici překážku tak se tam s figurkou nedostaneš, to by chtělo pak další podmínku/cyklus, aby se pozice procházeli, nebo teď vážně nevím, nějak by to šlo, každopádně to zatím funguje a já se na to zítra ještě podívám, tohle mě zajímá. :)

Nahoru Odpovědět 13.5.2014 22:44
This is a bad day to be human...
Avatar
coells
Redaktor
Avatar
Odpovídá na Alesseon
coells:

Pokud je na nulté pozici překážka, tak se tam dostat nemáš, od toho je to překážka :-)
Proto se to řeší přes dočasnou proměnnou než uděláš samotný krok.

 
Nahoru Odpovědět 13.5.2014 22:48
Avatar
Alesseon
Člen
Avatar
Odpovídá na coells
Alesseon:

No právě, jenže ty se potřebuješ dostat na nultou nebo 0+1,0+2,..,0+n, tedy takhle jsem pochopil to zadání, prostě se dostat na první volnou pozici.
Ne, počkat, tady je můj problém, já pochopil špatně zadání, nebo jsme si ho oba přebrali po svém, slečna nespecifikovala jestli to má přeskakovat stěny nebo ne, i když je pravda že mi mohlo dojít podle "jako u hada". Má chyba. :)

Nahoru Odpovědět  +1 13.5.2014 22:55
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:

Páni. Moc to nechápu, ale pokusim se na to nějak podívat, i když jak jsem četla dál, ještě s tim asi budeš něco dělat. Jako fakt moc díky oboum dvoum. Doufám, že mi to bude fungovat. Fakt moc díky a promiňte, pokud jsem se špatně vyjádřila v zadání.

 
Nahoru Odpovědět 13.5.2014 23:18
Avatar
Alesseon
Člen
Avatar
Odpovídá na vtpc
Alesseon:

To ne, spíš jak sem byl ospalý tak jsem to špatně pochopil...

Tady je hotový kód, případně kdyby to mělo být tak že by se to posunulo na první volnou pozici, místo na pevně první pozici tak si řekni, není problém to upravit, i když to snad zvládneš. :)

switch(klavesa)
{
case 77: //right
    t = pozice[X]+1;
    if(t >= MAX){
        t = 0;
    }
    if(sachovnice[pozice[Y]][t] != '#'){
        pozice[X] = t;
    }
    break;
case 75: //left
    t = pozice[X] - 1;
    if(t <=0){
        t=MAX;
    }
    if(sachovnice[pozice[Y]][t] != '#'){
        pozice[X] = t;
    }
    break;
case 72: //up
    t=pozice[Y] - 1;
    if(t>=0){
        t=MAX;
    }
    if(sachovnice[t][pozice[X]] != '#'){
        pozice[Y] = t;
    }
    break;
case 80: //down
    t=pozice[Y] + 1;
    if(t<=MAX){
        t=0;
    }
    if(sachovnice[t][pozice[X]] != '#'){
        pozice[Y] = t;
    }
    break;
}
Nahoru Odpovědět  +1 16.5.2014 11:59
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:

Díky moc. Je to vážně skvělé. Já jsem se na to taky nějak podívala a jakoby jsme jenom vymyslela to přepisování #. To aby mi to přeskakovalo na druhou stranu jsme použila od tebe. Takže vážně díky moc za radu. Takhle jsme to vyřešila já. Chápu, že to asi není moc dobře, ale na moji dosavadní úroveň to stačí.

switch(klavesa){
         case 77: // right
                  if ((pozice [X]+1)>MAX-1 && (sachovnice[pozice[Y]] [0]!='#') ) pozice[X]=0-1;
                  if ((pozice [X]+1)<=MAX-1 && sachovnice[pozice[Y]][pozice[X]+1] !='#') pozice[X] = pozice[X] + 1;
                  break;
         case 75: // left
                   if ((pozice [X]-1)<0 && (sachovnice [pozice[Y]][MAX-1]!='#')) pozice[X]=MAX;
                   if((pozice [X]-1)>=0 &&sachovnice [pozice[Y]][pozice[X]-1]!='#') pozice[X]=pozice[X]-1;
                   break;
         case 72: //up
                   if ((pozice[Y]-1)<0 &&  (sachovnice [MAX-1][pozice[X]]!='#')) pozice[Y]=MAX;
                   if ((pozice[Y]-1)>=0 && sachovnice [pozice[Y]-1][pozice[X]]!='#') pozice[Y]=pozice[Y]-1;
                   break;
         case 80: // down
                   if((pozice[Y]+1)> MAX-1 && (sachovnice [0][pozice[X]]!='#')) pozice[Y]=0-1;
                   if((pozice[Y]+1)<= MAX-1 && sachovnice [pozice[Y]+1][pozice[X]]!='#') pozice[Y]=pozice[Y]+1;
                    break;

                    };
 
Nahoru Odpovědět 16.5.2014 12:04
Avatar
coells
Redaktor
Avatar
Odpovídá na Alesseon
coells:

:-D zkontroluj si ten kód ještě jednou, ospalče, na první pohled jsem tam našel hned tři chyby

 
Nahoru Odpovědět  +1 16.5.2014 12:06
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 32 zpráv z 32.