高级会员

- 积分
- 621
- 金钱
- 621
- 注册时间
- 2013-12-27
- 在线时间
- 0 小时
|
5金钱
问题图片
有的方块之间有间隔!
下面代码:
[mw_shl_code=c,true]#include "tetris.h"
#include "stdlib.h"
#include "lcd.h"
#include "key.h"
#include "chinese.h"
#include "delay.h"
#define SIZE_BOX 10//??????·??é??±??¤??10???????¨10*10??·??é?©
#define MAX_BOXS 19//??????19????????????·??é
#define SYS_X 10//???????·???÷??×ó????X×?±ê?¨?á×?±ê?©
#define SYS_Y 100//???????·???÷??×ó????Y×?±ê?¨?ú×?±ê?©
#define H_BOXS 10//?á·??ò??·??é?????????¤??
#define V_BOXS 15//?ú·??ò??·??é????????????
#define FIRST_BOX_X 4//??????·??é??????????
#define FALSE 0//????????·??é?? ???è???ú?ú??·??é
#define TRUE 1//????????·??é ?è???ú?ú??·??é
#define DOWN 0//×???????
#define RIGHT 1//????
#define TURN 2//??×?
#define LEFT 3//×ó??
u8 CURRENT_BOX_X=SYS_X+FIRST_BOX_X*SIZE_BOX,CURRENT_BOX_Y=SYS_Y;//??·??±?°·??é??×?±ê
u8 CURRENT_BOX_NUMBER;//?±?°·??é??±à??
u8 FLAG_NEWBOX=FALSE;//??·??è???ú?ú????·??é
//???·???÷?á????
struct BOARD
{
u8 state;//??·?????×??? ????0??1 1±í??????±?????
u16 color;//??·?????????
}Table_Board[H_BOXS][V_BOXS];//?á×?±ê ?ú×?±ê?¨????????·??? ????·?????×?????????
//·??é???á????
struct BOX
{
char box[2];//????·??é??2??×???????
/*0000
0000
0000
0000*/
u16 color;//·??é??????
u8 next;//??????·??é??±à??
};
//??????·??é??×?
struct BOX SHAPES[MAX_BOXS]=
{
/*
* ?? ?????? ???? ??
* ?? ?? ?? ??????
* ???? ??
*/
{0x88, 0xc0, CYAN, 0},
{0xe8, 0x00, CYAN, 1},
{0xc4, 0x40, CYAN, 2},
{0x2e, 0x00, CYAN, 3},
/*
* ?? ???? ??????
* ?? ?? ?? ??
* ???? ?????? ??
*/
{0x44, 0xc0, MAGENTA, 4},
{0x8e, 0x00, MAGENTA, 5},
{0xc8, 0x80, MAGENTA, 6},
{0xe2, 0x00, MAGENTA, 7},
/*
* ??
* ???? ????
* ?? ????
*/
{0x8c, 0x40, YELLOW, 8},
{0x6c, 0x00, YELLOW, 9},
/*
* ?? ????
* ???? ????
* ??
*/
{0x4c, 0x80, BROWN, 10},
{0xc6, 0x00, BROWN, 11},
/*
* ?? ?? ??
* ?????? ???? ?????? ????
* ?? ?? ??
*/
{0x4e, 0x00, WHITE, 12},
{0x8c, 0x80, WHITE, 13},
{0xe4, 0x00, WHITE, 14},
{0x4c, 0x40, WHITE, 15},
/* ??
* ??
* ?? ????????
* ??
*/
{0x88, 0x88, RED, 16},
{0xf0, 0x00, RED, 17},
/*
* ????
* ????
*/
{0xcc, 0x00, BLUE, 18},
};
// //???????·????
void Show_Face(void)
{
BACK_COLOR=BLACK;
Test_Show_CH_Font16(139,105,7,WHITE);//·?
Test_Show_CH_Font16(155,105,8,WHITE);//??
POINT_COLOR=WHITE;
LCD_ShowString(171,105,":0000");
Test_Show_CH_Font16(139,126,9,WHITE);//??
Test_Show_CH_Font16(155,126,10,WHITE);//??
POINT_COLOR=WHITE;
LCD_ShowString(171,126,":000");
Test_Show_CH_Font16(139,146,11,WHITE);//??
Test_Show_CH_Font16(155,146,12,WHITE);//??
Test_Show_CH_Font16(171,146,13,WHITE);//??
LCD_ShowString(5,303,"WK_UP:");
Test_Show_CH_Font16(53,303,14,WHITE);//×ó
Test_Show_CH_Font16(68,303,16,WHITE);//??
LCD_ShowString(88,303,"KEY1:");
Test_Show_CH_Font16(128,303,17,WHITE);//??
Test_Show_CH_Font16(144,303,18,WHITE);//×?
LCD_ShowString(164,303,"KEY0:");
Test_Show_CH_Font16(204,303,15,WHITE);//??
Test_Show_CH_Font16(220,303,16,WHITE);//??
Test_Show_CH_Font16(0,0,19,WHITE);//?í
Test_Show_CH_Font16(16,0,20,WHITE);//??
Test_Show_CH_Font16(32,0,21,WHITE);//??
Test_Show_CH_Font16(48,0,22,WHITE);//·?
Test_Show_CH_Font16(64,0,23,WHITE);//?é
}
//?????¤?????÷
void Show_Con_P(u8 x,u8 y,u8 nx,u8 ny)
{
u8 i,j,oldx;
oldx=x;
for(j=0;j<ny;j++)
{
for(i=0;i<nx;i++)
{
LCD_DrawLine(x,y,x+SIZE_BOX,y);
LCD_DrawLine(x,y,x,y+SIZE_BOX);
LCD_DrawLine(x,y+SIZE_BOX,x+SIZE_BOX,y+SIZE_BOX);
LCD_DrawLine(x+SIZE_BOX,y,x+SIZE_BOX,y+SIZE_BOX);
x+=SIZE_BOX;
}
y+=SIZE_BOX;
x=oldx;
}
}
//???????·???÷
void Show_Container(u8 x,u8 y,u8 h_boxs,u8 v_boxs)
{
u8 i,j,oldx;
oldx=x;
for(j=0;j<v_boxs;j++)
{
for(i=0;i<h_boxs;i++)
{
LCD_DrawLine(x,y,x+SIZE_BOX,y);
LCD_DrawLine(x,y,x,y+SIZE_BOX);
LCD_DrawLine(x,y+SIZE_BOX,x+SIZE_BOX,y+SIZE_BOX);
LCD_DrawLine(x+SIZE_BOX,y,x+SIZE_BOX,y+SIZE_BOX);
x+=SIZE_BOX;
}
y+=SIZE_BOX;
x=oldx;
}
}
//?ú?ú??·??é ?ú?ú??????·??é??·???·??é??±à??
u8 Made_NextBox(u8 box_number)
{
u8 place=0x80,t_boardx,t_boardy,n,m;
//place??????·?×??ê16????
//t_boardx,t_boardy±í??x,y×?±ê??·??é??????
//n,m????????4*4??·??é
t_boardx=(CURRENT_BOX_X-SYS_X)/SIZE_BOX;//·??é???±?°×?±ê????????×?±ê??????????·??é???????ó???á×?±ê??????·??é
t_boardy=(CURRENT_BOX_Y-SYS_Y)/SIZE_BOX;//?ó??×?×?±ê??????·??é
for(n=0;n<4;n++)
{
for(m=0;m<4;m++)
{
if(((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&place))
{
Table_Board[t_boardx+n][t_boardy+m].state=1;
Table_Board[t_boardx+n][t_boardy+m].color=SHAPES[CURRENT_BOX_NUMBER].color;
}
place=place/2;
if(place==0)
place=0x80;
}
}
CURRENT_BOX_X=SYS_X+FIRST_BOX_X*SIZE_BOX;
CURRENT_BOX_Y=SYS_Y;//??????????×?±ê
if(box_number==1)
box_number=rand()%MAX_BOXS;
CURRENT_BOX_NUMBER=box_number;
return(rand()%MAX_BOXS);
}
//????·??ò ×?±ê ±à?? ????
void Show_NewBox(u16 x,u16 y,u16 n,u16 color)
{
u8 i,ii,ls_x=x;
for(ii=0;ii<2;ii++)
{
u8 mask=128;
for(i=0;i<8;i++)
{
if(i%4==0&&i!=0)
{
y+=SIZE_BOX;
x=ls_x;
}
if(SHAPES[n].box[ii]&mask)
{
LCD_Fill(x,y,x+SIZE_BOX,y+SIZE_BOX,color);
POINT_COLOR=LIGHTBLUE;//???·???÷????????
LCD_DrawLine(x,y,x+SIZE_BOX,y);
LCD_DrawLine(x,y,x,y+SIZE_BOX);
LCD_DrawLine(x,y+SIZE_BOX,x+SIZE_BOX,y+SIZE_BOX);
LCD_DrawLine(x+SIZE_BOX,y,x+SIZE_BOX,y+SIZE_BOX);
}
x+=SIZE_BOX;
mask/=2;
}
y+=SIZE_BOX;
x=ls_x;
}
}
//????·??é
void EraseBox(u16 x,u16 y,u8 box_number)
{
u8 mask=128,n,m;
for(n=0;n<4;n++)
{
for(m=0;m<4;m++)
{
if(((SHAPES[box_number].box[n/2])&mask))
{
LCD_Fill(x+m*SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*+SIZE_BOX+SIZE_BOX,BLACK);
POINT_COLOR=LIGHTBLUE;//???·???÷????????
LCD_DrawLine(x+m*SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX);
LCD_DrawLine(x+m*SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX);
LCD_DrawLine(x+m*SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX);
LCD_DrawLine(x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX,x+m*SIZE_BOX+SIZE_BOX,y+n*SIZE_BOX+SIZE_BOX);
}
mask=mask/(2);
if(mask==0)
mask=128;
}
}
}
//????·??é??·???????????·??é
//????·??é??·?????????
//x,y???±?°·??é????
//box_number???±?°·??é??±à??
//Direction??·??ò±ê??
//????·???TRUE?ò??FALSE
u8 Judge_MoveCondition(u16 x,u16 y,u8 box_number,u8 Direction)
{
u8 n,m,t_boardx,t_boardy;
u8 mask;
if(Direction==LEFT)//??????×ó??
{
mask=0x80;
x-=SIZE_BOX;
t_boardx=(x-SYS_X)/SIZE_BOX;
t_boardy=(y-SYS_Y)/SIZE_BOX;
for(n=0;n<4;n++)
{
for(m=0;m<4;m++)
{
if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)//×?×ó±???·??é?????±?°???·???÷????·??é
{
if((x+SIZE_BOX*m)<SYS_X)
return(FALSE);//????×?×ó±???
else
if(Table_Board[t_boardx+n][t_boardy+m].state)//×ó??????·??é?ó ??4*4?????ò?????·°???????
{
return(FALSE);
}
}
mask=mask/(2);
if(mask==0)
mask=0x80;
}
}
return(TRUE);
}
else if(Direction==RIGHT)//??????????
{
x+=SIZE_BOX;
t_boardx=(x-SYS_X)/SIZE_BOX;
t_boardy=(y-SYS_Y)/SIZE_BOX;
mask=0x80;
for(n=0;n<4;n++)
{
for(m=0;m<4;m++)//??×???±?????????
{
if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)//×???±???·??é?????±?°???·???÷????·??é
{
if((x+SIZE_BOX*m)>=(SYS_X+SIZE_BOX*H_BOXS))
return(FALSE);//????×???±???
else
if(Table_Board[t_boardx+n][t_boardy+m].state)
{
return(FALSE);
}
}
mask=mask/(2);
if(mask==0)
mask=128;
}
}
return(TRUE);
}
else if(Direction==TURN)//??×?
{
t_boardx=(x-SYS_X)/SIZE_BOX;
t_boardy=(y-SYS_Y)/SIZE_BOX;
mask=0x80;
for(n=0;n<4;n++)
{
for(m=0;m<4;m++)
{
if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)
{
if((y+SIZE_BOX*n)>=(SYS_Y+SIZE_BOX*V_BOXS))
return(FALSE);//??????±???
if((x+SIZE_BOX*n)>=(SYS_X+SIZE_BOX*H_BOXS))
return(FALSE);//????×?×ó±???
if((x+SIZE_BOX*m)>=(SYS_X+SIZE_BOX*H_BOXS))
return(FALSE);//????×???±???
else if(Table_Board[t_boardx+n][t_boardy+m].state)
{
return(FALSE);
}
}
mask=mask/(2);
if(mask==0)
mask=0x80;
}
}
return(TRUE);
}
else if(Direction==DOWN)//??????????
{
y+=SIZE_BOX;
t_boardx=(x-SYS_X)/SIZE_BOX;
t_boardy=(y-SYS_Y)/SIZE_BOX;
mask=0x80;
for(n=0;n<4;n++)
{
for(m=0;m<4;m++)
{
if((SHAPES[CURRENT_BOX_NUMBER].box[n/2])&mask)//×???±???·??é?????±?°???·???÷????·??é
{
if((y+SIZE_BOX*n)>=(SYS_Y+SIZE_BOX*V_BOXS)||Table_Board[t_boardx+n][t_boardy+m].state)
{
FLAG_NEWBOX=TURN;//?è???ú?ú????·??é
break;
}
}
mask=mask/(2);
if(mask==0)
mask=0x080;
}
}
if(FLAG_NEWBOX)
{
return(FALSE);
}
else
return(TRUE);
}
else
{
return(FALSE);
}
}
//?????·
void Play_Game(void)
{
u8 nextbox;//??????·??é±à??
u8 action=0;//·??é????×÷×??? 0±í??????×÷ ????±í??????×÷
u8 key;//°??ü??
Show_Face();//???·????
POINT_COLOR=LIGHTBLUE;//???·???÷????????
Show_Con_P(140,166,4,4);//?????¤?????÷
Show_Container(SYS_X,SYS_Y,H_BOXS,V_BOXS);//???????·???÷
nextbox=Made_NextBox(1);//?ú?ú??·??é
Show_NewBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,SHAPES[CURRENT_BOX_NUMBER].color);
Show_NewBox(140,166,nextbox,SHAPES[nextbox].color);
while(1)
{
key=KEY_Scan();//?????ü??
switch(key)
{
case 1:
if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,RIGHT))//??????????????????????????????
{
EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER);
CURRENT_BOX_X+=SIZE_BOX;
action=RIGHT;
}
break;
case 2:
if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,TURN))//??????????????????????????????
{
EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER);
CURRENT_BOX_NUMBER=SHAPES[CURRENT_BOX_NUMBER].next;
action=TURN;
}
break;
case 3:
if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,LEFT))//??????????????????????????????
{
EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER);
CURRENT_BOX_X-=SIZE_BOX;
action=LEFT;
}
break;
}
//????°??ü°?????×???????
if(!action)
{
if(Judge_MoveCondition(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,DOWN))
{
EraseBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER);
CURRENT_BOX_Y+=SIZE_BOX;
Show_NewBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,SHAPES[CURRENT_BOX_NUMBER].color);
action=DOWN;
delay_ms(500);
}
}
if(action)
{
Show_NewBox(CURRENT_BOX_X,CURRENT_BOX_Y,CURRENT_BOX_NUMBER,SHAPES[CURRENT_BOX_NUMBER].color);
action=0;
}
if(FLAG_NEWBOX)//?ú?ú????·??é
{
EraseBox(140,166,nextbox);
nextbox=Made_NextBox(nextbox);
Show_NewBox(140,166,nextbox,SHAPES[nextbox].color);
FLAG_NEWBOX=FALSE;
}
}
}
[/mw_shl_code]
|
|