俄羅斯方塊解析全過程

 

     以下是我過去做俄羅斯方塊的全部思路,雖說每種語言實現的方式不一樣,但是製作的思路是大體一樣的

 

                                          俄羅斯方塊的思路

界面的搭建:遊戲區域  panel控件
   下一個方塊的提示顯示區域: panel 控件
   其他控件有button,label,textBox等等
遊戲實現的主要步驟:
  方塊的動態生成
  方塊的移動
  方塊的變化
  當每一行填滿的時候方塊的清除
  清除後方塊的排列
方塊動態生成的思路以及運用的知識點:
 PictureBox p=new PictureBox();//動態生成方塊
 p.width=20;//設置方塊的屬性,對於其他方塊必須的屬性根據個人要求設置
 p.height=20;
 不同方塊的生成:由小方塊拼接而成

方塊的移動:
 當方塊的下一個移動區域爲空的時候,可以容許方塊向下移動,
 如果條件不成立,就停止方塊移動

注意:沒個方塊的向下移動的情況都不相同,只需要根據每個方塊的向下移動
 的可行區域進行判斷,如果方塊可以往下移動,就容許移動。


方塊的左右移動
判斷方塊最的左邊和右邊的方塊的座標+左右移動的位置(像素)
 y
 移動條件:如果移動的區域爲空的時候,就移動方塊,否則不移動方塊

注意:左右移動的最大區域不可以超過遊戲區域,可以根據不同的判斷來限定方塊越界的問題

方塊的直接向下移動:
 只需要加快方塊的移動速度就可以達到這個效果


方塊的變化
 兩種長方形的變化條件
  判斷區域:變化範圍=長方形的長*長方形的長的區域
   如果變化範圍條件都爲空的時候,就變化
 其它方塊的變化條件:
  主要思路:判斷要變化方塊,變化後的區域是否爲空,
     並且方塊變化區域範圍是否成立

 注意:方塊變化時的條件,不要忘記如果方塊已經停止移動的時候,方塊就不再容許變化

判斷方塊如何爲填滿:
 可以根據不同的方法來限定:只需要判斷當Y座標一行都爲方塊的時候,
    說明這一行方塊已經填滿,那麼就可以清除這一行方塊
 
 清除後的效果:
  清除這一行以上的方塊的位置都需要往下移動一行,
  根據消除行數來判斷向下移動的位置

 建議:可以將每一個小方塊保存在List<>集合中,
  清除時候可以根據填滿一行的下標和對象進行刪除:

 對於遊戲等級和遊戲加分制度可以根據不同的需求來進行設置,

最後希望這個方案能給你帶來思路,能給你帶來幫助,祝願能早日完成!

 


   

個人代碼提供以及實現步驟:
               The First Point

 運用二維數組定義整個遊戲界面,定義數組
 Int[,]  arr=new  int[21,12];
 界面賦值
For(int i=0;i<22;i++)
{
 For(int j=0;j<12;j++)
 {
  If( i==20 || j==0 || j==11)
   Arr[i,j]=-2;//代表障礙
  Else
   Arr[i,j]=-1;//代表空格
 }
}
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■□□□□□□□□■
■■■■■■■■■■
地圖大小爲200  *  400
  數組賦值後,值爲-1的地方相對於地圖界面的空白區域

    The Second Point

//動態生成方塊(■■■■)
//定義方塊集合
 list<PictureBox> ls=new list<PictureBox>();
 PictureBox  one =new pictureBox();
  One.width=20;
  One.height=20;
  One.image=imagelist.images[0];//給圖片空間賦值圖片
  One.location=new point(40,0);//給第一張圖片定位
 PictureBox two=new pictureBox();
  Two.width=20;
  Two.height=20;
  Two.image=imagelist.images[0];
  Two.location=new point(60,0);
 pictureBox three =new pictureBox();
  three.widht=20;
  three.height=20;
  three.image=imagelist.images[0];
  three.location=new point(80,0);
 pictureBox four=new pictureBox();
  four.widht=20;
  four.height=20;
  four.image=imagelist.images[0];
  four.location=new point(100,0);
 //將四個設好的圖片添加到遊戲控件內
  This.panel.controls.add(one);
  This.panel.controls.add(two);
  This.panel.controls.add(three);               x  40
  This.panel.controls.add(four);                |      100
 //將方塊添加到集合中                              |       |
  ls.add(one);                                       ■□□■■■■□□■ ——y  0
  ls.add(two);                                       ■□□□□□□□□■
  ls.add(three);                                     ■□□□□□□□□■
  ls.add(four);                                       ■□□□□□□□□■
                                                            ■□□□□□□□□■
                                                            ■□□□□□□□□■
   完成後大概圖像                                ■□□□□□□□□■
  //定義變量記錄方塊下標                    ■□□□□□□□□■
                                                            ■□□□□□□□□■ __ y 380
                                                            ■■■■■■■■■■
  sumindex+=4;    
                 
 //方塊的移動
   The Thrid Point
   //注意判斷四個方塊同等X座標移動的Y位置是否爲空

  如:定義X和Y代表方塊在panel中的座標值
 方塊1    x=40, y=0;
 方塊2    x=60,y=0;
 方塊3    x=80,y=0;
 方塊4    x=100,y=0;
  
   如果方塊每移動一次,Y座標加20pX的話
