找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3142|回复: 4
打印 上一主题 下一主题
收起左侧

单片机LCD12864链表实现贪吃蛇源码

  [复制链接]
跳转到指定楼层
楼主
內附LCD12864子函数


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<stdlib.h>
  3. #include<lcd12864.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define Random(x) (rand()%x)
  7. #define dgrade 11
  8. #define igrade 15
  9. #define up 9                                  
  10. #define down 13                                  
  11. #define left 12                                  
  12. #define right 14                                  
  13. #define passscore 50
  14. #define N 25
  15. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

  16. sbit dula=P2^6;
  17. sbit wela=P2^7;

  18. uchar code score0[]={"score"};
  19. uchar code speed0[]={"speed"};
  20. uchar score = 0,speed = 5;
  21. uchar temp,key=16;

  22. struct Snake
  23. {
  24.         uchar x[N];
  25.         uchar y[N];
  26.         uchar node;
  27.         uchar direction;
  28.         uchar life;
  29. }snake;
  30. struct Food
  31. {
  32.         uchar x;
  33.         uchar y;
  34.         uint exist;
  35. }food;

  36. void delay(uint t)
  37. {  
  38.         uint i,j;
  39.         for(i=0;i<t;i++)
  40.                 for(j=0;j<10;j++);   
  41. }
  42. //矩阵键盘
  43. void ReadKey()
  44. {
  45.         P3 = 0xfe;
  46.         temp = P3;
  47.         temp = temp & 0xf0;
  48.         if(temp != 0xf0)
  49.         {
  50.                 delay(100);
  51.                 if(temp != 0xf0)
  52.                 {
  53.                         temp = P3;
  54.                         switch(temp)
  55.                         {
  56.                                 case 0xee:
  57.                                            key = 0;
  58.                                      break;
  59.                                 case 0xde:
  60.                                            key = 1;
  61.                                      break;
  62.                                 case 0xbe:
  63.                                            key = 2;
  64.                                      break;
  65.                                 case 0x7e:
  66.                                            key = 3;
  67.                                      break;
  68.                         }
  69.                         while(temp != 0xf0)
  70.                         {
  71.                                 temp = P3;
  72.                                 temp = temp & 0xf0;
  73.                         }
  74.                 }
  75.         }
  76.         P3 = 0xfd;
  77.         temp = P3;
  78.         temp = temp & 0xf0;
  79.         if(temp != 0xf0)
  80.         {
  81.                 delay(100);
  82.                 if(temp != 0xf0)
  83.                 {
  84.                         temp = P3;
  85.                         switch(temp)
  86.                         {
  87.                                 case 0xed:
  88.                                            key = 4;
  89.                                      break;
  90.                                 case 0xdd:
  91.                                            key = 5;
  92.                                      break;
  93.                                 case 0xbd:
  94.                                            key = 6;
  95.                                      break;
  96.                                 case 0x7d:
  97.                                            key = 7;
  98.                                      break;
  99.                         }
  100.                         while(temp != 0xf0)
  101.                         {
  102.                                 temp = P3;
  103.                                 temp = temp & 0xf0;
  104.                         }
  105.                 }
  106.         }
  107.         P3 = 0xfb;
  108.         temp = P3;
  109.         temp = temp & 0xf0;
  110.         if(temp != 0xf0)
  111.         {
  112.                 delay(100);
  113.                 if(temp != 0xf0)
  114.                 {
  115.                         temp = P3;
  116.                         switch(temp)
  117.                         {
  118.                                 case 0xeb:
  119.                                            key = 8;
  120.                                      break;
  121.                                 case 0xdb:
  122.                                            key = 9;
  123.                                      break;
  124.                                 case 0xbb:
  125.                                            key = 10;
  126.                                      break;
  127.                                 case 0x7b:
  128.                                            key = 11;
  129.                                      break;
  130.                         }
  131.                         while(temp != 0xf0)
  132.                         {
  133.                                 temp = P3;
  134.                                 temp = temp & 0xf0;
  135.                         }
  136.                 }
  137.         }
  138.         P3 = 0xf7;
  139.         temp = P3;
  140.         temp = temp & 0xf0;
  141.         if(temp != 0xf0)
  142.         {
  143.                 delay(100);
  144.                 if(temp != 0xf0)
  145.                 {
  146.                         temp = P3;
  147.                         switch(temp)
  148.                         {
  149.                                 case 0xe7:
  150.                                            key = 12;
  151.                              break;
  152.                                 case 0xd7:
  153.                                            key = 13;
  154.                                      break;
  155.                                 case 0xb7:
  156.                                            key = 14;
  157.                                      break;
  158.                                 case 0x77:
  159.                                            key = 15;
  160.                                      break;
  161.                         }
  162.                         while(temp != 0xf0)
  163.                         {
  164.                                 temp = P3;
  165.                                 temp = temp & 0xf0;
  166.                         }
  167.                 }
  168.         }
  169. }
  170. void Lcd_DisNode(uchar x,uchar y,uchar color)
  171. {
  172.         Lcd_DisRectangle(2*x,2*y,2*x+1,2*y+1,color);
  173. }
  174. void Timer0_Init()
  175. {
  176.         TMOD = 0x01;
  177.         TH0 = (65536-1000)/256;
  178.         TL0 = (65536-1000)%256;
  179.         TR0 = 1;
  180.         ET0 = 1;
  181.         EA = 1;
  182. }
  183. //创建基本框架
  184. void CreatBasicFrame()
  185. {
  186.         uchar n;
  187.         for(n=0;n<128;n++)
  188.         {
  189.                 Lcd_DisDot(n,0,1);
  190.                 Lcd_DisDot(n,1,1);
  191.                 Lcd_DisDot(n,62,1);
  192.                 Lcd_DisDot(n,63,1);
  193.         }
  194.         for(n=0;n<63;n++)
  195.         {
  196.                 Lcd_DisDot(0,n,1);
  197.                 Lcd_DisDot(1,n,1);
  198.                 Lcd_DisDot(78,n,1);
  199.                 Lcd_DisDot(79,n,1);
  200.                 Lcd_DisDot(126,n,1);
  201.                 Lcd_DisDot(127,n,1);
  202.         }
  203. }
  204. //显示成绩
  205. void DisScore()
  206. {
  207.         uchar str[3];
  208.         str[0] = (score/10)|0x30;
  209.         str[1] = (score%10)|0x30;
  210.         str[2] = 0;
  211.         Lcd_WriteStr(5,0,score0);
  212.         Lcd_WriteStr(6,1,str);
  213. }
  214. //显示速度
  215. void DisSpeed()
  216. {
  217.         uchar str[3];
  218.         str[0] = ' ';
  219.         str[1] = speed|0x30;
  220.         str[2] = 0;
  221.         Lcd_WriteStr(5,2,speed0);
  222.         Lcd_WriteStr(6,3,str);
  223. }



  224. //游戏结束
  225. void GameOver()
  226. {
  227.         uchar n;
  228.         Lcd_DisNode(food.x,food.y,0);
  229.         for(n=1;n<snake.node;n++)
  230.         {
  231.                 Lcd_DisNode(snake.x[n],snake.y[n],0);               
  232.         }
  233.         if(snake.life==1)
  234.                 Lcd_WriteStr(1,1," PASS");
  235.         else           
  236.                 Lcd_WriteStr(1,1," LOSE");
  237.         Lcd_WriteStr(0,2," GameOver");
  238. }
  239. void GamePlay()
  240. {
  241.         uchar n;
  242.        
  243.         food.exist=0;
  244.         snake.life=1;
  245.         snake.direction=down;
  246.         snake.x[0]=6;snake.y[0]=6;
  247.         snake.x[1]=5;snake.y[1]=6;
  248.         snake.x[2]=4;snake.y[2]=6;
  249.         snake.node=3;
  250.         DisScore();
  251.         DisSpeed();

  252.         while(1)
  253.         {
  254.                 if(food.exist==0)
  255.                 {
  256.                         //产生食物
  257.                         while(1)
  258.                         {
  259.                                 srand(TL0);
  260.                                 food.x=Random(30);
  261.                                 food.y=Random(38);
  262.                           for(n=0;n<snake.node;n++)
  263.                                 {
  264.                                         if((food.x==snake.x[n])&&(food.y==snake.y[n]))
  265.                                                 break;
  266.                                 }
  267.                                 if(n==snake.node)
  268.                                 {
  269.                                         if(food.x>0&&food.x<39&&food.y>0&&food.y<31)
  270.                                         food.exist=1;
  271.                                         break;
  272.                                 }
  273.                         }
  274.                 }
  275.                 if(food.exist==1)
  276.                 {
  277.                         Lcd_DisNode(food.x,food.y,1);
  278.                 }       
  279.                
  280.                 for(n=snake.node-1;n>0;n--)
  281.                 {
  282.                         snake.x[n]=snake.x[n-1];
  283.                         snake.y[n]=snake.y[n-1];
  284.                 }
  285.                
  286.                 switch(snake.direction)
  287.                 {
  288.                         case down:snake.y[0]++;break;
  289.                         case up:snake.y[0]--;break;
  290.                         case right:snake.x[0]++;break;
  291.                         case left:snake.x[0]--;break;
  292.                         default:break;
  293.                 }
  294.                 //判断是否死亡
  295.                 for(n=3;n<snake.node;n++)
  296.                 {
  297.                         if(snake.x[n]==snake.x[0]&&snake.y[n]==snake.y[0])
  298.                         {
  299.                                 GameOver();
  300.                                 snake.life=0;
  301.                                 break;
  302.                         }
  303.                 }
  304.                 if(snake.x[0]<1||snake.x[0]>38||snake.y[0]<1||snake.y[0]>30)
  305.                 {
  306.                         GameOver();
  307.                         snake.life=0;
  308.                 }
  309.                 if(snake.life==0)
  310.                         break;
  311.                 //判断是否吃到食物
  312.                 if(snake.x[0]==food.x&&snake.y[0]==food.y)
  313.                 {
  314.                         Lcd_DisNode(food.x,food.y,0);
  315.                         snake.x[snake.node]=200;
  316.                         snake.y[snake.node]=200;
  317.                         snake.node++;
  318.                         food.exist=0;
  319.                         score=score+speed;
  320.                         if(score>=passscore)
  321.                         {
  322.                                 DisScore();
  323.                                 GameOver();
  324.                                 break;
  325.                         }
  326.                         DisScore();
  327.                 }
  328.                
  329.                 //画出蛇身
  330.                 for(n=0;n<snake.node;n++)
  331.                 {
  332.                         Lcd_DisNode(snake.x[n],snake.y[n],1);
  333.                 }
  334.                
  335.                 delay((10-speed)*300);          
  336.                 delay((10-speed)*300);
  337.                 Lcd_DisNode(snake.x[snake.node-1],snake.y[snake.node-1],0);
  338.                 switch(key)
  339.                 {
  340.                         case dgrade:
  341.                                         key=0;
  342.                                         if(--speed<=0)
  343.                                                 speed=9;
  344.                                                 DisScore();
  345.                                            DisSpeed();
  346.                                         break;
  347.                         case igrade:
  348.                                   key=0;
  349.                             if(++speed>=10)
  350.                                                 speed=1;
  351.                                         DisScore();
  352.                                         DisSpeed();
  353.                                 break;
  354.                         case down:
  355. ……………………

  356. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
贪吃蛇.rar (4.66 KB, 下载次数: 48)


评分

参与人数 3黑币 +58 收起 理由
不负时光~田 + 3 很给力!
康德 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:227864 发表于 2018-7-23 11:43 | 只看该作者
这么牛的代码没人顶吗,谢谢楼主
回复

使用道具 举报

板凳
ID:369396 发表于 2018-7-23 14:17 | 只看该作者
错了 是数组写的
回复

使用道具 举报

地板
ID:369686 发表于 2018-7-28 20:55 | 只看该作者
非常好
回复

使用道具 举报

5#
ID:627157 发表于 2019-10-20 18:13 | 只看该作者
学习了,写得很好,……
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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