ďťż

Ładny brzuch

Witam,

mój program ma być bardzo prostą grą ( jak np. Snake z Nokii). Nie wiem jak zaprogramować skręty, tzn. aby każdy "X" (bo tak wygląda ciało węża), po dojściu do pkt skrętu - skręcił. Przy jednym X sprawa jest bardzo prosta i wszystko oczywiście działa (no może prawie wszystko, bo przsuwając się nie kasuje swojej poprzedniej pozycji). Ale gdy ciało się powiększy do kilku elementów, a co gorsza będę wykonywał wielokrotne skręty sprawa się komplikuje. Pomyślałem, że muszę stworzyć tablicę-bufor z informacjami: współrzędne skrętu(2) oraz współrzędne punktu gdzie X ma skręcić. Jak zrealizować taki pomysł? Nie obejdzie się bez bufora? Jak skasować dane skrętu i przesunąć pozostałe, aby zapełniło się miejsce (queue?). Czy każdy "X" musi mieć informacje - oprócz położenia - który skręt zaliczył? Jak poradzić sobie, przed X nie ma już zakrętów?

Będę bardzo wdzięczny za pomoc!

#include <cstdlib> #include <iostream> #include <windows.h> #include <stdio.h> #include <conio.h> #include <fstream> #include <vector.h> #define ILOSC 3 #define ND -1 #define MEKRAN 1840 enum kierunki { gora=56, dol=53, lewo=52, prawo=54 }; enum pozycjax { lft=0, center=40, rgt=80 }; enum pozycjay { top=0, middle=13, bottom=25 }; int ogrprawo,ogrlewo,ogrgora,ogrdol; int uzycie; int wybory; using namespace std; /////////////////////////////////////////////////////////// // deklaracje void nowagra(); void wyborplanszy(); void poziomtrud(); void opcje(); void hof(); void gotoxy(const int & x, const int & y) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); COORD pas; pas.X=x-1; pas.Y=y-1; SetConsoleCursorPosition(hCon, pas); } int srodek(int a) { if(a%2==0){ a/=2; return a; } else{ a=(a+1)/2; return a; } } void czekajczysc(int a) { Sleep(a); system("CLS"); } const void ogranieczeniewyboru(int &x,int &y) { if(y!=ND) { if(y<ogrgora) y=ogrgora; if(y>ogrdol) y=ogrdol; } if(x!=ND) { if(x<ogrlewo) x=ogrlewo; if(x>ogrprawo) x=ogrprawo; } } int kursorwyboru(int x1, int x2, int y) { uzycie = ND; gotoxy(x1,y); cout << "["; gotoxy(x2,y); cout << "]"; wybory=1; while(wybory!=57) { wybory=getch(); switch(wybory) { case gora: gotoxy(x1, y); cout << " "; gotoxy(x2, y); cout << " "; y-=1; break; case dol: gotoxy(x1, y); cout << " "; gotoxy(x2,y); cout << " "; y+=1; break; default: break; } ogranieczeniewyboru(uzycie,y); gotoxy(x1,y); cout << "["; gotoxy(x2,y); cout << "]"; } return y; } void menu() { gotoxy(center-srodek(29), middle-5); cout << " W ~~~~ E ~~~~ Z ~~~~ Y ~~ K "; gotoxy(center-srodek(10),middle-3); cout << " Nowa gra "; gotoxy(center-srodek(15), middle-2); cout << " Wybor planszy "; gotoxy(center-srodek(25), middle-1); cout << " Wybor poziomu trudnosci "; gotoxy(center-srodek(7), middle); cout << " Opcje "; gotoxy(center-srodek(14), middle+1); cout << " Hall of Fame "; gotoxy(center-srodek(7), middle+2); cout << " Wyjdz "; ogrgora = middle-3; ogrdol = middle+2; ogrprawo = kursorwyboru(center-srodek(29)-2, srodek(29)+center, middle-3); switch(ogrprawo) { case middle-3: nowagra(); break; case middle-2: wyborplanszy(); break; case middle-1: poziomtrud(); break; case middle: opcje(); break; case middle+1: hof(); break; case middle+2: exit(1); default: cout << " zle ! "; break; } } class cialoweza { friend class wezyk; int polx, poly; vector<int> komorki; void pokazpol(int & a) { komorki[a] }; ///////////////////////////////////////////////////// class wezyk { cialoweza cialo; char plansza[MEKRAN]; int x,y; int c; int ilosc; int punktow; int wsplzmian[40][4]; friend void wyborplanszy(); bool przegrana(const int & x, const int & y); void rysuj(const int & x, const int & y); public: void zmienxy(int xz,int yz) { x=xz; y=yz; } void wczytaj(int wybor); wezyk(int cd=gora) : punktow(0), ilosc(1), c(cd), x(40), y(25) { gotoxy(center-srodek(19), middle); cout << " W - E - Z - Y - K " << endl; wczytaj(2); czekajczysc(80); //zmienic menu(); } void pokazplansze(); void przesun(); }; class levele { friend void wezyk::wczytaj(int wybor); char level[ILOSC+1][2]; void wczytajlvle(); public: levele() { wczytajlvle(); gotoxy(center-srodek(25), middle); cout << " Wczytywanie leveli zakonczone! "<<endl; czekajczysc(900); } void wypiszlvle(); }; levele podstawowy; wezyk game; //////////////////////// void wezyk::pokazplansze() { system("CLS"); gotoxy(1,2); for(int k=0; k<MEKRAN; ++k) if(plansza[k]=='0') cout << " "; else cout << plansza[k]; } void levele::wczytajlvle() { char c = 'a'; int i=0, p=1; ifstream g("lvle.wg"); while(i<=(ILOSC+1)*2) { g.seekg(i++); g.getĹ ; if(i%2==0) { level[p][1]=c; ++p; } else{ level[p][0]=c; } } g.close(); } void levele::wypiszlvle() { gotoxy(center, middle-1); for(int i=1; i<ILOSC+1; ++i) {for(int c=0; c<2; ++c) cout << level[i][c]; cout << endl; } } void wezyk::wczytaj(int wybor) { char aktualnylvl[7]; for(int k=0; k<2; ++k) aktualnylvl[k]=podstawowy.level[wybor][k]; aktualnylvl[2]='.'; aktualnylvl[3]='l'; aktualnylvl[4]='v'; aktualnylvl[5]='l'; aktualnylvl[6]=NULL; ifstream w(aktualnylvl); w.read(game.plansza, MEKRAN); w.close(); } bool wezyk::przegrana(const int & x, const int & y) { Sleep(700); if(x!=0&&x!=80 && y!=0 && y!=25&&(plansza[(y-2)*80+x]!='#'||plansza[(y+1)*80+x]!=' #')&& (plansza[(y-2)*80+x+1]!='#'||plansza[(y-2)*80+x-1]!='#')& &(plansza[(y-2)*80+x-1]!='#'||plansza[(y+1)*80+x+1]!='#'))return false; else { system("CLS"); gotoxy(35,12); cout << " PRZEGRALES " << endl; Sleep(4000); exit(1); } } void wezyk::rysuj(const int & x, const int & y) { Sleep(200); cout << " "; gotoxy(x,y); cout << "X"; } void wezyk::przesun() { switchĹ  { default: c=gora; break; case gora: while(!kbhit()){if(!przegrana(x,--y))rysuj(x,y);} c=getch(); break; case dol: while(!kbhit()){if(!przegrana(x,++y))rysuj(x,y);} c=getch(); break; case lewo: while(!kbhit()){if(!przegrana(--x,y))rysuj(x,y);} c=getch(); break; case prawo: while(!kbhit()){if(!przegrana(++x,y))rysuj(x,y);} c=getch(); break; } } //////////////////////////////////////////////////////////////////////////// int main(int argc, char*argv[]) { // wezyk gra(56); // while(1)gra.przesun(); system("pause"); return 0; } ////////////////////////////////////////////////////////////////////////////// void wyborplanszy() { czekajczysc(0); int wybor; gotoxy(center-srodek(22), middle); cout << "Wybierz numer planszy!"; gotoxy(center-srodek(10), middle+2); cout << "Wybieram: "; cin >> wybor; game.wczytaj(wybor); czekajczysc(0); gotoxy(center-srodek(10), middle); cout << "Zmieniono!"; czekajczysc(600); menu(); } void nowagra() { game.pokazplansze(); game.zmienxy(center,middle+9); while(1) game.przesun(); } void poziomtrud() {} void opcje() {} void hof() {} {}

