找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机贪吃蛇程序 支持液晶屏,矩阵键盘操作

[复制链接]
跳转到指定楼层
楼主
解压缩,可以查看这个贪吃蛇程序。支持液晶屏,矩阵键盘操作


单片机源程序如下:
  1. /*
  2. * 贪吃蛇
  3. *
  4. * author:cole3
  5. * date:2010.11.28
  6. */


  7. #include <reg52.h>
  8. #include <stdlib.h>
  9. #include "lcd.h"

  10. #define LEN_MAX 40

  11. sbit KeyIn1 = P2^4;
  12. sbit KeyIn2 = P2^5;
  13. sbit KeyIn3 = P2^6;
  14. sbit KeyIn4 = P2^7;
  15. sbit KeyOut1 = P2^3;
  16. sbit KeyOut2 = P2^2;
  17. sbit KeyOut3 = P2^1;
  18. sbit KeyOut4 = P2^0;


  19. void key(void);
  20. void rand_dot(void);
  21. void turncount(int length,int position,int row,int page);


  22. int i=4,j=0,length=5,direction=2,k=0,dotx,doty,temx[LEN_MAX],temy[LEN_MAX];
  23. char speed=5, t_flag=0;

  24. main()
  25. {
  26.         unsigned int t,flag=1;

  27.         LCD12864_init();
  28.         TMOD = 0x01;
  29.         TH0 = 0x3C;
  30.         TL0 = 0xB0;
  31.         ET0 = 0;
  32.         TR0 = 0;
  33.         EA = 1;

  34.         printf2lcd(0, 0, "----------------");
  35.         printf2lcd(0, 2, "Gluttonous Snake");
  36.         printf2lcd(0, 4, "----------------");
  37.         printf2lcd(0, 6, "  Made By Kingst");
  38.         for (t=0; t<60000; t++);

  39.         ClearSree(0);

  40.         for (t=0; t<length; t++)
  41.         {
  42.                 change(t,0);
  43.                 temx[t] = t;
  44.                 temy[t] = 0;
  45.         }
  46.         rand_dot();

  47.         ET0 = 1;
  48.         TR0 = 1;

  49.         while(flag)
  50.         {
  51.                 key(); // 按键扫描

  52.                 // 是否前行
  53.                 if (t_flag == 1)
  54.                 {
  55.                         t_flag = 0;
  56.                         switch (direction)
  57.                         {
  58.                                 case 0: change(i,--j); break;
  59.                                 case 1: change(--i,j); break;
  60.                                 case 2: change(++i,j); break;
  61.                                 case 3: change(i,++j); break;
  62.                         }
  63.        
  64.                         clear(temx[0], temy[0]);
  65.                         for(t=0; t<length-1; t++)
  66.                         {
  67.                                 temx[t] = temx[t+1];
  68.                         }
  69.                         temx[length-1] = i;
  70.        
  71.                         for(t=0; t<length-1; t++)
  72.                         {
  73.                                 temy[t] = temy[t+1];
  74.                         }
  75.                         temy[length-1] = j;
  76.        
  77.                         if((i == dotx) && (j == doty))
  78.                         {
  79.                                 temx[length] = dotx;
  80.                                 temy[length++] = doty;
  81.                                 rand_dot();
  82.                         }
  83.                 }
  84.                 // 是否撞墙
  85.                 if ((i < 0) || (i > 31))
  86.                 {
  87.                         flag = 0;       
  88.                 }
  89.                 if ((j < 0) || (j > 15))
  90.                 {
  91.                         flag = 0;               
  92.                 }
  93.                 // 是否撞自己
  94.                 for (t=0; t<length-4; t++)
  95.                 {
  96.                         if ((i == temx[t]) && (j == temy[t]))
  97.                         {
  98.                                 flag = 0;
  99.                         }
  100.                 }

  101.                 // 是否晋级
  102.                 if (length == LEN_MAX)
  103.                 {
  104.                         TR0 = 0;
  105.                         ET0 = 0;
  106.                         ClearSree(0);
  107.                         speed--;
  108.                         if (speed < 0)
  109.                         {
  110.                                 printf2lcd(4, 1, "You Win!");
  111.                                 while (1);
  112.                         }
  113.                         else
  114.                         {
  115.                                 printf2lcd(3, 1, "Next level!");
  116.                                 for (t=0; t<60000; t++);
  117.                                 ClearSree(0);
  118.                         }
  119.                         length = 5;
  120.                         direction = 2;
  121.                         i = 4;
  122.                         j = 0;
  123.                         k = 0;
  124.                         for (t=0; t<length; t++)
  125.                         {
  126.                                 change(t,0);
  127.                                 temx[t] = t;
  128.                                 temy[t] = 0;
  129.                         }
  130.                         rand_dot();
  131.                         TR0 = 1;
  132.                         ET0 = 1;
  133.                 }
  134.         }

  135.         // game over
  136.         TR0 = 0;
  137.         ET0 = 0;
  138.         ClearSree(0);
  139.         printf2lcd(3, 1, "Game over!");
  140.         printf2lcd(3, 3, "score:");
  141.         ShowNum(9, 3, (length-5)+(LEN_MAX-5)*(5-speed));

  142.         while(1);                               
  143. }


  144. void key(void)
  145. {
  146.         KeyOut1 = 0;
  147.         KeyOut2 = 1;
  148.         KeyOut3 = 1;
  149.         KeyOut4 = 1;
  150.         if ((KeyIn4 == 0) && (direction != 3))
  151.                 direction = 0;
  152.        
  153.         KeyOut1 = 1;
  154.         KeyOut2 = 1;
  155.         KeyOut3 = 0;
  156.         KeyOut4 = 1;
  157.         if ((KeyIn4 == 0) && (direction != 0))
  158.                 direction = 3;

  159.         KeyOut1 = 1;
  160.         KeyOut2 = 0;
  161.         KeyOut3 = 1;
  162.         KeyOut4 = 1;
  163.         if ((KeyIn4 == 0) && (direction != 2))
  164.                 direction = 1;

  165.         KeyOut1 = 1;
  166.         KeyOut2 = 1;
  167.         KeyOut3 = 1;
  168.         KeyOut4 = 0;
  169.         if ((KeyIn4 == 0) && (direction != 1))
  170.                 direction = 2;
  171. }


  172. void rand_dot(void)
  173. {
  174.           int ii;
  175.        
  176.         while (1)
  177.         {
  178.                 dotx = rand() % 32;
  179.                   doty = rand() % 16;

  180.                   for (ii=0; ii<length; ii++)
  181.                 {
  182.                         if ((dotx == temx[ii]) && (doty == temy[ii]))
  183.                                 break;
  184.                 }
  185. ……………………

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

所有资料51hei提供下载:
贪吃蛇程序.rar (41.5 KB, 下载次数: 16)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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