实验:贪吃蛇
一、实验目的
1.运用所学过的单片机知识,编写简单的贪吃蛇游戏; 2.学会单片机大部分功能的运用。 二、实验原理 1. TFT 彩屏工作原理
TFT(Thin Film Transistor)LCD 即薄膜场效应晶体管LCD,是有源矩阵类型液晶显示器(AM-LCD)中的一种。和TN 技术不同的是,TFT 的显示采用“背透式”照射方式——假想的光源路径不是像TN 液晶那样从上至下,而是从下向上。这样的作法是在液晶的背部设置特殊光管,光源照射时通过下偏光板向上透出。由于上下夹层的电极改成FET 电极和共通电极,在FET 电极导通时,液晶分子的表现也会发生改变,可以通过遮光和透光来达到显示的目的,响应时间大大提高到80ms 左右。因其具有比TN LCD 更高的对比度和更丰富的色彩,荧屏更新频率也更快,故TFT 俗称“真彩”。
LCD 是由二层玻璃基板夹住液晶组成的,形成一个平行板电容器,通过嵌入在下玻璃基板上的TFT 对这个电容器和内置的存储电容充电,维持每幅图像所需要的电压直到下一幅画面更新。液晶的彩色都是透明的必须给LCD 衬以白色的背光板上才能将五颜六色表达出来,而要使白色的背光板有反射就需要在四周加上白色灯光。因此在TFT LCD 的底部都组合了灯具,如CCFL 或LED。
2.矩阵按钮
矩阵按键又称为行列式按键,他是用4 条I/O 线作为行线,4 条I/O 线作为列线组成的按键,在行线和列线的每一个交叉点上,设置一个按键。如图所示,
按键识别原理:
在某一时刻只让一条列线处于低电平,其余列线均处于高电平,则当这一列有键按下时,该键所在的行电平将会由高电平变为低电平,可判定该列相应的行
有键按下。当第0 列处于低电平时,逐行查找是否有行线变低,若有,则第0 列与该行的交叉点按键按下;若无,则表示第0 列无键按下,再让下一列处在低电平,依此循环,这种方式称为键盘扫描。
3.贪吃蛇操作原理
贪吃蛇本身是由好几个点连成的一条线段,只要通过延时函数使线段在时间前后往指定的方向进一步就行了,即将所有线段上的点往指定方向移动一段,就会出现贪吃蛇的基本运动。贪吃蛇的方向可以通过设置几个指定的按钮来控制。
贪吃蛇吃的食物那个点可以由随机函数rand()产生一个随机数组,再每次显示一个数组里的点就可以达到预计的随机点。
最后再通过判断边界,输赢条件,使程序更加完善,界面美观。 三、实验代码。
#include
#include\ #include\ #include\ #include\
#include\
// Provide a definition for M_PI, if it was not provided by math.h. #ifndef M_PI
#define M_PI 3.14159265358979323846F #endif
uint16_t sc; //长度
unsignedint k=0,start=0,s=3000; //k按键数,start开始键 unsignedint sum=0;//吃到的食物数量
//********************************************************************* uint32_t g_ui32SysClock;
staticvolatileunsignedlong g_ulTickCount; #define SERIES_LENGTH 240
typedefstruct _snack {
uint32_tx; uint32_ty; }ssnack;
staticssnack snack[40],a[50];//a为随机数 staticssnack food;//食物
voidTFTLCD_DrawLine(ssnack sk1,ssnack sk2,uint32_t color) // 画蛇线段 {
uint32_t i=0,PointNum = 0; if(sk1.x==sk2.x) //沿Y方向画线 {PointNum = abs(sk1.y-sk2.y); if(sk1.y<=sk2.y) {
for(i=0;i TFTLCD_DrawPoint(sk1.x,sk1.y+i,color); } } Else { for(i=0;i } } { TFTLCD_DrawPoint(sk1.x,sk2.y+i,color); } elseif (sk1.y==sk2.y)//沿X方向画线 {PointNum = abs(sk1.x-sk2.x); if(sk1.x<=sk2.x) { } else { } } } void SnackInit(void) //对蛇进行初始化 { uint32_t i; snack[0].x=50; snack[0].y=50; for(i=1;i<=5;i++) { snack[i].x=50; snack[i].y=50+10*i; TFTLCD_DrawLine(snack[i-1],snack[i],GREEN); for(i=0;i { TFTLCD_DrawPoint(sk2.x+i,sk2.y,color); } for(i=0;i TFTLCD_DrawPoint(sk1.x+i,sk2.y,color); } TFTLCD_DrawHorizontalLine(0,240,340,GREEN); } void SnackDown(void) // 往下走 { uint32_t n; TFTLCD_DrawLine(snack[1],snack[0],BLACK); SysCtlDelay(500*(20000000/s));//2 for(n=0;n snack[n]=snack[n+1]; } snack[sc].y=snack[sc].y+10; TFTLCD_DrawLine(snack[sc-1],snack[sc],GREEN); SysCtlDelay(500*(20000000/s));//2 } void SnackRight(void)//往右走 { uint32_t n,j; j=sc-1; TFTLCD_DrawLine(snack[1],snack[0],BLACK); SysCtlDelay(500*(20000000/s));//2 for(n=0;n<=j;n++) { snack[n]=snack[n+1]; } snack[sc].x=snack[sc].x+10; TFTLCD_DrawLine(snack[j],snack[sc],GREEN); SysCtlDelay(500*(20000000/s));//2 } void SnackLeft(void) //往左走 { uint32_t n,j; j=sc-1;