Greska posle odredjenog vremena/prosta zmijica igrica/c++

Greska posle odredjenog vremena/prosta zmijica igrica/c++

offline
  • daks98 
  • Novi MyCity građanin
  • Pridružio: 03 Sep 2016
  • Poruke: 5

Pozdrav drustvo,trebala bi mi pomoc,posto sam se zaglavio na jednom mozda za mene vecem problemu,nikako ne mogu da oktirjem zasto u mom programu tj. igrici

Citat:Zmija na zmiju koja je kao obicna zmija samo sto sada ima dve zmije koje jedu jednu vockicu i svaki put kad jedna od zmija pojede tu vockicu,dobija jedan deo tela,do toga sam i dosao,problem je sto sam stavio da ako se kordinate glave i jedne i druge zmije nadju na istoj poziciji,onda bi trebalo da se pojave na nekom drugom mestu na mapi i sa telom kao pre toga ali sa jednim zivotom manje,i sve je to radilo,i dalje radi,ali pojavljuje se problem,u nekom trenutku,koji nije konstantan,tj nije svaki put bas tako,kao da se taj deo koda gde kad se potrefe kordinate ZANEMARLJUJE,jer one onda prolaze jedna kroz drugu kao da se nista nije desilo,a pre nekoliko trenutaka je radilo...

Lomim se da shvatim gde je greska,verovatno nisam dovoljno upucen u neku logiku pa mi nesto izmice,pa bi mi pomoc vrlo dobro dosla a do tad

Verovatno je tesko ovako pronaci problem pa cu kod ostaviti ovde isto

Nemojte mi sta zameriti,novi sam u svemu,i c++ je moj prvi programski jezik koji ucim,ali sam veoma voljan dosta da naucim,pa bih bio zahvalan ako ima neko ko moze da pomogne

Znam da cete reci i da je kod ruzan,ali pocetnik sam,i nije bas u klasama sto odlikuje c++ ali pocetnikovom se kodu u zube ne gleda ahahha ili tako nesto

Takodje ima i dosta i glupih komentara,ali kad sam pocetnik,stavljao sam da od prilike nesto znam ako zaboravim

