logo资料库

opengl实现俄罗斯方块.docx

第1页 / 共22页
第2页 / 共22页
第3页 / 共22页
第4页 / 共22页
第5页 / 共22页
第6页 / 共22页
第7页 / 共22页
第8页 / 共22页
资料共22页,剩余部分请下载后查看
共 分 为 2 个 头 文 件 和 3 个 .cpp 文 件 , 分 别 为 Draw.h,Draw.cpp,keylistener.h,keylistener.cpp 和 Main.cpp 1、Draw.h class draw { public : draw(); ~draw(); static void draw_rect(int leftX, int leftY, int color); static void draw_line(int startX, int startY, int endX, int endY,int color[3]); static void display();
static void rand_stone_and_placedir(int& stone, int& pd); static void get_brick_mode(int stone, int mode[4][4][2]); static void display_next_brick(int stone, int pd,int mode[4][4][2]); static void drawString(char *str); static void draw_char(char* str); static void draw_Text(); void get_map(int *map[12]); int* get_stone(); int* get_score(); int* get_placedir(); int* get_drop_flag(); void get_cur_mode(int *mode[4][4]); }; 2、Draw.cpp #include #include #include #include #include #include #include #include "Draw.h" #define width 24 int white[3] = {255 , 255 , 255}; int yellow[3] = {255 , 255 , 0}; int red[3] = {255 , 0 , 0}; int black[3] = {0 , 0 , 0}; int blue[3] = {0 , 162 , 232}; int green[3] = {80 , 202 , 53}; int orange[3] = {255, 128, 0}; int purple[3] = {128, 0, 128}; int pink[3] = {255, 0, 255}; int *clr[8] = {black, green, yellow, red, blue, purple, pink, orange};
//第 1 个 int LL[4][4][2] = { {{1, 0}, {1, -1}, {1, -2}, {0, -2}}, {{0, -1}, {1, -1}, {2, -1}, {2, -2}}, {{0, 0}, {1, 0}, {0, -1}, {0, -2}}, {{0, -2}, {1, -2}, {2, -2}, {0, -1}} }; //第 2 个 int LR[4][4][2] = { {{0, 0}, {0, -1}, {0, -2}, {1, -2}}, {{0, -2}, {1, -2}, {2, -2}, {2, -1}}, {{0 ,0}, {1, 0}, {1, -1}, {1, -2}}, {{0, -1}, {1, -1}, {2, -1}, {0, -2}} }; //第 3 个 int T[4][4][2] = { {{0, -1}, {1, -1}, {2, -1}, {1, 0}}, {{1, 0}, {0, -1}, {1, -1}, {1, -2}}, {{0 ,0}, {1, 0}, {2, 0}, {1, -1}}, {{0 ,0}, {0, -1}, {0, -2}, {1, -1}} }; //第 4 个 int O[4][4][2] = { {{0 ,0}, {1, 0}, {0, -1}, {1, -1}}, {{0 ,0}, {1, 0}, {0, -1}, {1, -1}}, {{0 ,0}, {1, 0}, {0, -1}, {1, -1}}, {{0 ,0}, {1, 0}, {0, -1}, {1, -1}} }; //第 5 个 int ZL[4][4][2] = { {{1, 0}, {2, 0}, {0, -1}, {1, -1}}, {{0 ,1}, {0, 0}, {1, 0}, {1, -1}}, {{1, 0}, {2, 0}, {0, -1}, {1, -1}}, {{0 ,1}, {0, 0}, {1, 0}, {1, -1}} }; //int a[3][3][2] = { // // // //}; {{0 ,0}, {1, 0}, {2, 0}}, {{0, -1}, {1, -1}, {2, -1}}, {{0, -2}, {1, -2}, {2, -2}}
//第 6 个 int ZR[4][4][2] = { {{0 ,0}, {1, 0}, {1, -1}, {2, -1}}, {{1 ,1}, {0 ,0}, {1, 0}, {0, -1}}, {{0 ,0}, {1, 0}, {1, -1}, {2, -1}}, {{1 ,1}, {0 ,0}, {1, 0}, {0, -1}}, }; //第 7 个 int I[4][4][2] = { {{0 ,0}, {1, 0}, {2, 0}, {3, 0}}, {{1, 0}, {1, 1}, {1, 2}, {1, 3}}, {{0 ,0}, {1, 0}, {2, 0}, {3, 0}}, {{1, 0}, {1, 1}, {1, 2}, {1, 3}} }; int cur_mode[4][4][2]; int next_mode[4][4][2]; //当前方块模板 //是否落地标志 //方块种类 //方块放置的朝向 int mp[18][32] = {0}; int drop_flag = 0; int cur_stone; int cur_place_dir; int score = 0; char pre_score[10] = "0"; int next_stone; int next_place_dir; int next_x = 12; int next_y = 17; draw::draw() { srand((unsigned)time(NULL)); rand_stone_and_placedir(cur_stone, cur_place_dir); rand_stone_and_placedir(next_stone, next_place_dir); get_brick_mode(cur_stone,cur_mode); get_brick_mode(next_stone,next_mode); } draw::~draw() {
} //画直线 void draw::draw_line(int startX, int startY, int endX, int endY,int color[3]) { glBegin(GL_LINES); glColor3ub(color[0], color[1], color[2]); glVertex2d(startX, startY); glVertex2d(endX, endY); glEnd(); //起点 //终点 //结束画线 } //画长方形 void draw::draw_rect(int leftX, int leftY, int color) { glBegin(GL_POLYGON); glColor3ub(clr[color][0], clr[color][1], clr[color][2]); glVertex2d(leftX + 1, leftY + 1); glVertex2d(leftX + width, leftY + 1); glVertex2d(leftX + width, leftY + width); glVertex2d(leftX + 1, leftY + width); glEnd();//结束画线 //左下角 //右下角 //左上角 //右上角 } //展示下一个形状方块 void draw::display_next_brick(int stone, int pd,int mode[4][4][2]) { for(int i = 0; i < 4; i++) { int x = next_x + mode[pd][i][0]; int y = next_y + mode[pd][i][1]; mp[x][y] = stone; } } void draw::draw_Text() { if(drop_flag == 2) { glColor3ub(red[0], red[1], red[2]); glRasterPos2i(10, 240); drawString("GAME OVER!!"); } glColor3ub(black[0], black[1], black[2]);
glRasterPos2i(415, 220); drawString(pre_score); glColor3ub(red[0], red[1], red[2]); glRasterPos2i(410, 240); drawString("分数"); glRasterPos2i(415, 220); char d[10]; sprintf(d, "%d", score); drawString(d); glRasterPos2i(360, 120); drawString("1、空格键实现暂停"); glRasterPos2i(360, 100); drawString("2、UP->形状切换"); strcpy(pre_score, d); } void draw::display() { display_next_brick(next_stone, next_place_dir,next_mode); for(int i = 100; i < 500; i += 25) { if(i == 350) continue; for(int j = 0; j < 500; j += 25) { int x = (i - 100) / 25 + 1; int y = j / 25 + 1; int color = mp[x][y]; draw_rect(i, j, color); } } for(int i = 100; i <= 350; i += 25) draw_line(i, 0, i, 500, white); for(int i = 0; i <= 500; i += 25) draw_line(100, i, 350, i, white);
if(drop_flag == 1) { //方块落地后 //将前一个形状置为背景色 display_next_brick(0, next_place_dir,next_mode); for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++) cur_mode[i][j][k] = next_mode[i][j][k]; cur_stone = next_stone; cur_place_dir = next_place_dir; rand_stone_and_placedir(next_stone, next_place_dir); get_brick_mode(next_stone,next_mode); drop_flag = 0; } draw_Text(); glFlush(); } void draw::rand_stone_and_placedir(int& stone, int& pd) { stone = (double)rand() / RAND_MAX * 7 + 1; pd = (double)rand() / RAND_MAX * 3; } //获取形状模板 void draw::get_brick_mode(int stone, int mode[4][4][2]) { switch(stone) { case 1: { for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++)
mode[i][j][k] = LL[i][j][k]; break; } case 2: { for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++) mode[i][j][k] = LR[i][j][k]; break; } case 3: { for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++) mode[i][j][k] = T[i][j][k]; break; } case 4: { for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++) mode[i][j][k] = O[i][j][k]; break; } case 5: { for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++) mode[i][j][k] = ZL[i][j][k]; break; } case 6: { for(int i = 0; i < 4; i++) for(int j = 0; j < 4; j++) for(int k = 0; k < 4; k ++) mode[i][j][k] = ZR[i][j][k]; break; } case 7:
分享到:
收藏