[程序源码] OLED屏版本的贪吃蛇游戏

[复制链接]
 楼主| yaosongjin2018 发表于 2019-4-29 18:24 | 显示全部楼层 |阅读模式
本帖最后由 yaosongjin2018 于 2019-4-30 14:54 编辑

前两天在本论坛看到有人分享的8*8点阵屏贪吃蛇,想到自己有个OLED屏,成功移植过来了,不敢独享,特分享给有需要的朋友。
  1. #include "snake.h"

  2. extern u16 j;
  3. extern u8 OLED_GRAM[128][8];//显示缓存
  4. unsigned int  she[65];        //蛇体数组,由于用的OLED显存为128*64,所以用两个字节表示蛇的一个节点,高8位和低8位分别表示y,x坐标
  5. u8 fangxiang;        //蛇头移动方向
  6. u8 shiwushanshuo;                //食物闪烁控制位

  7. void xianshishe(void)        //显示蛇,将蛇体数据映射到显存
  8. {
  9.         unsigned char i,n;
  10.         u8 x,y;
  11.                         for(i=0;i<8;i++)for(n=0;n<128;n++)
  12.                         {
  13.                                 if(i==0)OLED_GRAM[n][i]=0X01;//绘制蛇之前先清除显存
  14.                                 else if(i==7)OLED_GRAM[n][i]=0X80;
  15.                                 else if(n==0)OLED_GRAM[n][i]=0Xff;
  16.                                 else if(n==127)OLED_GRAM[n][i]=0Xff;
  17.                                 else OLED_GRAM[n][i]=0X00;
  18.                                 if((i==0||i==7)&&(n==0||n==127))OLED_GRAM[n][i]=0Xff;
  19.                         }

  20.                 for(i=0;i<65;i++)//从头到尾遍历蛇体数据
  21.                 {
  22.                         if(she[i]!=0xffff)//如果未到蛇尾
  23.                         {
  24.                                 y=she[i]>>8;
  25.                                 x=she[i]&0xff;//根据xy坐标绘制
  26.                                 OLED_DrawPoint(x,y,1);
  27.                         }
  28.                         else
  29.                         {
  30.                                 break;//已到蛇尾,退出当前循环
  31.                         }
  32.                 }
  33.                 if(shiwushanshuo) OLED_DrawPoint((she[64]&0xff),(she[64]>>8),1);//绘制食物,蛇体最后一个字节是食物坐标
  34.                 OLED_Refresh_Gram();
  35. }

  36. void shechushihua(void)        //蛇初始化,蛇长两个节点,0xff表示蛇尾,最后一个字节是食物坐标,初始向左移动
  37. {
  38.         u8 a,b;
  39.         a=j;
  40.         if(j>62)j=124-j;//由于显示屏是长方形,所以要加此判断
  41.         b=j;
  42.         she[64]=((b<<8)|a)&0x7fff;//使用TL0的值随机生成一个食物坐标
  43.         she[0]=0x1008;//表示蛇头的坐标
  44.         she[1]=0x1007;
  45.         she[2]=0x1006;
  46.         she[3]=0x1005;
  47.         she[4]=0xffff;//蛇尾标志
  48.         fangxiang=xia;
  49. }

  50. void yidongshe(unsigned char fangxiang)        //移动蛇
  51. {
  52.         unsigned char i;
  53.         for(i=63;i>0;i--)        //从蛇尾向蛇头遍历蛇体数据
  54.         {
  55.                 if(she[i]!=0xffff)        //不是蛇尾
  56.                 {
  57.                         she[i]=she[i-1];        //后一节点复制前一节点坐标
  58.                 }
  59.                 else
  60.                 {
  61.                         continue;        //是0xff表示是蛇尾数据,继续向前
  62.                 }
  63.         }
  64.         if(fangxiang==shang)        //点阵左上角坐标为0,0,右下角坐标为127,63
  65.         {
  66.                 she[0]=she[0]-0x100;        //高8位减1
  67.         }
  68.         if(fangxiang==xia)
  69.         {
  70.                 she[0]=she[0]+0x100;        //高8位加1
  71.         }
  72.         if(fangxiang==zuo)
  73.         {
  74.                 she[0]=she[0]-0x01;        //低8位减1
  75.         }
  76.         if(fangxiang==you)
  77.         {
  78.                 she[0]=she[0]+0x01;        //低8位加1
  79.         }
  80.         she[0]=she[0]&0x7fff;        //控制坐标范围不超过1,1-126,62,因为边缘画了框,所以坐标改小
  81. }

  82. u8 chulishe(void)
  83. {
  84.         unsigned char i;
  85.         u8 a,b;
  86.         u8 shiwuzaisheshenshang;
  87.         if(she[0]==she[64])//蛇头坐标与食物坐标一致,说明吃到食物
  88.         {
  89.                 for(i=0;i<65;i++)//遍历蛇体数据
  90.                 {
  91.                         if(she[i]==0xffff)//如果到蛇尾
  92.                         {
  93.                                 she[i]=she[i-1];//蛇尾复制前一节点坐标
  94.                                 she[i+1]=0xffff;//蛇尾后移               
  95.                                 break;
  96.                         }
  97.                 }
  98.                 do
  99.                 {               
  100.                         shiwuzaisheshenshang=0;//假设新生成的食物坐标不在蛇身上
  101.                         a=j;
  102.                         if(j>62)j=124-j;//由于显示屏是长方形,所以要加此判断
  103.                         b=j;
  104.                         she[64]=((b<<8)|a)&0x7fff;//使用J的值随机生成一个食物坐标
  105.                         for(i=0;i<64;i++)//遍历蛇体判断新的食物是否跟蛇体重合
  106.                         {
  107.                                 if(she[i]==she[64])//节点坐标与食物坐标相同
  108.                                 {
  109.                                         shiwuzaisheshenshang=1;//置标志位
  110.                                         break;
  111.                                 }
  112.                         }
  113.                 }while(shiwuzaisheshenshang);//如果重合,再重新生成一个食物坐标
  114.   }
  115.         for(i=1;i<64;i++)//遍历蛇体
  116.         {
  117.                 if(she[0]==she[i])//如果蛇头与蛇体节点重合,说明咬到自己了,重新初始化蛇
  118.                 {
  119.                         shechushihua();
  120.                         OLED_ShowString(25,25,"GAME OVER",12);
  121.                         OLED_Refresh_Gram();
  122.                         delay_ms(2000);
  123.                         return 0;
  124.                 }
  125.                 if(((she[0]>>8)>62)||((she[0]>>8)<1)||((she[0]&0xff)>126)||((she[0]&0xff)<1))//如果蛇撞到屏幕边缘,游戏结束,重新初始化
  126.                 {
  127.                         shechushihua();
  128.                         OLED_ShowString(25,25,"GAME OVER",12);
  129.                         OLED_Refresh_Gram();
  130.                         delay_ms(2000);
  131.                         return 0;
  132.                 }
  133.         }
  134.         return 1;
  135. }

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

本版积分规则

5

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部