以下是我過去做俄羅斯方塊的全部思路,雖說每種語言實現的方式不一樣,但是製作的思路是大體一樣的
俄羅斯方塊的思路
界面的搭建:遊戲區域 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重新判斷
}
}