// Problem, o którym mowa w topicu poniżej
Użytkownik Grzese edytował ten post 20 grudzień 2007, 07:50


Powalcz z wektorem, wrzucaj tam współrzędne i kasuj kiedy już nie będą potrzebne

No tak tylko wiem że współrzędne można doklejać push_back. Ale jak usuwać pierwszy element zwalniając miejsce? Tzn. 2 element przesuwa się na miejsce 1, kiedy 1 znika. Wiem, że do takiego coś służy queue... da się tego jakoś użyć? Czy może vector ma jakąś specjalną funkcję? Może muszę napisać ją sam?


No tak tylko wiem że współrzędne można doklejać push_back. Ale jak usuwać pierwszy element zwalniając miejsce? Tzn. 2 element przesuwa się na miejsce 1, kiedy 1 znika. Wiem, że do takiego coś służy queue... da się tego jakoś użyć? Czy może vector ma jakąś specjalną funkcję? Może muszę napisać ją sam?

Jeżeli zapełnisz sobie wektor jakimiś współrzędnymi, a potem wywalisz pierwszy element za pomocą erase() to elementy pozostałe automatycznie się przesuną. Zrób sobie test z wektorem, usuń pierwszy element a potem ponownie go wywołaj i zobaczysz że to w rzeczywistości ten drugi który stał sie teraz pierwszym.



