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

📄 main.c

📁 一个“游蛇吃豆”小游戏(用EasyARM.exe显示)
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
** 
**                           初始化,定义和子函数
*********************************************************************************************************
*/

#include "config.h"
#include "stdio.h"
#include "math.h"

#define	Task0StkLengh	64				// 定义任务Task0的堆栈长度
#define	Task1StkSize	128			    // 定义任务Task1的堆栈长度
#define	Task2StkSize	128				// 定义任务Task2的堆栈长度
#define	Task3StkSize	128				// 定义任务Task3的堆栈长度

#define BEEP 1<<7
 
OS_STK	Task0Stk [Task0StkLengh];		// 定义任务Task0的堆栈
OS_STK	Task1Stk [Task1StkSize];	    // 定义任务Task1的堆栈
OS_STK	Task2Stk [Task2StkSize];	    // 定义任务Task2的堆栈
OS_STK	Task3Stk [Task3StkSize];	    // 定义任务Task3的堆栈

OS_EVENT *pd0;
OS_EVENT *sem7;

uint32 hh=0;
int vv,mm;
uint8 n=1,s5=1,z=1,zj3,k0=1,k1=0,k2=0,k3=1;
int8 ff[20][2]={2,10,
                  10,10,
                };


void  Task0(void *pdata);				// 任务Task0
void  Task1(void *data);				// 任务Task1
void  Task2(void *data);				// 任务Task2
void  Task3(void *data);				// 任务Task3


  int key(void);
  void led(uint8 a);
  void ISendStr (uint8 x, uint8 y, uint8 color, char *str);
  void PC_DispChar (uint8 x, uint8 y, uint8 chr, uint8 color);
  void ISendStr1 (uint32 da);
  void UART0_Init (void);
  char snack(int8 ss[][2],uint8 d,uint8 s9);
  char snack1(int8 ss[][2],uint8 d1,uint8 mn1);     
  void  MSPI_Init(void);  
  void mp(uint8 a);
   
   
   
   uint8 u,s0,je;
   unsigned char  rrr(unsigned char vv0,unsigned char vv1)                     //随机函数
     {u=rand()%10;
	   if(vv0/10<=u&&u<=vv1/10&&s0)
	      {je=u*10;
		   s0=0;
		   return 0;
		   }
		else
	    {if(!s0)
		  {if(je/10!=vv0/10&&je/10!=vv1/10)
		     { je+=u;
			  s0=1;
			  return 1;
		      }
		  if(je/10==vv0/10&&vv0%10<=u&&je/10!=vv1/10)
		     {s0=1;
			 je+=u;
			 return 1;
			 }
           if(je/10==vv1/10&&vv1%10>=u&&je/10!=vv0/10)
		     {s0=1;
			 je+=u;
		     return 1;
			 }
		    if(vv0/10==vv1/10&&vv1%10>=u&&vv0%10<=u)
			  {s0=1;
			 je+=u;
		      return 1;
			 }
		  }
		}
       return 0;
	  }
	  
	  
   uint8 u1,s1,je1;
   unsigned char  rrr1(unsigned char vv0,unsigned char vv1)                  //随机函数 
    { u1=rand()%10;
	   if(vv0/10<=u1&&u1<=vv1/10&&s1)
	      {je1=u1*10;
		   s1=0;
		   return 0;
		   }
		else
	    {if(!s1)
		  {if(je1/10!=vv0/10&&je1/10!=vv1/10)
		     { je1+=u1;
			  s1=1;
			  return 1;
		
		      }
		  if(je1/10==vv0/10&&vv0%10<=u1&&je1/10!=vv1/10)
		     {s1=1;
			 je1+=u1;
			 return 1;
		
			 }
           if(je1/10==vv1/10&&vv1%10>=u1&&je1/10!=vv0/10)
		     {s1=1;
			 je1+=u1;
		     return 1;
			 }
		    if(vv0/10==vv1/10&&vv1%10>=u1&&vv0%10<=u1)
			  {s1=1;
			 je1+=u1;
		      return 1;
			 }
			 }
			 }
       return 0;
	  }
  
  
  
   uint8  kk(int8 aa,int8 bb)                                   //判断点有没有在蛇身函数
  
   {uint8 zj;
   if(n!=1)     
    {for(zj=n-1;zj!=0;zj--)
     { if(ff[zj][0]==ff[zj-1][0])
            {
             if(!(ff[zj][1]>bb)==(ff[zj-1][1]>bb))
                 {if(ff[zj][0]==aa)
                      return 0;
             }
          }
       if(ff[zj][1]==ff[zj-1][1])
          {
             if(!(ff[zj][0]>aa)==(ff[zj-1][0]>aa))
                {if(ff[zj][1]==bb)
                     return 0;
                }
          }
     }  
     } 
  return 1;
}
  

/*
*********************************************************************************************************
** 
**                           主函数启动多任务
*********************************************************************************************************
*/
int main (void)
{  
	OSInit ();																										
	OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 3);
	pd0=OSSemCreate(0);	
	sem7=OSSemCreate(1);
	OSStart ();
	return 0;															
}

/*
********************************************************************************************************
** 									Task0 任务0
** 							完成目标板初始化和创建任务和按扭处理
********************************************************************************************************
*/

void Task0	(void *pdata)
{
	pdata = pdata;
	
	TargetInit ();
	
	OSTaskCreate (Task1,(void *)0, &Task1Stk[Task1StkSize - 1], 2);		
	OSTaskCreate (Task2,(void *)0, &Task2Stk[Task2StkSize - 1], 4);		
	OSTaskCreate (Task3,(void *)0, &Task3Stk[Task3StkSize - 1], 5);
	
    { uint8 err; 
      uint16 ii;
      pdata = pdata;                          	 	// 避免编译警告
	  PINSEL0 = 0x05;	
      PINSEL1=00;
      PINSEL2=PINSEL2&(~0X08);
      IO1DIR|=0XFF<<18;
      IO0DIR|=BEEP;
     
	 UART0_Init ();
	 
	 ISendStr1 (hh);                                //初始化数码管
	 for(ii=0;ii<2000;ii++)                         //清屏
	    {PC_DispChar(ii%80,ii/80,32,0);
	    }
	 snack(ff,n,0x21);                              //画蛇初始化                          
	 IO1SET|=0XFF<<18;	

	
    for (;;)                 
    {switch(key())                                        //按扭                                  
          {case 1:zj3=1;
                  break;
           case 2:zj3=2;                                  //向左                               
                 break;
           case 3:zj3=3;                                  //向下            
                  break;
           case 4:zj3=4;                                  //向上    
                   break;
           case 5:if(k0)                                
                     {k0=0;
                      led(11);
                      }  
                   else
                      {k0=1;  
                       led(1);
                      }                 
                   break;
           case 6:if(k3)
                    {  k3=0;
                    err=OSTaskSuspend (4);              
                     } 
                  else
                     {k3=1;
                     err=OSTaskResume (4);
                     }  

                  break;
          }	
          
          
          
               if(k1)
                { k1=0;
                  z=1;
                  n=1;s5=1;
                  hh=0;
                  ff[0][0]=2;  
                  ff[0][1]=10; 
                  ff[1][0]=10; 
                  ff[1][1]=10;                         //按扭
                  ISendStr1 (hh);                      //初始化数码管
	              for(ii=0;ii<2000;ii++)               //清屏
	              PC_DispChar(ii%80,ii/80,32,0);
	              snack(ff,n,0x21);                    //画蛇初始化                
	              err=OSSemPost(pd0);
	              err=OSTaskResume (4);
	             }
	              
   if(ff[n][0]==vv&&ff[n][1]==mm)                      //是否吃到豆子
      {err=OSSemPost(pd0);
       s5=0;
      OSSemPend(sem7,0,&err);
                   ISendStr1 (++hh);
                   k2=1;
                  err=OSSemPost(sem7);                 //产生豆子   
      }                                                //是否吃到豆子    
        OSTimeDly(8);
    }
  }
}

/*
********************************************************************************************************
** 									Task1任务
** 								声音和流水灯任务    
********************************************************************************************************
*/
void  Task1(void *pdata)
{int d1=0,d2=0;
 pdata=pdata;
  
 for(;;)
    {if(k2)
       {IO0CLR|=BEEP;               //发声
        k2=0;
         }
  if(k0)                            //led为流水
    {IO1SET|=0XFF<<18;
     led(d1);
     
     if(d1==0)
        d2=1;
     if(d1==8)
        d2=0;
     if(d2)
        d1++; 
     else
        d1--;
      } 
  else                             //led为全亮  
    IO1CLR|=0XFF<<18;           
     OSTimeDly(15);
     IO0SET|=BEEP;
    }
}

/*
********************************************************************************************************
** 									Task2 任务
** 								   蛇前进任务    
********************************************************************************************************
*/
void  Task2(void *pdata)
{
  uint8 err,zj,zj1,zj2; 
  pdata = pdata;                                               // 避免编译警告
    
 for(;;)
 {if(k0)  
  {if(n!=1)                                                      //是否碰到蛇身
    {for(zj=n-1;zj!=0;zj--)
        {if(ff[zj][0]==ff[zj-1][0])
            {
             if(!(ff[zj][1]>ff[n][1])==(ff[zj-1][1]>ff[n][1]))
              {
               if(ff[n][0]>ff[n-1][0])
                 {if(ff[zj][0]==ff[n][0]+1)
                      {if(ff[n-1][1]>ff[n-2][1]) 
                         zj3=3;
                       else
                          zj3=4;  
                       goto sss;                                 //蛇头碰到蛇身改变蛇头
                       }
                 }
                 
             if(ff[n][0]<ff[n-1][0])
                 {if(ff[zj][0]==ff[n][0]-1)
                      {
                      if(ff[n-1][1]>ff[n-2][1]) 
                         zj3=3;
                      else
                         zj3=4;   
                       goto sss;                                  //蛇头碰到蛇身改变蛇头         
                       }
                 }   
       }
   }
          
       if(ff[zj][1]==ff[zj-1][1])
          {
             if(!(ff[zj][0]>ff[n][0])==(ff[zj-1][0]>ff[n][0]))
                {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -