俄罗斯方块游戏STM32F103ZET6 |
[/free][hide=2,money]
#include "tetris.h" #include "tftlcd.h" #include "stdlib.h" #include "picture.h" #include "ascii.h" u16 Tetris[19]={0x0F00,0x4444,0x0660,0x4460,0x02E0,0x6220,0x0740,0x2260,0x0E20,0x6440,0x0470,0x0C60,0x2640,0x0360,0x4620,0x04E0,0x2620,0x0E40,0x4640}; u16 BoxSR[Y_BOXS+4]={0x0000,0x0000,0x0000,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0x8001,0xFFFF}; _Shape NewShape={60,30,SHAPE_COLOR,1,1,1,0}; _Game Game={10000,1,0}; //»¾ØÐÎ //(x1,y1),(x2,y2):¾ØÐεĶԽÇ×ø±ê void LCD_DrawRectangle_Color(u16 x1, u16 y1, u16 x2, u16 y2,u16 color) { LCD_DrawLine_Color(x1,y1,x2,y1,color); LCD_DrawLine_Color(x1,y1,x1,y2,color); LCD_DrawLine_Color(x1,y2,x2,y2,color); LCD_DrawLine_Color(x2,y1,x2,y2,color); } void LCD_ShowPictureEx(u16 x, u16 y, u16 wide, u16 high) { u16 temp = 0; long tmp=0,num=0; LCD_Set_Window(x, y, x+wide-1, y+high-1); num = wide * high*2 ; do { temp = pic[tmp + 1]; temp = temp << 8; temp = temp | pic[tmp]; LCD_WriteData_Color(temp);//ÖðµãÏÔʾ tmp += 2; } while(tmp < num); } //ÔÚÖ¸¶¨Î»Öà ÏÔʾ1¸ö16*16µÄºº×Ö //(x,y):ºº×ÖÏÔʾµÄλÖà //index:tfontÊý×éÀïÃæµÄµÚ¼¸¸öºº×Ö //color:Õâ¸öºº×ÖµÄÑÕÉ« void Test_Show_CH_Font16(u16 x,u16 y,u8 index,u16 color) { u8 temp,t,t1; u16 y0=y; for(t=0;t<32;t++)//ÿ¸ö16*16µÄºº×ÖµãÕó ÓÐ32¸ö×Ö½Ú { if(t<16)temp=tfont16[index*2][t]; //ǰ16¸ö×Ö½Ú else temp=tfont16[index*2+1][t-16]; //ºó16¸ö×Ö½Ú for(t1=0;t1<8;t1++) { if(temp&0x80)LCD_DrawFRONT_COLOR(x,y,color);//»ÊµÐĵã else LCD_DrawFRONT_COLOR(x,y,GBLUE); //»¿Õ°×µã£¨Ê¹Óñ³¾°É«£© temp<<=1; y++; if((y-y0)==16) { y=y0; x++; break; } } } } /*LCD»Ð¡·½¿éº¯Êý**/ /*(sx,xy):ÆðÊ¼×ø±ê*/ /***color:·½¿éÑÕÉ«*/ void LCD_DrawBlock(u16 sx,u16 sy,u16 color) { LCD_DrawRectangle_Color(sx,sy,sx+BPIXEL-1,sy+BPIXEL-1,color); LCD_Fill(sx+2,sy+2,sx+BPIXEL-3,sy+BPIXEL-3,color); } /*********»æÖÆÍ¼Ðκ¯Êý************/ /*(sx,sy):»ùµã£¬ÔÚ4*4ÇøÓòµÄ×óÉϽÇ*/ /*******n:»ù±¾Í¼ÐαàºÅ************/ /***color:ÑÕɫֵ******************/ void LCD_DrawShape(u16 sx,u16 sy,u8 n,u16 color) { u8 a,b; u16 temp=Tetris[n]; u8 i; for(i=0;i<16;i++) { a=i/4; b=i%4; if(temp&0x8000) { LCD_DrawRectangle_Color(sx+b*BPIXEL,sy+a*BPIXEL,sx+(b+1)*BPIXEL-1,sy+(a+1)*BPIXEL-1,color); LCD_Fill(sx+b*BPIXEL+2,sy+a*BPIXEL+2,sx+(b+1)*BPIXEL-3,sy+(a+1)*BPIXEL-3,color); BoxSR[sy/BPIXEL+a]|=1<<((sx/BPIXEL)+b); //±ê¼Ç¸Ã·½¿éÒѱ»Í¼ÐÎÕ¼Óà } temp<<=1; } } /*********Ïû³ýͼÐκ¯Êý***************/ /*(sx,sy):»ùµã£¬ÔÚ4*4ÇøÓòµÄ×óÉϽÇ****/ /*******n:»ù±¾Í¼ÐαàºÅ***************/ /***color:ÑÕɫֵ*********************/ /*Ïû³ýͼÐÎʱӦ½«ÏàÓ¦·½¿éµÄ±ê־λÇåÁã*/ void LCD_ClearShape(u16 sx,u16 sy,u8 n,u16 color) { u8 a,b; u16 temp=Tetris[n]; u8 i; for(i=0;i<16;i++) { a=i/4; b=i%4; if(temp&0x8000) { LCD_Fill(sx+b*BPIXEL,sy+a*BPIXEL,sx+(b+1)*BPIXEL-1,sy+(a+1)*BPIXEL-1,color); BoxSR[sy/BPIXEL+a]&=~(1<<((sx/BPIXEL)+b)); //±ê¼Ç¸Ã·½¿éδ±»Í¼ÐÎÕ¼Óà } temp<<=1; } } /***********************ÅжϺ¯Êý***********************/ /*****************ÅжÏÒÆ¶¯Í¼ÐεĿÉÐÐÐÔ*****************/ /*mode:1->×óÒÆ;2->ÓÒÒÆ;3->Ðýת;4->¼ÓËÙÏÂÂä;5->×ÔÓÉÏÂÂä*/ u8 Judge(u16 sx,u16 sy,u8 n,u8 mode) { int cx,cy,temp1=Tetris[n],temp2=Tetris[n]; u8 a,b,i,Flag=0; switch(mode) { case 1: cx=sx-BPIXEL;cy=sy;break; case 2: cx=sx+BPIXEL;cy=sy;break; case 3: cx=sx; cy=sy; switch(NewShape.CurNum) { case 0:temp2=1;break; case 1:temp2=0;break; case 2:temp2=2;break; case 3:temp2=4;break; case 4:temp2=5;break; case 5:temp2=6;break; case 6:temp2=3;break; case 7:temp2=8;break; case 8:temp2=9;break; case 9:temp2=10;break; case 10:temp2=7;break; case 11:temp2=12;break; case 12:temp2=11;break; case 13:temp2=14;break; case 14:temp2=13;break; case 15:temp2=16;break; case 16:temp2=17;break; case 17:temp2=18;break; case 18:temp2=15;break; } NewShape.TurnNum=temp2; temp2=Tetris[temp2]; break; case 5: cx=sx;cy=sy+BPIXEL;break; default:cx=sx;cy=sy;break; } for(i=0;i<16;i++) { a=i/4; b=i%4; if(temp1&0x8000)BoxSR[sy/BPIXEL+a]&=~(1<<((sx/BPIXEL)+b)); temp1<<=1; } for(i=0;i<16;i++) { a=i/4; b=i%4; if(temp2&0x8000) { if(BoxSR[cy/BPIXEL+a]&(1<<((cx/BPIXEL)+b)))Flag=1; } temp2<<=1; } if(Flag==0)return 1; else return 0; } /*´´½¨ÐÂͼÐκ¯Êý*/ void Create_Shape(void) { u8 a,b; u16 temp; u8 i; NewShape.CurNum=NewShape.NextNum; NewShape.x=60; NewShape.y=30; if(BoxSR[4]&0x03C0)ResetGame(); else LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); temp=Tetris[NewShape.NextNum]; for(i=0;i<16;i++) { a=i/4; b=i%4; if(temp&0x8000) { LCD_DrawBlock(180+b*BPIXEL,50+a*BPIXEL,WILL_COLOR); } temp<<=1; } NewShape.NextNum=rand()%19; temp=Tetris[NewShape.NextNum]; for(i=0;i<16;i++) { a=i/4; b=i%4; if(temp&0x8000) { LCD_DrawBlock(180+b*BPIXEL,50+a*BPIXEL,SHAPE_COLOR); } temp<<=1; } } /*ͼÐÎ×óÒÆº¯Êý*/ void MoveLeft(void) { u8 Draw_Ready; if(NewShape.Move==0) { NewShape.Move=1; Draw_Ready=Judge(NewShape.x,NewShape.y,NewShape.CurNum,1); if(Draw_Ready==1) { LCD_ClearShape(NewShape.x,NewShape.y,NewShape.CurNum,BOXS_COLOR); NewShape.x-=BPIXEL; LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); } else LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); NewShape.Move=0; } } /*ͼÐÎÓÒÒÆº¯Êý*/ void MoveRight(void) { u8 Draw_Ready; if(NewShape.Move==0) { NewShape.Move=1; Draw_Ready=Judge(NewShape.x,NewShape.y,NewShape.CurNum,2); if(Draw_Ready==1) { LCD_ClearShape(NewShape.x,NewShape.y,NewShape.CurNum,BOXS_COLOR); NewShape.x+=BPIXEL; LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); } else LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); NewShape.Move=0; } } /*¿ìËÙÏÂÂ亯Êý*/ void DownFast(void) { u8 Draw_Ready; if(NewShape.Move==0) { NewShape.Move=1; Draw_Ready=Judge(NewShape.x,NewShape.y,NewShape.CurNum,5); if(Draw_Ready==1) { LCD_ClearShape(NewShape.x,NewShape.y,NewShape.CurNum,BOXS_COLOR); NewShape.y+=BPIXEL; LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); } else { LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); } NewShape.Move=0; } } u8 score_buf[7],level_buf[4]; /*×ÔÓÉÏÂÂ亯Êý*/ void DownFree(void) { u8 Draw_Ready; u8 i,j,Clear_Flag; u16 temp; if(NewShape.Move==0) { NewShape.Move=1; Draw_Ready=Judge(NewShape.x,NewShape.y,NewShape.CurNum,5); if(Draw_Ready==1) { LCD_ClearShape(NewShape.x,NewShape.y,NewShape.CurNum,BOXS_COLOR); NewShape.y+=BPIXEL; LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); } else { LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); for(i=4;i<Y_BOXS+4-1;i++) { if(BoxSR==0xFFFF) { Game.score++; Game.level=1+Game.score/100; score_buf[0]=Game.score/100000+0x30; score_buf[1]=Game.score%100000/10000+0x30; score_buf[2]=Game.score%100000%10000/1000+0x30; score_buf[3]=Game.score%100000%10000%1000/100+0x30; score_buf[4]=Game.score%100000%10000%1000%100/10+0x30; score_buf[5]=Game.score%100000%10000%1000%100%10+0x30; score_buf[6]='\0'; level_buf[0]=Game.level/100+0x30; level_buf[1]=Game.level%100/10+0x30; level_buf[2]=Game.level%100%10+0x30; level_buf[3]='\0'; FRONT_COLOR=TEXT_COLOR; BACK_COLOR=GBLUE; LCD_ShowString(170,120,tftlcd_data.width,tftlcd_data.height,16,score_buf); LCD_ShowString(170,160,tftlcd_data.width,tftlcd_data.height,16,level_buf); Clear_Flag=1; for(j=i;j>3;j--)BoxSR[j]=BoxSR[j-1]; } } if(Clear_Flag)LCD_Fill(10,30,149,279,BOXS_COLOR); for(i=3;i<Y_BOXS+4-1;i++) { temp=BoxSR; temp>>=1; for(j=1;j<15;j++) { if(temp&0x0001)LCD_DrawBlock(j*BPIXEL,i*BPIXEL,SHAPE_COLOR); temp>>=1; } } Create_Shape(); } NewShape.Move=0; } } void Transform(void) { u8 Draw_Ready; if(NewShape.Move==0) { NewShape.Move=1; Draw_Ready=Judge(NewShape.x,NewShape.y,NewShape.CurNum,3); if(Draw_Ready==1) { LCD_ClearShape(NewShape.x,NewShape.y,NewShape.CurNum,BOXS_COLOR); NewShape.CurNum=NewShape.TurnNum; LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); } else LCD_DrawShape(NewShape.x,NewShape.y,NewShape.CurNum,SHAPE_COLOR); NewShape.Move=0; } } void Show_TetrisFace(void) { u8 i,j; u16 curpos=30; LCD_Clear(BOXS_COLOR); Test_Show_CH_Font16(0+50,0+10,19,TEXT_COLOR); //¶í Test_Show_CH_Font16(16+50,0+10,20,TEXT_COLOR); //ÂÞ Test_Show_CH_Font16(32+50,0+10,21,TEXT_COLOR); //˹ Test_Show_CH_Font16(48+50,0+10,22,TEXT_COLOR); //·½ Test_Show_CH_Font16(64+50,0+10,23,TEXT_COLOR); //¿é Test_Show_CH_Font16(160,30,11,TEXT_COLOR); //Ï Test_Show_CH_Font16(176,30,12,TEXT_COLOR); //Ò» Test_Show_CH_Font16(192,30,13,TEXT_COLOR); //¸ö Test_Show_CH_Font16(160,100,7,TEXT_COLOR); //·Ö Test_Show_CH_Font16(176,100,8,TEXT_COLOR); //Êý Test_Show_CH_Font16(160,140,9,TEXT_COLOR); //µÈ Test_Show_CH_Font16(176,140,10,TEXT_COLOR); //¼¶ Test_Show_CH_Font16(170,210,24,TEXT_COLOR);//°´ Test_Show_CH_Font16(210,210,25,TEXT_COLOR);//¼ü Test_Show_CH_Font16(190,190,26,TEXT_COLOR);//ÐÅ Test_Show_CH_Font16(190,230,27,TEXT_COLOR);//Ï¢ FRONT_COLOR=RED; BACK_COLOR=GBLUE; LCD_ShowString(10,300,tftlcd_data.width,tftlcd_data.height,16,"K_UP:TURN"); LCD_ShowString(10,320,tftlcd_data.width,tftlcd_data.height,16,"K_DOWN ![]() LCD_ShowString(10,340,tftlcd_data.width,tftlcd_data.height,16,"K_RIGHT:RIGHT"); LCD_ShowString(10,360,tftlcd_data.width,tftlcd_data.height,16,"K_LEFT ![]() FRONT_COLOR=TEXT_COLOR; LCD_ShowString(170,120,tftlcd_data.width,tftlcd_data.height,16,score_buf); LCD_ShowString(170,160,tftlcd_data.width,tftlcd_data.height,16,level_buf); for(i=0;i<4;i++) { for(j=0;j<4;j++) { LCD_DrawBlock(180+i*BPIXEL,50+j*BPIXEL,WILL_COLOR); } } for(i=0;i<25;i++) { LCD_DrawBlock(0,curpos,WILL_COLOR); curpos+=BPIXEL; } curpos=30; for(i=0;i<25;i++) { LCD_DrawBlock(150,curpos,WILL_COLOR); curpos+=BPIXEL; } curpos=0; for(i=0;i<16;i++) { LCD_DrawBlock(curpos,280,WILL_COLOR); curpos+=BPIXEL; } } void Start_Game(void) { Create_Shape(); } void ResetGame(void) { u8 i; LCD_Fill(10,30,149,279,BOXS_COLOR); Game.score=0; Game.level=1; BoxSR[0]=0x0000; BoxSR[1]=0x0000; BoxSR[2]=0x0000; for(i=3;i<Y_BOXS+4-1;i++) { BoxSR=0x8001; } BoxSR[Y_BOXS+4-1]=0xFFFF; Start_Game(); } #ifndef __TETRIS__H #define __TETRIS__H #include "system.h" /*************¶íÂÞ˹·½¿éÓÎÏ·²ÎÊý*****************/ #define BPIXEL 10 //Ò»¸öС·½¿é±ß³¤µÄÏñËØÖµ #define X_BOXS 14 //ÓÎÏ·µ×°åXÖáС·½¿é¸öÊý #define Y_BOXS 25 //ÓÎÏ·µ×°åYÖáС·½¿é¸öÊý #define SHAPE_COLOR 0x0000 //ͼÐÎÑÕÉ«->ºÚÉ« #define BOXS_COLOR 0X07FF //µ×°åÑÕÉ«->°×É« #define WILL_COLOR 0x7D7C //±ß½çÑÕÉ«->dzÀ¶É« #define TEXT_COLOR 0x0000 //×ÖÌåÑÕÉ«->ºÚÉ« #define LEFT 34 #define RIGHT 194 #define DOWN 168 #define TURN 98 #define RESET 162 extern u8 score_buf[7],level_buf[4]; extern u16 BoxSR[Y_BOXS+4]; typedef struct { u16 x; u16 y; u16 color; u8 CurNum; //µ±Ç°Í¼ÐαàºÅ u8 NextNum;//ÏÂÒ»¸öͼÐαàºÅ u8 TurnNum;//·×ªÍ¼ÐαàºÅ u8 Move; }_Shape; extern _Shape NewShape; typedef struct { u16 speed; u8 level; u32 score; }_Game; extern _Game Game; //void TIM4_Init(u16 arr,u16 psc); //¿ØÖƶíÂÞ˹·½¿é×ÔÓÉÏÂÂäµÄËÙ¶È void Show_TetrisFace(void); //ÏÔʾ¶íÂÞ˹·½¿éÓÎÏ·Ö÷½çÃæ void Show_NextShape(u16 sx,u16 sy,u16 color); //ÏÔʾÏÂÒ»¸ö·½¿éͼÐÎ void Start_Game(void); //¿ªÊ¼ÓÎÏ· void LCD_DrawBlock(u16 sx,u16 sy,u16 color); //LCD»Ð¡·½¿éº¯Êý void LCD_DrawShape(u16 sx,u16 sy,u8 n,u16 color); //LCD»Í¼Ðκ¯Êý void LCD_ClearShape(u16 sx,u16 sy,u8 n,u16 color);//Çå³ýͼÐκ¯Êý u8 Judge(u16 sx,u16 sy,u8 n,u8 mode); void Create_Shape(void); void MoveLeft(void); void MoveRight(void); void DownFast(void); void Transform(void); void DownFree(void); void ResetGame(void); #endif #include "system.h" #include "SysTick.h" #include "led.h" #include "usart.h" #include "tftlcd.h" #include "time.h" #include "key.h" #include "tetris.h" int main() { u8 i; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÖжÏÓÅÏȼ¶·Ö×é ·Ö2×é LED_Init(); USART1_Init(9600); TFTLCD_Init(); //LCD³õʼ»¯ KEY_Init(); LCD_Clear(GREEN); LCD_ShowPictureEx(0, 0, 240, 320); TIM4_Init(10,7199); while(key!= KEY_UP) //µÈ´ý°´¼üK_UP°´Ï { FRONT_COLOR=RED; LCD_ShowString(20,10,tftlcd_data.width,tftlcd_data.height,16," ![]() delay_ms(200); LCD_ShowString(20,10,tftlcd_data.width,tftlcd_data.height,16," "); delay_ms(200); } TIM_Cmd(TIM4, DISABLE); //ʧÄÜTIMx score_buf[0]=Game.score/100000+0x30; score_buf[1]=Game.score%100000/10000+0x30; score_buf[2]=Game.score%100000%10000/1000+0x30; score_buf[3]=Game.score%100000%10000%1000/100+0x30; score_buf[4]=Game.score%100000%10000%1000%100/10+0x30; score_buf[5]=Game.score%100000%10000%1000%100%10+0x30; score_buf[6]='\0'; level_buf[0]=Game.level/100+0x30; level_buf[1]=Game.level%100/10+0x30; level_buf[2]=Game.level%100%10+0x30; level_buf[3]='\0'; Show_TetrisFace(); Start_Game(); TIM3_Init(5000,7199); while(1) { key=KEY_Scan(0); switch(key) { case KEY_LEFT:MoveLeft();break; case KEY_RIGHT:MoveRight();break; case KEY_DOWN ![]() case KEY_UP:Transform();break; // case RESET:ResetGame();break; default : break; } i++; if(i%20==0) { led1=!led1; } delay_ms(10); } } [/hide][free]
购买主题
本主题需向作者支付 2 枚金币 才能浏览
《《《 点击这里展开全文 》》》 |
|