albo mniej eleganckie rozwiazanie, ale takie prostsze na początek to przyswojenia...
plansza niech bedzie tablicą intów dwuwymiarową jak najedziesz na jakies pole to nadaj mu wartosc równa długosci węża, po kazdym ruchu przebiegasz po całej planszy i jak gdzies jest liczba wieksza od 1 to ją zmniejszasz o jeden, nastepnie rysujesz węża w miejscach gdzie w planszy jest liczba różna od 0

#include <cstdlib> #include <iostream> #include <windows.h> #include <stdio.h> #include <conio.h> #include <fstream> #include <vector.h> #define ILOSC 3 #define ND -1 #define MEKRAN 1920 enum poziom { btrudny = 40, trudny=100, sredni=200, latwy=280, blatwy=340 }; enum kierunki { gora=56, dol=53, lewo=52, prawo=54 }; enum pozycjax { lft=0, center=40, rgt=80 }; enum pozycjay { top=0, middle=13, bottom=25 }; int ogrprawo,ogrlewo,ogrgora,ogrdol; int uzycie; int wybory; int iler = 0; using namespace std; /////////////////////////////////////////////////////////// // deklaracje void nowagra(); void wyborplanszy(); void poziomtrud(); void opcje(); void hof(); void gotoxy(const int & x, const int & y) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); COORD pas; pas.X=x-1; pas.Y=y-1; SetConsoleCursorPosition(hCon, pas); } int srodek(int a) { if(a%2==0){ a/=2; return a; } else{ a=(a+1)/2; return a; } } void czekajczysc(int a) { Sleep(a); system("CLS"); } const void ogranieczeniewyboru(int &x,int &y) { if(y!=ND) { if(y<ogrgora) y=ogrgora; if(y>ogrdol) y=ogrdol; } if(x!=ND) { if(x<ogrlewo) x=ogrlewo; if(x>ogrprawo) x=ogrprawo; } } int kursorwyboru(int x1, int x2, int y) { uzycie = ND; gotoxy(x1,y); cout << "["; gotoxy(x2,y); cout << "]"; wybory=1; while(wybory!=57) { wybory=getch(); switch(wybory) { case gora: gotoxy(x1, y); cout << " "; gotoxy(x2, y); cout << " "; y-=1; break; case dol: gotoxy(x1, y); cout << " "; gotoxy(x2,y); cout << " "; y+=1; break; default: break; } ogranieczeniewyboru(uzycie,y); gotoxy(x1,y); cout << "["; gotoxy(x2,y); cout << "]"; } return y; } void menu() { gotoxy(center-srodek(29), middle-5); cout << " W ~~~~ E ~~~~ Z ~~~~ Y ~~ K "; gotoxy(center-srodek(10),middle-3); cout << " Nowa gra "; gotoxy(center-srodek(15), middle-2); cout << " Wybor planszy "; gotoxy(center-srodek(25), middle-1); cout << " Wybor poziomu trudnosci "; gotoxy(center-srodek(7), middle); cout << " Opcje "; gotoxy(center-srodek(14), middle+1); cout << " Hall of Fame "; gotoxy(center-srodek(7), middle+2); cout << " Wyjdz "; ogrgora = middle-3; ogrdol = middle+2; ogrprawo = kursorwyboru(center-srodek(29)-2, srodek(29)+center, middle-3); switch(ogrprawo) { case middle-3: nowagra(); break; case middle-2: wyborplanszy(); break; case middle-1: poziomtrud(); break; case middle: opcje(); break; case middle+1: hof(); break; case middle+2: exit(1); default: cout << " zle ! "; break; } } class levele; ///////////////////////////////////////////////////// class wezyk { char plansza[MEKRAN][2]; int x,y,xt,yt; int pozpocz, poztrud, punktow, ilosc, c; friend void poziomtrud(); friend void wyborplanszy(); friend class levele; bool przegrana(const int & x, const int & y); void rysuj(const int & x, const int & y); // tu void zmienxy(int xz,int yz=0) { x=xz; y=yz; } void wczytaj(int wybor); public: wezyk(int cd=gora) : punktow(5), pozpocz(0), ilosc(1), c(cd), poztrud(sredni) // ZMIENIC PKT { gotoxy(center-srodek(19), middle); cout << " W - E - Z - Y - K " << endl; wczytaj(2); pozycjapoczatkowa(); // zebym nie przegral zmiena wartosci plansza[miejsce][1] na 1 czekajczysc(80); menu(); } void pozycjapoczatkowa(); void pokazplansze(); void przesun(); int losujpozycje(); void wstawelement(int); static char losujco(); //static? void loswst(); int * liczbanapoz(int); const void zmienxyliczba(int &a); const int poznaliczbe(int , int ); }; const int wezyk::poznaliczbe(int x, int y) { static int liczba; liczba = 0; liczba = y*80 + x; return liczba; } int * wezyk::liczbanapoz(int a) { int * wsk; wsk = new int[2]; wsk[0]=0; if(a%80!=0) while(a%80!=0) { --a; ++wsk[0]; } wsk[1]=a/80; return wsk; } void wezyk::pozycjapoczatkowa() { static int * w = liczbanapoz(pozpocz); zmienxy(w[0],w[1]); } void wezyk::loswst() { ++iler; if(iler%4==0) wstawelement(losujpozycje()); } int wezyk::losujpozycje() { srand((unsigned) time(NULL)); cout << rand()%(MEKRAN-1); Sleep(2000); return rand()%(MEKRAN-1); } char wezyk::losujco() { static int x; srand((unsigned) time(NULL)); rand()%4; if(x==0) return '@'; if(x==1) return '$'; if(x==2) return '%'; if(x==3) return '&'; } void wezyk::wstawelement(int a) { static int * wsk; wsk = liczbanapoz(a); if(plansza[a][0]!='#'&&plansza[a][1]==0) { zmienxyliczba(a); gotoxy(xt,yt); cout << (plansza[a][0]=losujco()); } else wstawelement(losujpozycje()); } class levele { friend class wezyk; char level[ILOSC+1][2]; void wczytajlvle(); public: levele() { wczytajlvle(); gotoxy(center-srodek(25), middle); cout << " Wczytywanie leveli zakonczone! "<<endl; czekajczysc(900); } void wypiszlvle(); }; levele podstawowy; wezyk game; //////////////////////// void wezyk::pokazplansze() { system("CLS"); gotoxy(1,1); for(int k=0; k<MEKRAN; ++k) if(plansza[k][0]=='0') cout << " "; else cout << plansza[k][0]; } void levele::wczytajlvle() { char c = 'a'; int i=0, p=1; ifstream g("lvle.wg"); while(i<=(ILOSC+1)*2) { g.seekg(i++); g.getŠ; if(i%2==0) { level[p][1]=c; ++p; } else{ level[p][0]=c; } } g.close(); } void levele::wypiszlvle() { gotoxy(center, middle-1); for(int i=1; i<ILOSC+1; ++i) {for(int c=0; c<2; ++c) cout << level[i][c]; cout << endl; } } void wezyk::wczytaj(int wybor) { char c; int k; char aktualnylvl[7]; for(k=0; k<2; ++k) aktualnylvl[k]=podstawowy.level[wybor][k]; aktualnylvl[2]='.'; aktualnylvl[3]='l'; aktualnylvl[4]='v'; aktualnylvl[5]='l'; aktualnylvl[6]=NULL; ifstream w(aktualnylvl); // w.read(game.plansza, MEKRAN); for(k=0; k<MEKRAN; ++k) { w.getŠ; game.plansza[k][0]=c; game.plansza[k][1]=0; } while(w.getŠ!=0) { w.seekg(k++); pozpocz = pozpocz*10 + atol(&c); } w.close(); } bool wezyk::przegrana(const int & x, const int & y) { if(x!=0&&x!=80&&y!=1&&y!=25&&plansza[(y-1)*80+x-1] [0]!='#')return false; else { Sleep(8000); system("CLS"); gotoxy(35,12); cout << " PRZEGRALES " << endl; Sleep(4000); menu(); } } const void wezyk::zmienxyliczba(int &a) { static int * wskaznikrysowania; wskaznikrysowania=liczbanapoz(a); xt = wskaznikrysowania[0]; yt = wskaznikrysowania[1]; } void wezyk::rysuj(const int & x, const int & y) { static int ostatnia; static int k; k=poznaliczbe(x,y); Sleep(poztrud); if(plansza[k][0]=='@'||plansza[k][0]=='$'||plansza[ k][0]=='%'||plansza[k][0]=='&')++punktow; plansza[k][1]=punktow; for(k=0; k<MEKRAN; ++k) { zmienxyliczba(k); if(plansza[k][1]!=0) { gotoxy(xt,yt); cout << "X"; --plansza[k][1]; if(plansza[k][1]==0) ostatnia=k; } } zmienxyliczba(ostatnia); gotoxy(xt,yt); cout << " "; } void wezyk::przesun() { static int poprzednia; poprzednia = c; switchŠ { default: c=gora; break; case gora: while(!kbhit()){if(!przegrana(x,--y)){rysuj(x,y);} loswst();} c=getch(); break; case dol: while(!kbhit()){if(!przegrana(x,++y)){rysuj(x,y);} loswst();} c=getch(); break; case lewo: while(!kbhit()){if(!przegrana(--x,y)){rysuj(x,y);} loswst();} c=getch(); break; case prawo: while(!kbhit()){if(!przegrana(++x,y)){rysuj(x,y);} loswst();} c=getch(); break; } if(poprzednia==lewo||poprzednia==prawo) { if((poprzednia==c-2||poprzednia==c+2)&&c!=gora)c=poprzednia; } else if(poprzednia==gora||poprzednia==dol) if(poprzednia==c-3||poprzednia==c+3)c=poprzednia; } //////////////////////////////////////////////////////////////////////////// int main() { system("pause"); return 0; } ////////////////////////////////////////////////////////////////////////////// void wyborplanszy() { czekajczysc(0); int wybor; gotoxy(center-srodek(22), middle); cout << "Wybierz numer planszy!"; gotoxy(center-srodek(10), middle+2); cout << "Wybieram: "; cin >> wybor; game.wczytaj(wybor); czekajczysc(0); gotoxy(center-srodek(10), middle); cout << "Zmieniono!"; czekajczysc(600); menu(); } void nowagra() { game.pokazplansze(); while(1) game.przesun(); } void poziomtrud() { system("CLS"); ogrgora=middle-2; ogrdol=middle+2; gotoxy(center-srodek(26),middle-4); cout << "Wybierz poziom trudnosci:"; gotoxy(center-srodek(13),middle-2); cout << "BARDZO TRUDNY"; gotoxy(center-srodek(6),middle-1); cout << "trudny"; gotoxy(center-srodek(6),middle); cout << "sredni"; gotoxy(center-srodek(5),middle+1); cout << "latwy"; gotoxy(center-srodek(12),middle+2); cout << "BARDZO LATWY"; ogrprawo = kursorwyboru(center-srodek(13)-2, srodek(13)+center, middle-2); switch(ogrprawo) { case middle-2: game.poztrud = btrudny; break; case middle-1: game.poztrud = trudny; break; case middle: game.poztrud = sredni; break; case middle+1: game.poztrud = latwy; break; case middle+2: game.poztrud = blatwy; break; default: cout << " zle ! "; break; } system("CLS"); menu(); } void opcje() {} void hof() {}

Program wyłącza się w losowym momencie? Bez uprzedzenia i bez sygnalizacji błędu. Co jest nie tak? Ruch węża działa.

Zastanawiam się czy bład nie tkwi:

int wezyk::losujpozycje() { srand((unsigned) time(NULL)); cout << rand()%(MEKRAN-1); // MEKRAN to ilosc elementow tablicy Sleep(2000); return rand()%(MEKRAN-1); } oraz void wezyk::wstawelement(int a) { static int * wsk; wsk = liczbanapoz(a); if(plansza[a][0]!='#'&&plansza[a][1]==0) { zmienxyliczba(a); gotoxy(xt,yt); cout << (plansza[a][0]=losujco()); } else wstawelement(losujpozycje()); }

Dlaczego zawsze w wyniku losowania, gdy wylosowana liczba nie spełnia kryteriów (jest w tablicy o tym numerze znak '#') "losowana" jest kolejna liczba, która o dziwo wynosi tyle co poprzednia+10 (najczęściej dokładnie tyle, czasem trochę mniej lub więcej)? Dlaczego jest ona zawsze większa?

//Już wiem czemu się wyłącza! Z niewiadomych przyczyn losowanie nie działa poprawnie, i współrzędna x leci w prawo (zwiększa się). jak dojdzie do rogu ekranu, to program wisi. A jakoże pierwszy symbol pojawia się w rzeczywiście losowym punkcie, to czasem działa dłużej, czasem nie.

//Problem rozwiązany. Po wywaleniu linijki srand((unsigned) time(NULL)); z losujpozycje() wszytko działa ok. Teraz proszę tylko mi wytłumaczyć, dlaczego z nią nie działało? Czy nie może być 2 wywołań srand((unsigned) time(NULL)); 2 różnych funkcjach?
Użytkownik Grzese edytował ten post 20 grudzień 2007, 14:24
Mój program to wężyk. Wszystko działa w najlepszym porządku, poza tym, że elementy, które może zjeść wąż pojawiają się czasami w miejsach, gdzie nie mogą. Dzieje się to raczej rzadko, co jednak uniemożliwia rozgrywkę (po wejściu w pole, które przecież jest murem, wąż ginie. Elementy nie znikają, więc liczba możłiwych do zebrania bonusów (początkowo max 3) zmniejsza się o 1. Gdy sytuacja się powtarza, waż zostaje bez pokarmu ;-( ) Zabraniam im to w funkcji:

void wezyk::wstawelement(int a) { if(plansza[a][0]!='#'&&plansza[a][1]==0) { zmienxyliczba(a); gotoxy(xt,yt); cout << (plansza[a][0]=losujco()); } else wstawelement(losujpozycje()); }

Gdzie plansza to tablica char o liczbie elementów 1920 (cały ekran konsoli, bez jednej, ostatniej 80-znakowej linijki) i 2 wymiarach. W polu 0 wpisuję odczytane z pliku tekstowego dane planszy (tzn. przepisuję po kolei, element po elemencie), a w pliku 1 dane nieistotne w moim mniemaniu do rozwiązania problemu. Funkcja wypisz wypisuje na początku gry elementy tablicy i na ekranie pojawia się mapa. Tak więc wydaje mi się, wręcz jestem pewien, że ten fragment programu działa dobrze i nie jest on przyczyną późniejszych problemów (przecież '#' wypisywane są w miejscach, które wskazałem i oczekuję). Jakoże program jest dość długi i na pewno nikomu nie będzie się chciało przeglądać jego zawartości linijka po linijce, zamieszczam tylko funkcje, które mają wpływa na pojawianie się bonusów.

Powinno być tak (tzn. "bonusy" - tak je nazwę - czyli "@,$,& i %, nie pojawiają się na polach z '#');
http://xs322.xs.to/x.../dobrefdfdf.png

A jest tak:
http://xs322.xs.to/x...10/zled5456.png

Pozostałe funkcje, których używam w powyższej:

void wezyk::loswst() { ++iler; if(iler%czestbon==0&&ilebon<3) { iler=0; wstawelement(losujpozycje()); ++ilebon; } }

Funkcja wstawia element tylko wtedy, gdy liczba elementów na planszy nie przekracza 3 oraz określona jest częstotliwość pojawiania się bonusów. Tutaj nie wydaje mi się, aby był jakiś błąd. Funkcja spełnia swoje zadanie.

int wezyk::losujpozycje() { static int x; x = rand()%MEKRAN; }

Co do tej funkcji mam wątpliwości. Właściwie tylko ona, oraz funkcja wstawelement(int) (na samej górze), ma wpływ na to, gdzie pojawi się bonus.

char wezyk::losujco() { static int x; srand((unsigned) time(NULL)); x=rand()%2; if(x==1) { x=rand()%CZESTLEP; if(x==0) return '$'; if(x==1) return '%'; if(x==2) return '&'; } return '@'; }

W tej funkcji losuję, który bonus wyświetli się na mapie. Tutaj też trudno dopatrzeć się przyczyny błędów.

void gotoxy(const int & x, const int & y) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); COORD pas; pas.X=x-1; pas.Y=y-1; SetConsoleCursorPosition(hCon, pas); }
Funkcja najczęściej używana w programie. Działa bez zarzutu.
Użytkownik Grzese edytował ten post 23 grudzień 2007, 18:57
Popraw wszelkie warunki tego typu:
(iler%czestbon==0&&ilebon<3)
rozdzielając to co trzeba nawiasami. Bo możliwe że kompilator interpretuje to inaczej niż Ty byś chciał.
np.
((iler%czestbon==0) && (ilebon<3))

//
if(plansza[a][0] !='#' && plansza[a][1]==0 )
plansza[a][1] zawsze zawiera 0?
Użytkownik Ali240 edytował ten post 23 grudzień 2007, 19:13
Tak, zawiera. Sprawdzałem poprzez wypisywanie każdorazowo. Niestety umieszczenie w nawiasy nie pomogło. Zastanawiam się, czy możliwa jest sytuacja że program wreszcie "głupieje" i wokonuje instrukcję, kiedy wiele, wiele razy losowanie nie przynosi spodziewanego efektu (czyli zmiany pola na dobre) - wywołuję przecież rekurencję.

Zauważyłem jeszcze jedno. Zawsze na początku "wylosowywana" jest liczba 42... tutaj warunek nie jest spełniony, ale zostaje wylosowana "poprawna" liczba i obiekty nie sa umieszczane w polach z '#'... Jest jeszcze dużo sytuacji, w których funkcja zachowuje się dobrze, mimo, że wylosowana została początkowo "zła" pozycja wstawianego elementu.
Użytkownik Grzese edytował ten post 23 grudzień 2007, 20:10
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •