找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机贪吃蛇点阵

[复制链接]
跳转到指定楼层
楼主
ID:313060 发表于 2018-12-25 13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51贪吃蛇点阵

单片机源程序如下:
  1. #include "reg51.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #include<intrins.h>
  3. #include<math.h>
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. //72,80,75,77是方向键对应的键值
  7. #define UP 5
  8. #define DOWN 6
  9. #define LEFT 7
  10. #define RIGHT 8
  11. #define SANKE 1        //蛇的坐标标识
  12. #define FOOD 1
  13. #define BAR 0

  14. sbit SRCLK=P3^6;
  15. sbit RCLK=P3^5;
  16. sbit SER=P3^4;
  17. //按键
  18. sbit Left = P3^1;
  19. sbit Right = P3^0;
  20. sbit Up = P3^2;
  21. sbit Down = P3^3;
  22. unsigned int NLL=1;
  23. //u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};
  24. unsigned char ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  25. //初始化地图17*17
  26. unsigned char map[8][8] ={0};
  27. //初始化蛇头坐标
  28. unsigned char snack[20] = {27};
  29. //初始化食物坐标
  30. unsigned char food = 17;
  31. //蛇长
  32. char len = 1;
  33. // 存储坐标数字与x,y的转化函数
  34. void tran(unsigned char num,unsigned char *x,unsigned char *y);
  35. //打印游戏
  36. void print_game(void);
  37. // 获取方向函数(注意当蛇身超过一节时不能回头)
  38. int get_dir(int old_dir);
  39. //移动蛇身函数
  40. void move_snack(int dir);
  41. //生产食物的函数
  42. unsigned char generate_food(void);
  43. //判断蛇死活的函数
  44. int isalive(void);
  45. //移动蛇身函数
  46. /*******************************************************************************
  47. * 函 数 名         : delay
  48. * 函数功能                   : 延时函数,i=1时,大约延时10us
  49. *******************************************************************************/
  50. void delay(unsigned int i)
  51. {
  52.         while(i--);        
  53. }

  54. /*******************************************************************************
  55. * 函数名         : Hc595SendByte(u8 dat)
  56. * 函数功能                   : 向74HC595发送一个字节的数据
  57. * 输入           : 无
  58. * 输出                  : 无
  59. *******************************************************************************/
  60. void Hc595SendByte(unsigned char dat)
  61. {
  62.         unsigned char a;
  63.         SRCLK=0;
  64.         RCLK=0;
  65.         for(a=0;a<8;a++)
  66.         {
  67.                 SER=dat>>7;
  68.                 dat<<=1;

  69.                 SRCLK=1;
  70.                 _nop_();
  71.                 _nop_();
  72.                 SRCLK=0;        
  73.         }

  74.         RCLK=1;
  75.         _nop_();
  76.         _nop_();
  77.         RCLK=0;
  78. }

  79. /*******************************************************************************
  80. * 函 数 名       : main
  81. * 函数功能                 : 主函数
  82. * 输    入       : 无
  83. * 输    出             : 无
  84. *******************************************************************************/
  85. void main()
  86. {
  87.         int dir = UP,n,i=1;

  88.         while(1)
  89.         {        
  90.                 move_snack(dir);               
  91.                 for(n=0;n<50;n++)
  92.                 {
  93.                         print_game();                        
  94.                         dir = get_dir(dir);        
  95.                 }
  96.                 if(!isalive())
  97.                 {
  98.                         break;
  99.                 }
  100.         }        
  101.                
  102. }
  103. void print_game(void)
  104. {
  105.         int i,j;
  106.         unsigned  int zhi=0;

  107.         for(i = 0;i < 8;i ++)
  108.         {
  109.                 zhi = 0;
  110.                 for(j = 0;j < 8;j ++)
  111.                 {
  112.                         if(map[i][j] == 1)
  113.                         {
  114.                                 zhi=zhi+(0x01<<j);
  115.                         }
  116.                 }
  117.                 P0=ledwei[i];                  //位选
  118.                 Hc595SendByte(zhi);
  119.                 delay(100);
  120.                 Hc595SendByte(0x00);        
  121.                
  122.         }
  123.         
  124. }
  125. void move_snack(int dir)
  126. {
  127.         int last = snack[0],current;
  128.         int i,j;
  129.         int grow = 0;
  130.         unsigned char x,y,fx,fy;
  131.         tran(food,&fx,&fy);
  132.         tran(snack[0],&x,&y);
  133.         switch(dir)
  134.         {
  135.                 case UP:
  136.                         y++;
  137.                         break;
  138.                 case DOWN:
  139.                         y--;
  140.                         break;
  141.                 case LEFT:
  142.                         x--;
  143.                         break;
  144.                 case RIGHT:
  145.                         x++;
  146.                         break;
  147.         }
  148. //        snack[0] = ((x ^ 0) << 4) ^ y;
  149.         snack[0] = x*8+y;
  150.         //蛇吃到食物
  151.         if(snack[0] == food)
  152.         {
  153.                 grow = 1;
  154.                 food = generate_food();
  155.         }
  156.         
  157.         for(i = 0;i < len;i ++)
  158.         {
  159.                 if(i == 0)
  160.                         continue;
  161.                 current = snack[i];
  162.                 snack[i] = last;
  163.                 last = current;
  164.         }
  165.         if(grow)
  166.         {
  167.                 snack[len] = last;
  168.                 len++;
  169.         }
  170.         for(j = 0;j < 8; j ++)
  171.         {
  172.                 for(i = 0;i < 8;i ++)
  173.                 {
  174.                         if(i == 0 || i == 7 || j == 0 || j == 7)
  175.                         {
  176.                                 map[i][j] = 1;
  177.                         }
  178.                         else if(i == fx && j == fy)
  179.                         {                                
  180.                                 map[i][j] = 1;
  181.                         }
  182.                         else
  183.                         {
  184.                                 map[i][j] = 0;
  185.                         }
  186.                                 
  187.         
  188.                 }
  189.         }
  190.         for(i = 0;i < len;i ++)
  191.         {
  192.                 tran(snack[i],&x,&y);
  193.                 if(snack[i] > 0)
  194.                 {
  195.                         map[x][y] = SANKE;
  196.                 }
  197.         }

  198. }
  199. //存储坐标数字与x,y的转换函数
  200. void tran(unsigned char num,unsigned char *x,unsigned char *y)
  201. {
  202.         // *x = num >> 4;
  203.         // *y = (unsigned char)(num << 4 ) >> 4;
  204.         *x = num / 8;
  205.         *y = num % 8;        
  206. }
  207. //生产食物的函数
  208. unsigned char generate_food(void)
  209. {
  210.         unsigned char food_,fx,fy;
  211.         unsigned int in_snack=0,i;
  212. //        srand((unsigned int)time(NULL));
  213.                 srand(NLL);
  214.         do
  215.         {        
  216.                 NLL++;
  217.                 in_snack=0;
  218.                 food_ =        rand() % 64;
  219.                 tran(food_,&fx,&fy);
  220.                 for(i = 0;i < len;i ++)
  221.                 {
  222.                         if(food_ == snack[i])
  223.                         {
  224.                                 in_snack = 1;
  225.                         }
  226.                 }
  227.         }while(fx == 0 || fx == 7 || fy == 0 || fy == 7 || in_snack);
  228.         
  229.         return food_;
  230. }
  231. //获取方向的函数
  232. int get_dir(int old_dir)
  233. ……………………

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

所有资料51hei提供下载:

单片机贪吃蛇.zip

51.13 KB, 下载次数: 22, 下载积分: 黑币 -5

贪吃蛇.docx

59.47 KB, 下载次数: 7, 下载积分: 黑币 -5

HC6800-ES V2.0 新版.pdf

759.71 KB, 下载次数: 9, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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