基於C 用WinForm實現的2048小遊戲

2021-10-11 21:17:52 字數 3078 閱讀 3450

2048遊戲規則比較簡單,玩家通過上、下、左、右四個方向來控制方塊的移動,每一次移動,所有的方塊都會朝這個方向進行移動,而此時則會在某個隨機空的地區產生乙個新的數字方塊,在移動過程中,若方塊上的數字與移動方向後乙個的方塊上的數字相同,則會碰撞成乙個新的方塊,數字為兩個方塊數字之和。若所有地方都被填滿方塊,且每個方塊與相鄰方塊之間的數字均不相同,則遊戲結束。

執行結果:

所需控制項:乙個button用於重置遊戲,兩個label來顯示分數,乙個panel容器來裝16個textbox用於顯示實時數字。

如出現上圖情況,將每個textbox的tabstop屬性改為false,也可以用label來代替textbox。

本程式使用w、a、s、d四個鍵來操作方塊的移動。記得將form1的keypreview屬性改為true。

首先,定義變數

public class variables

本程式是採用乙個長度為16的陣列來存放每個方塊(即每個textbox)的數字。

移動方法:

public void movingw()

}if (arr.count == 1)

if (arr.count == 2)

else

}if (arr.count == 3)

else

else}}

if (arr.count == 4)

else

}else

else

else}}}}}

此為向上運動的方法,即w。根據方陣每一列的非0的個數以及相互之間的相等情況來計算移動的結果,只有在有方塊進行相加時才有分數產生。其餘三個方向與其類似,就不贅述。

判斷是否遊戲結束

public bool gameover()

//判斷是否有相鄰相同的

//四個角

if (num[0] == num[1] || num[0] == num[4] || num[3] == num[2] || num[3] == num[7]

|| num[12] == num[8] || num[12] == num[13] || num[15] == num[14] || num[15] == num[11])

over1 = true;

//四條邊

int lines1 = ;

foreach (int i in lines1)

}//中間四塊

if (num[5] == num[6] || num[6] == num[10] || num[5] == num[9] || num[9] == num[10])

over1 = true;

return over1;

}

遊戲結束的規則就是方陣被填滿,且沒有兩個相鄰的數字。

首先判斷是否方陣被填滿,只有num中有乙個數字為0,則遊戲繼續。

再來判斷相鄰情況。由於方陣中每個位置的相鄰情況都不一樣,所以需要分開來討論。

首先看四個角的相鄰情況,每個角均與兩個方塊相鄰。然後是每條邊的中間兩個均與三個方塊相鄰。最後是中間四個都與四個方塊相鄰。只有這些相鄰情況中有乙個為真,即返回值為true,遊戲沒有結束。

程式載入時

private void form1_load(object sender, eventargs e)

程式載入時,初始化分數為0,並隨機在方陣中產生乙個數字「2」。計時器是用來將num陣列的值賦給textbox並實時重新整理顯示。此處可以根據textbox不同值來設定不同的背景色,以便於區分。

private void timer1_tick(object sender, eventargs e)}}

#endregion

label2.text = score.tostring();

}

把方陣移動前後進行比較,即num在moving方法呼叫前後進行比較,如果不同則在方陣移動完以後,隨機在此時方陣空的,即值為0的地方生成乙個2或者4,如果相同則不會生成新的數。

public int newnumber()

; //生成數的範圍,2多4少

int select;

select = arraylisttoint(arr); //list轉int陣列

i = getoneindex(num); //在num中隨機得到乙個索引即生成的位置

if (i != 99)

num[i] = getonenumber(select);

return num;

}public int getonenumber(int arr) //在陣列中隨機獲得乙個數

public int getoneindex(int a) //在陣列中隨機得到乙個為0的索引

}random r = new random();

int k;

if (arr.count == 0)

else

return (int)arr[k];

}public int arraylisttoint(arraylist arr)

return s;

}

//判斷運動前後是否相同

for(int i=0;i每次運動完成之後需要再進乙個新的計時器,其中跟上面那個計時器內容差不多,只需要在每次進該計時器時需要將文字框內容清零一下,再進行顯示。再加上乙個判斷遊戲是否結束就ok了。

//清空文字框內容

foreach (control ctrl in panel1.controls)}//

//跟timer1中的顯示和顏色字型設定一樣

////判斷遊戲是否結束

if (quiit== false)

用C 實現基於用C 實現基於TCP協議的網路通訊

tcp 協議是乙個基本的網路 協議,基本上所有的網路服務都是基於 tcp協議的,如http,ftp等等,所以要了解網路程式設計就必須了解基於 tcp協議的程式設計。然而 tcp協議是乙個龐雜的體系,要徹底的弄清楚它的實現不是一天兩天的功夫,所幸的是在.net framework環境下,我們不必要去追...

基於winform在ie中的實現

這兩天做個圖表的元件,用的是開源的nplot,效果卻是不錯,就是動態顯示座標時,速度有些慢。現在問題是想把其封裝在乙個winform中,實現我的ie圖表使用者互動顯示,走了一些彎路,剛開始準備直接用winform在ie顯示,後來經過多個環境測試,發現,單一的winform 不呼叫nplot 是可以實...

用WinForm,實現基本的功能操作

sqlconnection myconn 定義全域性變數 sqldataadapter da dataset ds myconn new sqlconnection myconn.connectionstring server localhost database stumagsys trusted...