找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3555|回复: 0
收起左侧

51单片机+ILI9163 TFT设计的经典怀旧游戏贪吃蛇源码

[复制链接]
ID:342671 发表于 2018-6-1 09:36 | 显示全部楼层 |阅读模式
利用51单片机设计经典怀旧游戏贪吃蛇。

0.png
ILI9163液晶屏+单片机源程序如下:
  1. /**************************************************************************

  2. mini80 或者 mini80E 按键,上 s6,下 s14,左 s11, 右 s9, s4 重新开始

  3. 可以按照自己需要重新定义键盘扫描程序中的值,在key_sweep.h 中


  4. ****************************************************************************/

  5. #include "reg52.h"
  6. #include "KEY_SWEEP.H"
  7. #include "SNAKE.h"
  8. #include "9325tp.h"


  9. //=========================================主程序========================================//
  10. main()
  11. {
  12.      ILI9325_Initial();
  13.         Init_SNAKE();
  14.         while(1)
  15.         {
  16.         Run_SNAKE();
  17.         Key();
  18.         }
  19. }
复制代码
  1. /***********************************************************************************
  2. /* 文件名称:        SNAKE.c
  3. /* 功         能:        贪吃蛇游戏代码
  4. /* 署         名:        张先永(原作者)
  5. /* 时         间:        2009年10月11日
  6. /* 备         注:
  7. /*               游戏按键由于需要快速的响应,所有按键通过线与扩展为中断按键
  8. /*               LCD 液晶显示器在PO口 需要上拉电阻
  9. /***********************************************************************************/

  10. #include <reg52.H>  
  11. #include <KEY_SWEEP.H>
  12. #include"9325tp.h"
  13. #include "SNAKE.h"


  14. #define uchar unsigned char
  15. //=================================================================
  16. //    使用结构体定义变量   使程序的名称更加的清楚
  17. //=================================================================
  18. struct
  19. {
  20.         uchar X;
  21.         uchar Y;                        
  22.         uchar Yes;
  23. }Food;        //食物结构体

  24. #define SNAKE_Max_Long 20                 //最大长度
  25. struct
  26. {
  27.         uchar X[SNAKE_Max_Long];
  28.         uchar Y[SNAKE_Max_Long];
  29.         uchar Long;  
  30.         uchar Life;
  31.         uchar Score;                                        //蛇的分数
  32.         uchar Level;                                        //蛇的等级              
  33. }Snake;        //蛇结构体

  34. uchar Key_V_temp=0;                                     //取出上次按键值

  35. //=================================================================
  36. //函数功能:1ms延时函数
  37. //晶    振:11.0592        M
  38. //入口参数:n
  39. //出口参数:无
  40. //=================================================================
  41. void Delay_1mS(unsigned int n)
  42. {
  43.         unsigned int  i;
  44.         unsigned char j;
  45.         
  46.         for(i=0;i<n;i++)
  47.                 for(j=0;j<120;j++)         ;
  48. }

  49. //=================================================================
  50. //函数名称:void Init_time0 (void)
  51. //函数功能:初始化定时器1  用于产生随机数种子 ,用于放置实物
  52. //入口参数:无
  53. //出口参数:无
  54. //=================================================================
  55. void Init_time0 (void)
  56. {
  57.         EA=1;
  58.         ET1=1;
  59.         TMOD|=0x10;
  60.         TH1=0X00;
  61.         TL1=0X00;
  62.         TR1=1;
  63. }
  64. void time1 (void) interrupt  3
  65. {
  66.         TH1=0X00;
  67.         TL1=0X00;
  68. }


  69. //=================================================================
  70. //函数名称:Trun_On_Point     Trun_Off_Point (uchar x,uchar y)
  71. //函数功能:点亮或者熄灭 一个点。用于显示蛇身体
  72. //入口参数:无
  73. //出口参数:无
  74. //特别说明:此 Trun_On,函数换成其他的就可以兼容其他的液晶
  75. //          入8*8 点阵   12864 等
  76. //=================================================================
  77. void Trun_On_Point (uchar x,uchar y,uchar color)
  78. {
  79.         Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color);
  80. }

  81. void Trun_Off_Point (uchar x,uchar y)
  82. {
  83.         Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),0xBE5F);        
  84. }

  85. //=================================================================
  86. //函数名称:void Init_SNAKE(void)  
  87. //函数功能:绘制游戏界面,初始化游戏等级等参数
  88. //入口参数:无
  89. //出口参数:无
  90. //=================================================================
  91. void Init_SNAKE(void)   
  92. {
  93.         uchar i;

  94.         Init_time0();
  95.         //***********绘制游戏界面********************//
  96.         CLR_Screen(0xBE5F);
  97.         Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127
  98.          LCD_PutString(88,8,"Score",0x00ff,0xBE5F);
  99.         LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
  100.          LCD_PutString(88,81,"LEVEL",0x00ff,0xBE5F);
  101.         LCDShow_uCharNumber(96,97,Snake.Level,0x00ff,0xBE5F);

  102.         //***********初始化蛇参数********************//
  103.         Snake.Long=2;                                    //定义初始化蛇的长度
  104.         Snake.Life=0;                                    //初始化蛇还活着
  105.         Snake.Score=0;
  106.         Food.Yes=1;                                       
  107.         Key_Value=0;
  108.     Key_V_temp=0;

  109.         for(i=0;i<Snake.Long;i++)                //将蛇给赋值
  110.         {
  111.                 Snake.X[i]=i+2;
  112.                 Snake.Y[i]=2;
  113.         }                                                        
  114.         for(i=0;i<Snake.Long;i++)                //将蛇给画出来
  115.         {
  116.                 Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
  117.         }                                                        
  118. }
  119. //=================================================================
  120. //函数名称:void Display_dead(uchar i)
  121. //函数功能:显示死亡界面
  122. //入口参数:无
  123. //出口参数:无
  124. //=================================================================
  125. void Display_dead(void)
  126. {

  127.         LCD_PutString(10,40,"GAME OVER",0x00ff,0xBE5F);
  128.         while(Key_Value!=Key_Enter)
  129.              {
  130.                   Key();
  131.                  }
  132.         Init_SNAKE();
  133. }

  134. //=================================================================
  135. //函数名称:void Display_Pass(uchar i)
  136. //函数功能:显示过关界面
  137. //入口参数:无
  138. //出口参数:无
  139. //=================================================================
  140. void Display_Pass(void)
  141. {
  142.         Snake.Level++;        
  143.         LCD_PutString(18,40,"You are",0xcc88,0xBE5F);
  144.         LCD_PutString(34,56,"WIN!",0xcc88,0xBE5F);
  145.         while(Key_Value!=Key_Enter)
  146.              {
  147.                   Key();
  148.                  }
  149.         Init_SNAKE();
  150. }
  151. //=================================================================
  152. //函数名称:void Run_SNAKE(void)
  153. //函数功能:蛇运动函数 (游戏精华)
  154. //入口参数:无
  155. //出口参数:无
  156. //=================================================================
  157. void Run_SNAKE(void)
  158. {
  159.         uchar i=0;

  160.         /*********************根据按键选择蛇的运动方向*******************/
  161.         if((Key_Value==Key_Right&&Key_V_temp!=Key_Left)||(Key_Value==Key_Left&&Key_V_temp==Key_Right))
  162.         {
  163.                 Trun_Off_Point(Snake.X[0],Snake.Y[0]);                //先把蛇尾给熄灭掉

  164.                 for(i=0;i<Snake.Long-1;i++)                    //蛇身都是它前一段的蛇身的位置
  165.                 {
  166.                         Snake.X[i]=Snake.X[i+1];
  167.                         Snake.Y[i]=Snake.Y[i+1];
  168.                 }

  169.                 Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;
  170.                 Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动
  171.                
  172.                 for(i=0;i<Snake.Long;i++)                                    //这个让蛇显示出来的函数
  173.                 {
  174.                         Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
  175.                 }
  176.                 Key_V_temp=Key_Right;
  177.         }

  178.         if((Key_Value==Key_Left&&Key_V_temp!=Key_Right)||(Key_Value==Key_Right&&Key_V_temp==Key_Left))
  179.         {

  180.                 Trun_Off_Point(Snake.X[0],Snake.Y[0]);                    //先把蛇尾给熄灭掉
  181.                
  182.                 for(i=0;i<Snake.Long-1;i++)                     //蛇身都是它前一段的蛇身的位置
  183.                 {
  184.                         Snake.X[i]=Snake.X[i+1];
  185.                         Snake.Y[i]=Snake.Y[i+1];
  186.                 }
  187.                
  188.                 Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;
  189.                 Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动
  190.                
  191.                 for(i=0;i<Snake.Long;i++)                                    //这个让蛇显示出来的函数
  192.                 {
  193.                         Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
  194.                 }
  195.                 Key_V_temp=Key_Left;
  196.         }
  197.         if(( Key_Value==Key_Up&&Key_V_temp!=Key_Down)||( Key_Value==Key_Down&&Key_V_temp==Key_Up))
  198.         {
  199.                 Trun_Off_Point(Snake.X[0],Snake.Y[0]);                   //先把蛇尾给熄灭掉
  200.                
  201.                 for(i=0;i<Snake.Long-1;i++)                   //蛇身都是它前一段的蛇身的位置
  202.                 {
  203.                         Snake.X[i]=Snake.X[i+1];
  204.                         Snake.Y[i]=Snake.Y[i+1];
  205.                 }
  206.                
  207.                 Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
  208.                 Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //蛇头向你要求的方向移动
  209.                
  210.                 for(i=0;i<Snake.Long;i++)                                   //这个让蛇显示出来的函数
  211.                 {
  212.                         Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
  213.                 }
  214.                 Key_V_temp=Key_Up;
  215.         }
  216.         if(( Key_Value==Key_Down&&Key_V_temp!=Key_Up)||( Key_Value==Key_Up&&Key_V_temp==Key_Down))
  217.         {
  218.                 Trun_Off_Point(Snake.X[0],Snake.Y[0]);                  //先把蛇尾给熄灭掉
  219.                
  220.                 for(i=0;i<Snake.Long-1;i++)                  //蛇身都是它前一段的蛇身的位置
  221.                 {
  222.                         Snake.X[i]=Snake.X[i+1];
  223.                         Snake.Y[i]=Snake.Y[i+1];
  224.                 }
  225.                
  226.                 Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
  227.                 Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //蛇头向你要求的方向移动
  228.                
  229.                 for(i=0;i<Snake.Long;i++)                                   //这个让蛇显示出来的函数
  230.                 {
  231.                         Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
  232.                 }
  233.                 Key_V_temp=Key_Down;
  234.         }
  235.         

  236.         /****************根据按键选择蛇的运动程序结束*******************/
  237.         /////////////////////////////////////////////////////////////////

  238.         
  239.         /************************判断蛇是否死亡***********************/
  240.         if(Snake.X[Snake.Long-1]>=19||Snake.Y[Snake.Long-1]>=28)//判蛇头是否撞到墙壁
  241.         {
  242.                 Snake.Life=1;
  243.         }
  244.         for(i=3;i<Snake.Long;i++)//从第三节开始判断蛇头是否咬到自己
  245.         {
  246.                 if(Snake.X[i]==Snake.X[0]&&Snake.Y[i]==Snake.Y[0])
  247.                 {
  248.                         Snake.Life=1;
  249.                 }
  250.         }
  251.         if(Snake.Life==1)          //if the snake over
  252.         {
  253.                
  254.                 Display_dead();
  255.         }
  256.         /******************判断蛇是否死亡程序结束***********************/
  257.         /////////////////////////////////////////////////////////////////


  258.         /************************判断蛇是否最长了**********************/
  259.         if(Snake.Long==SNAKE_Max_Long)
  260.         {
  261.                
  262.                 Display_Pass();
  263.         }
  264.         /////////////////////////////////////////////////////////////////                                                                                   

  265.         /*************************判蛇是否吃到食物**********************/               
  266.         if(Snake.X[Snake.Long-1]==Food.X&&Snake.Y[Snake.Long-1]==Food.Y)//
  267.         {
  268.                 //Trun_Off_Point(Food.X,Food.Y);                  //消隐食物
  269.                 Snake.Long++;//蛇节数加1
  270.                 Snake.X[Snake.Long-1]=Food.X;
  271.                 Snake.Y[Snake.Long-1]=Food.Y;
  272.                 Snake.Score+=10;
  273.                 LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
  274.                 Food.Yes=1;  //食物标志置1
  275.         }
  276. ……………………

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


所有资料51hei提供下载:
2.4 贪吃蛇实验.rar (186.78 KB, 下载次数: 26)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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