生活随笔
收集整理的這篇文章主要介紹了
拉登游戏开发--C#实现过程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
???? 關(guān)于這個(gè)游戲的創(chuàng)意和較為深入的研究來(lái)自于新浪博客大力水手。
???? 拉登游戲的游戲思路是:
???? 一個(gè)N*N的方格,每個(gè)格子的有兩種顏色狀態(tài)(黑色,黃色);初始時(shí)所有格子為同一種顏色(比如:黑色),通過(guò)點(diǎn)擊其中的一個(gè)格子,該格子以及其上下左右的格子的顏色將變?yōu)橄喾吹念伾?#xff08;之前黑色,之后黃色;反之亦然)。
??? 如下面六張圖可以看到整個(gè)游戲的玩法:
?
?? 游戲開(kāi)發(fā)過(guò)程考慮的幾個(gè)問(wèn)題:
? 1.生成的N*N格子的應(yīng)該自適應(yīng)Window
? 2.點(diǎn)擊格子四周的格子的邊界問(wèn)題處理
? 3.格子的顏色變化設(shè)置
? 4.判斷所有格子顏色是否發(fā)生改變
? 5.如何實(shí)現(xiàn)自動(dòng)完成功能
?? 游戲開(kāi)發(fā)的關(guān)鍵就在于這個(gè)自動(dòng)完成的算法實(shí)現(xiàn)。
?? 算法:
????? 格子共有N*N個(gè),共N行N列,自動(dòng)完成基于第一行的實(shí)現(xiàn),每一個(gè)格子的狀態(tài)只有兩種,設(shè)為0或1.
???1.第0行有N個(gè)格子,每個(gè)格子共有2中狀態(tài),全排列共有Pow(2, N)中情況。
?? 2.給每一種情況進(jìn)行編號(hào)[0,Pow(2,N))
??? 如下圖3*3的格子,第0行的格子的狀態(tài):
????? 分析:第0行的狀態(tài)共有Pow(2,N)中,接下來(lái)對(duì)第1行至第N-1一行進(jìn)行遍歷,每一行有N個(gè)格子進(jìn)行點(diǎn)擊處理,這樣時(shí)間復(fù)雜度上升為:Pow(2, N)*Pow(N, 2)。如果N為32的時(shí)候,就僅僅讓計(jì)算機(jī)走完這個(gè)數(shù),Java中Integer.MAX_VALUE嘗試了一下沒(méi)有等到這個(gè)數(shù)就給Stop了。
????? 具大力水手的說(shuō)法,目前通過(guò)分布式計(jì)算,已經(jīng)完成到了N=35。每一種貼下來(lái)的圖都是一幅美麗的圖片(這個(gè)得仔細(xì)想象加觀察)
???? 下面貼一張圖:
?? 下面是C#版的部分代碼程序較為簡(jiǎn)單,主要立足解決分布式問(wèn)題。
using?System; ?using?System.Collections.Generic; ?using?System.ComponentModel; ?using?System.Data; ?using?System.Drawing; ?using?System.Text; ?using?System.Windows.Forms; ?using?System.Threading; ??namespace?OkLight ?{ ?????public?partial?class?FormMain?:?Form ?????{ ?????????Button[]?btns?=?new?Button[25]; ??????????????????static?int[]?states; ?????????static?int[]?operaters; ??????????????????static?int?count?=?0; ???????????????????public?FormMain() ?????????{ ?????????????InitializeComponent(); ?????????} ???????????????????private?void?FormMainLoad(object?sender,?EventArgs?e) ?????????{?? ????????????? ?????????????int?min?=?panelMain.Height; ?????????????if?(min?>?panelMain.Width) ?????????????{ ?????????????????min?=?panelMain.Width; ?????????????} ?????????????int?maxNumber?=?min?/?40; ?????????????for?(int?i?=?1;?i?<?maxNumber?+?1;?i++) ?????????????{ ?????????????????comboBoxIndex.Items.Add(i); ?????????????} ?????????????comboBoxIndex.SelectedIndex?=?4; ?????????????InitalButton((int)comboBoxIndex.SelectedItem); ?????????} ???????????????????private?void?InitalButton(int?number) ?????????{ ?????????????panelMain.Controls.Clear(); ???????????????????????????int?x?=?(panelMain.Width?-?number*40)?/?2; ?????????????int?y?=?(panelMain.Height?-?number?*?40)?/?2; ?????????????btns?=?new?Button[number?*?number]; ???????????????????????????for?(int?i?=?0;?i?<?number*number;?i++) ?????????????{ ?????????????????btns[i]?=?new?Button(); ?????????????????btns[i].Width?=?40; ?????????????????btns[i].Height?=?40; ??????????????????????????????????btns[i].Left?=?x?+?(i?%?number)?*?40; ?????????????????btns[i].Top?=?y?+?(i?/?number)?*?40; ??????????????????????????????????btns[i].BackColor?=?Color.Black; ??????????????????????????????????btns[i].Click?+=?new?EventHandler(FormMainClick); ?????????????????panelMain.Controls.Add(btns[i]); ?????????????} ??????????} ???????????????????void?FormMainClick(object?sender,?EventArgs?e) ?????????{ ?????????????int?number?=?(int)comboBoxIndex.SelectedItem; ?????????????Button?btn?=?sender?as?Button; ??????????????????????????int?x?=?(panelMain.Width?-?40*number)?/?2; ?????????????int?y?=?(panelMain.Height?-?40*number)?/?2; ??????????????????????????int?i?=?(btn.Left?-?x)?/?40; ?????????????int?j?=?(btn.Top?-?y)?/?40; ??????????????????????????int?top?=?j?-?1; ?????????????int?buttoom?=?j?+?1; ?????????????int?left?=?i?-?1; ?????????????int?right?=?i?+?1; ?????????????count++; ?????????????ChangeButtonColor(btn); ?????????????if?(top?>=?0) ?????????????{ ?????????????????int?index?=?i?+?number?*?top; ?????????????????ChangeButtonColor(btns[index]); ?????????????} ?????????????if?(buttoom?<?number) ?????????????{ ?????????????????int?index?=?i?+?number?*?buttoom; ?????????????????ChangeButtonColor(btns[index]); ?????????????} ?????????????if(left>=0) ?????????????{ ?????????????????int?index?=?left?+?number?*?j; ?????????????????ChangeButtonColor(btns[index]); ?????????????} ?????????????if?(right?<?number) ?????????????{ ?????????????????int?index?=?right?+?number?*?j; ?????????????????ChangeButtonColor(btns[index]); ?????????????} ?????????????showLabel.Text?=?"您當(dāng)前已經(jīng)點(diǎn)擊次數(shù)為:?"?+?count; ?????????????if?(IsSucceed(number)) ?????????????{ ????????????????DialogResult?dr=MessageBox.Show("恭喜你,成功完成",?"消息"); ?????????????} ?????????} ???????????????????private?void?ChangeButtonColor(Button?btn) ?????????{ ?????????????if?(btn.BackColor?==?Color.Black) ?????????????{ ?????????????????btn.BackColor?=?Color.Yellow; ?????????????} ?????????????else?????????????{ ?????????????????btn.BackColor?=?Color.Black; ?????????????} ?????????????btn.Refresh(); ??????????} ???????????????????private?void?GetShow(int?number) ?????????{ ???????????????????????????????????????int?count?=?(int)Math.Pow(number,?2); ??????????????????????????????????????????????????????????????????????????????for?(int?i?=?0;?i?<?(int)Math.Pow(2,?number);?i++) ?????????????{ ?????????????????states?=?new?int[count]; ?????????????????operaters?=?new?int[count]; ?????????????????int?x?=?i;?????????????????int?j?=?0; ??????????????????????????????????while?(true) ?????????????????{ ?????????????????????if?(x?==?0) ?????????????????????{ ?????????????????????????break; ??????????????????????????????????????????????} ??????????????????????????????????????????operaters[j]?=?x?%?2; ?????????????????????x?=?x?/?2; ?????????????????????j++; ?????????????????} ???????????????????????????????????????????????????for?(int?k?=?0;?k?<?number;?k++) ?????????????????{ ??????????????????????????????????????????if?(operaters[k]?==?1) ?????????????????????{ ?????????????????????????ToClick(k,?number); ?????????????????????} ?????????????????} ???????????????????????????????????for?(int?k?=?1;?k?<?number;?k++) ?????????????????{ ??????????????????????????????????????????for?(int?m?=?0;?m?<?number;?m++) ?????????????????????{ ????????????????????????????????????????????????????????????????????????????????????????????????????if?(states[(k?-?1)?*?number?+?m]?==?0) ?????????????????????????{ ??????????????????????????????????????????????????????????operaters[k?*?number?+?m]?=?1; ?????????????????????????????ToClick(k?*?number?+?m,?number); ?????????????????????????} ??????????????????????} ?????????????????} ??????????????????????????????????int?statesCount?=?0; ?????????????????for?(int?k?=?0;?k?<?states.Length;?k++) ?????????????????{ ?????????????????????if?(states[k]?==?1) ?????????????????????{ ?????????????????????????statesCount++; ?????????????????????} ?????????????????} ??????????????????????????????????if?(statesCount?==?count) ?????????????????{ ?????????????????????break; ?????????????????} ??????????????} ??????????} ???????????????????private?bool?IsSucceed(int?number) ?????????{ ?????????????bool?result?=?false; ?????????????for?(int?i?=?0,?j?=?number?*?number;?i?<?j;?i++) ?????????????{ ?????????????????if?(btns[i].BackColor?==?Color.Black) ?????????????????{ ?????????????????????result?=?false; ?????????????????????break; ?????????????????} ?????????????????else?????????????????{ ?????????????????????result?=?true; ?????????????????} ?????????????} ?????????????return?result; ?????????} ???????????????????private?void?SelectedIndexChanged(object?sender,?EventArgs?e) ?????????{ ?????????????int?number?=?(int)comboBoxIndex.SelectedItem; ?????????????count?=?0; ?????????????showLabel.Text?=?"您當(dāng)前已經(jīng)點(diǎn)擊次數(shù)為:"; ?????????????InitalButton(number); ?????????} ???????????????????private?static?void?ToClick(int?tag,?int?number) ?????????{ ???????????????????????????????????????int?j?=?tag?/?number; ??????????????????????????int?i?=?tag?%?number; ?????????????int?left?=?i?-?1; ?????????????int?right?=?i?+?1; ?????????????int?top?=?j?-?1; ?????????????int?buttom?=?j?+?1; ?????????????ChangeButtonStates(tag); ?????????????if?(left?>=?0) ?????????????{ ?????????????????ChangeButtonStates(left?+?number?*?j); ?????????????} ?????????????if?(right?<?number) ?????????????{ ?????????????????ChangeButtonStates(right?+?number?*?j); ?????????????} ?????????????if?(top?>=?0) ?????????????{ ?????????????????ChangeButtonStates(i?+?number?*?top); ?????????????} ?????????????if?(buttom?<?number) ?????????????{ ?????????????????ChangeButtonStates(i?+?number?*?buttom); ?????????????} ?????????} ???????????????????private?static?void?ChangeButtonStates(int?index) ?????????{ ?????????????if?(states[index]?==?0) ?????????????{ ?????????????????states[index]?=?1; ?????????????} ?????????????else?????????????{ ?????????????????states[index]?=?0; ?????????????} ?????????} ???????????????????private?void?BtnShowClick(object?sender,?EventArgs?e) ?????????{ ?????????????int?number?=?(int)comboBoxIndex.SelectedItem; ?????????????GetShow(number); ?????????????for(int?i?=?0;?i?<?operaters.Length;i++) ?????????????{ ????????????????if(operaters[i]==1) ????????????????{ ????????????????????btns[i].PerformClick(); ????????????????????Thread.Sleep(1000); ????????????????} ?????????????} ?????????} ?????} ????? ?}? ????? 游戲算是成功的開(kāi)發(fā)完了,而且這個(gè)游戲是沒(méi)有終結(jié)點(diǎn)的。因?yàn)槿魏稳嗽诿恳徊蕉甲邔?duì)的情況下都沒(méi)法通過(guò)鼠標(biāo)點(diǎn)擊走到N=32的情況去,甚至更小。這算是一個(gè)探討分布式計(jì)算的一個(gè)非常好的實(shí)例。
總結(jié)
以上是生活随笔為你收集整理的拉登游戏开发--C#实现过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。