找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于点阵的贪吃蛇游戏设计-51单片机初学

[复制链接]
跳转到指定楼层
楼主

基于点阵的贪吃蛇游戏设计


以上全部资料打包下载:
基于点阵的贪吃蛇游戏设计.zip (538.51 KB, 下载次数: 137)

本题目要求设计一款贪吃蛇游戏,显示器采用8*8点阵,主控采用51单片机,如果开发板上有点阵可以直接在上面进行开发。

基本要求:
1、屏幕能够显示出一条蛇,并且能够通过按键控制其移动。
2、能够随机产生食物。
3、完成上面两个要求的前提下,实现完整的游戏功能。
提高:
1、实现难度选择功能。
2、加入关卡机制。
3、用链表或者队列这类高级数据结构来实现程序功能。

参考电路:

点阵:
实际元件中,点阵的封装不尽相同,因此需要测试出每个引脚的功能,以便正确连线。
注意,每个像素点的额定电压在3v左右,电压过大将会彻底损坏。
点阵的驱动方法和数码管一样,通过动态扫描来显示。驱动电路可以照搬数码管,也可以直接接在单片机的IO口上,不过显示亮度将会受到影响。

按键:
略。。

参考程序:
游戏的逻辑结构大体都差不多,主要考验大家和硬件结合的能力。


编程的过程中大家不可避免的会遇见很多困难,希望大家多多坚持,越过这道坎后相信大家的能力也会提升不少。最后祝大家编程愉快!

部分源码预览(完整版本请下载附件):
  1. /*************8*8点阵  贪吃蛇   ***************.****/
  2. /*****定义的坐标原点在左下角(0,0),右上角为(7,7)*********////

  3. #include <reg52.h>
  4. #include <stdlib.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit we = P2^1;
  8. sbit du = P2^0;
  9. sbit CS88 = P2^2;//点阵使能

  10. sbit up = P3^4;  //上。下。左。右   
  11. sbit down = P3^5;
  12. sbit right = P3^7;
  13. sbit left = P3^6;

  14. sbit  k3 = P3^2;                   //外部中断0,k3用做暂停;        

  15. char y_table[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  16. char x_table[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  17. char x[21];        
  18. char y[21]; //存放蛇身 + 食物 行、列坐标

  19. int addx,addy;  //相对位移偏移
  20. uchar n;       //蛇长

  21. void delay(uint i)           //毫秒
  22. {
  23.         uint j;
  24.         for(;i>0;i--)
  25.                 for(j=110;j>0;j--);        
  26. }

  27. /**************************************************************
  28.                 判断是否碰撞,是则返回1,否则返回0
  29. **************************************************************/
  30. int knock()                          
  31. {        int k=0,i;
  32.         if(x[1]>7||y[1]>7)k=1;                 //撞墙
  33.         for(i=2;i<n;i++)
  34.                 if((x[1]==x[i])&(y[1]==y[i]))k=1;  //撞自己
  35.         return k;
  36. }



  37. /**************************************************************
  38.                 显示
  39. **************************************************************/
  40. void display(uchar n,uchar speed)                        //利用speed控制速度,speed越小,速度越快
  41. {
  42.         int j;
  43.         while(speed--)
  44.         {
  45.                 for(j=0;j<n;j++)
  46.                         {
  47.                                 du=1;                                                //消去鬼影
  48.                                 P0=0x00;
  49.                                 du=0;
  50.                                 P0=0xff;
  51.                                 CS88=1;
  52.                                 P0=0xff;
  53.                                 CS88=0;
  54.                                 P0=0x00;        

  55.                                 du=1;
  56.                                 P0=y_table[y[j]];
  57.                                 du=0;
  58.                                 P0=0xff;
  59.                                 CS88=1;
  60.                                 P0=x_table[x[j]];
  61.                                 CS88=0;
  62.                                 P0=0x00;        
  63.                                 delay(1);          //延时1毫秒                        
  64.                                 }
  65.                         }                                       
  66. }

  67. void pause_she() interrupt 0                   //暂停,独立按键k3
  68. {
  69.         int speed=100,j;
  70.         while(speed--)
  71.         {        for(j=0;j<n;j++)
  72.                         {
  73.                                 du=1;                                                //消去鬼影
  74.                                 P0=0x00;
  75.                                 du=0;
  76.                                 P0=0xff;
  77.                                 CS88=1;
  78.                                 P0=0xff;
  79.                                 CS88=0;
  80.                                 P0=0x00;        

  81.                                 du=1;
  82.                                 P0=y_table[y[j]];
  83.                                 du=0;
  84.                                 P0=0xff;
  85.                                 CS88=1;
  86.                                 P0=x_table[x[j]];
  87.                                 CS88=0;
  88.                                 P0=0x00;        
  89.                                 delay(1);          //延时1毫秒               
  90.                         }
  91.         }
  92.         
  93. }


  94. void T0_time() interrupt 1   //每50ms扫描一次按键
  95. {
  96.         ET0=0;                        //先关闭定时器0中断
  97.         TR0=0;                        //关闭定时器0
  98.         TH0=(65536-50000)/256;
  99.         TL0=(65536-50000)%256;  //重装初值 ,扫描结束后再打开定时器0

  100.                         if(!left)
  101.                         {
  102.                                 addy=0;        
  103.                                 addx=-1;
  104.                          }
  105.                         if(!right)
  106.                         {
  107.                                 addy=0;
  108.                                 addx=1;
  109.                         }
  110.                         if(!up)
  111.                         {
  112.                                 addx=0;
  113.                                 addy=1;
  114.                         }
  115.                         if(!down)
  116.                         {
  117.                                 addx=0;
  118.                                 addy=-1;
  119.                         }
  120.         ET0=1;   //打开定时器0中断
  121.         TR0=1;        //启动定时器0
  122. }
  123. void main()
  124. {  
  125.         TMOD=0x01;                        //设置定时器0的工作方式1
  126.         TH0=(65536-50000)/256;
  127.         TL0=(65536-50000)%256;  // 每50ms就申请中断一次
  128.         EA=1;
  129.         EX0=1;   //开外部中断0
  130.         ET0=1;   //打开定时器0中断
  131.         TR0=1;        //启动定时器0
  132.         while (1)         //主循环
  133.         {               
  134.                           
  135.                         int speed=80;
  136.                         int i,again;  

  137.                          du=0;   //关点阵的行,即y
  138.                         we=0;   //关数码管
  139.                         CS88=0;  //关点阵的列,即x
  140.         
  141.                         /*****初始化*****/
  142.                         n=4;                        //蛇长为n-1,开始的时候蛇长为2
  143.                         x[1]=3;
  144.                         y[1]=6;                        //x[1],y[1],固定放置蛇头
  145.         
  146.                         x[2]=4;
  147.                         y[2]=6;        
  148.                         
  149.                         x[3]=5;
  150.                         y[3]=6;                //放置蛇尾
  151.                         
  152.                         x[0]=2;
  153.                         y[0]=2;         //放置果实
  154.         
  155.                         addx=0;addy=0;

  156.                 while(1)     
  157.                 {        
  158.                         display(n,speed);         //显示
  159.                            if(knock())
  160.                         {
  161.                                 speed=80;
  162.                                 break;
  163.                         }                          //判断碰撞
  164.                 if((x[0]==x[1]+addx)&(y[0]==y[1]+addy))         //是否吃东西
  165.             {
  166.                              n++;
  167.                              if(n==21)
  168.                             {
  169.                                         speed=80;
  170.                                          break;
  171.                             }
  172.                                 do
  173.                                 {        x[0]=rand()%8;y[0]=rand()%8;//产生随机果实
  174.                                         again=0;
  175.                                         for(i=1;i<n;i++)                        //判断是否与蛇身重叠
  176.                                         {        if((x[0]==x[i])&(y[0]==y[i]))
  177.                                                 again=1;  }
  178.                                 }while(again);                                        //若重叠则再次产生

  179.            }
  180.                for(i=n-1;i>1;i--)
  181.                         {
  182.                                 x[i]=x[i-1];
  183.                                 y[i]=y[i-1];
  184.                         }      
  185.                     x[1]=x[2]+addx;y[1]=y[2]+addy;                    //移动               
  186.                 }
  187.         }        
  188. }


复制代码

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

使用道具 举报

沙发
ID:1 发表于 2016-5-2 03:25 | 只看该作者
51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:204070 发表于 2017-6-1 17:22 | 只看该作者
很厉害啊
回复

使用道具 举报

地板
ID:276997 发表于 2018-1-18 20:06 | 只看该作者
厉害,拿到其他开发板上可以直接用吗
回复

使用道具 举报

5#
ID:252629 发表于 2018-4-11 15:03 | 只看该作者
厉害了,学习学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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