利用STM32单片机+TFT彩屏设计的俄罗斯方块。速度可调。
全部源码下载:
Keil代码.7z
(254.91 KB, 下载次数: 99)
部分单片机源程序:
- #include "game.h"
- #include "picture.h"
- u8 str1[] = " NEXT ";
- u8 str2[] = " MARK ";
- u8 str3[] = " Design ";
- u8 str5[] = " By ";
- u8 str6[] = " LXY ";
- u8 str4[] = " GAME OVER ";
- u16 hangdata[8];
- unsigned long fenshu=0;
- void putstring16x24(u16 x,u16 y,u8 *str,u16 charColor,u16 bkColor)
- {
-
- u8 i=0;
- for (;*str;str++)
- {
-
- ili9320_PutChar_16x24(x+(16*i),y,*str,charColor,bkColor);
- i++;
- }
- }
- void putstring8x16(u16 x,u16 y,u8 *str,u16 charColor,u16 bkColor)
- {
-
- u8 i=0;
- for (;*str;str++)
- {
-
- ili9320_PutChar(x+(8*i),y,*str,charColor,bkColor);
- i++;
- }
- }
- void setwindow()
- {
- ili9320_Clear(White); //设置窗口
- GUI_Line(0,0,0,320,Red);
- GUI_Line(1,0,1,320,Red);
- GUI_Line(2,0,2,320,Red);
- GUI_Line(3,0,3,320,Red);
- GUI_Line(4,0,4,320,Red);
- GUI_Line(138,0,138,320,Red);
- GUI_Line(137,0,137,320,Red);
- GUI_Line(136,0,136,320,Red);
- GUI_Line(135,0,135,320,Red);
- GUI_Line(134,0,134,320,Red);
- GUI_Line(133,0,133,320,Red);
- GUI_Line(0,320,140,320,Red);
- GUI_Line(0,319,140,319,Red);
- GUI_Line(0,318,140,318,Red);
- GUI_Line(0,317,140,317,Red);
- GUI_Line(0,316,140,316,Red);
- GUI_Line(0,315,140,315,Red);
- GUI_Line(0,314,140,314,Red);
- GUI_Line(0,313,140,313,Red);
- GUI_Line(0,312,140,312,Red);
- GUI_Line(0,311,140,311,Red);
- GUI_Line(0,310,140,310,Red);
- GUI_Line(0,309,140,309,Red);
- GUI_Line(0,308,140,308,Red);
- GUI_Line(0,307,140,307,Red);
- GUI_Line(0,306,140,306,Red);
- GUI_Line(0,305,140,305,Red);
- GUI_Line(0,304,140,304,Red);
- GUI_Line(140,0,140,320,Red);
- GUI_Line(139,0,139,320,Red);
- GUI_Line(140,80,240,80,Red);
- GUI_Line(140,140,240,140,Red);
- // GUI_Line(140,200,240,200,Red);
- putstring16x24(142,10,str1,Red,White);
- putstring16x24(142,90,str2,Red,White); //设置提示语
- putstring8x16(160,260,str3,Red,White);
- putstring8x16(177,280,str5,Red,White);
- putstring8x16(175,300,str6,Red,White);
- putnum(175,115,Black,White,fenshu);
- // tu5(50,50,1,1);
- // Delay(1000);
- // tu5(50,50,2,1);
- }
- void fk(u16 x,u16 y,u16 color)
- {
- GUI_Square(x,y,15,color,1);
- }
- void tu1(u16 x,u16 y,u16 fangxiang,u8 flag)
- {
- static u16 fangxiang1;
- if((flag==0)|(fangxiang1!=fangxiang))
- switch(fangxiang1)
- {
- case 1:fk(x+16,y,White);fk(x,y+16,White);fk(x+16,y+16,White);fk(x+32,y+16,White);break;
- case 2:fk(x,y,White);fk(x,y+16,White);fk(x+16,y+16,White);fk(x,y+32,White);break;
- case 4:fk(x+16,y,White);fk(x,y+16,White);fk(x+16,y+16,White);fk(x+16,y+32,White);break;
- case 3:fk(x,y,White);fk(x+16,y,White);fk(x+32,y,White);fk(x+16,y+16,White);break;
- }
- if((flag==1)|(fangxiang1!=fangxiang))
- switch(fangxiang)
- {
- case 1:fk(x+16,y,Black);fk(x,y+16,Black);fk(x+16,y+16,Black);fk(x+32,y+16,Black);break;
- case 2:fk(x,y,Black);fk(x,y+16,Black);fk(x+16,y+16,Black);fk(x,y+32,Black);break;
- case 4:fk(x+16,y,Black);fk(x,y+16,Black);fk(x+16,y+16,Black);fk(x+16,y+32,Black);break;
- case 3:fk(x,y,Black);fk(x+16,y,Black);fk(x+32,y,Black);fk(x+16,y+16,Black);break;
- }
- fangxiang1=fangxiang;
- }
- void tu2(u16 x,u16 y,u16 fangxiang,u8 flag)
- {
- static u16 fangxiang1;
- if((flag==0)|(fangxiang1!=fangxiang))
- switch(fangxiang1) //将原图像擦除
- {
- case 1:fk(x,y,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x+32,y+16,White);break;
- case 2:fk(x+16,y,White);fk(x,y+16,White);fk(x+16,y+16,White);fk(x,y+32,White);break;
- case 3:fk(x,y,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x+32,y+16,White);break;
- case 4:fk(x+16,y,White);fk(x,y+16,White);fk(x+16,y+16,White);fk(x,y+32,White);break;
- }
- if((flag==1)|(fangxiang1!=fangxiang))
- switch(fangxiang) //重绘新图像
- {
- case 1:fk(x,y,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x+32,y+16,Black);break;
- case 2:fk(x+16,y,Black);fk(x,y+16,Black);fk(x+16,y+16,Black);fk(x,y+32,Black);break;
- case 3:fk(x,y,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x+32,y+16,Black);break;
- case 4:fk(x+16,y,Black);fk(x,y+16,Black);fk(x+16,y+16,Black);fk(x,y+32,Black);break;
- }
- fangxiang1=fangxiang;
- }
- void tu3(u16 x,u16 y,u16 fangxiang,u8 flag)
- {
- static u16 fangxiang1;
- if((flag==0)|(fangxiang1!=fangxiang))
- switch(fangxiang1) //将原图像擦除
- {
- case 1:fk(x,y,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x,y+16,White);break;
- case 2:fk(x,y,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x,y+16,White);break;
- case 3:fk(x,y,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x,y+16,White);break;
- case 4:fk(x,y,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x,y+16,White);break;
- }
- if((flag==1)|(fangxiang1!=fangxiang))
- switch(fangxiang) //重绘新图像
- {
- case 1:fk(x,y,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x,y+16,Black);break;
- case 2:fk(x,y,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x,y+16,Black);break;
- case 3:fk(x,y,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x,y+16,Black);break;
- case 4:fk(x,y,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x,y+16,Black);break;
- }
- fangxiang1=fangxiang;
- }
- void tu4(u16 x,u16 y,u16 fangxiang,u8 flag)
- {
- static u16 fangxiang1;
- if((flag==0)|(fangxiang1!=fangxiang))
- switch(fangxiang1) //将原图像擦除
- {
- case 1:fk(x,y,White);fk(x+16,y,White);fk(x+32,y,White);break;
- case 2:fk(x,y,White);fk(x,y+16,White);fk(x,y+32,White);break;
- case 3:fk(x,y,White);fk(x+16,y,White);fk(x+32,y,White);break;
- case 4:fk(x,y,White);fk(x,y+16,White);fk(x,y+32,White);break;
- }
- if((flag==1)|(fangxiang1!=fangxiang))
- switch(fangxiang) //重绘新图像
- {
- case 1:fk(x,y,Black);fk(x+16,y,Black);fk(x+32,y,Black);break;
- case 2:fk(x,y,Black);fk(x,y+16,Black);fk(x,y+32,Black);break;
- case 3:fk(x,y,Black);fk(x+16,y,Black);fk(x+32,y,Black);break;
- case 4:fk(x,y,Black);fk(x,y+16,Black);fk(x,y+32,Black);break;
- }
- fangxiang1=fangxiang;
- }
- void tu5(u16 x,u16 y,u16 fangxiang,u8 flag)
- {
- static u16 fangxiang1;
- if((flag==0)|(fangxiang1!=fangxiang))
- switch(fangxiang1) //将原图像擦除
- {
- case 1:fk(x,y,White);fk(x,y+16,White);fk(x+16,y+16,White);fk(x+32,y+16,White);break;
- case 2:fk(x,y,White);fk(x+16,y,White);fk(x,y+16,White);fk(x,y+32,White);break;
- case 3:fk(x,y,White);fk(x+16,y,White);fk(x+32,y,White);fk(x+32,y+16,White);break;
- case 4:fk(x,y+32,White);fk(x+16,y,White);fk(x+16,y+16,White);fk(x+16,y+32,White);break;
- }
- if((flag==1)|(fangxiang1!=fangxiang))
- switch(fangxiang) //重绘新图像
- {
- case 1:fk(x,y,Black);fk(x,y+16,Black);fk(x+16,y+16,Black);fk(x+32,y+16,Black);break;
- case 2:fk(x,y,Black);fk(x+16,y,Black);fk(x,y+16,Black);fk(x,y+32,Black);break;
- case 3:fk(x,y,Black);fk(x+16,y,Black);fk(x+32,y,Black);fk(x+32,y+16,Black);break;
- case 4:fk(x,y+32,Black);fk(x+16,y,Black);fk(x+16,y+16,Black);fk(x+16,y+32,Black);break;
- }
- fangxiang1=fangxiang;
- }
- void down(u16 xx,u16 yy,u8 tu,u16 sudu) //tu为哪个,sudu为下落速度,xy对应初始位置
- {
- u16 fangxiang;
- fangxiang=fx;
- switch(tu)
- {
- case 1:tu1(xx,yy,fangxiang,1);Delay(50*sudu);tu1(xx,yy,fangxiang,0);break;
- case 2:tu2(xx,yy,fangxiang,1);Delay(50*sudu);tu2(xx,yy,fangxiang,0);break;
- case 3:tu3(xx,yy,fangxiang,1);Delay(50*sudu);tu3(xx,yy,fangxiang,0);break;
- case 4:tu4(xx,yy,fangxiang,1);Delay(50*sudu);tu4(xx,yy,fangxiang,0);break;
- case 5:tu5(xx,yy,fangxiang,1);Delay(50*sudu);tu5(xx,yy,fangxiang,0);break;
- }
- xx=x;
- yy=y;
-
- }
- void ting(u8 tu)
- {
- switch(tu)
- {
- case 1:tu1(x,y,fx,1);break;
- case 2:tu2(x,y,fx,1);break;
- case 3:tu3(x,y,fx,1);break;
- case 4:tu4(x,y,fx,1);break;
- case 5:tu5(x,y,fx,1);break;
- }
- }
- u8 suiji() //产生随机数
- {
- u16 ADCvalue,precent,voltage;
- u16 shu1,shu;
- ADCvalue=GetADCConvertedValue();
- precent=(ADCvalue*100/0x1000);
- voltage=precent*33;
- Delay(100);
- printf("\r\n 当前AD转换结果为:0x%X,电压值为:%d.%d%dV,百分比为%d%%", ADCvalue,voltage/1000, (voltage%1000)/100, (voltage%100)/10,precent);
- shu=((voltage%1000)/100)+((voltage%100)/10);
- srand(shu);
- shu1=rand()%6;
- if(shu1==0)
- shu1=5;
- printf("%d",shu1);
- return shu1;
- }
- u16 bi(u16 x1,u16 y1,u16 x2,u16 y2)
- {
- if((ili9320_GetPoint(x1,y1))==(ili9320_GetPoint(x2,y2)))
- return 1;
- else
- return 0;
- }
- u16 zuobian()
- {
- switch(tuxing)
- {
- case 1:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x-1,y+16))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x-1,y+16))==0xffff) return 1;else return 0;break;
- }
- case 2:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- }
- case 3:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- }
- case 4:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- }
- case 5:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x-1,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x-1,y+32))==0xffff) return 1;else return 0;break;
- }
-
- }
-
- }
- u16 youbian()
- {
- switch(tuxing)
- {
- case 1:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x+49,y+16))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x+33,y+16))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x+49,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- }
- case 2:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x+49,y+16))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x+49,y+16))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- }
- case 3:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- }
- case 4:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x+49,y))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x+17,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x+49,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x+17,y))==0xffff) return 1;else return 0;break;
- }
- case 5:switch(fx)
- {
- case 1:if((ili9320_GetPoint(x+49,y+16))==0xffff) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- case 3:if((ili9320_GetPoint(x+49,y))==0xffff) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x+33,y))==0xffff) return 1;else return 0;break;
- }
-
- }
-
- }
- u16 dibian()
- {
- switch(tuxing)
- {
- case 1:switch(fx)
- {
- case 1:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)&&((ili9320_GetPoint(x+40,y+32))==0xffff)) return 1;else return 0;break;
- case 2:if(((ili9320_GetPoint(x+8,y+48))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- case 4:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+48))==0xffff)) return 1;else return 0;break;
- case 3:if(((ili9320_GetPoint(x+8,y+16))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)&&((ili9320_GetPoint(x+40,y+16))==0xffff)) return 1;else return 0;break;
- }
- case 2:switch(fx)
- {
- case 1:if(((ili9320_GetPoint(x+8,y+16))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)&&((ili9320_GetPoint(x+40,y+32))==0xffff)) return 1;else return 0;break;
- case 2:if(((ili9320_GetPoint(x+8,y+48))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- case 3:if(((ili9320_GetPoint(x+8,y+16))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)&&((ili9320_GetPoint(x+40,y+32))==0xffff)) return 1;else return 0;break;
- case 4:if(((ili9320_GetPoint(x+8,y+48))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- }
- case 3:switch(fx)
- {
- case 1:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- case 2:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- case 3:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- case 4:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)) return 1;else return 0;break;
- }
- case 4:switch(fx)
- {
- case 1:if(((ili9320_GetPoint(x+8,y+16))==0xffff)&&((ili9320_GetPoint(x+24,y+16))==0xffff)&&((ili9320_GetPoint(x+40,y+16))==0xffff)) return 1;else return 0;break;
- case 2:if((ili9320_GetPoint(x+8,y+48))==0xffff) return 1;else return 0;break;
- case 3:if(((ili9320_GetPoint(x+8,y+16))==0xffff)&&((ili9320_GetPoint(x+24,y+16))==0xffff)&&((ili9320_GetPoint(x+40,y+16))==0xffff)) return 1;else return 0;break;
- case 4:if((ili9320_GetPoint(x+8,y+48))==0xffff) return 1;else return 0;break;
- }
- case 5:switch(fx)
- {
- case 1:if(((ili9320_GetPoint(x+8,y+32))==0xffff)&&((ili9320_GetPoint(x+24,y+32))==0xffff)&&((ili9320_GetPoint(x+40,y+32))==0xffff)) return 1;else return 0;break;
- case 2:if(((ili9320_GetPoint(x+8,y+48))==0xffff)&&((ili9320_GetPoint(x+24,y+16))==0xffff)) return 1;else return 0;break;
- case 3:if(((ili9320_GetPoint(x+8,y+16))==0xffff)&&((ili9320_GetPoint(x+24,y+16))==0xffff)&&((ili9320_GetPoint(x+40,y+32))==0xffff)) return 1;else return 0;break;
- case 4:if(((ili9320_GetPoint(x+8,y+48))==0xffff)&&((ili9320_GetPoint(x+24,y+48))==0xffff)) return 1;else return 0;break;
- }
-
- }
-
- }
- void readhang(u16 y1)
- {
- u16 i=0,x=13;
- for(i=0;i<8;i++)
- {
- hangdata[i]=ili9320_GetPoint(x,y1);
- x=x+16;
- }
- }
- void writehang(u16 y1,u8 f) //f为1时,写上一行数据,f为0时将此行写白
- {
- u16 i=0,x=5;
- for(i=0;i<8;i++)
- {
- if(f==1)
- fk(x,y1,hangdata[i]);
- if(f==0)
- fk(x,y1,White);
- x=x+16;
- }
- }
- u16 manhang(u16 y1)
- {
- u16 i,x=13,b=0,w=0;
- for(i=0;i<8;i++)
- {
- if((ili9320_GetPoint(x,y1))==Black)
- b++;
- if((ili9320_GetPoint(x,y1))==White)
- w++;
- x=x+16;
- }
- if(b==8)
- return 1; //满行为黑色则返回1
- if(w==8)
- return 2; //满行为白色则返回2
- }
- void quxiao()
- {
- u16 y2=288,y1;
- while((manhang(y2))!=2)
- {
- if((manhang(y2))==1)
- {
- y1=y2;
- while((manhang(y1))!=2)
- {
- writehang(y1,0);
- readhang(y1-16);
- writehang(y1,1);
- y1=y1-16;
-
- }
- putnum(175,115,White,White,fenshu);
- fenshu++;
- putnum(175,115,Black,White,fenshu);
- if(fenshu%5==0)
- sudu=sudu-2;
- if(sudu==0)
- sudu=0;
- }
- y2=y2-16;
- }
- }
- void tuxian()
- {
- // switch(tuxing)
- // {
- // case 1:tu1(165,40,1,0);break;
- // case 2:tu2(165,40,1,0);break;
- // case 3:tu3(165,40,1,0);break;
- // case 4:tu4(165,40,1,0);break;
- // case 5:tu5(165,40,1,0);break;
- // }
- GUI_Rectangle(142,35,240,75,White,White);
- tuxing1=suiji();
- switch(tuxing1)
- {
- case 1:tu1(165,40,1,1);break;
- case 2:tu2(165,40,1,1);break;
- case 3:tu3(165,40,1,1);break;
- case 4:tu4(165,40,1,1);break;
- case 5:tu5(165,40,1,1);break;
- }
- }
- void gameover()
- {
- if(manhang(1)!=2)
- {
- ili9320_Clear(Black);
- putstring16x24(30,100,str4,Red,Black);
- putstring16x24(70,140,str2,Red,Black);
- putnum(100,165,Red,Black,fenshu);
- while(1);
-
- }
- }
复制代码
|