社区导航

 

搜索
查看: 557|回复: 2

[原创] 【NXP Rapid IoT评测】经典贪吃蛇 纯手打

[复制链接]

206

TA的帖子

10

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-3-31 16:55 | 显示全部楼层 |阅读模式
NXP Rapid IoT 原来调用的是EWWIM做显示架构的,利用原来的架构,通过 ATMO_Status_t GluttonousSnake_onDisplayed(ATMO_Value_t *in, ATMO_Value_t *out)进行自己的任务
  1. ATMO_Status_t GluttonousSnake_onDisplayed(ATMO_Value_t *in, ATMO_Value_t *out) {
  2.         SX9500Touch_DisableAbilityHandle();
  3.         GluttonousSnakeInit();
  4.         ATMO_PLATFORM_DebugUsbPrint("%s\r\n",__FUNCTION__);
  5.         return ATMO_Status_Success;
  6.    
  7. }
复制代码


GluttonousSnake 是在 Rapid IOT Studio 拖拉出来的显示模块的命名,根据自己实际情况进行修改。

现在只做了一个架框,蛇可以动,能吃食物,大概效果如果
QQ图片20190331164154.jpg

画边界
  1. //画一个蛇的最小单位
  2. uint16_t Trun_On_Point(uint16_t x, uint16_t y, uint16_t size) {
  3.         GUI_FillRect(x, y, x + size, y + size);
  4.         return size;
  5. }

  6. //擦去一个蛇的最小单位
  7. uint16_t Trun_Off_Point(uint16_t x, uint16_t y, uint16_t size) {
  8.         GUI_ClearRect(x, y, x + size, y + size);
  9.         return size;
  10. }

  11. static void CreateMap(void) {
  12.         uint16_t ucV_XSize = 0;
  13.         uint16_t ucV_YSize = 0;
  14.         uint16_t i = 0;
  15.         ucV_XSize = LCD_GetXSize();
  16.         ucV_YSize = LCD_GetYSize();

  17.         //ATMO_PLATFORM_DebugUsbPrint("LCD X:%d Y:%d\r\n",ucV_XSize,ucV_YSize);

  18.         GUI_SetColor(GUI_RED);  //画笔颜色
  19.         //GUI_SetPenSize(8);      //设置笔大小,5pixel粗线
  20.         //GUI_DrawRect(2,2,ucV_XSize-2,ucV_YSize-2);
  21.         //GUI_DrawLine(0,8, ucV_XSize-8, 8);

  22.         for (i = 0; i < ucV_XSize; i += 4) {    //打印上下边框
  23.                 //GUI_DispStringAt("A", i, 0);
  24.                 //GUI_DispStringAt("A", i, ucV_YSize);
  25.                 Trun_On_Point(i, 0, 2);
  26.                 Trun_On_Point(i, ucV_YSize - 1 - 2, 2);
  27.         }
  28.         for (i = 0; i < ucV_YSize; i += 4) {        //打印左右边框
  29.                 //GUI_DispStringAt("A", 0, i);
  30.                 //GUI_DispStringAt("A", ucV_XSize, i);
  31.                 Trun_On_Point(0, i, 2);
  32.                 Trun_On_Point(ucV_XSize - 1 - 2, i, 2);
  33.         }

  34.         //GUI_Exec();

  35. }
复制代码


