Nadesłany przez gchlebus, 20 lutego 2011 02:42
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
tetris/tetris.cpp:
#include "stdafx.h" #include "glut.h" #include "glut_funcs.h" #include "pole.h" #include "cegielka.h" #include <cstdlib> #include <ctime> #include <fstream> #define default_speed 300 //################################################################### //DEKLARACJE FUNKCJI void drawScene(); void handleKeypress(unsigned char key, int x, int y); void rysuj_kostke(float x, float y,int w, float *kolor); void rysuj_gre(); void update(int value); void end_game(); //################################################################### //ZMIENNE GLOBALNE int h=31,w=19; //wymiary pola gry cegielka *element; pole obszar(h,w); //utworzenie obiektu bedacego polem gry ofstream wynik; //strumien wyjscia do zapisu do pliku int score=0; int speed=default_speed; //predkosc opadania cegielek bool mov = false; //zmienna logiczna okreslajaca czy cegielka w danej chwili spada float kolor[][3] = { {0.2,0.2,0.2}, //kolor ramki {0.88,0.93,0.88}, //kolor tla {0.54,0.17,0.89},{0.5,1,0},{0.18,0.31,0.31},{1,0.14,0},{1,1,0},{1,0.41,0.71},{0.55,0.15,0},{0.75,0.24,1} }; //################################################################### int _tmain(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 800); glutCreateWindow("Tetris"); initRendering(); glutDisplayFunc(drawScene); glutKeyboardFunc(handleKeypress); glutReshapeFunc(handleResize); glutTimerFunc(25, update, 0); glutMainLoop(); system("pause"); return 0; } //################################################################### void drawScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glTranslatef(0,0,-50); rysuj_gre(); glPopMatrix(); glutSwapBuffers(); } //################################################################### void handleKeypress(unsigned char key, //The key that was pressed int x, int y) { //The current mouse coordinates switch (key) { case 27: //Escape key end_game(); case 'a'://lewo if (element->l_check(obszar.wsk)) { element->mov_left(obszar.wsk); } break; case 'd'://prawo if (element->r_check(obszar.wsk)) { element->mov_right(obszar.wsk); } break; case 's': if (mov) { if (element->rot_check(obszar.wsk)) { element = element->rotate(obszar.wsk,w); } } break; case 'f': speed=20; break; } glutPostRedisplay(); } //################################################################### void update(int value) { if (!mov) { obszar.line_check(); //sprawdz czy juz cala linia if (obszar.wsk[2][7]!=0) //warunek game over { end_game(); } speed = default_speed; srand (time(NULL)); //inicjalizacja ziarna dla gen liczb losowych int ktory; do //losuj numer klocka az wypadnie 0 v 2 v 4 v 6 v 10 v 14 v 15 { ktory = rand() % 19; }while (!(ktory == 0 || ktory == 1 || ktory == 2 || ktory == 4 || ktory == 6 || ktory == 10 || ktory == 14 || ktory == 15)); //ktory = 6; int wybor_koloru = rand() % 8 + 1; //losuj kolor element = new cegielka(wybor_koloru, ktory, 7, 2, obszar.wsk); //tworz nowa cegielke w punkcie (x,y)=(7,2) mov=true; }else { mov = element->d_check(obszar.wsk); //sprawdz czy cegielka moze spasc w dol if (mov == true) element->mov_down(obszar.wsk); //jak tak to opusc o jeden w dol if (mov == false) delete element; //jak nie to usun wskaznik na cegielke } glutPostRedisplay(); glutTimerFunc(speed, update, 0); } //################################################################### void rysuj_kostke(float x, float y,int w, float *kolor) // (x,y) - wspolrzedne lewego gornego wierzcholka kostki // w - wybor koloru // *kolor - wskaznik na macierz przechowujaca kolory [x][3]w rgb { glBegin(GL_QUADS); //rysuje kostke w podanych wspolrzendych glColor3f(*(kolor+0+(w+1)*3),*(kolor+1+(w+1)*3),*(kolor+2+(w+1)*3)); glVertex3f(x, y, 0); glVertex3f(x, y-1, 0); glVertex3f(x+1, y-1, 0); glVertex3f(x+1, y, 0); glEnd(); //rysuje ramki kostki, jesli kostka nie jeste tlem lub obramowaniem if (w>0) { glBegin(GL_LINES); glColor3f(0,0,0); //lewa glVertex3f(x, y, 0.0001); glVertex3f(x, y-1, 0.0001); //dolna glVertex3f(x, y-1, 0.0001); glVertex3f(x+1, y-1, 0.0001); //gorna glVertex3f(x, y, 0.0001); glVertex3f(x+1, y, 0.0001); //prawa glVertex3f(x+1, y, 0.0001); glVertex3f(x+1, y-1, 0.0001); glEnd(); } } //################################################################### void rysuj_gre() { //wizualizuje macierz bedaca obszarem gry for (int i=0; i<obszar.zwroc_wysokosc(); i++) { for (int j=0; j<obszar.zwroc_szerokosc(); j++) { rysuj_kostke(j-9,-i+15,obszar.zwroc_komorke(i,j),&kolor[0][0]); } } } void end_game() { //zapis wyniku do pliku score = obszar.get_score(); wynik.open("score.txt",fstream::app); wynik<<"Twoj wynik to: "<<score<<endl; wynik.close(); exit(0); //Exit the program }
tetris/cegielka.cpp:
#include "StdAfx.h" #include "cegielka.h" //tablice zawierajace wspolrzedne kwadratow wchodzacych w sklad kazdej cegielki wzgledem ukladu wspolrzednych o poczatku w kwadracie bedacym hot pointem int y_elementy[][4]= { {0,1,2,3},{0,0,0,0}, //0,1 {0,0,1,1},{0,1,1,2}, //2,3 {1,1,0,0},{0,1,1,2}, //4,5 {0,0,1,2},{0,1,1,1},{0,1,2,2},{0,-1,-1,-1}, //6,7,8,9 {0,0,1,2},{0,0,0,1},{0,0,-1,-2},{0,1,1,1}, //10,11,12,13 {0,0,1,1}, //14 {0,0,0,1},{0,1,2,1},{0,0,0,-1},{0,1,2,1} //15,16,17,18 }; int x_elementy[][4]= { {0,0,0,0},{0,1,2,3}, {0,1,1,2},{1,1,0,0}, {0,1,1,2},{0,0,1,1}, {0,1,1,1},{0,0,-1,-2},{0,0,0,1},{0,0,1,2}, {0,-1,-1,-1},{0,1,2,2},{0,1,1,1},{0,0,1,2}, {0,1,1,0}, {0,1,2,1},{0,0,0,-1},{0,1,2,1},{0,0,0,1} }; //############################################################################## cegielka::cegielka(int k, int n, int x, int y, int **ptr) { kolor = k; numer = n; for (int i=0; i<4; i++) { ptr[y+y_elementy[numer][i]][x+x_elementy[numer][i]]=kolor; xcoords[i]=x+x_elementy[numer][i]; ycoords[i]=y+y_elementy[numer][i]; } } //############################################################################## cegielka::~cegielka(void) { } //############################################################################## int cegielka::get_numer() { return numer; } //############################################################################## bool cegielka::l_check(int **ptr) { switch (numer) { case 0: for (int i=0; i<4; i++) { if( ptr[ycoords[i]][xcoords[i]-1]!=0) return false; } return true; break; case 1: if( ptr[ycoords[0]][xcoords[0]-1]!=0) return false; return true; break; case 2: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; return true; break; case 3: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 4: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; return true; break; case 5: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[1]][xcoords[1]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 6: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 7: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 8: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[1]][xcoords[1]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; return true; break; case 9: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[1]][xcoords[1]-1]!=0) return false; return true; break; case 10: if (ptr[ycoords[1]][xcoords[1]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 11: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 12: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 13: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[1]][xcoords[1]-1]!=0) return false; return true; break; case 14: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 15: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 16: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 17: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[3]][xcoords[3]-1]!=0) return false; return true; break; case 18: if (ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if (ptr[ycoords[1]][xcoords[1]-1]!=0) return false; if (ptr[ycoords[2]][xcoords[2]-1]!=0) return false; return true; break; } return false; } //############################################################################## bool cegielka::r_check(int **ptr) { switch (numer) { case 0: for (int i=0; i<4; i++) { if( ptr[ycoords[i]][xcoords[i]+1]!=0) return false; } return true; break; case 1: if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 2: if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 3: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 4: if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 5: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 6: if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 7: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; return true; break; case 8: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 9: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 10: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 11: if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 12: if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 13: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 14: if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; return true; break; case 15: if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 16: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[1]][xcoords[1]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; return true; break; case 17: if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; case 18: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[2]][xcoords[2]+1]!=0) return false; if( ptr[ycoords[3]][xcoords[3]+1]!=0) return false; return true; break; } return false; } //############################################################################## bool cegielka::d_check(int **ptr) { switch (numer) { case 0: if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 1: for (int i=0;i<4;i++) { if (ptr[ycoords[i]+1][xcoords[i]]!=0) return false; } return true; break; case 2: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 3: if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 4: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 5: if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 6: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 7: if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 8: if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 9: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 10: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 11: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 12: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; return true; break; case 13: if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 14: if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 15: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 16: if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; case 17: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[1]+1][xcoords[1]]!=0) return false; if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; return true; break; case 18: if( ptr[ycoords[2]+1][xcoords[2]]!=0) return false; if( ptr[ycoords[3]+1][xcoords[3]]!=0) return false; return true; break; } return false; } //############################################################################## bool cegielka::rot_check(int **ptr) { switch (numer) { case 0: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+2]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+3]!=0) return false; return true; case 1: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]]!=0) return false; if( ptr[ycoords[0]+3][xcoords[0]]!=0) return false; return true; case 2: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]]!=0) return false; return true; case 3: if( ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]+1]!=0) return false; return true; case 4: if( ptr[ycoords[0]-1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]+1]!=0) return false; return true; case 5: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+2]!=0) return false; return true; case 6: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+2]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]+2]!=0) return false; return true; case 7: if( ptr[ycoords[0]][xcoords[0]-1]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]-1]!=0) return false; return true; case 8: if( ptr[ycoords[0]+1][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]-1]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]-1]!=0) return false; return true; case 9: if( ptr[ycoords[0]-2][xcoords[0]]!=0) return false; if( ptr[ycoords[0]-2][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; return true; case 10: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]-2]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]]!=0) return false; return true; case 11: if( ptr[ycoords[0]+1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]-1][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]+1]!=0) return false; return true; case 12: if( ptr[ycoords[0]-1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]-1][xcoords[0]+2]!=0) return false; if( ptr[ycoords[0]-2][xcoords[0]]!=0) return false; return true; case 13: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+2]!=0) return false; return true; case 15: if( ptr[ycoords[0]+2][xcoords[0]+2]!=0) return false; if( ptr[ycoords[0]+1][xcoords[0]+2]!=0) return false; return true; case 16: if( ptr[ycoords[0]+2][xcoords[0]-1]!=0) return false; if( ptr[ycoords[0]+2][xcoords[0]-2]!=0) return false; return true; case 17: if( ptr[ycoords[0]-1][xcoords[0]]!=0) return false; if( ptr[ycoords[0]-2][xcoords[0]]!=0) return false; return true; case 18: if( ptr[ycoords[0]][xcoords[0]+1]!=0) return false; if( ptr[ycoords[0]][xcoords[0]+2]!=0) return false; return true; } return false; } //############################################################################## int cegielka::get_xcoords(int i) { return xcoords[i]; } //############################################################################## int cegielka::get_ycoords(int i) { return ycoords[i]; } //############################################################################## void cegielka::set_xcoords(int i, int value) { xcoords[i] = value; } //############################################################################## void cegielka::set_ycoords(int i, int value) { ycoords[i] = value; } //############################################################################## void cegielka::mov_down(int **ptr) { for (int i=0; i<4; i++) { ptr[ycoords[i]++][xcoords[i]]=0; } for (int i=0; i<4; i++) { ptr[ycoords[i]][xcoords[i]]=kolor; } } //############################################################################## void cegielka::mov_right(int **ptr) { for (int i=0; i<4; i++) { ptr[ycoords[i]][xcoords[i]++]=0; } for (int i=0; i<4; i++) { ptr[ycoords[i]][xcoords[i]]=kolor; } } //############################################################################## void cegielka::mov_left(int **ptr) { for (int i=0; i<4; i++) { ptr[ycoords[i]][xcoords[i]--]=0; } for (int i=0; i<4; i++) { ptr[ycoords[i]][xcoords[i]]=kolor; } } //############################################################################## cegielka* cegielka::rotate(int **ptr, int w) { erase(ptr); cegielka *wsk; switch (numer) { case 0: wsk = new cegielka(kolor, 1, xcoords[0],ycoords[0], ptr); delete this; return wsk; case 1: wsk = new cegielka(kolor, 0, xcoords[0], ycoords[0], ptr); delete this; return wsk; case 2: wsk = new cegielka(kolor, 3, xcoords[0], ycoords[0], ptr); delete this; return wsk; case 3: wsk = new cegielka(kolor, 2, xcoords[0]-1,ycoords[0], ptr); delete this; return wsk; case 4: wsk = new cegielka(kolor, 5, xcoords[0], ycoords[0]-1, ptr); delete this; return wsk; case 5: wsk = new cegielka(kolor, 4, xcoords[0],ycoords[0], ptr); delete this; return wsk; case 6: wsk = new cegielka(kolor, 7, xcoords[0]+2, ycoords[0], ptr); delete this; return wsk; case 7: wsk = new cegielka(kolor, 8, xcoords[0]-1,ycoords[0], ptr); delete this; return wsk; case 8: wsk = new cegielka(kolor, 9, xcoords[0]-1,ycoords[0]+2, ptr); delete this; return wsk; case 9: wsk = new cegielka(kolor, 6, xcoords[0], ycoords[0]-2, ptr); delete this; return wsk; case 10: wsk = new cegielka(kolor, 11, xcoords[0]-2,ycoords[0]+1, ptr); delete this; return wsk; case 11: wsk = new cegielka(kolor, 12, xcoords[0], ycoords[0]+1, ptr); delete this; return wsk; break; case 12: wsk = new cegielka(kolor, 13, xcoords[0],ycoords[0]-2, ptr); delete this; return wsk; break; case 13: wsk = new cegielka(kolor, 10, xcoords[0]+2, ycoords[0], ptr); delete this; return wsk; //14 skipnieta bo to kwadrat case 15: wsk = new cegielka(kolor, 16, xcoords[0]+2, ycoords[0], ptr); delete this; return wsk; case 16: wsk = new cegielka(kolor, 17, xcoords[0]-2,ycoords[0]+2, ptr); delete this; return wsk; case 17: wsk = new cegielka(kolor, 18, xcoords[0], ycoords[0]-2, ptr); delete this; return wsk; case 18: wsk = new cegielka(kolor, 15, xcoords[0],ycoords[0], ptr); delete this; return wsk; } wsk = new cegielka(kolor, numer, xcoords[0],ycoords[0], ptr); delete this; return wsk; } //############################################################################## void cegielka::erase(int **ptr) { for (int i=0; i<4; i++) { ptr[ycoords[i]][xcoords[i]]=0; } }
tetris/pole.cpp:
#include "StdAfx.h" #include "pole.h" pole::pole(int h, int w) { wysokosc = h; szerokosc = w; score = 0; wsk = pole::tworz_pole(); } //############################################################################## pole::~pole(void) { } //############################################################################## int** pole::tworz_pole() { int **wsk = new int*[wysokosc]; for (int i=0;i<wysokosc;i++) { wsk[i] = new int[szerokosc]; } for (int i=0; i<wysokosc; i++) { for (int j=0; j<szerokosc; j++) { if (j==0) wsk[i][j]=-1; else if (j==szerokosc-1) wsk[i][j]=-1; else if (i==wysokosc-1) wsk[i][j]=-1; else wsk[i][j]=0; } } return wsk; } //############################################################################## void pole::line_check() { int tempchk; for (int i=wysokosc-2; i>0; i--) { tempchk=0; for (int j=1; j<szerokosc-1;j++) { if (wsk[i][j]!=0) tempchk++; } if (tempchk == szerokosc-2) line_erase(i++); } } //############################################################################## void pole::line_erase(int num) { //mrygaj(num, 1); score++; for (int i=num; i>0; i--) { for (int j=1; j<szerokosc-1; j++) { wsk[i][j]=wsk[i-1][j]; } } } //############################################################################## void pole::mrygaj(int num, int ile) { for (int i=0; i<ile; i++) { for (int j=1; j<szerokosc-1; j++) { wsk[num][j]=2; } } }