XardassLord Temat założony przez niniejszego użytkownika |
» 2013-05-23 23:23:17 Dzięki bardzo za podpowiedź :) Przerobiłem funkcję ruch, niby trochę na około ale nie ogarniam jeszcze optymalizacji ;d No ale najważniejsze, że działa :) Teraz chciałbym, aby wąż po każdym zjedzeniu jabłka rósł o jedno pole. Myślałem, żeby robić to na liście bądź na wektorach, ale nigdy jeszcze nie przerabiałem tych elementów, więc nie wiem czy się połapię. Wiem tylko że można tam łatwo dodawać element na początek i usuwać element z ostatniego miejsca, ale co i jak to już nie wiem. Macie jakieś porady dla mnie czy to byłoby dobre rozwiązanie? Czy może jest jeszcze jakieś inne, łatwiejsze? Poniżej przesyłam ponownie cały kod (zmianie uległa przede wszystkim funkcja ruch() ) #include <iostream> #include <conio.h> #include <cstdlib> #include <ctime> #include <Windows.h>
using namespace std;
void zeruj_mape( char mapa[ 20 ][ 60 ] ); void rysuj_mape( char mapa[ 20 ][ 60 ] ); void wstaw_weza( char mapa[ 20 ][ 60 ], int & x, int & y ); void ruch( char mapa[ 20 ][ 60 ], int & x, int & y, char & ruch ); bool koniec( char mapa[ 20 ][ 60 ], int & x, int & y ); void losuj_jablko( char mapa[ 20 ][ 60 ], int & x, int & y, int & jx, int & jy, int & pkt );
int main() { srand( time( NULL ) ); char mapa[ 20 ][ 60 ]; int x = 30; int y = 10; int jx = rand() % 59; int jy = rand() % 19; int punkty = 0; char kierunek = 'w'; do { system( "cls" ); zeruj_mape( mapa ); wstaw_weza( mapa, x, y ); losuj_jablko( mapa, x, y, jx, jy, punkty ); rysuj_mape( mapa ); ruch( mapa, x, y, kierunek ); koniec( mapa, x, y ); } while( !koniec( mapa, x, y ) ); cout << "\n\n KONIEC GRY!"; cout << "\n\n Twoj wynik to: " << punkty; getch(); return 0; }
void zeruj_mape( char mapa[ 20 ][ 60 ] ) { for( int i = 0; i < 20; i++ ) for( int j = 0; j < 60; j++ ) mapa[ i ][ j ] = 0; }
void rysuj_mape( char mapa[ 20 ][ 60 ] ) { cout << " ------------------------------------------------------------" << endl; for( int i = 0; i < 20; i++ ) { cout << "|"; for( int j = 0; j < 60; j++ ) { if( mapa[ i ][ j ] == 0 ) mapa[ i ][ j ] = 32; cout << mapa[ i ][ j ]; } cout << "|"; cout << endl; } cout << " ------------------------------------------------------------" << endl; }
void wstaw_weza( char mapa[ 20 ][ 60 ], int & x, int & y ) { mapa[ y ][ x ] = 'O'; }
void ruch( char mapa[ 20 ][ 60 ], int & x, int & y, char & ruch ) { if( kbhit() ) { Sleep( 100 ); ruch = getch(); if( ruch == 'w' ) y--; if( ruch == 's' ) y++; if( ruch == 'a' ) x--; if( ruch == 'd' ) x++; } else { Sleep( 100 ); if( ruch == 'w' ) y--; if( ruch == 's' ) y++; if( ruch == 'a' ) x--; if( ruch == 'd' ) x++; } }
bool koniec( char mapa[ 20 ][ 60 ], int & x, int & y ) { bool test = false; if( x < 0 || x > 59 ) { test = true; system( "cls" ); return test; } if( y < 0 || y > 19 ) { test = true; system( "cls" ); return test; } return test; }
void losuj_jablko( char mapa[ 20 ][ 60 ], int & x, int & y, int & jx, int & jy, int & pkt ) { if( x == jx && y == jy ) { jx = rand() % 59; jy = rand() % 19; pkt++; } mapa[ jy ][ jx ] = '*'; }
EDIT: Dodałem też pętlę w funkcji losuj_jabłko, która nie pozwala na wylosowanie jabłka w miejscu, w którym znajduje się aktualnie wąż :) void losuj_jablko( char mapa[ 20 ][ 60 ], int & x, int & y, int & jx, int & jy, int & pkt ) { if( x == jx && y == jy ) { do { jx = rand() % 59; jy = rand() % 19; } while( jx == x && jy == y ); pkt++; } mapa[ jy ][ jx ] = '*'; }
|
pekfos |
» 2013-05-24 15:42:50 Mapa ma ograniczone rozmiary, więc wąż też. Do zrobienia tego wystarczy tablica (i jedna zmienna): Pierwszy element będzie głową, a kolejne n elementów to ogon. Przy poruszaniu, kopiuj elementy o jeden indeks dalej (element m skopiuj w miejsce elementu m+1), a głowie nadaj nowe współrzędne. Jeśli w nowym miejscu głowy będzie jedzenie, zwiększ wartość zmiennej z rozmiarem węża. Jako elementu tablicy użyj struktury ze współrzędnymi kawałka węża. Jeżeli jeszcze nie znasz struktur, równie dobrze możesz użyć dwóch tablic intów: jednej dla współrzędnej X, a drugiej dla Y. |