No sláva, konečně se mi to povedlo zprovoznit. Začínám být zoufalý, protože pokaždé, co se snažím vytvořit nějaký ''složitější'' kod, tak se někde šprajcnu a většinou se bez cizí pomoci nedostanu dál :) No nic, musím setrvat a snad se toho víc dostanu.. Každopádně díky za rady a trpělivost :) Mějte se a ještě jednou díky !
Příspěvky odeslané z IP adresy 84.16.108.–
Moc děkuju za tipy.
Dostal jsem se k něčemu takovému :
int main(){
int znak=0, chaos=1, zmenar=0, zmenas=0;
init();
cas1=(unsigned long)time(0);
;
nahrajPoleZeSouboru();
do{
if(pole[pozices][pozicer]=='@') chaos=chaos*-1;
if(kbhit()!=0){
znak=getch();
int zmenar = 0, zmenas = 0;
switch(znak) {
case 'w': zmenar++; break;
case 's': zmenar--; break;
case 'd': zmenas++; break;
case 'a': zmenas--; break;
}
if (chaos) {
zmenar = chaos*zmenar;
zmenas = chaos*zmenas;
}
int nover = pozicer + zmenar, noves = pozices + zmenas;
if (nover < 0 || nover >= MAX ||
noves < 0 || noves >= MAX ||
pole[nover][noves] == '#') {
trestnebody++;
} else {
pozicer = nover;
pozices = noves;
Ovšem pořád to nefunguje tak, jak by mělo. Už od spuštění hry jsou prohozené klávesy S a W, klávesy A a D fungují normálně (levo, pravo) a najetí na pole se zavináčem nemění vůbec nic. Hádám, že chyba bude v části : if(pole[pozices][pozicer]=='@') chaos=chaos*-1; ovšem jistý si nejsem ničím :)
Zdravíčko,
mám zde jednoduchou hru v céčku, ve které se pohybujete klasicky klávesami WASD a vaším úkolem je se dostat do pravého dolního rohu pole. Pokud narazíte do zdi (ve hře #) nebo se pokusíte vylézt z pole, přičte se vám jeden trestný bod. Pokud vyprší časový limit, dosáhnete tří trestných bodů nebo stisknete klávesu ''q'' , hra skončí. S tímhle problém není.
#include <stdio.h>
#include <time.h>
#define MAX 10-2
#define CASLIMIT 20
char pole[MAX][MAX];
int pozicer=0,pozices=0,trestnebody=0;
unsigned long cas1,cas2;
void init() {
int r,s;
for(r=0;r<MAX;r++)
for(s=0;s<MAX;s++)
pole[r][s]=' ';
}
void nahrajPoleZeSouboru() {
int i,r,znak;
FILE *soubor;
soubor=fopen("sachovnice.txt","r");
if (soubor!=NULL) {
for(i=0
void vypis(){
int r,s;
system("cls");
for(r=0;r<MAX;r++) {
for(s=0;s<MAX;s++)
printf("+-") ;
printf("+\n");
for(s=0;s<MAX;s++)
if(pozicer==r && pozices==s)
printf("|*");
else
printf("|%c",pole[r][s]);
printf("|\n");
}
for(s=0;s<MAX;s++)
printf("+-") ;
printf("+\n");
printf("Trestne body : %d\n",trestnebody);
cas2=(unsigned long)time(0);
printf("Cas: %d\n", CASLIMIT-(cas2-cas1));
}
int main() {
int i, znak=0,
init();
cas1=(unsigned long)time(0);
for(i=1; i<7; i++)
pole [4][i]='#';
do{
if(kbhit()!=0){
znak=getch();
switch(znak){
case 's': if(pozicer<(MAX-1) && pole[pozicer+1][pozices]!='#')
pozicer++;
else trestnebody++;
break;
case 'w': if(pozicer>0 && pole[pozicer-1][pozices]!='#')
pozicer--;
else trestnebody++;
break;
case 'a': if(pozices>0 && pole[pozicer][pozices-1]!='#')
pozices--;
else trestnebody++;
break;
case 'd': if(pozices<(MAX-1)&& pole[pozicer][pozices+1]!='#')
pozices++;
else trestnebody++;
break;
}
}
vypis();
}while ( znak !='q' && !(pozicer==(MAX-1) && pozices==(MAX-1)) && trestnebody<5 && (cas2-cas1<CASLIMIT));
getchar();
Jenže jsem se snažil do hry přidat vychytávku, kdy po vkročení na určité políčko (v mém případě políčko označené ''@'') se ovládaní přetočí ( doposud znamenal znak W posun od jedno nahoru, nyní by ale znamenal posun dolů, S by znamenal posun nahoru, A by znamenal posun doprava a D posun doleva).
Pokusil jsem se o to následovně
int main(){
int i, znak=0, chaos=0;
init();
cas1=(unsigned long)time(0);
;
if(pozices=='@' && pozicer=='@')
chaos++;
nahrajPoleZeSouboru();
do{
if(chaos==0) {
if(kbhit()!=0){
znak=getch();
switch(znak){
case 's': if(pozicer<(MAX-1) && pole[pozicer+1][pozices]!='#')
pozicer++;
else trestnebody++;
break;
case 'w': if(pozicer>0 && pole[pozicer-1][pozices]!='#')
pozicer--;
else trestnebody++;
break;
case 'd': if(pozices<(MAX-1) && pole[pozicer][pozices+1]!='#')
pozices++;
else trestnebody++;
break;
case 'a': if(pozices>0 && pole[pozicer][pozices-1]!='#')
pozices--;
else trestnebody++;
break;}
}
else
if(kbhit()!=0){
znak=getch();
switch(znak){
case 'w': if(pozicer<(MAX-1) && pole[pozicer+1][pozices]!='#')
pozicer++;
else trestnebody++;
break;
case 's': if(pozicer>0 && pole[pozicer-1][pozices]!='#')
pozicer--;
else trestnebody++;
break;
case 'a': if(pozices<(MAX-1) && pole[pozicer][pozices+1]!='#')
pozices++;
else trestnebody++;
break;
case 'd': if(pozices>0 && pole[pozicer][pozices-1]!='#')
pozices--;
else trestnebody++;
break;
} }
}
printf("%d\n",chaos);
vypis();
}while( znak !='q' && !(pozicer==(MAX-1) && pozices==(MAX-1)) && (cas2-cas1<CASLIMIT) && trestnebody<3 );
getchar();
Do mainu jsem přidal proměnou ''chaos'' rovnou nule. A přidal ''if'' který by měl inkrementovat chaos o jedna, pokud hráč vstoupí právě na políčko označené zavináčem. Dále druhý ''If'' před ovládaní, kdy pokud je chaos roven nule, funguje klasické ovládání, pokud je různý od nuly, tak by fungovat mělo druhé- přehozené ovládaní.
Samozřejmě to nefunguje tak, jak bych si to představoval a ovládaní zůstává pořád stejné. Našel by se tu někdo, kdo by mi poradil v čem mám chybu a nasměroval mě ke správnému řešení ?
Předem díky za snahu a trpělivost.
Jinak jsem zapomněl dodat, že hrací pole se nahrává z textové souboru, který jsem vytvořil v poznámkovém bloku a do které jsem jednoduše vložil mezery nebo mřížky.