⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snack.c

📁 本代码为magicchip原创代码
💻 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;               //豆子节点坐标X.
uint8   beansnacky;               //豆子节点坐标Y.
uint8   snacklen;				  //蛇身长度.
uint8   snackway;                 //蛇身前进方向
uint8   snacktime;                //蛇身运动间隔的时间.

/*********************************************************************************************************
** create by :           magicchip
** create data:          2008-06-17
** 输入数数: 
** 功能:   画新蛇头 重画原来蛇头,清蛇尾,     
**-------------------------------------------------------------------------------------------------------
** 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
** 输入数数: 判断节点的坐标.
** 输出数据:节点不在蛇身上时返回TRUE,否则返回FALSE.
** 功能:    判断蛇身节点及产生的豆子是否在蛇身上,不包括蛇头。     
**-------------------------------------------------------------------------------------------------------
** 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
** 输入数数: 
** 输出数据:
** 功能:    产生随机豆子。     
**-------------------------------------------------------------------------------------------------------
** 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
** 输入数数: 
** 输出数据:
** 功能:    蛇前进函数     
**-------------------------------------------------------------------------------------------------------
** 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];					//蛇身增加一新节点,蛇尾后移.
		 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();						  //产生随机豆子
		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
** 输入数数: 
** 功能:    贪吃蛇处理任务     
**-------------------------------------------------------------------------------------------------------
** 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();						  //产生随机豆子
	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 + -