//UPUSTVO-igra se sa komandama(w-gore,s-dole,a-levo,d-desno) #include "stdafx.h" #include <iostream> #include <windows.h> //za brzinu igre u ovom kodu #include <conio.h>//zbog inputa,biblioteka da bi mogli da koristimo tastaturu za igru npr. using namespace std; bool gameOver, smrtPrveZmije, smrtDrugeZmije; // globalna promenljiva const int width = 40;//dimenzije mape-sirina const int height = 20;//dimenzije mape-visina int x, y, u, c, fruitX, fruitY, score,score2;//promenljive,(x,y za zmiju,fruitX i fruitY za ono sto pokupi zmija) i imamo score ,brojac za postignut skor int teloX[400], teloY[400], teloX2[400], teloY2[400];//maksimalna velicina za telo x,y int nTelo, nTelo2;//duzina tela n enum eDirection1 { STOP = 0, LEFT, RIGHT, UP, DOWN };//da ne bi morali da stiskamo stalno jednu te istu komandu,ovim omogucujemo da kad se npr nesto pokrenulo prema dole,ide prema dole dok se ne zaustavi nekom komandom ili pravilom eDirection1 dir;//promenljiva dir enum eDirection2 { STOP2 = 10, LEFT2, RIGHT2, UP2, DOWN2 }; eDirection2 dir2; int zivot = 13; int zivot2 = 13; void Setup() {    gameOver = false;//krecemo od toga da nije gameover na pocetku    smrtPrveZmije = false;    smrtDrugeZmije = false;    dir = STOP;// zmija se ne krece dok je mi ne pokrenemo na pocetku    dir2 = STOP2;    x = width / 2;//postavljamo zmiji pocetni polozaj,centar    y = height / 2;    u = width / 2;    c = width / 3;    fruitX = rand() % width;//postavljamo vockici pocetni polozaj,random    fruitY = rand() % height;    score = 0;//na pocetku je skor 0 } void Draw() {    system("cls");//cisti ekran na pocetku    for (int i = 0; i < width + 2; i++)//gornji deo okvira,+2 da bi lepo ispalo       cout << "#";    cout << endl;    for (int i = 0; i < height; i++)    {       for (int j = 0; j < width; j++)       {          if (j == 0)//0 jer stampa levo             cout << "#";          if (i == c && j == u)             cout << "0";          else if (i == y && j == x)             cout << "O";          else if (i == fruitY && j == fruitX)             cout << "*";          else          {             bool stampa = false;             for (int k = 0; k < nTelo; k++)             {                if (teloX[k] == j && teloY[k] == i)                {                   cout << "o";                   stampa = true;                }             }             /*if (!stampa)//ako nema stampe,prazan prostor pisi             cout << " "; //prazan prostor izmedju levog i desnog okvira             */             bool stampa2 = false;             for (int z = 0; z < nTelo2; z++)             {                if (teloX2[z] == j && teloY2[z] == i)                {                   cout << "o";                   stampa2 = true;                }             }             if (!stampa && !stampa2)                cout << " ";             //ako su iste kordinate tela i jedne i druge da mogu da se poklope i da se promeni njihovo mesto i da pojede jedna drugu             if (teloX == teloX2 && teloY == teloY2)             {                stampa = false;                stampa2 = false;             }             /*bool stampa2 = false;             for (int k = 0; k < nTelo2; k++)             {             if (teloX2[k] == j && teloY2[k] == i)             }             */          }          if (j == width - 1)//kad dodje do kraja,oduzme jedan i to stampa desnu stranu okvira,da bi desni okvir pomerio na odgovarajuce mesto ide -1*u ovom slucaju samo*             cout << "#";       }       cout << endl;    }    for (int i = 0; i < width + 2; i++)//donji deo okvira,+2,da bi se poklopilo       cout << "#";    cout << endl; } void Input() {    if (_kbhit())//ako se pritisne nesto na tastaturi    {       switch (_getch())//uvodimo da mozemo koristiti,a,b,w,s,za kretnju u igri       {       case 'a':          dir = LEFT;          break;       case 'd':          dir = RIGHT;          break;       case 'w':          dir = UP;          break;       case 's':          dir = DOWN;          break;       case '4':          dir2 = LEFT2;          break;       case '6':          dir2 = RIGHT2;          break;       case '8':          dir2 = UP2;          break;       case '5':          dir2 = DOWN2;          break;       case'x'://ako pritisnemo x,igra se odma prekida,tj odma je gameOver          gameOver = true;          break;       }    } } void Logic() {    int preX = teloX[0];//prethodna kordinata jednog dela tela zmije(x),znaci ono 'o' posle 'O'    int preY = teloY[0];//isto za y    int pre2X, pre2Y;    teloX[0] = x;    teloY[0] = y;    for (int i = 1; i < nTelo; i++)//,princip dodavanja tela i=1 jer vec glava zmije zauzima nesto,tako da je ovo bas telo    {       pre2X = teloX[i];       pre2Y = teloY[i];       teloX[i] = preX;       teloY[i] = preY;       preX = pre2X;       preY = pre2Y;       //prev2X,prev2Y su kordinate novog tela zmijice,ono prvo ne postoji,zmijina glava je nulti deo u telu zmije,odnosno prvi,svi ostali delovi su 1,2,3,4...       //u zavisnosti od duzine tela zmije       //pre2X = teloX[i]; kordinate tela zmije i koliko ce se puta dodavati,       //pre2Y = teloY[i];       //teloX[i] = preX; odnosno ono mesto gde je zmijina glava bila sada ce se stvoriti jedan komadic zmijinog tela odnosno 'o',ovo je logika,a crtanje gore       //teloY[i] = preY;       //preX = pre2X; a telo zmije moze biti ko zna koliko,preX je onaj deo zmijice koji stalno ide uz glavu zmije, i uvek njenu prethodnu       // poziciju zauzima,dok pre2X su svi ostali ustvari delovi zmije i oni prate i zauzimaju kordinate ovog preX       //preY = pre2Y;    }    int preU = teloX2[0];    int preC = teloY2[0];    int pre2X2, pre2Y2;    teloX2[0] = u;    teloY2[0] = c;    for (int p = 1; p < nTelo2; p++)    {       pre2X2 = teloX2[p];       pre2Y2 = teloY2[p];       teloX2[p] = preU;       teloY2[p] = preC;       preU = pre2X2;       preC = pre2Y2;    }    switch (dir) //cista logika kretanja zmije    {    case LEFT:       x--;       break;    case RIGHT:       x++;       break;    case UP:       y--;//-- jer je 0 gore skroz i ako idemo prema gore,a npr je zmija bila na kordinati y=7,da bi ona isla gore po kordinati y,y se mora smanjiti       break;    case DOWN:       y++;       break;    default:       break;    }    switch (dir2) //cista logika kretanja zmije    {    case LEFT2:       u--;       break;    case RIGHT2:       u++;       break;    case UP2:       c--;//-- jer je 0 gore skroz i ako idemo prema gore,a npr je zmija bila na kordinati y=7,da bi ona isla gore po kordinati y,y se mora smanjiti       break;    case DOWN2:       c++;       break;    default:       break;    }    switch (score)    {    case 100:       score = score + 40;       zivot = zivot + 1;       break;    case 400:       score = score + 60;       zivot = zivot + 1;       break;    case 1000:       score = score + 80;       zivot = zivot + 1;       break;    case 2000:       score = score + 120;       zivot = zivot + 2;       break;    }    //if (x > width|| x < 0|| y > height || y < 0)    //   gameOver = true;    for (int i = 0; i < nTelo; i++)       if (teloX[i] == x && teloY[i] == y)//ako se podudare kordinate glave i tela,gubi zivot zmija       {          zivot = zivot - 1;       }    if (x >= width) x = 0; else if (x < 0) x = width - 1;    if (y >= height) y = 0; else if (y < 0) y = height - 1;    if (u >= width) u = 0; else if (u < 0) u = width - 1;    if (c >= height) c = 0; else if (c < 0) c = height - 1;    if (x == fruitX && y == fruitY)//ako je zmijina tacka jednaka tacki vockice,dodaje se skor +10 i stvara se nova radnom pozicija vockice    {       score += 10;       fruitX = rand() % width;       fruitY = rand() % height;       nTelo++;//ako su kordinate iste,povecava se telo zmije    }    if (u == fruitX && c == fruitY)    {       score += 10;       fruitX = rand() % width;       fruitY = rand() % height;       nTelo2++;    }    cout << "REZULTAT: " << score << endl;    cout << "Zivota: " << zivot << endl;    if (zivot <= -1)       gameOver = true;    if (score <= 30)    {       Sleep(80);    } } void Logic2() {    int preX = teloX[0];//prethodna kordinata jednog dela tela zmije(x),znaci ono 'o' posle 'O'    int preY = teloY[0];//isto za y    int pre2X, pre2Y;    teloX[0] = x;    teloY[0] = y;    for (int i = 1; i < nTelo; i++)//,princip dodavanja tela i=1 jer vec glava zmije zauzima nesto,tako da je ovo bas telo    {       pre2X = teloX[i];       pre2Y = teloY[i];       teloX[i] = preX;       teloY[i] = preY;       preX = pre2X;       preY = pre2Y;       //prev2X,prev2Y su kordinate novog tela zmijice,ono prvo ne postoji,zmijina glava je nulti deo u telu zmije,odnosno prvi,svi ostali delovi su 1,2,3,4...       //u zavisnosti od duzine tela zmije       //pre2X = teloX[i]; kordinate tela zmije i koliko ce se puta dodavati,       //pre2Y = teloY[i];       //teloX[i] = preX; odnosno ono mesto gde je zmijina glava bila sada ce se stvoriti jedan komadic zmijinog tela odnosno 'o',ovo je logika,a crtanje gore       //teloY[i] = preY;       //preX = pre2X; a telo zmije moze biti ko zna koliko,preX je onaj deo zmijice koji stalno ide uz glavu zmije, i uvek njenu prethodnu       // poziciju zauzima,dok pre2X su svi ostali ustvari delovi zmije i oni prate i zauzimaju kordinate ovog preX       //preY = pre2Y;    }    int preU = teloX2[0];    int preC = teloY2[0];    int pre2X2, pre2Y2;    teloX2[0] = u;    teloY2[0] = c;    for (int p = 1; p < nTelo2; p++)    {       pre2X2 = teloX2[p];       pre2Y2 = teloY2[p];       teloX2[p] = preU;       teloY2[p] = preC;       preU = pre2X2;       preC = pre2Y2;    }    switch (dir) //cista logika kretanja zmije    {    case LEFT:       x--;       break;    case RIGHT:       x++;       break;    case UP:       y--;//-- jer je 0 gore skroz i ako idemo prema gore,a npr je zmija bila na kordinati y=7,da bi ona isla gore po kordinati y,y se mora smanjiti       break;    case DOWN:       y++;       break;    default:       break;    }    switch (dir2) //cista logika kretanja zmije    {    case LEFT2:       u--;       break;    case RIGHT2:       u++;       break;    case UP2:       c--;//-- jer je 0 gore skroz i ako idemo prema gore,a npr je zmija bila na kordinati y=7,da bi ona isla gore po kordinati y,y se mora smanjiti       break;    case DOWN2:       c++;       break;    default:       break;    }    switch (score)    {    case 100:       score = score + 40;       zivot = zivot + 1;       break;    case 400:       score = score + 60;       zivot = zivot + 1;       break;    case 1000:       score = score + 80;       zivot = zivot + 1;       break;    case 2000:       score = score + 120;       zivot = zivot + 2;       break;    }    //if (x > width || x < 0) || y > height || y < 0)//ako zmijina glava izadje iz okvira igre    //{    //   zivot = zivot - 1;    //   }    if (x >= width)    {       zivot = zivot - 1;       dir = LEFT;    }    if (x <= 0)    {       zivot = zivot - 1;       dir = RIGHT;    }    if (y >= height)    {       zivot = zivot - 1;       dir = UP;    }    if (y <= 0)    {       zivot = zivot - 1;       dir = DOWN;    }    if (u >= width)    {       zivot2 = zivot2 - 1;       dir2 = LEFT2;    }    if (u <= 0)    {       zivot2 = zivot2 - 1;       dir2 = RIGHT2;    }    if (c >= height)    {       zivot2 = zivot2 - 1;       dir2 = UP2;    }    if (c <= 0)    {       zivot2 = zivot2 - 1;       dir2 = DOWN2;    }    for (int i = 0; i < nTelo; i++)       if (teloX[i] == x && teloY[i] == y)//ako se podudare kordinate glave i tela,igra je gotova       {          zivot = zivot - 1;       }    //if (x >= width) x = 0; else if (x < 0) x = width - 1;    //if (y >= height) y = 0; else if (y < 0) y = height - 1;    if (x == fruitX && y == fruitY)//ako je zmijina tacka jednaka tacki vockice,dodaje se skor +10 i stvara se nova radnom pozicija vockice    {       score += 20;       fruitX = rand() % width;       fruitY = rand() % height;       nTelo++;//ako su kordinate iste,povecava se telo zmije    }    if (u == fruitX && c == fruitY)    {       score2 += 20;       fruitX = rand() % width;       fruitY = rand() % height;       nTelo2++;    }    cout << "\n SKOR PRVE ZMIJE: " << score << endl;    cout << " \n SKOR DRUGE ZMIJE: " << score2 << endl;    cout << "\t\t\t\t Zivota prve zmije : " << zivot << endl;    cout << "\t\t\t\t Zivota druge zmije: " << zivot2 << endl;    if (x == u && y == c)    {       zivot = zivot - 1;       zivot2 = zivot2 - 1;       x = rand() % width;       y = rand() % height;              /*for (int i = 1; i < nTelo; i++)//,princip dodavanja tela i=1 jer vec glava zmije zauzima nesto,tako da je ovo bas telo       {          pre2X = teloX[i];          pre2Y = teloY[i];          teloX[i] = preX;          teloY[i] = preY;          preX = pre2X;          preY = pre2Y;          //prev2X,prev2Y su kordinate novog tela zmijice,ono prvo ne postoji,zmijina glava je nulti deo u telu zmije,odnosno prvi,svi ostali delovi su 1,2,3,4...          //u zavisnosti od duzine tela zmije          //pre2X = teloX[i]; kordinate tela zmije i koliko ce se puta dodavati,          //pre2Y = teloY[i];          //teloX[i] = preX; odnosno ono mesto gde je zmijina glava bila sada ce se stvoriti jedan komadic zmijinog tela odnosno 'o',ovo je logika,a crtanje gore          //teloY[i] = preY;          //preX = pre2X; a telo zmije moze biti ko zna koliko,preX je onaj deo zmijice koji stalno ide uz glavu zmije, i uvek njenu prethodnu          // poziciju zauzima,dok pre2X su svi ostali ustvari delovi zmije i oni prate i zauzimaju kordinate ovog preX          //preY = pre2Y;       }       */       u = rand() % width;       c = rand() % height;              /*for (int p = 1; p < nTelo2; p++)       {          pre2X2 = teloX2[p];          pre2Y2 = teloY2[p];          teloX2[p] = preU;          teloY2[p] = preC;          preU = pre2X2;          preC = pre2Y2;       }       */    }    if (zivot <= -1 && zivot2 <= -1)       gameOver = true;    Sleep(100); } int main() {    char level;    //Setup();//pozivamo Setup    /*while (!gameOver)//i sve dok nije gameOver,neka radi sledece    {    Draw();    Input();    Logic();    Sleep(50);//brzina kretanja nase zmijice    }    */    cout << "Izaberi level: " << endl;    cout << "1. Lako " << endl;    cout << "2. Normalno " << endl;    cout << "3. Tesko " << endl;    cin >> level;    Setup();    while (!gameOver)    {       switch (level)       {       case '1':       {          Draw();          Input();          Logic();          Input();          //brzina kretanja nase zmijice          break;          return 0;       }       case '2':       {          Draw();          Input();          Logic();          break;          return 0;       }       case '3':       {          Draw();          Input();          Logic2();          Sleep(0);          break;          return 0;       }       default:          break;       }    }    if (gameOver)    {    }    system("pause");    return 0; }



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Kod zaista jeste konfuzan, ali nije loše za početnika. Koliko se meni čini, problem je u tome što prvo izračunaš pozicije glava obe zmije pa tek onda proveravaš da li su se glave sudarile.

Zamisli da se glava zmije 1 nalazi na x koordinati x1=5, a glava zmije 2 na x2=6 i kreću se jedna prema drugoj (zmija 1 u desno, a zmija 2 u levo). Prvo pomeriš glavu zmije 1 u desno i sada je x1=6, zatim glavu zmije 2 u levo i sada je x2=5, i onda proveravaš da li je x1=x2. Pošto nije, tvoj kod kaže da nema sudara.

Jednostavno rešenje bi bilo da sudar proveriš jednom posle pomeranja zmije 1, i drugi put posle pomeranja zmije 2.



offline
  • daks98 
  • Novi MyCity građanin
  • Pridružio: 03 Sep 2016
  • Poruke: 5

Srki_82 ::Kod zaista jeste konfuzan, ali nije loše za početnika. Koliko se meni čini, problem je u tome što prvo izračunaš pozicije glava obe zmije pa tek onda proveravaš da li su se glave sudarile.

Zamisli da se glava zmije 1 nalazi na x koordinati x1=5, a glava zmije 2 na x2=6 i kreću se jedna prema drugoj (zmija 1 u desno, a zmija 2 u levo). Prvo pomeriš glavu zmije 1 u desno i sada je x1=6, zatim glavu zmije 2 u levo i sada je x2=5, i onda proveravaš da li je x1=x2. Pošto nije, tvoj kod kaže da nema sudara.

Jednostavno rešenje bi bilo da sudar proveriš jednom posle pomeranja zmije 1, i drugi put posle pomeranja zmije 2.



LJUDINO!!!

Pre svega hvala ti,veoma velika pomoc meni,to me je mucilo dugo ahhaha,ubacio sam ovo i za sada radi,jer gleda i kordinatu pre odnosno kordinatu prvog tela zmije...

if (x == u && y == c || x == preU && y == preC || u == preX && c == preY || x == preU && y == preC)    {       zivot = zivot - 1;       zivot2 = zivot2 - 1;       x = rand() % width;       y = rand() % height;           u = rand() % width;       c = rand() % height;    }


HVALA JOS JEDNOM LJUDINO!!

Ko je trenutno na forumu
 

Ukupno su 1018 korisnika na forumu :: 50 registrovanih, 4 sakrivenih i 964 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., arsa, babaroga, bojanM84, BORUTUS, BraneS, brundo65, Dannyboy, djboj, Djokislav, doklevise, DonRumataEstorski, doom83, Dorcolac, dragoljub11987, DragoslavS, gorval, ikan, Istman, ivan979, jukeboxer, kokodakalo, kovinacc, Kubovac, kunktator, kybonacci, ljuba, LUDI, Lukaaa, Marko Marković, mercedesamg, milenko crazy north, Misirac, mkukoleca, nemkea71, oldtimer, opt1, raptorsi, raykan, repac, sap, savaskytec, slonic_tonic, Stoilkovic, VJ, Vlad000, voja64, wolverined4, Wrangler, 79693