?? snake.c
字號:
/*-----------------------------------------------------------------------*/
//工程名:貪吃蛇
//描述:結合"61板"、鍵盤模組和液晶模組完成手機游戲貪吃蛇
// 鍵盤定義為1*8鍵盤
// 硬件接口IOA15-8接液晶數據線,IOA7-0接鍵盤,鍵盤另一端接高電平
// IOB4、IOB5、IOB6分別接A0、RWP、EP
//組成函數:main.c System.asm isr.asm sacm_user.asm sacmV32.asm
// spce.asm SPLC501DisplayTAB.asm SPLC501Hardware.asm
// Splc501sys.asm Splc501var.asm
//調用的庫:
//日期:2005/01/13
//修改:2005/01/25
/*-----------------------------------------------------------------------*/
#define N 200 //定義貪吃蛇的節數
#define music 0x0001 //1*8鍵盤的鍵號值,功能:進入游戲帶背景音樂/開啟音樂
#define n_music 0x0002 //1*8鍵盤的鍵號值,功能:進入游戲不帶背景音樂/關閉音樂
#define UP 0X0004 //1*8鍵盤的鍵號值,功能:向上
#define DOWN 0X0008 //1*8鍵盤的鍵號值,功能:向下
#define LEFT 0X0010 //1*8鍵盤的鍵號值,功能:向左
#define RIGHT 0X0020 //1*8鍵盤的鍵號值,功能:向右
#define QUIT 0X0040 //1*8鍵盤的鍵號值,功能:退出
extern unsigned int flag; //定義外部變量,標志位,用于等待
unsigned int random_num; //存儲隨機數,由于得到食物坐標
int i; //臨時變量,用于循環
int no_music; //標志位,是否需要音樂
/*-----------------------------------------------------------------------*/
//定義結構體類型變量
struct Food //食物
{
int x; //食物的橫坐標
int y; //食物的縱坐標
int yes; //是否需要食物,1表示需要,0表示不需要
}food;
struct Snake //蛇
{
int x[N]; //貪吃蛇的第N節橫坐標
int y[N]; //貪吃蛇的第N節縱坐標
int node; //貪吃蛇的節數
int direction; //貪吃蛇的行動方向
int life; //貪吃蛇的生命,0表示活,1表示死
}snake;
/*-----------------------------------------------------------------------*/
//說明函數
/*-----------------------------------------------------------------------*/
//函數名稱:GameOver()
//功能描述:貪吃蛇游戲結束,顯示GameOver
//語法格式:void GameOver()
//入口參數;無
//出口參數:無
//注意事項:僅為用戶模型
/*-----------------------------------------------------------------------*/
void GameOver()
{
LCD501_ClrScreen(0);//FG_ClearScreen(0); //調用液晶函數,清屏
//FG_SetLineStyle(2); //調用液晶函數,用實線填充
LCD501_Line(0,0,90,0);//FG_LineTo(0,0,90,0); //調用液晶函數,畫直線
LCD501_Line(90,0,90,63);//FG_LineTo(90,0,90,63); //調用液晶函數,畫直線
LCD501_Line(90,63,0,63);//FG_LineTo(90,63,0,63); //調用液晶函數,畫直線
LCD501_Line(0,0,0,63);//FG_LineTo(0,0,0,63); //調用液晶函數,畫直線
//FG_SetCharMode(0); //調用液晶函數,用實體輸出
LCD501_FontSet(0);
LCD501_PutString(127,50,"snake"); //FG_PutStr("snake",small,127,50); //調用液晶函數,輸出SNAKE
LCD501_FontSet(1);
LCD501_PutString(85,40,"GameOver!!");//FG_PutStr("GameOver!!",large,85,40);//調用液晶函數,輸出GameOver!!
//for(;;) //程序停在此處
//{
*P_Watchdog_Clear=0x0001; //清看門狗
//}
}
/*-----------------------------------------------------------------------*/
//函數名稱:GamePlay()
//功能描述:貪吃蛇游戲人機界面,具體操作與游戲
//語法格式:void GamePlay()
//入口參數;無
//出口參數:無
//注意事項:僅為用戶模型
/*-----------------------------------------------------------------------*/
void GamePlay()
{
food.yes=1; //初始化,屏幕上需要食物
snake.life=0; //初始化,蛇活
snake.direction=4; //初始化,蛇向右行動
snake.x[0]=60; //初始化,蛇頭的位置,橫坐標
snake.y[0]=50; //初始化,蛇頭的位置,縱坐標
snake.x[1]=61;
snake.y[1]=50;
snake.x[2]=62;
snake.y[2]=50;
snake.x[3]=63;
snake.y[3]=50;
snake.node=4; //初始化,蛇的節數
///////////////////////////////////////////////
/* if(no_music==1)
{
SACM_A2000_Initial(Auto); //初始化A2000
SACM_A2000_Play(0,3,3); //放音
}
Reset_Int();*/ //重新設置中斷
while(1)
{
if(no_music==1)
{
if((SACM_A2000_Status()&0x01) == 0) //判斷語音是否播放結束 函數包含在Sacmv32.lib
SACM_A2000_Play(0,DAC1+DAC2,Ramp_Up_On+Ramp_Dn_On);//語音播放 函數包含在Sacmv32.lib
}
K_code=0x0000; //清除上次鍵值
System_ServiceLoop(); //掃描鍵盤,獲得按鍵值
*P_Watchdog_Clear=0x0001; //清看門狗
random_num=*P_TimerB_Data; //獲得隨機數
if(food.yes==1) //需要食物
{
food.x=random_num%88+2; //獲得食物橫坐標
food.y=random_num%61+2; //獲得食物縱坐標
food.yes=0; //清除需要食物標志
}
if(food.yes==0)
{
FG_SetRectStyle(3); //在屏幕上畫出食物
FG_Rectangle(food.x,food.y,food.x+1,food.y+1);
}
if(K_code==QUIT) //如果鍵值為退出鍵,結束游戲
break;
if(K_code==n_music) //關閉背景音樂
{
SACM_A2000_Stop(); //停止播放
no_music=0; //清除標志
}
if(K_code==music) //開啟背景音樂
{
SACM_A2000_Initial(Auto); //初始化放音函數
SACM_A2000_Play(0,3,3); //播放音樂
no_music=1; //設置標志位
}
//1表示向上,2表示向下,3表示向左,4表示向右
else if(K_code==UP&&snake.direction==3) //鍵值為向上,貪吃蛇向左行動
snake.direction=1; //貪吃蛇向上行動
else if(K_code==UP&&snake.direction==4) //鍵值為向上,貪吃蛇向右行動
snake.direction=1; //貪吃蛇向上行動
else if(K_code==DOWN&&snake.direction==3) //鍵值為向下,貪吃蛇向左行動
snake.direction=2; //貪吃蛇向下行動
else if(K_code==DOWN&&snake.direction==4) //鍵值為向下,貪吃蛇向右行動
snake.direction=2; //貪吃蛇向下行動
else if(K_code==LEFT&&snake.direction==1) //鍵值為向左,貪吃蛇向上行動
snake.direction=3; //貪吃蛇向左行動
else if(K_code==LEFT&&snake.direction==2) //鍵值為向左,貪吃蛇向下行動
snake.direction=3; //貪吃蛇向左行動
else if(K_code==RIGHT&&snake.direction==1) //鍵值為向右,貪吃蛇向上行動
snake.direction=4; //貪吃蛇向右行動
else if(K_code==RIGHT&&snake.direction==2) //鍵值為向右,貪吃蛇向下行動
snake.direction=4; //貪吃蛇向右行動
////////////////////
if(snake.x[0]<0||snake.x[0]>90||snake.y[0]>63) //判斷蛇是否撞到邊框
{
FG_ClearScreen(0);
GameOver(); //游戲結束
snake.life=1; //蛇死
}
if(snake.y[0]<1)
{
FG_ClearScreen(0);
GameOver(); //游戲結束
snake.life=1; //蛇死
}
for(i=3;i<snake.node;i++)
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) //判斷蛇是否撞到自己
{
GameOver();
snake.life=1;
}
}
//注意貪吃蛇不能向相反方向行動
if(flag==1) //延時更新畫面,flag在中斷中改變用于延時
{
flag=0; //清中斷標志
//畫貪吃蛇,貪吃蛇關鍵算法
switch(snake.direction) //根據行動方向改變蛇頭位置
{
case 1:snake.y[0]+=1; //1表示向上
break;
case 2:snake.y[0]-=1; //2表示向下
break;
case 3:snake.x[0]+=1; //3表示向左
break;
case 4:snake.x[0]-=1; //4表示向右
break;
}
FG_SetRectStyle(3); //用實體畫線
for(i=0;i<snake.node;i++) //循環畫出蛇
FG_Rectangle(snake.x[i],snake.y[i],snake.x[i]+1,snake.y[i]+1);
FG_ClearRect(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+1,snake.y[snake.node-1]+1);
//關鍵:擦除蛇尾
for(i=snake.node-1;i>0;i--)
{
snake.x[i]=snake.x[i-1]; //移動各節蛇的坐標
snake.y[i]=snake.y[i-1];
}
/////////////////////////////
//重新設置中斷
Reset_Int();
}
if(snake.life==1) //蛇死
break; //跳出PlayGame函數
if(snake.x[0]==food.x&&snake.y[0]==food.y) //蛇吃到食物
{
FG_SetRectStyle(0);
FG_ClearRect(food.x,food.y,food.x+1,food.y-1);//擦掉食物
snake.node++; //蛇節數加一節
food.yes=1; //需要食物
}
*P_Watchdog_Clear=0x00001;
}
}
/*-----------------------------------------------------------------------*/
//函數名稱:Draw()
//功能描述:畫貪吃蛇初始界面
//語法格式:void Draw()
//入口參數;無
//出口參數:無
//注意事項:僅為用戶模型
/*-----------------------------------------------------------------------*/
void Draw()
{
FG_ClearScreen(0); //調用液晶函數,清屏
//FG_SetLineStyle(2); //調用液晶函數,用實線填充
FG_LineTo(0,0,90,0); //調用液晶函數,畫直線
FG_LineTo(90,0,90,63); //調用液晶函數,畫直線
FG_LineTo(90,63,0,63); //調用液晶函數,畫直線
FG_LineTo(0,0,0,63); //調用液晶函數,畫直線
FG_SetCharMode(0); //調用液晶函數,用實體輸出
FG_PutStr("snake",small,127,50); //調用液晶函數,輸出small:
}
/*-----------------------------------------------------------------------*/
//函數名稱:Welcome_Init()
//功能描述:在開機時顯示畫面
//語法格式:void Welcome_Init()
//入口參數;無
//出口參數:無
//注意事項:僅為用戶模型
/*-----------------------------------------------------------------------*/
void Welcome_Init()
{
FG_ClearScreen(0); //調用液晶函數,清屏
FG_SetLineStyle(2); //調用液晶函數,用實線填充
FG_LineTo(0,0,127,0); //調用液晶函數,畫直線
FG_LineTo(127,0,127,63); //調用液晶函數,畫直線
FG_LineTo(0,63,127,63); //調用液晶函數,畫直線
FG_LineTo(0,0,0,63); //調用液晶函數,畫直線
FG_SetCharMode(0); //調用液晶函數,用實體輸出
for(i=0;i<0x007e;i++)
{
FG_PutStr("Welcome Play Game",small,121,50); //調用液晶函數,輸出
*P_Watchdog_Clear=0x00001; //清看門狗
}
FG_ClearScreen(0); //清屏
while(1)
{
FG_PutStr("Play with music",small,121,50); //輸出字符
FG_PutStr("press 1",small,121,40); //輸出字符
FG_PutStr("Play without music",small,121,30); //輸出字符
FG_PutStr("press 2",small,121,20); //輸出字符
*P_Watchdog_Clear = 0x0001; //清看門狗
K_code=0x0000; //清除上次鍵值
System_ServiceLoop(); //掃描鍵盤
if(K_code ==0x0002) //進入游戲帶背景音樂
break;
if(K_code ==0x0001) //進入游戲不帶背景音樂
{
no_music=0;
break;
}
}
}
/*-----------------------------------------------------------------------*/
//函數名稱:main()
//功能描述:主函數
//語法格式:void main()
//入口參數;無
//出口參數:無
//注意事項:僅為用戶模型
/*-----------------------------------------------------------------------*/
/*
void main()
{
no_music = 1; //初始化標志位
Init_sys(); //初始化液晶
FG_InitGraphic(); //初始化液晶接口函數
Set_TimerB(); //開啟定時器,為得到隨機數做準備
Set_Int(); //設置中斷
Welcome_Init(); //設置開機畫面
Draw(); //畫貪吃蛇
GamePlay(); //玩游戲
GameOver(); //游戲結束
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -