📄 eluosi.c
字号:
#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 + -