Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.
Avatar
vtpc
Člen
Avatar
vtpc:13.5.2014 18:35

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
Tvůrce
Avatar
Odpovídá na vtpc
Ondrca:13.5.2014 19:10

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:13.5.2014 19:11

Ano, přesně tak.

 
Nahoru Odpovědět
13.5.2014 19:11
Avatar
Ondrca
Tvůrce
Avatar
Odpovídá na vtpc
Ondrca:13.5.2014 19:17

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:13.5.2014 19:46

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:13.5.2014 19:58

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:13.5.2014 20:17

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
Tvůrce
Avatar
Odpovídá na vtpc
Ondrca:13.5.2014 20:19

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:13.5.2014 20:26

stále bohužel nefunguje...

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

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
Tvůrce
Avatar
Odpovídá na vtpc
coells:13.5.2014 20:32

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
Tvůrce
Avatar
Odpovídá na Alesseon
Ondrca:13.5.2014 20:34

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
Tvůrce
Avatar
Odpovídá na vtpc
coells:13.5.2014 20:34

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

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

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
Tvůrce
Avatar
Odpovídá na Alesseon
Ondrca:13.5.2014 20:39

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:13.5.2014 20:41

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:13.5.2014 20:45

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:13.5.2014 20:48

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:13.5.2014 20:50

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
Tvůrce
Avatar
Odpovídá na Alesseon
coells:13.5.2014 20:57

je to knihovna <ncurses>

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

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:13.5.2014 21:35

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:13.5.2014 22:22

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:13.5.2014 22:24

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
Tvůrce
Avatar
Odpovídá na Alesseon
coells:13.5.2014 22:27

:-)) 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:13.5.2014 22:44

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
Tvůrce
Avatar
Odpovídá na Alesseon
coells:13.5.2014 22:48

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:13.5.2014 22:55

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
13.5.2014 22:55
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:13.5.2014 23:18

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:16.5.2014 11:59

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
16.5.2014 11:59
This is a bad day to be human...
Avatar
vtpc
Člen
Avatar
vtpc:16.5.2014 12:04

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
Tvůrce
Avatar
Odpovídá na Alesseon
coells:16.5.2014 12:06

:-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
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.