#include <stdio.h>
#include <stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<termios.h>
#include "time.h"
#include "fb_draw.h"
#define SMALL_CUBSIZE 4
#define X_SMALL_START 500
#define Y_SMALL_START 100
#define SMALL_UNIT 10
#define BIG_CUBSIZE_X 16
#define BIG_CUBSIZE_Y 12
#define BIG_UNIT 25
int small_cub[SMALL_CUBSIZE][SMALL_CUBSIZE]={0};
int big_cub[BIG_CUBSIZE_X][BIG_CUBSIZE_Y]={0};
int record[BIG_CUBSIZE_X][BIG_CUBSIZE_Y]={0};
int record2[BIG_CUBSIZE_X][BIG_CUBSIZE_Y]={0};
static int small_color;
static int big_color=0xa0;
static int stop_flag=0,count=0;
static int flag1=0,flag2;
struct termios old,new;
void clear_screen()
{
int x,y;
for (x = 0; x < xres(); x++)
  for (y = 0; y < yres(); y++) {
  fb_draw_point(x, y, 0x0);
  }
}
void draw_frame()
{
int x,y;
for(x=99,y=99;x<402;x++)
  fb_draw_point(x, y, 0xbf);
for(x=99,y=99;y<502;y++)
  fb_draw_point(x, y, 0xbf);
for(x=401,y=99;y<502;y++)
  fb_draw_point(x, y, 0xbf);
for(x=99,y=501;x<402;x++)
  fb_draw_point(x, y, 0xbf);
}
void zero_cub(int x,int y,int chosen)
{
int i,j;
for(i=0;i<x;i++){
  for(j=0;j<y;j++){
  if(chosen==1)
    small_cub[i][j]=0;
  else
    big_cub[i][j]=0;
  }
}
}
void small_cub_select(int a)
{
int i,j;
zero_cub(SMALL_CUBSIZE,SMALL_CUBSIZE,1);
switch(a){
  case 0:
  for(i=0;i<2;i++){
    for(j=0;j<2;j++)
    small_cub[i][j]=1;
  }
  break;
  case 1:
  for(i=0;i<4;i++)
    small_cub[0][i]=1;
  break;
  case 2:
  for(i=0;i<4;i++)
    small_cub[i][0]=1;
  break;
  case 3:
  for(i=0;i<2;i++)
    small_cub[0][i]=1;
  for(i=1;i<3;i++)
    small_cub[1][i]=1;
    break;
  case 4:
  for(i=1;i<3;i++)
    small_cub[i][0]=1;
  for(i=0;i<2;i++)
    small_cub[i][1]=1;
  break;
  case 5:
  for(i=1;i<3;i++)
    small_cub[0][i]=1;
  for(i=0;i<2;i++)
    small_cub[1][i]=1;
  break;
  case 6:
  for(i=0;i<2;i++)
    small_cub[i][0]=1;
  for(i=1;i<3;i++)
    small_cub[i][1]=1;
  break;
  case 7:
  for(i=0;i<3;i++)
    small_cub[i][0]=1;
  small_cub[0][1]=1;
  break;
  case 8:
  for(i=0;i<3;i++)
    small_cub[0][i]=1;
  small_cub[1][2]=1;
  break;
  case 9:
  for(i=0;i<3;i++)
    small_cub[i][1]=1;
  small_cub[2][0]=1;
  break;
  case 10:
  for(i=0;i<3;i++)
    small_cub[1][i]=1;
  small_cub[0][0]=1;
  break;
  case 11:
  for(i=0;i<3;i++)
    small_cub[i][1]=1;
  small_cub[0][0]=1;
  break;
  case 12:
  for(i=0;i<3;i++)
    small_cub[1][i]=1;
  small_cub[0][2]=1;
  break;
  case 13:
  for(i=0;i<3;i++)
    small_cub[i][0]=1;
  small_cub[2][1]=1;
  break;
  case 14:
  for(i=0;i<3;i++)
    small_cub[0][i]=1;
  small_cub[1][0]=1;
  break;
  case 15:
  for(i=0;i<3;i++)
    small_cub[1][i]=1;
  small_cub[0][1]=1;
  break;
  case 16:
  for(i=0;i<3;i++)
    small_cub[i][0]=1;
  small_cub[1][1]=1;
  break;
  case 17:
  for(i=0;i<3;i++)
    small_cub[0][i]=1;
  small_cub[1][1]=1;
  break;
  case 18:
  for(i=0;i<3;i++)
    small_cub[i][1]=1;
  small_cub[1][0]=1;
  break;
  default : return ;
}
}
void clear_small_screen()
{
int i,j;
int x,y;
for(i=0;i<SMALL_CUBSIZE;i++){
  for(j=0;j<SMALL_CUBSIZE;j++){
    for (x = X_SMALL_START+j*SMALL_UNIT; x <X_SMALL_START+SMALL_UNIT+j*SMALL_UNIT; x++)
    for (y = Y_SMALL_START+i*SMALL_UNIT; y <Y_SMALL_START+SMALL_UNIT+i*SMALL_UNIT; y++) {
      fb_draw_point(x, y, 0x0);
    }
  }
}
}
int draw_small_cub()
{
int i,j,x,y;
int value=0;
srand(time(NULL));
value=rand()%19;
small_color=rand()%0xff;
clear_small_screen();
small_cub_select(value);
for(i=0;i<SMALL_CUBSIZE;i++){
  for(j=0;j<SMALL_CUBSIZE;j++){
    if(small_cub[i][j]==1){
    for (x = X_SMALL_START+j*SMALL_UNIT; x <X_SMALL_START+SMALL_UNIT+j*SMALL_UNIT; x++)
    for (y = Y_SMALL_START+i*SMALL_UNIT; y <Y_SMALL_START+SMALL_UNIT+i*SMALL_UNIT; y++) {
      fb_draw_point(x, y, small_color);
    }
  }
  }
}
return value;
}
void big_cub_select(int value,int x,int y)
{
int i,j;
zero_cub(BIG_CUBSIZE_X,BIG_CUBSIZE_Y,2);
switch(value){
  case 0:
  for(i=0+x;i<2+x;i++){
    for(j=5+y;j<7+y;j++)
    big_cub[i][j]=1;
  }
  break;
  case 1:
  for(i=5+y;i<8+y;i++)
    big_cub[0+x][i]=1;
  break;
  case 2:
  for(i=0+x;i<4+x;i++)
    big_cub[i][5+y]=1;
  break;
  case 3:
  for(i=5+y;i<7+y;i++)
    big_cub[0+x][i]=1;
  for(i=6+y;i<8+y;i++)
    big_cub[1+x][i]=1;
    break;
  case 4:
  for(i=1+x;i<3+x;i++)
    big_cub[i][5+y]=1;
  for(i=0+x;i<2+x;i++)
    big_cub[i][6+y]=1;
  break;
  case 5:
  for(i=6+y;i<8+y;i++)
    big_cub[0+x][i]=1;
  for(i=5+y;i<7+y;i++)
    big_cub[1+x][i]=1;
  break;
  case 6:
  for(i=0+x;i<2+x;i++)
    big_cub[i][5+y]=1;
  for(i=1+x;i<3+x;i++)
    big_cub[i][6+y]=1;
  break;
  case 7:
  for(i=0+x;i<3+x;i++)
    big_cub[i][5+y]=1;
  big_cub[0+x][6+y]=1;
  break;
  case 8:
  for(i=5+y;i<8+y;i++)
    big_cub[0+x][i]=1;
  big_cub[1+x][7+y]=1;
  break;
  case 9:
  for(i=0+x;i<3+x;i++)
    big_cub[i][6+y]=1;
  big_cub[2+x][5+y]=1;
  break;
  case 10:
  for(i=5+y;i<8+y;i++)
    big_cub[1+x][i]=1;
  big_cub[0+x][5+y]=1;
  break;
  case 11:
  for(i=0+x;i<3+x;i++)
    big_cub[i][6+y]=1;
  big_cub[0+x][5+y]=1;
  break;
  case 12:
  for(i=5+y;i<8+y;i++)
    big_cub[1+x][i]=1;
  big_cub[0+x][7+y]=1;
  break;
  case 13:
  for(i=0+x;i<3+x;i++)
    big_cub[i][5+y]=1;
  big_cub[2+x][6+y]=1;
  break;
  case 14:
  for(i=5+y;i<8+y;i++)
    big_cub[0+x][i]=1;
  big_cub[1+x][5+y]=1;
  break;
  case 15:
  for(i=5+y;i<8+y;i++)
    big_cub[1+x][i]=1;
  big_cub[0+x][6+y]=1;
  break;
  case 16:
  for(i=0+x;i<3+x;i++)
    big_cub[i][5+y]=1;
  big_cub[1+x][6+y]=1;
  break;
  case 17:
  for(i=5+y;i<8+y;i++)
    big_cub[0+x][i]=1;
  big_cub[1+x][6+y]=1;
  break;
  case 18:
  for(i=0+x;i<3+x;i++)
    big_cub[i][6+y]=1;
  big_cub[1+x][5+y]=1;
  break;
  default : return ;
}
}
void prev_record()
{
int i,j;
for(i=0;i<BIG_CUBSIZE_X;i++)
  for(j=0;j<BIG_CUBSIZE_Y;j++)
  if(big_cub[i][j]==1)
    record[i][j]=big_cub[i][j];
}
void return_cub()
{
int i,j;
for(i=0;i<BIG_CUBSIZE_X;i++)
  for(j=0;j<BIG_CUBSIZE_Y;j++){
if(record[i][j]==1)
    big_cub[i][j]=1;
  }
}
void draw_big_cub(int x_start,int y_start)
{
int i,j,x,y;
for(i=0;i<BIG_CUBSIZE_X;i++){
  for(j=0;j<BIG_CUBSIZE_Y;j++){
    if(big_cub[i][j]==1){
    for (x = x_start+j*BIG_UNIT; x <x_start+BIG_UNIT+j*BIG_UNIT; x++)
    for (y = y_start+i*BIG_UNIT; y <y_start+BIG_UNIT+i*BIG_UNIT; y++) {
      fb_draw_point(x, y, big_color++);
    }
  }
  }
}
}
void clear_big_screen()
{
int i,j;
int x,y;
for(i=0;i<BIG_CUBSIZE_X;i++){
  for(j=0;j<BIG_CUBSIZE_Y;j++){
    for (x = 100+j*BIG_UNIT; x <100+BIG_UNIT+j*BIG_UNIT; x++)
    for (y = 100+i*SMALL_UNIT; y <100+BIG_UNIT+i*BIG_UNIT; y++) {
      fb_draw_point(x, y, 0x0);
    }
  }
}
}
int check_stop()
{
int i,j;
for(i=0;i<BIG_CUBSIZE_Y;i++){
  for(j=0;j<BIG_CUBSIZE_X;j++){
  if(record[j][i]==1)
    break;
  }
  if(j==BIG_CUBSIZE_X){
    if(big_cub[BIG_CUBSIZE_X-1][i]==1)
    return 1;
  }
  else{
  if(big_cub[j-1][i]==1)
    return 1;
  }
}
return 0;
}
void separate_cub()
{
int i,j;
for(i=0;i<BIG_CUBSIZE_X;i++)
  for(j=0;j<BIG_CUBSIZE_Y;j++){
  if(record[i][j]==1){
    big_cub[i][j]=0;
  }
}
}
void check_delete()
{
int i,j,p,q;
for(i=0;i<BIG_CUBSIZE_X;i++){
  for(j=0;j<BIG_CUBSIZE_Y;j++){
  if(record[i][j]==0)
    break;
  }
  if(j==BIG_CUBSIZE_Y){
  for(p=i;p>0;p--)
    for(q=0;q<BIG_CUBSIZE_Y;q++)
    record[p][q]=record[p-1][q];
    printf("\033[40;64H\33[7A%d",++count);
  }
}
}
void game_state()
{
int i;
for(i=0;i<BIG_CUBSIZE_X;i++){
  if(big_cub[0][i]==1){
  printf("GAME OVER BABY!!\n\n\n");
          tcsetattr(0,TCSANOW,&old);
  exit(1);
  }
}
}
void draw_big_cub_down(int a)
{
alarm(1);
int i,j;
if(check_stop()){
  prev_record();
  check_delete();
  game_state();
  flag2=flag1;
  big_cub_select(flag2,0,0);
  flag1=draw_small_cub();
  return ;
}
for(i=BIG_CUBSIZE_X-1;i>-1;i--){
  for(j=0;j<BIG_CUBSIZE_Y;j++){
  if(big_cub[i][j]==1){
    big_cub[i+1][j]=1;
    big_cub[i][j]=0;
  } 
  }
}
return_cub();
clear_big_screen();
draw_big_cub(100,100);
separate_cub();
}
void cub_exchange()
{
switch(flag2){
  case 0:
  break;
  case 1:
  ++flag2;
c语言编程小游戏  break;
  case 2:
  flag2=1;
  break;
  case 3:
  case 4:
  case 5:
  ++flag2;
  break;
  case 6:
  flag2=3;
  break;
  case 7:
  case 8:
  case 9:
  ++flag2;
  break;
  case 10:
  flag2=7;
  break;
  case 11:
  case 12:
  case 13:
  ++flag2;
  break;
  case 14:
  flag2=11;
  break;
  case 15:
  case 16:
  case 17:
  ++flag2;
  break;
  case 18:
  flag2=15;
  break;
}
}
int check_left_right()
{
int i,j,exchage;
for(i=0;i<BIG_CUBSIZE_Y;i++){
  for(j=0;j<BIG_CUBSIZE_X;j++){
  if(big_cub[j][i]==1)
    break;
  }
  if(big_cub[j][i]==1)
  break;
}
if(record[j][i-1]==1)
  return 1;
for(i=BIG_CUBSIZE_Y-2;i>0;i--){
  for(j=0;j<BIG_CUBSIZE_X;j++){
  if(big_cub[j][i]==1)
    break;
  }
  if(big_cub[j][i]==1)
  break;
}
if(record[j][i+1]==1)
  return 1;
return 0;
}
void cub_move(char ch,int flag)
{
int i,j,max_x,p,q,down_num=0;
switch(ch){
  case 'a':
  for(p=0;p<BIG_CUBSIZE_Y;p++){
    for(q=0;q<BIG_CUBSIZE_X;q++){
    if(big_cub[q][p]==1)
      break;
    }
    if(big_cub[q][p]==1)
    break;
  }
  if(p==0)
    return ;
  if(check_left_right())
    return ;
  for(i=0;i<BIG_CUBSIZE_X;i++){
    for(j=0;j<BIG_CUBSIZE_Y;j++){
    if(big_cub[i][j]==1){
      big_cub[i][j-1]=1;
      big_cub[i][j]=0;
    } 
    }
  }
  break;
  case 'd':
  for(p=BIG_CUBSIZE_Y-1;p>=0;p--){
    for(q=BIG_CUBSIZE_Y-1;q>=0;q--){
    if(big_cub[q][p]==1)
      break;
    }
    if(big_cub[q][p]==1)
    break;
  }
  if(p==BIG_CUBSIZE_Y-1)
    return ;
  if(check_left_right())
    return ;
  for(i=BIG_CUBSIZE_Y-1;i>=0;i--){
    for(j=BIG_CUBSIZE_X-1;j>=0;j--){
    if(big_cub[j][i]==1){
      big_cub[j][i+1]=1;
      big_cub[j][i]=0;
    } 
    }
  }
  break;
  case ' ': 
  for(i=0;i<BIG_CUBSIZE_X;i++){
    for(j=0;j<BIG_CUBSIZE_Y;j++){
    if(big_cub[i][j]==1)
    break;
    }
  if(big_cub[i][j]==1)
    break;
  }
  if(j>=BIG_CUBSIZE_Y-2)
    return;
  cub_exchange();
  big_cub_select(flag,i,j-5);
  break;
  case 's':
  while(down_num<3){
    draw_big_cub_down(0);
    down_num++;
  }
  break;
}
int main(void)
{
int ret;
        char ch;
        tcgetattr(0,&old);
        tcgetattr(0,&new);
        new.c_lflag = new.c_lflag & ~(ICANON | ECHO);
        new.c_cc[VMIN] = 1;
        new.c_cc[VTIME] = 0;
        tcsetattr(0,TCSANOW,&new);
ret = fb_open();
if (ret != 0) {
  fprintf(stderr, "fb_open() error.\n");
  exit(1);
}
clear_screen();
draw_frame();
printf("\033[40;64H\33[7A%d",count);
signal(SIGALRM,draw_big_cub_down);
alarm(1);
flag1=draw_small_cub();
big_cub_select(flag2,0,0);
while(1){
  ch=getchar();
  fflush(NULL);
  cub_move(ch,flag2);
}
fb_close();
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。