?? snack.c
字號:
/****************************************Copyright (c)**************************************************
** http://magicchip.21ic.org
** magicchip@163.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: snack.c
** Last modified Date: 2008-06-17
** Last Version: 1.0
**------------------------------------------------------------------------------------------------------
** Created by: magicchip
** Created date: 2008-06-17
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
uint8 snackaddr[101][2]; //蛇身坐標存儲空間
uint8 beansnackx; //豆子節(jié)點坐標X.
uint8 beansnacky; //豆子節(jié)點坐標Y.
uint8 snacklen; //蛇身長度.
uint8 snackway; //蛇身前進方向
uint8 snacktime; //蛇身運動間隔的時間.
/*********************************************************************************************************
** create by : magicchip
** create data: 2008-06-17
** 輸入數(shù)數(shù):
** 功能: 畫新蛇頭 重畫原來蛇頭,清蛇尾,
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void drawsnack(void)
{
SetFgColor(BLACK);
Draw_Rect(0x27,snackw*snackaddr[0][0],snackh*snackaddr[0][1],snackw*snackaddr[0][0]+snackw,snackh*snackaddr[0][1]+snackh); //畫蛇頭
SetFgColor(RED);
Draw_Rect(0x27,snackw*snackaddr[1][0],snackh*snackaddr[1][1],snackw*snackaddr[1][0]+snackw,snackh*snackaddr[1][1]+snackh); //重畫原來蛇頭
SetFgColor(TIANLANSE);
Draw_Rect(0x27,snackw*snackaddr[snacklen][0],snackh*snackaddr[snacklen][1],snackw*snackaddr[snacklen][0]+snackw,snackh*snackaddr[snacklen][1]+snackh); //清蛇尾
}
/*********************************************************************************************************
** create by : magicchip
** create data: 2008-06-17
** 輸入數(shù)數(shù): 判斷節(jié)點的坐標.
** 輸出數(shù)據(jù):節(jié)點不在蛇身上時返回TRUE,否則返回FALSE.
** 功能: 判斷蛇身節(jié)點及產(chǎn)生的豆子是否在蛇身上,不包括蛇頭。
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 judgesnack(uint8 x,uint8 y)
{
uint8 i;
for (i=1;i<snacklen;i++)
{
if ((x == snackaddr[i][0]) && ( y == snackaddr[i][1]))
return FALSE;
}
return TRUE;
}
/*********************************************************************************************************
** create by : magicchip
** create data: 2008-06-17
** 輸入數(shù)數(shù):
** 輸出數(shù)據(jù):
** 功能: 產(chǎn)生隨機豆子。
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void randomsnack(void)
{
do
{
beansnackx = (T0TC*beansnackx+beansnacky+T0TC)%beanxno;
beansnacky = (T0TC*beansnacky+beansnackx+T0TC)%beanyno;
if ((beansnackx == snackaddr[0][0]) && ( beansnacky == snackaddr[0][1])) //判斷畢露 點是否在蛇頭上
break;
}while(judgesnack(beansnackx,beansnacky) == FALSE);
SetFgColor(RED);
Draw_Rect(0x27,snackw*beansnackx,snackh*beansnacky,snackw*beansnackx+snackw,snackh*beansnacky+snackh); //畫豆子
}
/*********************************************************************************************************
** create by : magicchip
** create data: 2008-06-17
** 輸入數(shù)數(shù):
** 輸出數(shù)據(jù):
** 功能: 蛇前進函數(shù)
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 snackgo(void)
{
uint8 i;
if ((beansnackx == snackaddr[0][0]) && (beansnacky == snackaddr[0][1])) //判斷豆子是否與蛇頭重合
{
snackaddr[snacklen+1][0] = snackaddr[snacklen][0]; //蛇身增加一新節(jié)點,蛇尾后移.
snackaddr[snacklen+1][1] = snackaddr[snacklen][1];
for (i=snacklen;i>0;i--)
{
snackaddr[i][0] = snackaddr[i-1][0];
snackaddr[i][1] = snackaddr[i-1][1];
}
snacklen ++;
randomsnack(); //產(chǎn)生隨機豆子
if (snacklen %15 == 0) //加速
snacktime -= 5;
}
else
{
for (i=snacklen;i>0;i--)
{
snackaddr[i][0] = snackaddr[i-1][0];
snackaddr[i][1] = snackaddr[i-1][1];
}
}
if (snackway == wayup)
{
if (snackaddr[0][1] == 0)
return FALSE;
snackaddr[0][1] = snackaddr[1][1]-1;
}
else if (snackway == waydown) //下移
{
if (snackaddr[0][1] == (beanyno-1))
return FALSE;
snackaddr[0][1] = snackaddr[1][1]+1;
}
else if (snackway == wayleft) //左移
{
if (snackaddr[0][0] == 0)
return FALSE;
snackaddr[0][0] = snackaddr[1][0]-1;
}
else if (snackway == wayright) //右移
{
if (snackaddr[0][0] == (beanxno-1))
return FALSE;
snackaddr[0][0] = snackaddr[1][0]+1;
}
if (judgesnack(snackaddr[0][0],snackaddr[0][1]) == FALSE) //判斷蛇頭是否在蛇身上.
return FALSE;
drawsnack();
return TRUE;
}
/*********************************************************************************************************
** create by : magicchip
** create data: 2008-06-17
** 輸入數(shù)數(shù):
** 功能: 貪吃蛇處理任務
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SnackTask(void *pdata)
{
void *key;
uint8 i;
uint8 err;
pdata = pdata;
suspendsnacktask:
OSTaskSuspend(SnackTaskPrio);
snacklen = 5;
snackway = wayleft;
snacktime = 40;
snackaddr[0][0] = 30;
snackaddr[0][1] = 24;
snackaddr[1][0] = 31;
snackaddr[1][1] = 24;
snackaddr[2][0] = 32;
snackaddr[2][1] = 24;
snackaddr[3][0] = 33;
snackaddr[3][1] = 24;
snackaddr[4][0] = 34;
snackaddr[4][1] = 24;
ClearScreen(TIANLANSE);
SetFgColor(BLACK);
SetBgColor(TIANLANSE);
Draw_Rect(0x27,snackw*snackaddr[0][0],snackh*snackaddr[0][1],snackw*snackaddr[0][0]+snackw,snackh*snackaddr[0][1]+snackh); //畫蛇頭
SetFgColor(RED);
for (i=1;i<snacklen;i++)
Draw_Rect(0x27,snackw*snackaddr[i][0],snackh*snackaddr[i][1],snackw*snackaddr[i][0]+snackw,snackh*snackaddr[i][1]+snackh); //畫蛇身
randomsnack(); //產(chǎn)生隨機豆子
OSMboxAccept(KeyMbox); //清除按鍵
while(1)
{
key = OSMboxPend(KeyMbox,snacktime,&err);
if (err == OS_NO_ERR)
{
if (((uint32)key == KEY_LEFT) && (snackway != wayright))
{
snackway = wayleft;
}
else if(((uint32)key == KEY_RIGHT) && (snackway != wayleft))
{
snackway = wayright;
}
else if(((uint32)key == KEY_UP) && (snackway != waydown))
{
snackway = wayup;
}
else if(((uint32)key == KEY_DOWN) && (snackway != wayup))
{
snackway = waydown;
}
else if ((uint32)key == KEY_MENU)
{
exitsnack: OSTaskResume(GuiTaskPrio); //恢復GUI任務
goto suspendsnacktask;
}
if (snackgo() == FALSE)
{
goto exitsnack;
}
}
else if (err == OS_TIMEOUT)
{
if (snackgo() == FALSE)
{
goto exitsnack;
}
}
#if SOFT_DEBUG_EN > 0
if ((err != OS_NO_ERR) && (err != OS_TIMEOUT))
assert(0,err);
#endif
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -