#include <stdio.h>
#include <signal.h> //信号函数的头文件,例alarm
#include <sys/time.h> //系统时间之类的头文件
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "fb_draw.h"
static int score=0; //总分数
int sudu[]={500000,200000,100000}; //控制下落速度的三个值,分别是每秒2次,每秒5次,每秒10次
int passwd; //验证用户名和密码是否正确标志
int max_sd; //用于取得sudu[]中的值
int brr[20][10]={0}; //保存落下的图形,范围为整个游戏界面
FILE *fp; //定义一个文件指针
static int x, y; //分别用于记录横坐标的移动数值和纵坐标的移动数值,方便与i,j组合构成一组坐标,用于保存图形
int n;int m; //分别用于保存图形形状和旋转
int n_1;int m_1; //用于保存下一个即将出现的图形的图形形状和旋转
int crr[10][10]={ //显示一个囧字
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,0,1},
{1,0,1,0,0,0,0,1,0,1},
{1,1,0,0,0,0,0,0,1,1},
{1,0,1,1,1,1,1,1,0,1},
{1,0,1,0,0,0,0,1,0,1},
{1,0,1,0,0,0,0,1,0,1},
{1,0,1,1,1,1,1,1,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
int arr[7][4][5][5] = { //所有图形的定义
{//1
{{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,0,1,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,0},
{0,1,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,1,0,0,0},
{0,1,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,0},
{0,1,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}}
},
{//2
{{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}}
},
{//3
{{0,0,0,0,0},
{0,1,0,0,0},
{0,1,0,0,0},
{0,1,1,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,1,0},
{0,1,1,1,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,0},
{0,0,0,1,0},
{0,0,0,1,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,1,1,1,0},
{0,1,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0}}
},
{//4
{{0,0,0,0,0},
{1,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0}},
{{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,1,1},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0}}
},
{//6
{{0,0,0,0,0},
{0,0,0,1,0},
{0,0,1,1,0},
{0,0,1,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,0,0},
{0,1,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}}
},
{//7
{{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,0,0},
{0,0,1,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,0,0,0},
{0,1,1,1,0},
{0,0,1,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,1,0,0},
{0,0,0,0,0}}
},
{//8
{{0,0,0,0,0},
{0,0,1,1,0},
{0,0,0,1,0},
{0,0,0,1,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,1,1},
{0,0,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0}},
{{0,0,0,0,0},
{0,0,0,0,0},
{0,0,0,1,0},
{0,1,1,1,0},
{0,0,0,0,0}}
}
};
void fb_draw_element(int a, int b, int color) //将传来的坐标作为其点画20×20个点组成的图形
{
int w = W / WC;
int h = H / HC;
int xs = xres() / 2 - W / 2 + a * w;
int ys = yres() / 2 - H / 2 + b * h;
int i, j;
for (j = ys; j <= ys + h; j++) {
for (i = xs; i <= xs + w; i++) {
fb_draw_point(i, j, color); //画一个点
}
}
}
void fb_draw_element_1(int a, int b, int color) //画即将出现的图形,画成20×20的图形
{
int w = W / WC;
int h = H / HC;
int xs = xres() / 2 - W / 2 + a * w;
int ys = yres() / 2 - H / 2 + b * h;
int i, j;
for (j = ys+H+2*h; j <= ys + H + 3*h; j++) {
for (i = xs + W + 2 * w; i <= xs + W + 3*w; i++) {
fb_draw_point(i, j, color);
}
}
}
void draw_shape(int color) //画图形的调用函数,画图之用draw_shape(0x00)将原先的图形擦除
{
int i, j;
for (j = 0; j < 5; j++){
for (i = 0; i < 5; i++) {
if (arr[n][m][j][i])
fb_draw_element(i + x, j + y, color);
}
}
}
void draw_shape_1(int color) //画下一个图形的调用函数
{
int i, j;
for (j = 0; j < 5; j++){
for (i = 0; i < 5; i++) {
if (arr[n_1][m_1][j][i])
fb_draw_element_1(i, j, color);
}
}
}
void draw_are() //画边框的函数,包括大边框和小边框和之间的切割线
{
int w = W / WC;
int h = H / HC;
int xs = xres() / 2 - W / 2 ;
int ys = yres() / 2 - H / 2 ;
int i, j;
for (j = ys-h; j <= ys + H +h; j++) {//画大边框
for (i = xs-w; i <= xs + W +w; i++) {
if((j>=ys-h&&j<=ys-1)||(j>=ys+H+1&&j<=ys+H+h))
fb_draw_point(i, j,FC );
if((i>=xs-w&&i<=xs-1)||(i>=xs+W+1&&i<=xs+W+w))
fb_draw_point(i,j,FC);
}
}
for (j = ys+H+h; j <= ys + H +8*h; j++) {//画下一个图形的边框
for (i = xs+W+w; i <= xs + W +8*w; i++) {
if((j>=ys+H+h&&j<=ys+H+2*h)||(j>=ys+H+7*h&&j<=ys+H+8*h))
fb_draw_point(i, j,FC );
if((i>=xs+W+w&&i<=xs+W+2*w)||(i>=xs+W+7*w&&i<=xs+W+8*w))
fb_draw_point(i,j,FC);
}
}
for(j=ys;j<=ys+H;j+=20)//画横行直线
{
for(i=xs;i<=xs+W;i+=1)
{
fb_draw_point(i,j,FC);
}
}
for(j=ys;j<=ys+H;j+=1)//画竖行直线
{
for(i=xs;i<=xs+W;i+=20)
{
fb_draw_point(i,j,FC);
}
}
for(j=ys+H+h;j<=ys+H+8*h;j+=20) //画下一个图形框的横行直线
{
for(i=xs+W+w;i<=xs+W+8*w;i+=1)
{
fb_draw_point(i,j,FC);
}
}
for(j=ys+H+h;j<=ys+H+8*h;j+=1)//画下一个图形框的竖行直线
{
for(i=xs+W+w;i<=xs+W+8*w;i+=20)
{
fb_draw_point(i,j,FC);
}
}
}
void draw_user() //画用户文件中保存的图形数据
{
int i,j;
for(j=0;j<20;j++)
{
for(i=0;i<10;i++)
{
if(brr[j][i]==1)
{
fb_draw_element(i,j,BC);
}
}
}
}
void print_score(void) //在屏幕中央打印最终的得分
{
printf("\33[%d;%dH\33[1m the score is %d\33[49m \33[32m", 8, 74, score);
fprintf(stdout, "\33[%d;10H", 5 + 200 + 2);
}
void save() //保存当前用户的图形数据和成绩数据到指定的文件中
{
int i,j;
fp=fopen("baocun","w+");
for(i=0;i<20;i++)
{
for(j=0;j<10;j++)
{
fwrite(&brr[i][j],4,1,fp);
}
}
fclose(fp);
fp=fopen("score","w+");
fwrite(&score,4,1,fp);
fclose(fp);
}
void draw_game_over() //正常结束游戏的时候,画一个囧字,并且将用户的数据全部清空
{
int i,j;
int flag_game_over=1;
for(j=0;j<10;j++)
{
for(i=0;i<10;i++)
{
if(crr[j][i]==1)
{
if(flag_game_over==1)
{
system("clear");
}
flag_game_over=0;
fb_draw_element(i,j,0x00);
fb_draw_element(i,j,FC);
}
}
}
if(passwd==1)
{
for(i=0;i<20;i++)
{
for(j=0;j<10;j++)
{
brr[i][j]=0;
}
}
save();
print_score();
score=0;
save();
}
}
int game_over(void) //当检测到第0行有数据的时候,结束程序,