画蛇与按键的操作回调函数
  1. static void Snake_Init(void) {
  2.         uint8_t i;
  3.         snake.longth = 3;            //初始化长度为3
  4.         snake.isLive = 1;            //蛇是活着的
  5.         snake.score = 0; //当前的分为0
  6.         food.flag = 1;

  7.         for (i = 0; i < snake.longth; i++) {
  8.                 snake.XPos[i] = V_Snake_Size * 5 + V_Snake_Size * i;
  9.                 snake.YPos[i] = V_Snake_Size * 5;
  10.         }

  11.         for (i = 0; i < snake.longth; i++) {
  12.                 Trun_On_Point(snake.XPos[i], snake.YPos[i], V_Snake_Size);
  13.         }

  14.         ATMO_SX9500_RegisterTouchedCallback(SX9500_Touched_Down, SnakeDirKeyDown);
  15.         ATMO_SX9500_RegisterTouchedCallback(SX9500_Touched_Up, SnakeDirKeyUp);
  16.         ATMO_SX9500_RegisterTouchedCallback(SX9500_Touched_Left, SnakeDirKeyLeft);
  17.         ATMO_SX9500_RegisterTouchedCallback(SX9500_Touched_Right, SnakeDirKeyRight);
  18. }

  19. static void SnakeDirKeyLeft(void *value) {
  20.         uint8_t ucV_Key = 0;
  21.         ucV_Key = V_Dir_Left;
  22.         //ATMO_PLATFORM_DebugUsbPrint("%s\r\n",__FUNCTION__);
  23.         xQueueSend(hGlutonousSnakeKeyQueue, (void * ) &ucV_Key, (TickType_t )10);
  24. }

  25. static void SnakeDirKeyRight(void *value) {
  26.         uint8_t ucV_Key = 0;
  27.         ucV_Key = V_Dir_Right;
  28.         //ATMO_PLATFORM_DebugUsbPrint("%s\r\n", __FUNCTION__);
  29.         xQueueSend(hGlutonousSnakeKeyQueue, (void * ) &ucV_Key, (TickType_t )10);
  30. }

  31. static void SnakeDirKeyDown(void *value) {
  32.         uint8_t ucV_Key = 0;
  33.         ucV_Key = V_Dir_Down;
  34.         //ATMO_PLATFORM_DebugUsbPrint("%s\r\n", __FUNCTION__);
  35.         xQueueSend(hGlutonousSnakeKeyQueue, (void * ) &ucV_Key, (TickType_t )10);
  36. }

  37. static void SnakeDirKeyUp(void *value) {
  38.         uint8_t ucV_Key = 0;
  39.         ucV_Key = V_Dir_Up;
  40.         //ATMO_PLATFORM_DebugUsbPrint("%s\r\n", __FUNCTION__);
  41.         xQueueSend(hGlutonousSnakeKeyQueue, (void * ) &ucV_Key, (TickType_t )10);
  42. }


复制代码


蛇运行
  1. bool SnakeIsDead(void) {
  2.         if ((snake.XPos[snake.longth - 1] <= 1)
  3.                         || (snake.XPos[snake.longth - 1] >= LCD_GetXSize())
  4.                         || (snake.YPos[snake.longth - 1] <= 1)
  5.                         || (snake.YPos[snake.longth - 1] >= LCD_GetYSize())) {
  6.                 snake.isLive = 0;
  7.         }

  8.         if (snake.isLive != 0) {
  9.                 return false;
  10.         }

  11.         return false;
  12. }

  13. void Snake_Run(uint8_t ucV_Dir) {
  14.         uint8_t i;
  15.         //for (i = 0; i < snake.longth; i++) {
  16.         //        Trun_Off_Point(snake.XPos[i], snake.YPos[i], V_Snake_Size);
  17.         //}
  18.         Trun_Off_Point(snake.XPos[0], snake.YPos[0], V_Snake_Size);        //去尾
  19.         for (i = 0; i < snake.longth - 1; i++) {
  20.                 snake.XPos[i] = snake.XPos[i + 1];
  21.                 snake.YPos[i] = snake.YPos[i + 1];
  22.         }
  23.         switch (ucV_Dir) {
  24.         case V_Dir_Right: {
  25.                 snake.XPos[snake.longth - 1] = snake.XPos[snake.longth - 2]
  26.                                 + V_Snake_Size + 1;
  27.                 snake.YPos[snake.longth - 1] = snake.YPos[snake.longth - 2] + 0;
  28.                 //Trun_On_Point(snake.XPos[snake.longth - 1], snake.YPos[snake.longth - 1], V_Snake_Size);
  29.                 break;
  30.         }
  31.         case V_Dir_Left: {
  32.                 snake.XPos[snake.longth - 1] = snake.XPos[snake.longth - 2]
  33.                                 - V_Snake_Size - 1;
  34.                 snake.YPos[snake.longth - 1] = snake.YPos[snake.longth - 2] + 0;
  35.                 //Trun_On_Point(snake.XPos[snake.longth - 1], snake.YPos[snake.longth - 1], V_Snake_Size);
  36.                 break;
  37.         }
  38.         case V_Dir_Down: {
  39.                 snake.XPos[snake.longth - 1] = snake.XPos[snake.longth - 2] + 0;
  40.                 snake.YPos[snake.longth - 1] = snake.YPos[snake.longth - 2]
  41.                                 + V_Snake_Size + 1;
  42.                 //Trun_On_Point(snake.XPos[snake.longth - 1], snake.YPos[snake.longth - 1], V_Snake_Size);
  43.                 break;
  44.         }
  45.         case V_Dir_Up: {
  46.                 snake.XPos[snake.longth - 1] = snake.XPos[snake.longth - 2] + 0;
  47.                 snake.YPos[snake.longth - 1] = snake.YPos[snake.longth - 2]
  48.                                 - V_Snake_Size - 1;
  49.                 //Trun_On_Point(snake.XPos[snake.longth - 1], snake.YPos[snake.longth - 1], V_Snake_Size);
  50.                 break;
  51.         }
  52.         default:
  53.                 break;

  54.         }

  55.         //for (i = 0; i < snake.longth; i++) {
  56.         //        Trun_On_Point(snake.XPos[i], snake.YPos[i], V_Snake_Size);
  57.         //}

  58.         if (SnakeIsDead()) {
  59.                 for (i = 0; i < snake.longth; i++) {
  60.                         Trun_Off_Point(snake.XPos[i], snake.YPos[i], V_Snake_Size);
  61.                 }
  62.         } else {
  63.                 Trun_On_Point(snake.XPos[snake.longth - 1],
  64.                                 snake.YPos[snake.longth - 1], V_Snake_Size);
  65.         }
  66. }
复制代码


蛇吃食物
  1. void Eat_Food(void) {
  2.         //uint8_t length[20]; //用于保存要显示的分数和长度
  3.         uint8_t i;
  4.         /*************************判断蛇是否吃到食物**********************/
  5.         //if ((snake.XPos[snake.longth - 1] == food.x)
  6.         //                && (snake.YPos[snake.longth - 1] == food.y)) {
  7.         if ( (D_IsInCCInterval(snake.XPos[snake.longth - 1], food.x,
  8.                         snake.XPos[snake.longth - 1] +V_Snake_Size)
  9.                         && D_IsInCCInterval(snake.YPos[snake.longth - 1], food.y,
  10.                                         snake.YPos[snake.longth - 1] +V_Snake_Size))
  11.                         || ( D_IsInCCInterval(food.x , snake.XPos[snake.longth - 1] , food.x +V_Snake_Size)
  12.                                         && D_IsInCCInterval(food.y, snake.YPos[snake.longth - 1],
  13.                                                         food.y +V_Snake_Size))  ) {
  14.                 snake.longth++;
  15.                 snake.score += 5;
  16.                 snake.XPos[snake.longth - 1] = food.x;
  17.                 snake.YPos[snake.longth - 1] = food.y;
  18.                 Trun_On_Point(snake.XPos[snake.longth - 1],
  19.                                 snake.YPos[snake.longth - 1], V_Snake_Size);
  20.                 food.flag = 1;
  21.         }

  22.         if (food.flag == 1) {
  23.                 while (1) {
  24.                         food.x =
  25.                                         rand() % (LCD_GetXSize() - V_Snake_Size * 2) + V_Snake_Size;
  26.                         food.y =
  27.                                         rand() % (LCD_GetYSize() - V_Snake_Size * 2) + V_Snake_Size;
  28.                         for (i = 0; i < snake.longth; i++) { //判断产生的食物是否和蛇身重合
  29.                                 if ((food.x == snake.XPos[i]) && (food.y == snake.YPos[i]))
  30.                                         break;
  31.                         }
  32.                         if (i == snake.longth) {
  33.                                 ATMO_PLATFORM_DebugUsbPrint("Create Food:%d %d\r\n", food.x,
  34.                                                 food.y);
  35.                                 food.flag = 0;
  36.                                 Trun_On_Point(food.x, food.y, V_Snake_Size);
  37.                                 break;
  38.                         }
  39.                 }
  40.         }
  41. }
复制代码


对应的任务函数
  1. void GluttonousSnakeTask(uint32_t param) {
  2.         BaseType_t xResult;
  3.         const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* 设置最大等待时间为 300ms */
  4.         uint8_t ucQueueKeyMsg;
  5.         /* Initialize GUI */
  6.         while (1) {
  7.                 xResult = xQueueReceive(hGlutonousSnakeKeyQueue, /* 消息队列句柄 */
  8.                 (void *)&ucQueueKeyMsg, /* 存储接收到的数据到变量 ucQueueMsgValue 中 */
  9.                 (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */
  10.                 //vTaskDelay((TickType_t)xMaxBlockTime);
  11.                 if (xResult == pdPASS) {
  12.                         Snake_Run(ucQueueKeyMsg);
  13.                         Eat_Food();
  14.                 }
  15.         }
  16. }
复制代码



此内容由EEWORLD论坛网友dvd1478原创,如需转载或用于商业用途需征得作者同意并注明出处



来源:EEWorld RF/无线板块,转载请附上链接


回复

使用道具 举报

1350

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-4-1 08:53 | 显示全部楼层
厉害呀,棒棒哒
专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void


回复

使用道具 举报

8563

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-4-1 13:04 | 显示全部楼层


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-17 09:15 , Processed in 0.139605 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表