共 分 为 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: