久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1900|回復: 1
打印 上一主題 下一主題
收起左側

51單片機俄羅斯方塊游戲源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:348220 發表于 2018-6-9 21:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
通過附件,可輕松學習操作技巧!
單片機源程序如下:
  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.                         {
  325.                            HavePoint=0;
  326.                            for(k=1;k<13;k++)
  327.                            {
  328.                               if(Platform[k][Del_Line-1]==1)
  329.                                   {
  330.                                      HavePoint=1;            //標識這一行有要下移的點
  331.                                      XiaoFengKuai(k,Del_Line-1,0);           //刪除小方塊
  332.                                          Platform[k][Del_Line-1]=0;         //平臺數據清零
  333.                                          XiaoFengKuai(k,Del_Line,1) ;          //將小方塊下移
  334.                                          Platform[k][Del_Line]=1;         //平臺數據置1,表明此位置已被占用
  335.                                    }
  336.                            }
  337.                            if(HavePoint==0) break;  //沒有要下移的行,退出本循環
  338.                            Del_Line--;   //下移上一行
  339.                         }
  340.                         }
  341.                  }
  342.       }               
  343.    }
  344.    if(Del_Line_Num)
  345.          {
  346.             Show_score(Del_Line_Num);          //刷新分數顯示
  347.          }
  348. }                            
  349.                           
  350. //**************************************************************************
  351. //= 函數原型:void Show_shape(uchar x1,uchar y1,uchar Tshape,bit mode)
  352. //= 功    能: 顯示一個方塊形狀或刪除一個方塊形狀
  353. //= 參    數: (x1,y1)為顯示位置,Tshape為顯示的形狀,mode=1為顯示,mode=0不顯示                       
  354. //= 返 回 值:
  355. //= 函數性質:私有函數
  356. //= 注    意:
  357. //***************************************************************************
  358. void Show_shape(uchar x1,uchar y1,uchar Tshape,bit mode)
  359. {
  360.   if(mode==1)
  361.   {

  362.      XiaoFengKuai(x1+shape[Tshape].point[0].x,y1+shape[Tshape].point[0].y,1);         //顯示形狀
  363.          XiaoFengKuai(x1+shape[Tshape].point[1].x,y1+shape[Tshape].point[1].y,1);
  364.          XiaoFengKuai(x1+shape[Tshape].point[2].x,y1+shape[Tshape].point[2].y,1);
  365.          XiaoFengKuai(x1+shape[Tshape].point[3].x,y1+shape[Tshape].point[3].y,1);
  366.   }
  367.   else
  368.   {
  369.      XiaoFengKuai(x1+shape[Tshape].point[0].x,y1+shape[Tshape].point[0].y,0);  //刪除形狀
  370.          XiaoFengKuai(x1+shape[Tshape].point[1].x,y1+shape[Tshape].point[1].y,0);
  371.          XiaoFengKuai(x1+shape[Tshape].point[2].x,y1+shape[Tshape].point[2].y,0);
  372.          XiaoFengKuai(x1+shape[Tshape].point[3].x,y1+shape[Tshape].point[3].y,0);
  373.   }
  374. }

  375. //**************************************************************************
  376. //= 函數原型:void Fangkuai_down()
  377. //= 功    能: 方塊下降處理
  378. //= 參    數:                        
  379. //= 返 回 值:
  380. //= 函數性質:公有函數
  381. //= 注    意:
  382. //***************************************************************************   
  383. static uint DSpeed=MIN_SLOW_SPEED;                   //標識下降速度
  384. static uint Now_Speed=MIN_SLOW_SPEED;         //當前速度
  385. void Fangkuai_down()
  386. {
  387.   uchar i;
  388.   static bit New_shape=1;                 //標識是否要產生新形狀
  389.   if(Game_Stop==1) return;
  390.   if(New_shape==1)
  391.   {
  392.     New_shape=0;
  393.     xx=X_START;
  394.         yy=Y_START;
  395.     This_shape=Next_shape;                            //當前方塊等于預方塊
  396.         Show_shape(15,18,Next_shape,0);            // 產生一下個方塊前,將預方塊刪除
  397.         Next_shape=Random();                        //產生下一個方塊
  398.         Show_shape(xx,yy,This_shape,1);                 //顯示當前方塊
  399.         Show_shape(15,18,Next_shape,1);                 //預顯示下一個方塊
  400.         if(Bottom_Anti())
  401.         {
  402.            Game_Stop=1;
  403.        Show_Image(35,15,94,114,0);           //清屏
  404.            char_wr(6,6,Game_Char,0,4); //顯示Game
  405.            char_wr(6,8,Over_Char,0,4); //顯示over
  406.            return;
  407.         }
  408.   }
  409.   else
  410.   {
  411.       if(DSpeed==0)
  412.             {
  413.                DSpeed=Now_Speed;        //確定方塊下落的速度
  414.                if(Bottom_Anti())
  415.                  {
  416.                      New_shape=1;//產生新的形狀
  417.                     for(i=0;i<4;i++)
  418.                      {
  419.                        Platform[xx+shape[This_shape].point[i].x][yy+shape[This_shape].point[i].y]=1;//寫入平臺
  420.                           
  421.                          }
  422.                                  UnDisplay_line();//消行計分
  423.                                  return;
  424.               }
  425.                else
  426.                  {
  427.                    Show_shape(xx,yy,This_shape,0); //刪除當前形狀
  428.                    yy++;
  429.                Show_shape(xx,yy,This_shape,1); //顯示形狀(形狀下移一個位置)
  430.                    return;
  431.                   }
  432.                }
  433.       else
  434.        {
  435.           DSpeed--;
  436.              
  437.         }
  438.        
  439.     }
  440. }

  441. //**************************************************************************
  442. //= 函數原型:void Fangkuai_Control()
  443. //= 功    能: 方塊游戲控制
  444. //= 參    數:                        
  445. //= 返 回 值:
  446. //= 函數性質:公有函數
  447. //= 注    意:
  448. //***************************************************************************
  449. #define Move_Left    4
  450. #define Move_Right          6
  451. #define Add_Speed    5
  452. #define Change_Shape 8
  453. #define Game_Star    7
  454. #define Game_Pause   9

  455. void Fangkuai_Control()
  456. {
  457.           
  458.          switch(Key)    //消息處理
  459.          {
  460.              case  Move_Left:
  461.                        {
  462.                               Key=Nothing;  //信息已被處理,拋棄它
  463.                       if(!Left_Anti())
  464.                       {
  465.                                 Show_shape(xx,yy,This_shape,0); //刪除當前形狀
  466.                          xx--;
  467.                              Show_shape(xx,yy,This_shape,1); //顯示移動后的形狀
  468.                       }
  469.                            }break;
  470.              case  Move_Right:
  471.                       {
  472.                              Key=Nothing;  //信息已被處理,拋棄它
  473.                      if(!Right_Anti())
  474.                      {
  475.                                Show_shape(xx,yy,This_shape,0); //刪除當前形狀
  476.                         xx++;
  477.                             Show_shape(xx,yy,This_shape,1); //顯示移動后的形狀
  478.                      }
  479.                           }break;
  480.              case  Add_Speed:
  481.                        {
  482.                                Key=Nothing;                  //信息已被處理,拋棄它
  483.                                    if(Game_Stop==1)
  484.                                         {
  485.                                            if(Game_Level==0)
  486.                                            {
  487.                                               Game_Level=9;
  488.                                                   Show_num(13,11,9);         //顯示等級水平
  489.                                                   Game_Speed=MIN_SLOW_SPEED/(Game_Level+1);  //根據水平確定速度
  490.                                                 }
  491. ……………………

  492. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

  1. #include "SCH51.h"
  2. #include "fangkuai.h"
  3. #include "t6963c.h"
  4. #include "key.h"

  5. void main(void)
  6. {
  7.   
  8.       SCH_Init_T2();
  9.       Init_LCD();
  10.       Init_Game();

  11.       SCH_Add_Task(Fangkuai_down, 0, 3);
  12.       SCH_Add_Task(KEY_Update, 1, 3);
  13.           SCH_Add_Task(Fangkuai_Control, 2, 5);

  14.       SCH_Start();

  15.       while(1)
  16.       {
  17.         
  18.                  SCH_Dispatch_Tasks();
  19.        
  20.            }
  21.          
  22. }
復制代碼

所有資料51hei提供下載:
俄羅斯方塊.zip (90.64 KB, 下載次數: 10)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-6-10 00:01 | 只看該作者
本帖需要補全仿真文件后才可獲得88積分
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产精品三级精品av网址 | 国产精品成人一区二区 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 国产精品综合色区在线观看 | 美女黄网站 | 在线观看视频h | 欧美日韩精品久久久免费观看 | 黄色网址在线免费播放 | 一区二区三区四区视频 | 日韩欧美视频在线 | 久久不卡 | 91九色视频在线 | 欧美激情一区二区三区 | 日韩小视频 | 国产精品成人免费 | 色综合天天网 | 九九热精 | 亚洲三级在线 | 欧美精品二区 | 涩涩视频在线播放 | 欧美区在线 | 91电影在线 | 国产色在线 | 亚洲福利 | 久久久久久久久久久久亚洲 | 成人午夜免费在线视频 | 成人激情视频免费在线观看 | 精品欧美| 亚洲毛片在线观看 | www中文字幕 | 在线视频一区二区 | 精品不卡 | 成人精品鲁一区一区二区 | 久久人人国产 | 国产高清视频一区 | 在线视频一区二区 | 国产精品国产三级国产aⅴ中文 | 亚洲一区二区三区免费在线观看 | 亚洲美女一区 | 成人黄在线观看 | 婷婷色成人 |