⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eluosi.c

📁 HG12684 俄罗斯方块程序 自编的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <REGX52.H>
#include<box.h>

////////////////////////////////////////////////////液晶引脚初始化
sbit	Rs_Lcd=P3^5;
sbit	Rw_Lcd=P3^6;
sbit	En_Lcd=P3^7;
sbit	Cs1_Lcd=P1^0;
sbit	Cs2_Lcd=P1^1;
sfr     DataBuss=0xa0;		//P0作为Lcd的数据线
unsigned char  dat=0;

////////////////////////////////////////////////////按键引脚及其状态机初始值
#define key_state_0	0
#define key_state_1	1
#define key_state_2	2
unsigned char   key_state[4]={0,0,0,0};

sbit key_up=P1^4;
sbit key_down=P3^3;
sbit key_left=P1^3;
sbit key_right=P3^2;
unsigned char i=0,j=0; 
unsigned   char   down_time=0;
unsigned   char    crack_state=0;
unsigned    char    score=1;
////////////////////////////////////////////////////液晶函数初始化
char RdStateLcd();
char WrCommandIc(unsigned char Command);
char WrCommandLcd(unsigned char Command);
char WrDataLcd(unsigned char dat);
char SetStarLine(char line);
void InitDis(void);
char SysInit(void);
char SetPageAddr(char page);
char SetYAddr(char y);
void ClrScreen(void);  

////////////////////////////////////////////////////一个像素点的显示清除
void Dispoint(unsigned char page,unsigned char y);
void Clrpoint(unsigned char page,unsigned char y);
////////////////////////////////////////////////////延时和读取按键
void delay_us(unsigned  int a);
void delay_ms(unsigned  int a);
unsigned  char read_key(unsigned char a,unsigned char key);

////////////////////////////////////////////////////四个个像素点的显示清除
void  onepoint(unsigned char x,unsigned char y);
void  clr_onepoint(unsigned char x,unsigned char y);


////////////////////////////////////////////////////显示地图
void show_ditu(void);
////////////////////////////show game line
void  game_line(void);
///////show  score
void show_score(void);
//mode:line(01 23 45 67):colum(08-120128):state 
void DisChar(unsigned char *p,unsigned char page,unsigned char y,char state);


////////////////////////////////////////////////////消除地图的全1行
void check_ditu(void);
////////////////////////////////////////////////////写进地图0或1
void  write_ditu(unsigned char x,unsigned char y,unsigned  char z);	
////////////////////////////////////////////////////读出地图
unsigned char   read_ditu(unsigned char x,unsigned char y);


////////////////////////////////////////////////////产生一个方块
void  Box_Generate(void);
////////////////////////////////////////////////////写一个方块to地图
void Write_Box_ditu(void);
////////////////////////////////////////////////////from  titu erase a fangkuai
void  Clr_Box_ditu(void);


////////////////////////////if there hava box
unsigned  char  Check_Box_ditu();
////////////////////////////if there is the  game  line
unsigned  char  Check_Box_gameline();
/////////////////////////////check  if the  box can  ratate
unsigned  char  Check_Box_ditu_ratation(void);



/////////////////////////////move
void mov_left(void);
void mov_right(void);
void mov_ratation(void);
void  mov_down(void);
////////////////////////////////////////////////////
//line:31    colum:5*8
unsigned char idata tidu[31][5]={
0x00,0x00,0x00,0x00,0x00,//0
0x00,0x00,0x00,0x00,0x00,//1
0x00,0x00,0x00,0x00,0x00,//2
0x00,0x00,0x00,0x00,0x00,//3
0x00,0x00,0x00,0x00,0x00,//4
0x00,0x00,0x00,0x00,0x00,//5
0x00,0x00,0x00,0x00,0x00,//6
0x00,0x00,0x00,0x00,0x00,//7
0x00,0x00,0x00,0x00,0x00,//8
0x00,0x00,0x00,0x00,0x00,//9
0x00,0x00,0x00,0x00,0x00,//10
0x00,0x00,0x00,0x00,0x00,//11
0x00,0x00,0x00,0x00,0x00,//12
0x00,0x00,0x00,0x00,0x00,//13
0x00,0x00,0x00,0x00,0x00,//14
0x00,0x00,0x00,0x00,0x00,//15
0x00,0x00,0x00,0x00,0x00,//16
0x00,0x00,0x00,0x00,0x00,//17
0x00,0x00,0x00,0x00,0x00,//18
0x00,0x00,0x00,0x00,0x00,//19
0x00,0x00,0x00,0x00,0x00,//20
0x00,0x00,0x00,0x00,0x00,//21
0x00,0x00,0x00,0x00,0x00,//22
0x00,0x00,0x00,0x00,0x00,//23
0x00,0x00,0x00,0x00,0x00,//24
0x00,0x00,0x00,0x00,0x00,//25
0x00,0x00,0x00,0x00,0x00,//26
0xff,0xff,0xff,0xff,0xef,//30
0xff,0xff,0xff,0xff,0xef,//30
0xff,0xff,0xff,0xff,0xef,//30
0x00,0xff,0xff,0xff,0xef,//30
};
void main()
{
char SonState; 

P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
delay_ms(20);

do{
    SonState=SysInit( );
   }while(SonState!=0);

ClrScreen(); 

game_line();
show_ditu();

 //mode:line(01 23 45 67):colum(08-120128):state 
DisChar(fig[0],6,104,0);
DisChar(fig[0],6,112,0);
DisChar(fig[0],6,120,0);

while(1)
{
Box_Generate();
if((Check_Box_ditu())==0)  { Write_Box_ditu();}//no  crack
else                       { break;}                          //crack    game   over

while(1)
{
if(read_key(0,key_left))mov_left();
if(read_key(1,key_right))mov_right();
if(read_key(2,key_up))mov_ratation();
if(read_key(3,key_down))mov_down();
if(down_time>250){mov_down();}
delay_us(200);
down_time++;
if(crack_state==1){crack_state=0;break;}
}//while(1)

}//while(1)

}



//////////////////////////////////////////////////////////
//basic function
//////////////////////////////////////////////////////////
///////////x:line y:colum
void  onepoint(unsigned char x,unsigned char y)//show one point(2*2) 
{
unsigned char i=0,j=0;
x=2*x;y=2*y;
for(i=x;i<(x+2);i++)
for(j=y;j<(y+2);j++)
{Dispoint(i,j);}
}

///////////x:line y:colum
void  clr_onepoint(unsigned char x,unsigned char y)//clear one point(2*2) 
{
unsigned char i=0,j=0;
x=2*x;y=2*y;
for(i=x;i<(x+2);i++)
for(j=y;j<(y+2);j++)
{Clrpoint(i,j);}
}

void show_ditu()//show ditu:line(0-30)colum(1-40) ,line31 colun0&41 game line
{
for(j=0;j<31;j++)
for(i=0;i<5;i++)
{
if(tidu[j][i]&0x01){onepoint(j,8*i+1);}
if(tidu[j][i]&0x02){onepoint(j,8*i+2);}
if(tidu[j][i]&0x04){onepoint(j,8*i+3);}
if(tidu[j][i]&0x08){onepoint(j,8*i+4);}
if(tidu[j][i]&0x10){onepoint(j,8*i+5);}
if(tidu[j][i]&0x20){onepoint(j,8*i+6);}
if(tidu[j][i]&0x40){onepoint(j,8*i+7);}
if(tidu[j][i]&0x80){onepoint(j,8*i+8);}
}
}

void check_ditu()//check if the line is full then  delete it
{
unsigned   char     aaa=0;
for(j=30;j>0;j--)//form down to up
{
if((tidu[j][0]==0xff)&&(tidu[j][1]==0xff)&&(tidu[j][2]==0xff)&&(tidu[j][3]==0xff)&&(tidu[j][4]==0xff))//full
{ 
aaa=1; score++;
for(i=j;i>0;i--)
{
tidu[i][0]=tidu[i-1][0];
tidu[i][1]=tidu[i-1][1];
tidu[i][2]=tidu[i-1][2];
tidu[i][3]=tidu[i-1][3];
tidu[i][4]=tidu[i-1][4];
//show_one_Line(i);
}
tidu[0][0]=0;tidu[0][1]=0;tidu[0][2]=0;tidu[0][3]=0;//add ampty one line
//if there are many full lines together
if((tidu[j][0]==0xff)&&(tidu[j][1]==0xff)&&(tidu[j][2]==0xff)&&(tidu[j][3]==0xff)&&(tidu[j][4]==0xff))j++;
}

}//for(j=30;j>0;j--)
//updata   ditu   beacuse  there have  full line
if(aaa==1)
{
ClrScreen(); 
game_line();
show_ditu();
show_score();
}
//the better is  show the  change lines ,the no  change  not clear 
}//void check_ditu()

 //显示分数
void show_score(void)
{
unsigned  char  ge_wei=0,shi_wei=0,bai_wei=0;
if(score<10)       {ge_wei=score;}
else if(score<100) {shi_wei=score/10;ge_wei=score%10;}
else               {bai_wei=score/100;shi_wei=score%100/10;ge_wei=score%10;}

DisChar(fig[bai_wei],6,104,0);
DisChar(fig[shi_wei],6,112,0);		
DisChar(fig[ge_wei],6,120,0);
}

////////////////////////////写进地图x:line y:colum z=1写1 z=0写0 updata is fast
void  write_ditu(unsigned char x,unsigned char y,unsigned  char z)	
{
char  i=0,j=0;
////////////////////////////////ditu[][0]  form 1 not  from 0
////////////////////////////////ditu[][0]=y-1
y--;
i=y/8;
j=y%8;
if(z==1)       {tidu[x][i]|=1<<j;     onepoint(x,y+1);}
else if(z==0)  {tidu[x][i]&=~(1<<j);  clr_onepoint(x,y+1);}
}


////////////////////////////读出地图x:line y:colum 
unsigned char   read_ditu(unsigned char x,unsigned char y)
{
char  i=0,j=0,k=0;
////////////////////////////////ditu[][0]  form 1 not  from 0
////////////////////////////////ditu[][0]=y-1
y--;
i=y/8;
j=y%8;
k|=1<<j;

if(tidu[x][i]&k) return 1;//have point 
else             return 0;//no point               
}

////////////////////////////generate a box
void  Box_Generate()
{
    static unsigned char    box_no=5;

	this.x=0;this.y=20;
    this.BlckIndex = (box_no++)%7;
    this.Status = 0;

    this.pPIC   = TtrsBlck
                + TtrsBlckPoint[this.BlckIndex] 
                + (this.Status) * 4;
}

////////////////////////////if there is the  game  line
unsigned  char  Check_Box_gameline()
{
for(i=0;i<4;i++)
{
//if(this.pPIC[i]&0x08){if((this.x+i>30)||((this.y+1)>40)||((this.y+1)<1)) return 1;}//have point
//if(this.pPIC[i]&0x04){if((this.x+i>30)||((this.y+2)>40)||((this.y+2)<1))  return 1;}//have point
//if(this.pPIC[i]&0x02){if((this.x+i>30)||((this.y+3)>40)||((this.y+3)<1))  return 1;}//have point
//if(this.pPIC[i]&0x01){if((this.x+i>30)||((this.y+4)>40)||((this.y+4)<1))  return 1;}//have point

if(this.pPIC[i]&0x08){if((this.x+i>30)||((this.y+1)>40))  return 1;}//have point
if(this.pPIC[i]&0x04){if((this.x+i>30)||((this.y+2)>40))  return 1;}//have point
if(this.pPIC[i]&0x02){if((this.x+i>30)||((this.y+3)>40))  return 1;}//have point
if(this.pPIC[i]&0x01){if((this.x+i>30)||((this.y+4)>40))  return 1;}//have point
}
return 0;//no point
}

////////////////////////////if there hava box
unsigned  char  Check_Box_ditu()
{
for(i=0;i<4;i++)
{
if(this.pPIC[i]&0x08){if(read_ditu(this.x+i,this.y+1))  return 1;}//have point
if(this.pPIC[i]&0x04){if(read_ditu(this.x+i,this.y+2))return 1;}//have point
if(this.pPIC[i]&0x02){if(read_ditu(this.x+i,this.y+3))return 1;}//have point
if(this.pPIC[i]&0x01){if(read_ditu(this.x+i,this.y+4))return 1;}//have point
}
return 0;//no point
}
//////////////////////////////////
//if it  can  ratation
//////////////////////////////////
unsigned  char  Check_Box_ditu_ratation()
{
for(i=0;i<4;i++)
{
{if(read_ditu(this.x+i,this.y+1))  return 1;}//have point
{if(read_ditu(this.x+i,this.y+2))return 1;}//have point
{if(read_ditu(this.x+i,this.y+3))return 1;}//have point
{if(read_ditu(this.x+i,this.y+4))return 1;}//have point
if(this.x>27)return 1;//bottom line
if(this.y>37)return 1;//right line
}
return 0;//no point
}


////////////////////////////write a box
void Write_Box_ditu()
{
for(i=0;i<4;i++)
{
if(this.pPIC[i]&0x08) { onepoint(this.x+i,this.y+1); write_ditu(this.x+i,this.y+1,1);}
if(this.pPIC[i]&0x04) { onepoint(this.x+i,this.y+2); write_ditu(this.x+i,this.y+2,1);}
if(this.pPIC[i]&0x02) { onepoint(this.x+i,this.y+3); write_ditu(this.x+i,this.y+3,1);}
if(this.pPIC[i]&0x01) { onepoint(this.x+i,this.y+4); write_ditu(this.x+i,this.y+4,1);}
}

}

////////////////////////////clear a box
void  Clr_Box_ditu()
{
for(i=0;i<4;i++)
{
if(this.pPIC[i]&0x08) { clr_onepoint(this.x+i,this.y+1); write_ditu(this.x+i,this.y+1,0);}
if(this.pPIC[i]&0x04) { clr_onepoint(this.x+i,this.y+2); write_ditu(this.x+i,this.y+2,0);}
if(this.pPIC[i]&0x02) { clr_onepoint(this.x+i,this.y+3); write_ditu(this.x+i,this.y+3,0);}
if(this.pPIC[i]&0x01) { clr_onepoint(this.x+i,this.y+4); write_ditu(this.x+i,this.y+4,0);}
}

}

void  game_line()
{
for(i=0;i<32;i++)
{onepoint(i,0);
 onepoint(i,41);}
for(i=0;i<42;i++)
{onepoint(31,i);}
}


void mov_left()
{
Clr_Box_ditu();
this.y--;

if((Check_Box_ditu())||(Check_Box_gameline()))//crack
this.y++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -