今天想說(shuō)的示例是排塊游戲留荔。
這個(gè)程序很有意思,程序運(yùn)行后澜倦,一開(kāi)始聚蝶,它就有 1,2,3,4,5,6,7,8 一共15個(gè)按鈕, 然后還有一個(gè)按鈕藻治,我們把它當(dāng)成空的那個(gè)空格碘勉。 一點(diǎn)開(kāi)始,那它就打亂順序了桩卵, 就有一點(diǎn)像拼圖游戲验靡,打亂程序,那我們的程序的這個(gè)游戲的作用就是要把這些按鈕要調(diào)整到它原始的位置雏节,比如說(shuō) 1 就應(yīng)該調(diào)到這個(gè)上面去胜嗓, 1 后的這個(gè)空格組成一個(gè)環(huán)路,它就可以按照這個(gè)環(huán)路呢 就可以這么繞過(guò)來(lái)了钩乍,同樣的辦法我們把 2,3,4,5 等等調(diào)整過(guò)去。
那這個(gè)游戲程序 它是有很多按鈕,然后點(diǎn)擊按鈕又發(fā)生動(dòng)作程剥,我們的初始界面轴踱,只有開(kāi)始按鈕是設(shè)計(jì)的,那么其他的按鈕呢排作,為了程序的方便牵啦,不用手工一個(gè)個(gè)地去拖了,因?yàn)橐粋€(gè)個(gè)-去拖的話妄痪, 第一哈雏,它不是很整齊,我們?cè)L問(wèn)起來(lái)也很不方便。 所以裳瘪,用程序來(lái)寫(xiě)比較好土浸。那這個(gè)程序又有很多按鈕,所以當(dāng)然就是用一個(gè)數(shù)組了彭羹,所以我們看看這個(gè)代碼它的核心 就是這個(gè)數(shù)組黄伊。 現(xiàn)在,最核心已經(jīng)有了派殷。我們下面來(lái)看看程序要做的事情呢还最,首先 Form Load,注意這個(gè) Form react-text那這個(gè) Load 要做什么事情呢毡惜?我們來(lái)想呢拓轻,那 就是要產(chǎn)生這些按鈕,因?yàn)檫@些按鈕不是我們手工拖上去的经伙。
現(xiàn)在就寫(xiě)一個(gè)打亂順序函數(shù)扶叉,叫Shuffle。其實(shí)就是隨機(jī)交換兩個(gè)按鈕帕膜,程序的邏輯枣氧,盡量不要寫(xiě)到這個(gè)界面里頭,盡量用 單獨(dú)的函數(shù)垮刹。這個(gè)函數(shù)达吞,產(chǎn)生所有的按鈕呢, 有多行危纫,有多列宗挥,所以從 從 0 到 N,r 表示行 row种蝶,C 表示 column契耿,多行多列的一個(gè)雙重循環(huán)。 這個(gè)循環(huán)要做的事情螃征,就是產(chǎn)生按鈕搪桂,核心的就是這個(gè)按鈕,btn = new Button ()盯滚。 當(dāng)然如果我們拖空鍵的時(shí)候呢踢械,它是幫我們寫(xiě)的,現(xiàn)在我們要自己來(lái)寫(xiě) new Button魄藕。然后當(dāng)然這些按鈕的屬性就要設(shè)置好了
點(diǎn)擊我們能夠點(diǎn)擊按鈕呢内列,必須寫(xiě) += 這個(gè)時(shí)間。那這個(gè)事件怎么寫(xiě)背率?其實(shí)很方便话瞧,你比如說(shuō)我把這里先刪掉嫩与。 你寫(xiě)個(gè) += 就注冊(cè)事件,然后就知道它是按 Tab 鍵進(jìn)行插入。
所以說(shuō)按 Tab 鍵進(jìn)行插入就行了交排,它就自動(dòng)生成了 剛才那個(gè)代碼划滋。當(dāng)然還需要我們把這個(gè)剛剛生成的按鈕放到數(shù)組里面以后好訪問(wèn)。很重要就是要把它加到 this.Controls.Add 加到空間里頭埃篓。這一步呢我們把所有的 16 個(gè)按鈕 全產(chǎn)生好了处坪,然后注冊(cè)一個(gè)事件,然后放到數(shù)組并加到界面架专。最后一個(gè)按鈕呢同窘,把它藏起來(lái)。上面已說(shuō)出了部脚,產(chǎn)生按鈕的方法塞椎。
下面一個(gè)我們看 Shuffle 怎么做,Shuffle 呢就是打亂順序睛低。 這個(gè)打亂順序比較簡(jiǎn)單,用 Random就行服傍。
然后我們隨機(jī)產(chǎn)生這個(gè)行號(hào)钱雷、 列號(hào) a,b,c,d。 然后兩個(gè)按鈕 button吹零,這個(gè) a,b 罩抗,左下標(biāo)的這個(gè)按鈕和 c,d 這個(gè)左下標(biāo)的按鈕呢交換一下。
這里呢灿椅,可以再寫(xiě) 一個(gè)函數(shù) Swap套蒂。 Swap,就是把按鈕 a 上的文本放到按鈕上 面去茫蛹,按鈕 b 上的 Visable 操刀,放在按鈕 b 的 Visable,因?yàn)?有的按鈕是婴洼,是不見(jiàn)的骨坑。 ?所以實(shí)際上我們 交換的,實(shí)際上是柬采,它并沒(méi)有交換位置欢唾,它是交換上面的文本和可見(jiàn)性。這是打亂順序呢就是隨機(jī)的多次交換粉捻。
下一步呢礁遣,我們看看寫(xiě)的那個(gè) btn Click。btn Click 這個(gè)事件肩刃,實(shí)際上祟霍,我們?cè)袤w會(huì)一下杏头,實(shí)際上就是要點(diǎn)呢,然后進(jìn)行跟那個(gè)空白相交換浅碾,那么這里有一個(gè)問(wèn)題就出來(lái)了大州。這個(gè) btn Click 我們所有的都注冊(cè)到這個(gè)函數(shù), 那它怎么知道是哪一個(gè)點(diǎn)擊的呢垂谢?這就是所謂的 sender 事件發(fā)出者厦画,事件源。 事件的話滥朱,也就是你點(diǎn)了哪個(gè)按鈕根暑,它就發(fā)生哪個(gè)事件。 現(xiàn)在呢我們知道它是一個(gè) Button徙邻,叫 as Button排嫌,就是把它 當(dāng)成一個(gè) Button,因?yàn)樗褪且粋€(gè) Button缰犁,只不過(guò)我們開(kāi)始 在這里面它為了通用淳地,它就是react-text object,但實(shí)際上是個(gè) Button帅容。所以這個(gè) Button 呢我們賦到這個(gè)變量里頭颇象,下面好用,另外還有一個(gè)問(wèn)題呢就是說(shuō) 點(diǎn)到這個(gè)按鈕呢并徘,它必須跟空白相交換遣钳,所以我們?cè)賹?xiě)一個(gè)函數(shù), 空白按鈕麦乞,就是藏起來(lái)的那個(gè)按鈕蕴茴,F(xiàn)indHiddenButton, 這兩個(gè)按鈕姐直, 如果這兩個(gè)按鈕相鄰倦淀, IsNeighbor,這個(gè)按鈕跟它相鄰声畏,然后我們?nèi)ソ粨Q晃听,也就是說(shuō) 表面上是這個(gè)按鈕點(diǎn)了,它就移動(dòng)位置砰识,實(shí)際上呢能扒, 是跟那個(gè)空白在交換。
我們按鈕點(diǎn)了辫狼,還有判斷完沒(méi)完初斑,if (ResultOk ()) if (ResultOk ())。t 好膨处,那這里就有幾個(gè)函數(shù)了见秤,查找隱藏的按鈕砂竖,然后判斷是否相鄰,然后呢鹃答, 判斷是否完成乎澄,那這幾個(gè)函數(shù),相對(duì)來(lái)說(shuō)比較好寫(xiě)测摔。
查找隱藏按鈕怎么辦呢置济? 把所有的按鈕循環(huán)地去找每一行每一列。 如果它是 Visable锋八,不可見(jiàn)的 Visable浙于,注意這個(gè)感嘆號(hào) 就表示非,就是如果非 Visable挟纱,不可見(jiàn)羞酗。當(dāng)然,否則的話就是 return null 了紊服,實(shí)際上是不可能的檀轨,因?yàn)樗隙ㄓ幸粋€(gè)不可見(jiàn),就是藏起來(lái)那一個(gè)欺嗤,所以這就是查找隱藏按鈕這個(gè)函數(shù)裤园。
我們?cè)倏纯磁袛嘞噜彙_@個(gè)兩個(gè)按鈕剂府,btnA, but B。 為了判斷兩個(gè)相鄰呢剃盾,我們有多種辦法腺占,這里呢 我們就用的是什么呢?用剛才用那個(gè) react-text Tag痒谴,順序號(hào)衰伯,0,1,2,3,4,5,6,7 那個(gè) Tag 號(hào)。 這個(gè) Tag 號(hào)呢我們把它賦好了积蔚,就是那個(gè)行列位置呢可以求出行號(hào)意鲸,就是除以 , 整除啊這個(gè)整除尽爆,就是第幾行就是整除 N怎顾,然后呢余數(shù)呢就是列 號(hào)。 好了漱贱,相鄰呢實(shí)際上又分兩種情況槐雾,一個(gè)是左右相鄰,左右相鄰呢也就是 行號(hào)相等幅狮,然后列號(hào)差募强,列號(hào)要么它等于它 -1株灸,要么它等于它 +1。這個(gè)叫左右相鄰擎值。然后第二種情況是上下相鄰慌烧,所謂上下相鄰呢就是列號(hào)相等,這種情況我們就 return true鸠儿,否則的話屹蚊, 那么它就return false。 還有一個(gè)函數(shù)叫 ResultIsOk捆交,就是判斷是不是 完成了淑翼。 所謂完成,那就是 buttons 上的按鈕應(yīng)該 等于它的順序號(hào)品追,這個(gè)順序號(hào)呢就是行號(hào)乘以 N玄括, 加上列號(hào),再加 1肉瓦,判斷它這兩個(gè)是不是相等遭京。 如果不等,那說(shuō)明 沒(méi)有完成泞莉,如果全都等了哪雕,就說(shuō)明已經(jīng)完成了,這個(gè)函數(shù)呢返回一個(gè) bool 型鲫趁。
現(xiàn)在總結(jié)一下斯嚎,拖上去一個(gè)按鈕,然后借助程序產(chǎn)生了16個(gè)這些按鈕挨厚, 這是 Form Load 事件堡僻,就是最開(kāi)始要完成的事件。 然后一點(diǎn)這個(gè)按鈕疫剃,就是打亂順序了钉疫, 然后我們點(diǎn)一個(gè)按鈕,它就跟這個(gè)相鄰的這個(gè)要交換巢价,實(shí)際上把Visable 這個(gè) false牲阁,把它的數(shù)字也交換了。那如果這兩個(gè)按鈕它不跟空白相鄰壤躲,它什么也不做城菊,所以要判斷是不是相鄰,跟空的是不是相鄰碉克,這就是程序役电。
大數(shù)學(xué)家陳景潤(rùn)在中學(xué)生數(shù)理化上寫(xiě)的一篇文章, 他把這個(gè)叫做十五子游戲棉胀,你還可以到網(wǎng)上去搜這個(gè)文章《十五子游戲》法瑟。