生活随笔
收集整理的這篇文章主要介紹了
拉登游戏开发--C#实现过程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???? 關于這個游戲的創意和較為深入的研究來自于新浪博客大力水手。
???? 拉登游戲的游戲思路是:
???? 一個N*N的方格,每個格子的有兩種顏色狀態(黑色,黃色);初始時所有格子為同一種顏色(比如:黑色),通過點擊其中的一個格子,該格子以及其上下左右的格子的顏色將變為相反的顏色(之前黑色,之后黃色;反之亦然)。
??? 如下面六張圖可以看到整個游戲的玩法:
?
?? 游戲開發過程考慮的幾個問題:
? 1.生成的N*N格子的應該自適應Window
? 2.點擊格子四周的格子的邊界問題處理
? 3.格子的顏色變化設置
? 4.判斷所有格子顏色是否發生改變
? 5.如何實現自動完成功能
?? 游戲開發的關鍵就在于這個自動完成的算法實現。
?? 算法:
????? 格子共有N*N個,共N行N列,自動完成基于第一行的實現,每一個格子的狀態只有兩種,設為0或1.
???1.第0行有N個格子,每個格子共有2中狀態,全排列共有Pow(2, N)中情況。
?? 2.給每一種情況進行編號[0,Pow(2,N))
??? 如下圖3*3的格子,第0行的格子的狀態:
????? 分析:第0行的狀態共有Pow(2,N)中,接下來對第1行至第N-1一行進行遍歷,每一行有N個格子進行點擊處理,這樣時間復雜度上升為:Pow(2, N)*Pow(N, 2)。如果N為32的時候,就僅僅讓計算機走完這個數,Java中Integer.MAX_VALUE嘗試了一下沒有等到這個數就給Stop了。
????? 具大力水手的說法,目前通過分布式計算,已經完成到了N=35。每一種貼下來的圖都是一幅美麗的圖片(這個得仔細想象加觀察)
???? 下面貼一張圖:
?? 下面是C#版的部分代碼程序較為簡單,主要立足解決分布式問題。
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?=?"您當前已經點擊次數為:?"?+?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?=?"您當前已經點擊次數為:"; ?????????????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); ????????????????} ?????????????} ?????????} ?????} ????? ?}? ????? 游戲算是成功的開發完了,而且這個游戲是沒有終結點的。因為任何人在每一步都走對的情況下都沒法通過鼠標點擊走到N=32的情況去,甚至更小。這算是一個探討分布式計算的一個非常好的實例。
總結
以上是生活随笔為你收集整理的拉登游戏开发--C#实现过程的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。