四個方塊的向下移動條件是
   每個方塊同等X座標下Y+20的地方等於空
   二維數組中行和列所對應的就是panel中的X和Y座標
 只需判斷數組中的相應位置來控件方塊的移動
  移動後的圖解

   ■□□□□□□□□■                       ■□□□□□□□□■   
   ■□□□□□□□□■                       ■□□□□□□□□■   
   ■□□□□□□□□■                       ■□□□□□□□□■   
   ■□□□□□□□□■                       ■□□□□□□□□■    
   ■□□□□□□□□■                       ■□□□□□□□□■  
   ■□□□□□□□□■賦值後index值■□□□□□□□□■    
   ■□□□□□□□□■                       ■□□□□□□□□■    
   ■□□□□□□□□■                       ■□□□□□□□□■  
   ■□□■■■■□□■ __y 380        ■□□ 0 1 2 3□□■   
   ■■■■■■■■■■                       ■■■■■■■■■■  
           
        
         |
         x 40

   arr[19,4]=indexsum-4;
   arr[19,5]=indexsum-3;
   arr[19,6]=indexsum-2;
   arr[19,7]=indexsum-1;
   
     The Fourth Point
左移動
   判斷方塊X座標減移動的20Px的地方是否爲空,條件成立
  向左移動4個方塊
 如圖                      x
                                  | □■□ ------ y
                                □■■■□
   x=20;
   y=0;
   //如果兩個白正方塊的地方爲空的時候,方塊可以向左移動一格,x+20,y不變
    arr[1,1]=-1   對於的座標 x=0,y=20;
    arr[0,3]=-1             x=40,y=0;
      x
      |
      □■—y
    □■■■
 右則反之
                   x-1  x
變化            |  |                   x
                   □■□--y            |
           y+1--□■□               ■■■  ---y
                   □■■  變化後   ■

   The Fifth Point

 當一行填滿的時候
   清除這一行方塊
 
      for (int i =1; i <20; i++)   //判斷是哪一行已經填滿         ■□□□□□□□□■
                   {                                                                       ■□□□□□□□□■
                     string see="已滿";                                          ■□□□□□□□□■
                   for (int j = 1; j < 11; j++)                                   ■■■■■■■■■■
                   {                                                                       ■□□□□□□□□■
                        if (arr[i, j] == -1)//判斷是否有空格               ■□□■■■□■□■
                              {
                            see = "未滿";
                            break;
                                  }
                           }
                        if (see == "已滿")  //判斷如果一行填滿的時候
                        {               
                            int start = lp.Count;

                            for (int b = 1; b < 11; b++)//隱藏消除該行
                            {
                                   int index = arr[i, b];//得到消除方塊在數組中的下標
                                   lp.RemoveAt(index);//從數組中移除方塊
    this.panel.Controls.RamoveAt(index);//清除控件中的方塊
                                for (int iy = 1; iy < 20; iy++)//消除後根據集合的動態維護進行相應的數組改變
                                 {
                                     for (int ix = 1; ix < 11; ix++)
                                      {
                                          if (GameHelp.Yarr[iy, ix] != -1 && GameHelp.Yarr[iy, ix] > index)
                                          {
                                              GameHelp.Yarr[iy, ix] = GameHelp.Yarr[iy, ix] - 1;
                                          }
                                      }
                                  }
                            }
//注動態維護
 {0,1,2,3,4,5,6,7}  刪除 0 時候  1,2,3,4,5,6,7  index 爲  0,1,2,3,4,5,6,

      刪除爲2的時候 0,1,3,4,5,6,7, index 0,1,2,3,4,5,6
` 1
                         indexsum-= 10;//由於集合動態維護,將indexsum-消除行控件的個數

                            for (int b = 1; b < 11; b++)//將隱藏方塊的區域賦值爲空
                                GameHelp.Yarr[i, b] = -1;//將數組中消除的區域賦值
                            int indexof = 0;
                           this.panel1.Controls.Clear();//清除遊戲區域的控件,可以不清除
      x               
      |                 foreach (PictureBox pb in lp)//循環遍歷整個集合,將集合中的控件重新確定位置
  ■□□□□□□□□■      {
  ■□□□□□□■□■         int lx = pb.Location.X;//獲取方塊的X座標
  ■□□□■□□□□■         int ly = pb.Location.Y;//獲取方塊的Y座標 
  ■□■□■□□□□■           if (ly < i*20 )//如果方塊小於消除行的Y座標,將方塊Y+20,往下移動
  ■□□□□□□□□■  —y      {
                                   ly += 20;
                                   pb.Location = new Point(lx, ly);       2
       ■2                         this.panel1.Controls.Add(pb);          3
       ■3                         int nexty=0;
                                   int nextx=0; 
     移動2的時候                if (indexof > 0)//當是數組中第二個方塊的時候
       -1                         {
       2                             nexty = lp[indexof - 1].Location.Y;//獲取上一個方塊的XY座標
     移動3的時候                     nextx = lp[indexof - 1].Location.X;
       -1                        }
       2                         if (lx == nextx && ly == nexty + 20)//如果上一個方塊和這一個方塊X相同,並且Y相差20的話
       3                         {
                                     GameHelp.Yarr[ly / 20, lx / 20 + 1] = indexof;//將方塊移動到的地方賦值爲集合下標值
                                  }
     ■2                        else
                                 {
     □2  index -1                    GameHelp.Yarr[ly / 20, lx / 20 + 1] = indexof;//方塊移動的地方賦值爲集合下標值
     ■3        2                     GameHelp.Yarr[ly / 20 - 1, lx / 20 + 1] = -1;//方塊的原始位置賦值爲空
                                 }
     ■3 //集合中3             }
                             else  //消除方塊一下的方塊位置不變
     ■3  arr index 2         {
     □-1                          this.panel1.Controls.Add(pb);
     移動後                       GameHelp.Yarr[ly / 20, lx / 20 + 1] = indexof;
     ■2  arr index 2         }
     ■3  arr index 3          indexof = indexof + 1;//集合數組下標加
                       }
                        i -= 1;//判斷向下移動一格後,需要I-1重新判斷
                  }
              }

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章