找回密码
 立即注册

QQ登录

只需一步,快速开始

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

带红外遥控的双色光立方贪吃蛇单片机源程序

[复制链接]
跳转到指定楼层
楼主
双色光立方贪吃蛇遥控器:

玩家一
5:前进
8:后退
7:往左走
9:往右走
4:向上
6:向下

玩家二
0:前进
2:后退
1:往左走
3:往右走
NEXT:向上
+:向下

双击可以进行冲刺
PREV键重置游戏

游戏规则:
1. 边界可以碰撞,碰撞时会穿越到另一边。
2 不可以缠绕自己,吃到自己会导致失败。哪个颜色充满全屏,说明哪个颜色的蛇失败。
3. 通过吃食物来增加长度。
4. 吃到对方蛇会使对方长度减少。
5.芯片会根据音乐文件写入优盘的时间为他们自动排序,我设置的顺序是、 吃食物音乐 bgm、 失败音乐
然后初始化时直接播放(第一首会播放吃食物的音乐)下一曲
也就是bgm
然后需要触发吃食物音效时,控制芯片播放上一首
如果需要播放失败音乐,就控制芯片播放下一首



单片机源程序如下:
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>        
  5. #include <hc595.h>         
  6. #define MaxLength 20
  7. /************************************************************************/
  8. #define LENG 8
  9. uchar xdata game [LENG][LENG][LENG];
  10. uchar xdata grand[10]={1000,900,800,700,600,500,400,300,200,100};
  11. int LEVEL1=9;
  12. int finshflag=0;
  13. int pauseflag=0;
  14. void key2();
  15. int rush=0;
  16. int rush2=0;
  17. uchar xdata display_r[8][8]={0};            //色光数组
  18. uchar xdata display_b[8][8]={0};
  19. uchar currentColor = 1;
  20. uchar layerBuffer = 0x01;
  21. sbit GG=P3^4;
  22. sbit RR=P3^5;
  23. sbit BB=P3^6;
  24. sbit k4=P0^7;
  25. sbit k2=P0^5;
  26. uchar layer = 0;
  27. int reset=0;
  28. uchar data irtime=0;
  29. uchar startflag;//开始标志
  30. uchar data irdata[33];//数据一共33位加上引导码
  31. uchar bitnum;
  32. uchar irreceok;//接收一帧数据完成
  33. uchar ircode[4];//4个字节的数据
  34. uchar irprosok;//处理完成
  35. void drawPoint(int x, int y, int z,int color);
  36. void food();
  37. void delete_tail();
  38. void delete_tail2();
  39. int food_x,food_y,food_z;
  40. enum points{UP , DOWN , LEFT , RIGHT,FORTH,BACK};
  41. enum points point = RIGHT;

  42. enum points2{UP2 , DOWN2 , LEFT2 , RIGHT2,FORTH2,BACK2};
  43. enum points2 point2 = LEFT2;

  44. typedef struct  Snake{
  45.         uchar x[MaxLength]; //蛇身节点的横坐标  
  46.     uchar y[MaxLength]; //蛇身节点的纵坐标  
  47.     uchar z[MaxLength]; //蛇节点  
  48.     uchar length;//蛇长度
  49.         
  50. }Snake;
  51. xdata Snake snake={{0},{0},{0},0};
  52. xdata Snake snake2={{0},{0},{0},0};

  53. void delay2(uint t)                                  //延时
  54. {
  55.         int i;
  56.         while(t--)
  57.         for(i=0;i<5;i++);
  58. }

  59. void init(){                                                   //游戏初始化
  60.         int i, k,j;
  61.         for(i = 0 ; i < LENG ; i++){
  62.                 for(j = 0 ; j < LENG ; j++){
  63.                         for(k = 0 ; k < LENG ; k++){
  64.                          game[i][j][k] = 0;
  65.                         }
  66.                 }
  67.         }
  68. for(i=0;i<20;i++){
  69.          snake.x[i]        =0;
  70.          snake.y[i]        =0;
  71.          snake.z[i]        =0;
  72.          snake2.x[i]=0;
  73.          snake2.y[i]=0;
  74.          snake2.z[i]=0;
  75. }
  76. snake.length=0;
  77. snake2.length=0;
  78. }
  79. void eaten(int x,int y,int z,int n){          //蛇被吃函数设置
  80. int i ;
  81.                 k2=0;
  82.                 delay2(10000);
  83.                 k2=1;               
  84.          if(n==1){
  85.                  for(i=0;snake.x[i]!=x&&snake.y[i]!=y&&snake.z[i]!=z;i++);
  86.                  i++;
  87.                  for(i;i>0;i--)delete_tail();
  88.                   }
  89.         if(n==2){
  90.                  for(i=0;snake2.x[i]!=x&&snake2.y[i]!=y&&snake2.z[i]!=z;i++);
  91.                  i++;
  92.                  for(i;i>0;i--)delete_tail2();
  93.                   }
  94. }
  95. void finsh(int n){                                 //游戏结束函数设置        
  96.         int i,j,k;
  97.         for(i = 0 ; i < LENG ; i++){
  98.                 for(j = 0 ; j < LENG ; j++){
  99.                         for(k = 0 ; k < LENG ; k++){
  100.                          if(game[i][j][k] == 0){
  101.                                  game[i][j][k] =n;
  102.                          }

  103.                         }
  104.                 }
  105.         }
  106. }
  107. void add_head(int a, int b, int c){                  //蛇1增加头
  108.         
  109.         if(game[a][b][c]==1){
  110.                 k4=0;
  111.         delay2(10000);
  112.             k4=1;
  113.                 finshflag=1;
  114.                 finsh(1);
  115.         }
  116.         if(game[a][b][c]==2){               
  117.                 eaten(a,b,c,2);
  118.         }
  119.          game[a][b][c]=1;                  
  120.           snake.x[snake.length]=a;  
  121.           snake.y[snake.length]=b;
  122.                   snake.z[snake.length]=c;   
  123.         snake.length++;//节点个数加1  
  124. }//添加点至头部使蛇看起来在向前走
  125. void add_head2(int a, int b, int c){           //蛇2增加头
  126.         
  127.         if(game[a][b][c]==1){
  128.                
  129.                 eaten(a,b,c,1);
  130.         }
  131.         if(game[a][b][c]==2){
  132.                 k4=0;
  133.         delay2(10000);
  134.         k4=1;

  135.                 finshflag=1;
  136.                 finsh(2);
  137.         }
  138.          game[a][b][c]=2;                  
  139.           snake2.x[snake2.length]=a;  
  140.           snake2.y[snake2.length]=b;
  141.                   snake2.z[snake2.length]=c;  
  142.         snake2.length++;    //节点个数加1  
  143. }

  144. void delete_tail(){          //蛇一
  145. int i;
  146.         game[snake.x[0]][snake.y[0]][snake.z[0]]=0;
  147.         for(i=0;i<snake.length;i++)  //依次向尾部方向移动蛇各个节点的坐标  
  148.         {  
  149.           snake.x[i]=snake.x[i+1];  
  150.           snake.y[i]=snake.y[i+1];  
  151.           snake.z[i]=snake.z[i+1];  
  152.         }  
  153.      snake.length--;            
  154. }//删除尾部使蛇看起来在向前走

  155. void delete_tail2(){   //蛇二
  156. int i;
  157.         game[snake2.x[0]][snake2.y[0]][snake2.z[0]]=0;
  158.         for(i=0;i<snake2.length;i++)  //依次向尾部方向移动蛇各个节点的坐标  
  159.         {  
  160.           snake2.x[i]=snake2.x[i+1];  
  161.           snake2.y[i]=snake2.y[i+1];  
  162.           snake2.z[i]=snake2.z[i+1];  
  163.         }  
  164.      snake2.length--;     
  165.   
  166.         
  167. }


  168. void food(){
  169.         
  170.         do{
  171.                 food_x = rand()%7+1;//使得随机数在1到8的范围
  172.             food_y = rand()%7+1;
  173.                 food_z = rand()%7+1;
  174.         }while(game[food_x][food_y][food_z] == 1||game[food_x][food_y][food_z] == 2);
  175.         game[food_x][food_y][food_z] = 3;
  176. }//随机的食物
  177. /*
  178. void renew(){
  179.         int times=0;
  180.         current = head->next->next;
  181.         while(current->next != NULL){
  182.                 current = current->next;
  183.                 times++;
  184.         }
  185.         while(times--){
  186.                 current = current->prior;
  187.                 current->next = NULL;
  188.                 free(current->next);
  189.         }
  190. }
  191. */

  192. void delay(int t)
  193. {
  194.         int tt;
  195.         while(t--)
  196.                 for(tt=0;tt<10;tt++);
  197. }

  198. void move(){                //使蛇自动朝当前方向前进,控制蛇1

  199.         if(!pauseflag&&!finshflag){
  200.         int a = snake.x[snake.length-1];
  201.         int b = snake.y[snake.length-1];
  202.         int c = snake.z[snake.length-1];

  203.         switch(point){
  204.         case UP: {
  205.                 c++;
  206.                 if(c>7)c=0;
  207.                 break; }

  208.         case DOWN: {
  209.                 c--;
  210.                 if(c<0)c=7;
  211.                 break; }

  212.         case RIGHT: {
  213.                 a++;
  214.                 if(a>7)a=0;
  215.                 break;
  216.                           }
  217.         case LEFT: {
  218.                 a--;
  219.                 if(a<0)a=7;
  220.                 break;
  221.                           }
  222.         case FORTH: {
  223.                 b++;
  224.                 if(b>7)b=0;
  225.                 break;
  226.                           }
  227.         case BACK: {
  228.                 b--;
  229.                 if(b<0)b=7;
  230.                 break;
  231.                           }
  232.         }

  233.         if(a == food_x && b == food_y&&c == food_z){
  234.            k2=0;
  235.                 delay2(10000);
  236.                 k2=1;
  237.                
  238.                 add_head(a,b,c);
  239.         
  240.                 food();
  241.                
  242.                 return;
  243.         }//吃到食物了
  244.         add_head(a,b,c);
  245.         delete_tail();
  246.         }
  247.         
  248.         

  249. }

  250. void move2(){                 //使蛇自动朝当前方向前进,控制蛇2

  251. ……………………

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

所有资料51hei提供下载:
双色光立方贪吃蛇程序.zip (1.64 MB, 下载次数: 43)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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