基于Freescale三轴加速度传感器LCD的贪食蛇游戏设计Word格式文档下载.docx
《基于Freescale三轴加速度传感器LCD的贪食蛇游戏设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于Freescale三轴加速度传感器LCD的贪食蛇游戏设计Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
}Snake;
//蛇结构体
ucharKey_V_temp=0;
//取出上次按键值
ucharKey_Value=0;
staticintl=0;
staticuint16KEY_Init[3]={0,0,0};
staticuint16KEY_BASE[3]={0,0,0};
score[20]={"
0"
"
10"
20"
30"
40"
50"
60"
70"
80"
90"
100"
110"
120"
130"
140"
150"
160"
170"
180"
190"
};
intlevel[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
staticconstbyteChannels[]={13,14,15};
/*Contentsforthedevicecontrolregister*/
staticwordMMA_7260_OutV[3];
staticbyteSumChan;
staticbyteOutFlg;
voidMMA_7260_Init_3(void)
OutFlg=FALSE;
/*Nomeasuredvalue*/
/*ATD0CTL4:
SMP2=0,SMP1=0,SMP0=0,PRS4=0,PRS3=0,PRS2=1,PRS1=0,PRS0=1*/
ATD0CTL4=5;
/*Setsampletimeandprescaler*/
/*ATD0CTL3:
DJM=0,S8C=0,S4C=0,S2C=0,S1C=1,FIFO=0,FRZ1=0,FRZ0=0*/
ATD0CTL3=8;
/*SetATDcontrolregister3*/
/*ATD0CTL0:
?
?
=0,?
=0,WRAP3=1,WRAP2=1,WRAP1=1,WRAP0=1*/
ATD0CTL0=15;
/*Setwraparound*/
/*ATD0CTL1:
ETRIGSEL=0,SRES1=1,SRES0=0,SMP_DIS=1,ETRIGCH3=1,ETRIGCH2=1,ETRIGCH1=1,ETRIGCH0=1*/
ATD0CTL1=95;
/*Setresolutionanddischarge*/
/*ATD0CTL2:
=0,AFFC=1,ICLKSTP=0,ETRIGLE=0,ETRIGP=0,ETRIGE=0,ASCIE=0,ACMPIE=0*/
ATD0CTL2=64;
/*SetATDcontrolregister2*/
}
//-----------------------------------------------------
staticvoidMMA_7260_Measure_3(void)
for(SumChan=0;
SumChan<
3;
SumChan++){
ATD0CTL5=Channels[SumChan];
/*Startmeasurementofnextchannel*/
while(!
ATD0STAT0_SCF){}/*WaitforADconversioncomplete*/
MMA_7260_OutV[SumChan]=ATD0DR0;
/*Savemeasuredvalue*/
}
OutFlg=TRUE;
/*Measuredvaluesareavailable*/
byteMMA_7260_GetValue16_3(word*Values)
if(!
OutFlg){/*Ismeasuredvalue(s)available?
*/
return0;
/*Ifnothenerror*/
/*Note:
Next4linesarespeedoptimized*/
*Values++=MMA_7260_OutV[0];
/*Savemeasuredvaluestotheoutputbuffer*/
*Values++=MMA_7260_OutV[1];
*Values++=MMA_7260_OutV[2];
return1;
/*OK*/
////////////////////////贪食蛇游戏/////////////////////////////////
//函数名称:
Trun_On_PointTrun_Off_Point(ucharx,uchary)
//函数功能:
点亮或者熄灭一个点。
用于显示蛇身体
//入口参数:
无
//出口参数:
//特别说明:
此Trun_On,函数换成其他的就可以兼容其他的液晶
//入8*8点阵12864等
voidTrun_On_Point(ucharx,uchary,ucharcolor)
ili9320_Rectangle((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color,color);
//Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color);
voidTrun_Off_Point(ucharx,uchary)
ili9320_Rectangle((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),0xFFFF,0xFFFF);
voidInit_SNAKE(void)
绘制游戏界面,初始化游戏等级等参数
uchari;
//***********获取方向基准********************//
MMA_7260_Init_3();
MMA_7260_Measure_3();
MMA_7260_GetValue16_3(&
KEY_BASE);
//以下语句可以通过串口检验三轴加速度数据
/*
if(Flag){
printp("
GetXChannel:
%10D"
KEY_BASE[0]);
GetYChannel:
KEY_BASE[1]);
GetZChannel:
KEY_BASE[2]);
*/
//***********绘制游戏界面********************//
ili9320_Rectangle(4,4,166,206,0,0);
ili9320_Rectangle(5,5,167,207,0,0);
ili9320_Rectangle(6,6,168,208,0,0);
ili9320_Rectangle(5,5,169,209,0,0);
ili9320_Rectangle(7,7,167,207,0xFFFF,0xFFFF);
//绘制一个矩形框,160*240
ili9320_Write_multi_HZ_ASCII(167+10,32,32,32,"
少女32.FON"
少符32.FON"
07电信一"
0xF800);
ili9320_Write_multi_HZ_ASCII(167+10,66,32,32,"
郑友金"
ili9320_Write_multi_HZ_ASCII(167+10,100,32,32,"
贪食蛇"
//***********初始化蛇参数********************//
Snake.Long=2;
//定义初始化蛇的长度
Snake.Life=0;
//初始化蛇还活着
Snake.Score=0;
Food.Yes=1;
Key_Value=0;
for(i=0;
i<
Snake.Long;
i++)//将蛇给赋值
{
Snake.X[i]=i+10;
Snake.Y[i]=10;
}
i++)//将蛇给画出来
Trun_On_Point(Snake.X[i],Snake.Y[i],0);
voidDisplay_dead(uchari)
显示死亡界面
voidDisplay_dead(uchari)
l=0;
Snake.Level=0;
ili9320_Text(7+30,7+40,"
GAMEOVER"
9,0,0xffff);
ili9320_Delay(3000);
Init_SNAKE();
voidDisplay_Pass(uchari)
显示过关界面
l++;
Snake.Level++;
YOUWIN"
7,0,0xffff);
voidDisplay_finish(uchari);
显示通关界面
voidDisplay_finish(uchari)
ili9320_Text(7+30,7+80,"
GAMEFINISHED"
13,0,0xffff);
ili9320_Delay(4000);
voidRun_SNAKE(void)
蛇运动函数
/*********************采用扫描MMA_7260方式确立方向*******************/
uchari=0;
uint16KEY_Init[4]={0,0,0,0};
KEY_Init);
//以下语句可以通过串口检验三轴加速度数据
/*
GetX1Channel:
KEY_Init[0]);
GetY1Channel:
KEY_Init[1]);
GetZ1Channel:
KEY_Init[2]);
GetX2Channel:
KEY_Init[0]-KEY_BASE[0]);
GetY2Channel:
KEY_Init[1]-KEY_BASE[1]);
GetZ2Channel:
KEY_Init[2]-KEY_BASE[2]);
if((KEY_Init[0]-KEY_BASE[0])>
500&
&
(KEY_Init[0]-KEY_BASE[0])<
3000)Key_Value=Key_Left;
if((KEY_BASE[0]-KEY_Init[0])>
(KEY_BASE[0]-KEY_Init[0])<
3000)Key_Value=Key_Right;
if((KEY_Init[1]-KEY_BASE[1])>
(KEY_Init[1]-KEY_BASE[1])<
3000)Key_Value=Key_Up;
if((KEY_BASE[1]-KEY_Init[1])>
(KEY_BASE[1]-KEY_Init[1])<
3000)Key_Value=Key_Down;
//Cpu_Delay100US(2100-Snake.Level*400);
/*********************方向取值完毕*******************/
/*********************根据按键选择蛇的运动方向*******************/
//if((Key_Value==Key_Right&
Key_V_temp!
=Key_Left)||(Key_Value==Key_Left&
Key_V_temp==Key_Right))
if(Key_Value==Key_Right)
{//1.蛇行不是左向,下步可以右向。
2.蛇行右向,按左向无效,继续右向
Trun_Off_Point(Snake.X[0],Snake.Y[0]);
//先把蛇尾给熄灭掉
for(i=0;
Snake.Long-1;
i++)//蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0;
//蛇头向你要求的方向移动
i++)//这个让蛇显示出来的函数
Trun_On_Point(Snake.X[i],Snake.Y[i],0xffff);
}
Key_Value=0;
//Key_V_temp=Key_Right;
//if((Key_Value==Key_Left&
=Key_Right)||(Key_Value==Key_Right&
Key_V_temp==Key_Left))
if(Key_Value==Key_Left)
//先把蛇尾给熄灭掉
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;
//Key_V_temp=Key_Left;
//if((Key_Value==Key_Up&
=Key_Down)||(Key_Value==Key_Down&
Key_V_temp==Key_Up))
if(Key_Value==Key_Up)
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1;
//Key_V_temp=Key_Up;
//if((Key_Value==Key_Down&
=Key_Up)||(Key_Value==Key_Up&
Key_V_temp==Key_Down))
if(Key_Value==Key_Down)
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1;
//Key_V_temp=Key_Down;
/****************根据按键选择蛇的运动程序结束*******************/