Diskuze: C - vrácení se na začátek řádku
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 32 zpráv z 32.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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?
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ě
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]);
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í.
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;
};
Už vím kde je chyba - tu druhou podmínku co kontroluje jestli je uplně na konci musíš dát jako první !
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...
Musíš ten kód upravit trochu jinak:
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;
};
Ondrcu radši neposlouchej, mele nesmysly. Kdyby se alespoň trochu zamyslel, neradil by ti špatně.
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...
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
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.
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;
}
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#
########
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í:
Takže buď skočíš o dvě políčka najednou nebo skočíš do překážky...
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á.
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.
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.
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í.
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;
}
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;
};
zkontroluj si ten kód
ještě jednou, ospalče, na první pohled jsem tam našel hned tři chyby
Zobrazeno 32 zpráv z 32.