找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于AT89c51单片机制作的俄罗斯方块游戏 T6963C液晶显示源码

[复制链接]
跳转到指定楼层
楼主
注明:只能按2键往左移
         按4键往右移
         按8键变换
        无快速下降键


部分源码预览:
  1. #include "t6963c.h"
  2. #include "typedef.h"
  3. #include "key.h"

  4. #define X_START 5
  5. #define Y_START 0
  6. #define MIN_SLOW_SPEED  300
  7. #define BX_START  30
  8. #define BY_START  15
  9. #define Nothing   100


  10. //全局数据
  11. code uchar Game_Char[]={0x27,0x41,0x4d,0x45};
  12. code uchar Over_Char[]={0x2f,0x56,0x45,0x52};
  13.                                                             
  14. static uchar xx,yy;         //方块的位置
  15. static uint  Game_Score=0;
  16. static uchar xdata Platform[14][21];    //游戏平台数据
  17. static uchar This_shape;                                //当前形状
  18. static uchar Next_shape=0;
  19. static uint  Game_Speed=MIN_SLOW_SPEED;         //等级速度,正常情况,方块下降的速度
  20. static uchar Game_Stop=1;
  21. static uchar Game_Level=0;

  22. /////////////////////////////////////////////////////////////////////////////////
  23. /////////////////////////////////////////////////////////////////////////////////
  24. /////////方块形状的定义//////////////////////////////////////////////////////////
  25. /////////////////////////////////////////////////////////////////////////////////
  26. struct POINT{
  27.               uchar x;
  28.               uchar y;
  29.              };

  30. struct SHAPE{
  31.                struct POINT point[4];
  32.                            uchar next;        //下一个形状
  33.                          }


  34. xdata shape[19]={
  35.   
  36.                    { 1,0,0,1,1,1,2,1,1  },
  37.                                    { 1,0,1,1,2,1,1,2,2  },
  38.                                    { 0,0,1,0,2,0,1,1,3  },
  39.                                    { 1,0,0,1,1,1,1,2,0  },
  40.                                     
  41.                                    { 1,0,2,0,1,1,1,2,5  },
  42.                                    { 0,0,1,0,2,0,2,1,6  },
  43.                                    { 2,0,2,1,2,2,1,2,7  },
  44.                                    { 0,0,0,1,1,1,2,1,4  },

  45.                                    { 1,0,2,0,2,1,2,2,9  },
  46.                                    { 2,0,0,1,1,1,2,1,10 },
  47.                                    { 1,0,1,1,1,2,2,2,11 },
  48.                                    { 0,0,1,0,2,0,0,1,8  },

  49.                                    { 0,0,0,1,1,1,1,2,13 },
  50.                                    { 1,0,2,0,0,1,1,1,12 },

  51.                                    { 2,0,1,1,2,1,1,2,15 },
  52.                                    { 0,0,1,0,1,1,2,1,14 },

  53.                                    { 1,0,1,1,1,2,1,3,17 },
  54.                                    { 0,1,1,1,2,1,3,1,16 },

  55.                                    { 1,0,2,0,1,1,2,1,18 },         
  56.                                             
  57.                                 };   

  58. ////////////////////////////////////////////////////////////////////////////
  59. //**************************************************************************
  60. //= 函数原型:void Init_GamePlatform()
  61. //= 功    能: 初始化游戏平台
  62. //= 参    数: 无                        
  63. //= 返 回 值: 无
  64. //= 函数性质:公有函数
  65. //= 注    意:
  66. //***************************************************************************
  67. void Show_score(uchar);
  68. void Init_GamePlatform()
  69. {
  70.   uchar i;
  71.   uchar j;
  72.   uchar N_Hanzi;
  73.   
  74.   Wr_line(1,33,13,64,1 );        //初始化游戏平台边界        画游戏区域
  75.   Wr_line(1,33,14,64,1 );   //画上横线
  76.   Wr_line(0,33,15,100,1);
  77.   Wr_line(0,34,15,100,1);  //画左竖线
  78.   Wr_line(1,33,115,64,1);  
  79.   Wr_line(1,33,116,64,1);  //画下横线
  80.   Wr_line(0,95,15,100,1);
  81.   Wr_line(0,96,15,100,1);  //画右竖线
  82. //--------------------------------------------------------
  83.   for(i=1;i<13;i++)                //游戏平台数据清零
  84.   {
  85.     for(j=0;j<20;j++)
  86.           {
  87.             Platform[i][j]=0;
  88.           }
  89.    }
  90.    for(i=1;i<13;i++)
  91.    {
  92.       Platform[i][20]=1;   //游戏平台最下面一行的每一个方块位置为1,作为下边界
  93.         }
  94.    
  95.    for(j=0;j<20;j++)                //游戏平台左右方块位置置1,作为左右边界
  96.    {
  97.       Platform[0][j]=1;
  98.           Platform[13][j]=1;
  99.    }
  100. //---------------------------------------------------------
  101.   N_Hanzi=0;            
  102.   for(j=3;j<=12;j=j+2)           //
  103.   {
  104.      hanzhi(1,j,N_Hanzi,1);
  105.          N_Hanzi++;   //指向下一个汉字
  106.   }
  107.   
  108.   hanzhi(13,3,6,1);         //输入“分”汉字
  109.   hanzhi(13,8,8,1);   //输入“级”汉字

  110.   Show_score(0);        //显示初始分数
  111.   Show_num(13,11,Game_Level);         //显示初始等级水平
  112.   Game_Speed=MIN_SLOW_SPEED/(Game_Level+1);  //根据水平确定速度

  113. //------------------------------------------------------------------
  114.   Game_Score=0;
  115.   xx=X_START ;
  116.   yy=Y_START ;
  117. }
  118. ////////////////////////Init_Game/////////////////////
  119. void Init_Game()
  120. {
  121.   Game_Stop=1;
  122.   Init_GamePlatform();
  123.   hanzhi(7,3,9,1);         //输入“按”汉字
  124.   Show_num(7,6,7);         //显示7
  125.   hanzhi(7,8,10,1);         //输入“开”汉字
  126.   hanzhi(7,10,11,1);         //输入“始”汉字
  127. }
  128. //**************************************************************************
  129. //= 函数原型:void XiaoFengKuai(uchar x,uchar y,uchar mode)
  130. //= 功    能: 显示一个小方块
  131. //= 参    数: 小方块的横x,坚坐标y,mode=1:显示小方块,mode=0:删除小方块                        
  132. //= 返 回 值:
  133. //= 函数性质:私有函数
  134. //= 注    意:
  135. //***************************************************************************
  136. void XiaoFengKuai(uchar x,uchar y,bit mode)
  137. {
  138.    uchar x1=5*x+BX_START;        //将方块在平台的位置转化成LCD的点坐标(地址转换)
  139.    uchar y1=5*y+BY_START;         
  140.    uchar i;

  141.    if(mode==1)
  142.    {

  143.        for(i=0;i<5;i++)
  144.        {
  145.           Point(x1+i,y1,1); //画一条横线
  146.        }


  147.                y1+=4;

  148.         for(i=0;i<5;i++)
  149.         {
  150.            Point(x1+i,y1,1); //画第二条横线
  151.          }

  152.         for(i=0;i<5;i++)
  153.         {
  154.            Point(x1,y1-i,1); //画第1条坚线
  155.          }

  156.          x1+=4;

  157.         for(i=0;i<5;i++)
  158.         {
  159.            Point(x1,y1-i,1); //画第2条坚线
  160.          }

  161.         y1-=4;
  162.         for(i=0;i<5;i++)
  163.         {
  164.            Point(x1-i,y1+i,1); //画斜线
  165.         }
  166.    }

  167.   else
  168.   {
  169.              for(i=0;i<5;i++)
  170.         {
  171.           Point(x1+i,y1,0); //画一条横线
  172.               }

  173.                y1+=4;
  174.         for(i=0;i<5;i++)
  175.          {
  176.            Point(x1+i,y1,0); //画第二条横线
  177.          }

  178.          for(i=0;i<5;i++)
  179.          {
  180.             Point(x1,y1-i,0); //画第1条坚线
  181.           }

  182.          x1+=4;
  183.         for(i=0;i<5;i++)
  184.           {
  185.              Point(x1,y1-i,0); //画第2条坚线
  186.           }

  187.         y1-=4;
  188.         for(i=0;i<5;i++)
  189.          {
  190.            Point(x1-i,y1+i,0); //画斜线
  191.          }
  192.         }
  193. }
  194. //////////////////////////////////////////////////////////////////////////
  195. ////////////////左冲突检测//////////////////////////////////////////////
  196. bit Left_Anti()
  197. {
  198.   uchar i;
  199.   for(i=0;i<4;i++)
  200.         {
  201.           if(Platform[xx+shape[This_shape].point[i].x-1][yy+shape[This_shape].point[i].y]==1)
  202.             return 1;
  203.         }
  204.   return 0;
  205. }           

  206. ////////////////右冲突检测///////////////////////////////////////////
  207. bit Right_Anti()
  208. {
  209.   uchar i;
  210.   for(i=0;i<4;i++)
  211.         {
  212.           if(Platform[xx+shape[This_shape].point[i].x+1][yy+shape[This_shape].point[i].y]==1)
  213.             return 1;
  214.         }                           
  215.   return 0;
  216.   
  217. }

  218. ////////////////////////////////////////下冲突检测//////////////////////////
  219. bit Bottom_Anti()
  220. {
  221.    uchar i;
  222.    for(i=0;i<4;i++)
  223.         {
  224.           if(Platform[xx+shape[This_shape].point[i].x][yy+shape[This_shape].point[i].y+1]==1)
  225.             return 1;
  226.     }
  227.   return 0;                          
  228. }
  229. //////////////////////////////////改变形状时产生的冲突检测////////////////////
  230. bit Change_Shape_Anti()
  231. {
  232.    uchar i;
  233.    for(i=0;i<4;i++)
  234.         {
  235.           if(Platform[xx+shape[shape[This_shape].next].point[i].x][yy+shape[shape[This_shape].next].point[i].y]==1)
  236.             return 1;           //检测一个形状的冲突情况
  237.     }
  238.    return 0;
  239. }
  240. //////////////////////////////////产生一个随机数,返回一个随机数///////////////
  241. uchar Random()
  242. {
  243.   static uchar m;
  244.   m+=49;
  245.   return (m%19);
  246. }

  247. //////////////计分函数,参数为 消行行数n///////////////////////////////////////

  248. void Show_score(uchar n)
  249. {
  250.   Game_Score=Game_Score+10*n;

  251.   if(Game_Score<10)
  252.   {
  253.      Show_num(13,6,Game_Score%10);                //显示个位
  254.   }
  255.   else if(Game_Score<100)
  256.   {  
  257.      Show_num(14,6,Game_Score%10);
  258.          Show_num(13,6,Game_Score/10%100);        //显示个位,十位
  259.   }
  260.   else if(Game_Score<1000)
  261.   {
  262.      Show_num(14,6,Game_Score%10);
  263.          Show_num(13,6,Game_Score/10%10);
  264.          Show_num(12,6,Game_Score/100%10);        //显示个位 ,十位,百位
  265.   }
  266.   else
  267.   {  
  268.          Show_num(15,6,Game_Score%10);
  269.          Show_num(14,6,Game_Score/10%10);
  270.          Show_num(13,6,Game_Score/100%10);        //显示个位 ,十位,百位,千位
  271.          Show_num(12,6,Game_Score/1000);
  272.   }
  273.   
  274.   if(Game_Score%1000==0)
  275.   {
  276.     if(Game_Score>0)
  277.         {
  278.        Game_Level++;
  279.        if(Game_Level==10)
  280.            {
  281.               Game_Stop=1;
  282.               hanzhi(7,5,12,1);         //        输出“太棒了"
  283.           hanzhi(7,7,13,1);         
  284.                   hanzhi(7,9,14,1);
  285.                   
  286.            }
  287.        Show_num(13,11,Game_Level);         //显示水平
  288.         
  289.     }
  290.   }
  291. }

  292. //**************************************************************************
  293. //= 函数原型:void Undisplay_line()
  294. //= 功    能: 消除行
  295. //= 参    数: 无                        
  296. //= 返 回 值: 无
  297. //= 函数性质:私有函数
  298. //= 注    意:
  299. //***************************************************************************   
  300. void UnDisplay_line()
  301. {
  302.    uchar Del_Line;      //标识要删除的行
  303.    uchar Del_Line_Num=0;     //标识删除的行数
  304.    uchar i,j,k;
  305.    bit HavePoint;                    //标识一行中是否有空白点

  306.    for(i=0;i<4;i++)
  307.    {
  308.       for(j=1;j<13;j++)
  309.           {
  310.              if(Platform[j][yy+i]==0)
  311.                     break;                   //如果这一行中有一个为空,则退出这一行的循环
  312.                  else if(j==12)
  313.                  {
  314.                     Del_Line=yy+i;                 //确定要删除的行
  315.                         if(Del_Line<20)
  316.                         {
  317.                            Del_Line_Num++;                   //计算共删除的行数
  318.                         for(k=1;k<13;k++)
  319.                         {
  320.                             XiaoFengKuai(k,Del_Line,0);           //删除行
  321.                                 Platform[k][Del_Line]=0;         //平台数据清零
  322.                         }
  323.                         while(1)     //下移



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

下载:
俄罗斯方块.zip (139.26 KB, 下载次数: 51)


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

使用道具 举报

沙发
ID:32289 发表于 2018-9-29 22:01 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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