找回密码
 立即注册

QQ登录

只需一步,快速开始

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

fc手柄控制的12864贪吃蛇源码

[复制链接]
跳转到指定楼层
楼主
一套基于C51的12864贪吃蛇程序


单片机源程序如下:
  1. /*
  2. 贪食蛇程序
  3. 2016年10月6日20:02:37
  4. */

  5. #include "reg52.h"
  6. #include "lcd12864.h"
  7. #include "FC.H"
  8. #include "stdlib.h"

  9. #define snake_UP    0x01
  10. #define snake_DOWN  0xfe
  11. #define snake_LEFT  0x02
  12. #define snake_RIGHT 0xfd

  13. #define snakeInitLength 2
  14. #define snakeInitSideX 70
  15. #define snakeInitSideY 30
  16. #define snakeInitDir snake_RIGHT

  17. #define arraysize 100

  18. #define LEFT_X      63
  19. #define TOP_Y       0
  20. #define RIGHT_X     127
  21. #define BOTTOM_Y    63
  22. unsigned char  xdata stepArray[arraysize]={0};
  23. unsigned char  xdata dirArray[arraysize]={0};
  24. unsigned char front_array,tail_array;//存放头尾数据的数组编号
  25. unsigned char front_dir,tail_dir;//头尾移动的方向
  26. unsigned char frontdat,taildat; //头尾的段数
  27. char tail_x,tail_y,front_x,front_y;//头尾的坐标
  28. unsigned char food_x,food_y;//食物坐标
  29. unsigned int score=0;
  30. unsigned int time_speed;
  31. unsigned char scoreString[5]={0};
  32. unsigned char flag_food=0,flag_skip=0;
  33. unsigned int speed = 1;
  34. unsigned char power = 1;
  35. void toString(unsigned char* str)          //将分数转换为ask码的形式
  36. {
  37.    
  38.     str[0] =  score/1000+0x30;
  39.     str[1] =  score%1000/100+0x30;
  40.     str[2] =  score%100/10+0x30;
  41.     str[3] =  score%10+0x30;
  42. }
  43. //生成食物
  44. void CreateFood()
  45. {
  46.    
  47.     do
  48.     {
  49.         food_x = rand ()%LEFT_X+LEFT_X+1;
  50.         food_y = rand ()%(BOTTOM_Y-1);
  51.     }while(LCD12864_Readpoint(food_x,food_y));          //读点是为了让食物的点在蛇身之外
  52.     power = rand()%2+1;
  53.     time_speed = (250-speed*10)/power;
  54.     LCD12864_Drawpoint(food_x,food_y,DISPLAY);          //将点在12864显示出来
  55. }

  56. //画界面
  57. void drawGUI()
  58. {
  59.     unsigned char i=0;
  60.     LCD12864_String(0,0,"                ");
  61.     LCD12864_String(0,1,"                ");
  62.     LCD12864_String(0,2,"                ");
  63.     LCD12864_String(0,3,"                ");   
  64.    
  65.    
  66.     toString(scoreString);                 
  67.     LCD12864_String(0,0,"分数:          ");
  68.     LCD12864_String(0,1,scoreString);
  69.     LCD12864_String(0,2,"称号:          ");
  70.     LCD12864_String(0,3,"小虾米  ");
  71.     for(i=LEFT_X;i<RIGHT_X;i++)                  //画上下边框
  72.     {
  73.          LCD12864_Drawpoint(i,TOP_Y,DISPLAY);
  74.          LCD12864_Drawpoint(i,BOTTOM_Y,DISPLAY);
  75.     }
  76.     for(i=0;i<BOTTOM_Y;i++)                          //画左右边框
  77.     {
  78.          LCD12864_Drawpoint(LEFT_X,i,DISPLAY);
  79.          LCD12864_Drawpoint(RIGHT_X,i,DISPLAY);
  80.     }
  81.    
  82.     //画蛇
  83.     for(i=0;i<snakeInitLength;i++)
  84.     {
  85.          LCD12864_Drawpoint(i+snakeInitSideX,snakeInitSideY,DISPLAY);
  86.     }
  87.         //食物
  88.        do
  89.     {
  90.         food_x = rand ()%LEFT_X+LEFT_X+1;
  91.         food_y = rand ()%(BOTTOM_Y-1);
  92.     }while(LCD12864_Readpoint(food_x,food_y));
  93.     //power = rand()%2+1;
  94.     time_speed = (250-speed*10);
  95.     LCD12864_Drawpoint(food_x,food_y,DISPLAY);
  96. }
  97. //初始化
  98. void Snake_Init()
  99. {
  100.    
  101.     score = 0;
  102.     flag_food=0;
  103.     flag_skip=0;
  104.    
  105.     speed = 1;
  106.     power = 1;
  107.     front_x = snakeInitSideX + snakeInitLength - 1;
  108.     front_y = snakeInitSideY;
  109.     tail_x = snakeInitSideX;
  110.     tail_y = snakeInitSideY;


  111.     stepArray[0] = snakeInitLength;
  112.     dirArray[0] = snakeInitDir;
  113.     tail_array = front_array = 0;
  114.     time_speed = (250-speed*10)/power;
  115.     front_dir = dirArray[0];
  116.     tail_dir = dirArray[0];
  117.     frontdat = stepArray[0];
  118.     taildat = stepArray[0];
  119.     drawGUI();
  120.    
  121. }


  122. //游戏结束界面
  123. void GAMEOVER()
  124. {
  125.     LCD12864_clearGDR();
  126.     toString(scoreString);
  127.     LCD12864_String(0,0,"                ");
  128.     LCD12864_String(0,1,"                ");
  129.     LCD12864_String(0,2,"                ");
  130.     LCD12864_String(0,3,"                ");
  131.    
  132.     LCD12864_String(0,0,"   GAME  OVER   ");
  133.     LCD12864_String(0,1,"  SCROE:        ");
  134.     LCD12864_String(5,1,scoreString);
  135.     LCD12864_String(0,2,"      START     ");
  136.    
  137.     while(1)
  138.     {
  139.         if(FC_ReadDATA() == FC_START) break;
  140.     }
  141.     Snake_Init();

  142. }

  143. //称号获得
  144. void LEVEL_Name()
  145. {
  146.     switch (score)
  147.     {
  148.         case 0 : LCD12864_String(0,3,"小虾米  ");speed =1;
  149.             break;
  150.         case 4 : LCD12864_String(0,3,"大虾米  ");speed =2;
  151.             break;
  152.         case 8 : LCD12864_String(0,3,"大豆虫  ");speed =3;
  153.             break;
  154.         case 12: LCD12864_String(0,3,"小青蛇  ");speed =4;
  155.             break;
  156.         case 20: LCD12864_String(0,3,"青蛇    ");speed =5;
  157.             break;
  158.         case 40: LCD12864_String(0,3,"白蛇精  ");speed =6;
  159.             break;
  160.         case 80: LCD12864_String(0,3,"白素贞  ");speed =7;
  161.             break;
  162.         case 160:LCD12864_String(0,3,"蛇界食神");speed =8;
  163.             break;
  164.         case 320 : LCD12864_String(0,3,"小白龙  ");speed =9;
  165.             break;
  166.         case 640:LCD12864_String(0,3,"逆天白龙 ");speed =10;
  167.             break;
  168.         case 1000:LCD12864_String(0,3,"通天神龙");speed =11;
  169.             break;
  170.         default:
  171.                 break;
  172.     }

  173. }
  174. //画出贪食蛇
  175. void  drawSnake(unsigned char* stepArray,unsigned char* dirArray)
  176. {                                                                                                                                                                                                                                                                  ``````````
  177.    
  178.     switch (front_dir)
  179.     {
  180.         case snake_UP   : front_y--;if(front_y<(TOP_Y+1))front_y = (BOTTOM_Y-1);
  181.             break;
  182.         case snake_DOWN : front_y++;if(front_y>(BOTTOM_Y-1))front_y = (TOP_Y+1);
  183.             break;
  184.         case snake_LEFT : front_x--;if(front_x< (LEFT_X+1))front_x = (RIGHT_X-1);
  185.             break;
  186.         case snake_RIGHT: front_x++;if(front_x>(RIGHT_X-1))front_x = (LEFT_X+1);
  187.             break;
  188.         default:
  189.             break;
  190.     }
  191.     frontdat =  stepArray[front_array];
  192.     frontdat++;
  193.     frontdat = frontdat%128;
  194.     stepArray[front_array] = frontdat;
  195.    
  196.     //判断是食物还是自己身体
  197.     if(LCD12864_Readpoint(front_x,front_y))                //判断前进方向上有无点
  198.     {
  199.         //判断是否为食物
  200.         if((front_x==food_x)&&(front_y==food_y))   
  201.         {
  202.             flag_food = 1;
  203.             score++;
  204.             
  205.             toString(scoreString);
  206.             LCD12864_String(0,1,scoreString);
  207.             LEVEL_Name();
  208.         }
  209.         else
  210.         {
  211.             flag_food = 0;
  212.             GAMEOVER();
  213.         }
  214.     }
  215.    
  216.     //画头
  217.     LCD12864_Drawpoint(front_x,front_y,DISPLAY);
  218.    
  219.    
  220.     //消尾
  221.     if(flag_skip == 0)
  222.     {
  223.             
  224.         LCD12864_Drawpoint(tail_x,tail_y,NOTDISPLAY);
  225.         taildat = stepArray[tail_array];
  226.         taildat--;
  227.       
  228.         if(taildat == 0)
  229.         {
  230.             tail_array++;
  231.             tail_array %= arraysize;
  232.             //重新获取尾巴的段数和方向
  233.             taildat = stepArray[tail_array];
  234.             tail_dir = dirArray[tail_array];
  235.          
  236.         };
  237.          stepArray[tail_array] = taildat;

  238.         switch (tail_dir)
  239.         {
  240.             case snake_UP   : tail_y--;if(tail_y<(TOP_Y+1))tail_y = (BOTTOM_Y-1);
  241.                 break;
  242.             case snake_DOWN : tail_y++;if(tail_y>(BOTTOM_Y-1))tail_y = (TOP_Y+1);
  243.                 break;
  244.             case snake_LEFT : tail_x--;if(tail_x<(LEFT_X+1))tail_x = (RIGHT_X-1);
  245.                 break;
  246.             case snake_RIGHT: tail_x++;if(tail_x>(RIGHT_X-1))tail_x = (LEFT_X+1);
  247.                 break;
  248.            
  249.         }
  250.         if(flag_food==1)
  251.         {

  252.             //判断前面是食物
  253.             if((front_x==food_x)&&(front_y==food_y))
  254.             {
  255.                 flag_food = 0;
  256.                
  257.                 flag_skip = 1;
  258.                 CreateFood();
  259.             }
  260.                
  261.          }
  262.     }else flag_skip = 0;

  263. }

  264. //FC手柄扫描
  265. unsigned char  FC_scan()
  266. {
  267.     unsigned char dat;
  268.     dat = FC_ReadDATA();
  269.    
  270.     if(dat != 0xff)
  271.     {
  272.         
  273.          if((dat&~FC_UP) ==0)   return snake_UP;
  274.          if((dat&~FC_DOWN)==0)  return snake_DOWN;
  275.          if((dat&~FC_LEFT)==0)  return snake_LEFT;
  276.          if((dat&~FC_RIGHT)==0) return snake_RIGHT;         
  277.     }
  278.     return 0;
  279. }

  280. //手柄数据处理函数
  281. void MakeFCscan(unsigned char* stepArray,unsigned char* dirArray)
  282. {
  283.     unsigned char fcdat;
  284.     fcdat = FC_scan();
  285.     //手柄有方向
  286.     if(fcdat != 0)
  287.     {
  288.         //方向不与头的行进方向反向或相同
  289.         if((fcdat != ~front_dir) && (fcdat != front_dir))
  290.         {
  291. ……………………

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

所有资料51hei提供下载:
贪食蛇 2.0.zip (68.71 KB, 下载次数: 20)




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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