找回密码
 立即注册

QQ登录

只需一步,快速开始

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

贪吃蛇snake单片机版本:含源文件 点阵显示 仿真文件

[复制链接]
跳转到指定楼层
楼主
贪吃蛇程序,需要的拿走。
把仿真软件文件夹下的压缩包解压,解压得到的一个proteus的文件夹,依次Proteus\BIN找到ISIS.EXE,然后运行。还不会用的,在群里问,或者问度娘。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /***************************************
  2. ***武***
  3. 该程序只能实现简单的移动,吃食物,
  4. 以及撞死后的初始化,其他的功能就你们自己改进了。
  5. *****************************************/

  6. #include <reg52.h>
  7. #include "contronl.h"

  8. /*****************
  9. 主程序
  10. *****************/        
  11. void main(void)
  12. {
  13.         P0=0x00;
  14.         P1=0xff;
  15.         P2=0x00;
  16.         P3=0x00;
  17.         init();
  18.         while(1)
  19.                 {
  20.                         display();
  21.                 }
  22. }
复制代码
  1. #include "contronl.h"

  2. sbit key_enable=P3^6;                        //方向使能

  3. sbit up=P3^3;
  4. sbit down=P3^1;
  5. sbit right=P3^2;
  6. sbit left=P3^4;
  7. uchar x[SNAKE+1];
  8. uchar y[SNAKE+1];         
  9. uchar time,n,i,e=SPEED;              //延时时间,当前蛇长,通用循环变量,当前速度               
  10. char addx,addy;                //位移偏移量

  11. /*******************************************
  12. *1*碰撞判断
  13. *******************************************/
  14. bit knock()
  15. {
  16.         bit k=0;
  17.         
  18.         if(x[1]>7||y[1]>7)
  19.                 k=1;                             //撞墙
  20.         for(i=2;i<n;i++)
  21.                 if((x[1]==x[i])&(y[1]==y[i]))
  22.                         k=1;                                                                                                  //撞自己
  23.         return k;
  24. }

  25. /*****************
  26. *2*方向控制
  27. *****************/
  28. void turnkey()
  29. {
  30.         if(key_enable)
  31.         {
  32.                 if(left)
  33.                 {
  34.                         addy=0;
  35.                         if(addx!=1)
  36.                                 addx=-1;
  37.                         else
  38.                                 addx=1;
  39.                 }
  40.                         if(right)
  41.                         {
  42.                                 addy=0;
  43.                                 if(addx!=-1)
  44.                                         addx=1;
  45.                                 else
  46.                                         addx=-1;
  47.                         }
  48.                         if(up)
  49.                         {        
  50.                                 addx=0;
  51.                                 if(addy!=-1)
  52.                                         addy=1;
  53.                                 else
  54.                                         addy=-1;
  55.                         }
  56.                         if(down)
  57.                         {
  58.                                 addx=0;
  59.                                 if(addy!=1)
  60.                                         addy=-1;
  61.                                 else
  62.                                         addy=1;
  63.                         }
  64.         }
  65. }

  66. /*****************
  67. *3*蛇的状态
  68. *****************/
  69. void timer0(uchar timer)
  70. {
  71.         while(timer--)
  72.         {
  73.                 for(i=0;i<SNAKE+1;i++)
  74.                 {
  75.                         P2=mux(x[i]);P1=255-mux(y[i]);
  76.                         turnkey();                     //上下左右键位处理
  77.                         delay(TIME);                   //显示延迟
  78.                         P2=0x00;P1=0xff;
  79.                 }
  80.         }
  81. }
  82. /*****************
  83. *4*乘方程序
  84. *****************/
  85. uchar mux(uchar temp)
  86. {
  87.         if(temp==7)return 128;
  88.         if(temp==6)return 64;
  89.         if(temp==5)return 32;
  90.         if(temp==4)return 16;
  91.         if(temp==3)return 8;
  92.         if(temp==2)return 4;
  93.         if(temp==1)return 2;
  94.         if(temp==0)return 1;
  95.         return 0;
  96. }
  97. /****************
  98. *5*初始化蛇的状态
  99. *****************/
  100. void init()
  101. {
  102.         for(i=3;i<SNAKE+1;i++)
  103.                 x[i]=100;
  104.         for(i=3;i<SNAKE+1;i++)
  105.                 y[i]=100;                                                                                                                                                                                                                //初始化状态
  106.         x[0]=4;y[0]=4;                                                //食物坐标   
  107.         n=3;                                                          //蛇长n=-1
  108.         x[1]=1;y[1]=0;                                                //蛇头坐标
  109.         x[2]=0;y[2]=0;                                                //蛇尾坐标
  110.         addx=0;addy=0;                                                //位置
  111. }
  112. /****************
  113. *6*运行游戏
  114. *****************/
  115. void display()
  116. {
  117.         for(;;)//方向是否改变
  118.         {
  119.                 if(key_enable) break;
  120.                 else timer0(1);
  121.         }
  122.         for(;;)
  123.         {
  124.                 timer0(e);
  125.                 if(knock())//碰撞判断
  126.                 {
  127.                         e=SPEED;
  128.                         init();
  129.                         break;
  130.                 }                                                                                                         
  131.                         
  132.                 if((x[0]==x[1]+addx)&(y[0]==y[1]+addy))         //是否吃东西
  133.                 {
  134.                         n++;
  135.                         if(n==SNAKE+1)
  136.                         {
  137.                                 n=3;
  138.                                 e=e-10;
  139.                                 for(i=3;i<SNAKE+1;i++)x[i]=100;
  140.                                 for(i=3;i<SNAKE+1;i++)y[i]=100;
  141.                         }
  142.                         x[0]=x[n-2];
  143.                         y[0]=y[n-2];
  144.                 }
  145.                         
  146.                 for(i=n-1;i>1;i--)
  147.                 {
  148.                         x[i]=x[i-1];
  149.                         y[i]=y[i-1];
  150.                 }        
  151.                         
  152.                 x[1]=x[2]+addx;
  153. ……………………

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


所有资料51hei提供下载:
snake(单片机版本:含源文件 点阵显示 仿真文件 仿真软件).rar (5.19 MB, 下载次数: 49)


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

使用道具 举报

沙发
ID:297942 发表于 2018-4-3 18:53 | 只看该作者
不错、好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:301728 发表于 2018-4-3 21:36 来自手机 | 只看该作者
大佬!佩服佩服!
回复

使用道具 举报

地板
ID:613829 发表于 2019-10-21 20:54 | 只看该作者
大佬文件仿真文件好像损坏了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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