C#?拼圖游戲的實(shí)戰(zhàn)(附demo)
一、項(xiàng)目分析
項(xiàng)目分析簡要說明項(xiàng)目主要用戶需求、設(shè)計(jì)思路及模塊劃分。
1、用戶需求分析
在當(dāng)今社會(huì),人們的生活壓力越來越大,也沒有太多時(shí)間去玩大型的游戲,所以需要一些簡單的小游戲來緩解大家的工作和學(xué)習(xí)壓力。而連連看是一款簡單,容易理解,大多數(shù)人都會(huì)玩的小游戲,耗費(fèi)時(shí)間也不是太長,所以特意設(shè)計(jì)此款游戲來滿足用戶放松心情的需求。
2、系統(tǒng)設(shè)計(jì)思路
(1)進(jìn)行游戲用戶的注冊(cè)以及登錄;
(2)先導(dǎo)入圖片,并進(jìn)行切割
(3)隨機(jī)丟棄一張小切圖,并打亂順序
(3)窗體基本的功能選擇欄需實(shí)現(xiàn);
(4)可以判定游戲確定輸贏,當(dāng)拼成時(shí)提示成功;
(5)點(diǎn)擊圖片要能進(jìn)行移動(dòng);
(6)右側(cè)要有重排后的顯示框便于玩家游戲的完成。
3、系統(tǒng)模塊劃分
板塊一:注冊(cè)用戶并進(jìn)行登錄。
板塊二:導(dǎo)入圖片。
板塊三:設(shè)置關(guān)卡所能選的難度。
拼圖游戲應(yīng)該有關(guān)卡選擇33型,44型,5*5型等等。設(shè)置多個(gè)關(guān)卡可以讓用戶體驗(yàn)游戲更具挑戰(zhàn)性。
版塊四:拼圖是否完成的判斷。
通過判斷圖片對(duì)應(yīng)結(jié)構(gòu)體的數(shù)字是否完全順序排列來判斷游戲是否勝利。
板塊五:切割圖片。
板塊六:打亂拼圖。
板塊七:重排圖片,反映現(xiàn)在拼圖的狀況。
板塊八:切成圖后的小圖片移動(dòng)。
該過程是整個(gè)游戲的核心過程,是最重要的一個(gè)過程,用戶通過點(diǎn)擊圖片來移動(dòng)圖片,如果圖片臨近白塊,則圖片移動(dòng)到白塊位置;反之則不移動(dòng)。
二、項(xiàng)目設(shè)計(jì)
詳細(xì)介紹項(xiàng)目各個(gè)子模塊的設(shè)計(jì)方法及設(shè)計(jì)核心技術(shù)。
1、各個(gè)子模塊的設(shè)計(jì)方法
板塊一:注冊(cè)用戶并進(jìn)行登錄。
通過兩個(gè)窗體來完成注冊(cè)登錄的步驟。注冊(cè)主要用到文件讀取的方法:
StreamReader reader = new StreamReader("name.txt");
并通過寫入函數(shù)講用戶注冊(cè)名寫入:
StreamWriter writer = new StreamWriter("name.txt", true); writer.WriteLine(textBox1.Text); MessageBox.Show("用戶注冊(cè)成功,請(qǐng)進(jìn)行登錄!"); writer.Dispose();
登錄道理相同。
板塊二:導(dǎo)入圖片。
導(dǎo)入圖片用到
OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.ShowDialog();//打開文件夾選擇圖片 pictureBox1.Image = Image.FromFile(openFileDialog1.FileName).GetThumbnailImage(250, 250,new Image.GetThumbnailImageAbort(delegate { return false; }),IntPtr.Zero);//使所選圖片的尺寸符合所需大小
打開圖片文件之后并初始其尺寸大小,便于后期切圖以及用戶體驗(yàn)。
板塊三:設(shè)置關(guān)卡所能選的難度。
講難度設(shè)置加到combox中
comboBox1.Items.Add("1"); comboBox1.Items.Add("2"); comboBox1.Items.Add("3"); comboBox1.Items.Add("4");
然后用switch對(duì)應(yīng)各個(gè)難度
int Diffcult = int.Parse(comboBox1.Text); // 根據(jù)對(duì)應(yīng)難度初始化數(shù)組并給n賦值 switch (Diffcult) { case 1: node = new Node[3, 3]; n = 3; break; case 2: node = new Node[4, 4]; n = 4; break; case 3: node = new Node[5, 5]; n = 5; break; case 4: node = new Node[9, 9]; n = 9; break; }
版塊四:拼圖是否完成的判斷。
通過判斷函數(shù)來確定對(duì)照各個(gè)圖片的結(jié)構(gòu)體的數(shù)字記錄來判斷是否拼成
public bool JudgePicture() { int count = 0; for (int x = 0; x < n; x++) { for (int y = 0; y < n; y++) { if (this.node[x, y].num != count) return false; count++; } } return true; }
板塊五:切割圖片。
// 傳入圖片;單個(gè)圖片寬,高;拼圖界面的x,y長度 public Image Cutpicture(Image fImage,int width,int height,int spacex,int spacey) { // 創(chuàng)建新圖片的位圖 Bitmap bitmap = new Bitmap(width, height); // 創(chuàng)建繪制區(qū)域 Graphics graphics = Graphics.FromImage(bitmap); // 截取所需原圖對(duì)應(yīng)區(qū)域?qū)懭胱鲌D區(qū)域 graphics.DrawImage(fImage, 0, 0, new Rectangle(spacex, spacey, width, height), GraphicsUnit.Pixel); // 從作圖區(qū)域生成新圖 Image fgImage = Image.FromHbitmap(bitmap.GetHbitmap()); return fgImage; // 返回分割后的圖片 }
通過創(chuàng)建繪制區(qū)域,來截取所需的小圖塊,然后通過調(diào)用切圖函數(shù)將切后的圖片全部傳入結(jié)構(gòu)體圖片數(shù)組中。
板塊六:打亂拼圖。
// 定義隨機(jī)數(shù)用于打亂切后的圖 Random lx = new Random(); Random ly = new Random(); int x = lx.Next(0, n); int y = ly.Next(0, n);
再調(diào)用交換函數(shù)進(jìn)行來進(jìn)行兩圖片交換,進(jìn)行400000次達(dá)到打亂的目的
板塊七:重排圖片,反映現(xiàn)在拼圖的狀況。
每次圖片的點(diǎn)擊移動(dòng)事件都會(huì)進(jìn)行pictureBox2.Image = BackImage();
語句來存儲(chǔ)移動(dòng)后的圖片,當(dāng)點(diǎn)擊button3時(shí)就會(huì)調(diào)用這個(gè)函數(shù)
// 按鈕重排后再picturebox3中顯示 private void button3_Click(object sender, EventArgs e) { // 在pictureBox3中顯示被移動(dòng)后的拼圖 pictureBox3.Image = BackImage(); }
是的picturebox3的圖片顯示現(xiàn)在圖片的狀態(tài)
板塊八:切成圖后的小圖片移動(dòng)。
先讀取鼠標(biāo)點(diǎn)擊的位置,用于判斷點(diǎn)擊的圖片位置
int X = e.X / (width / n); // 鼠標(biāo)x位置整型只能取 1到n-1 int Y = e.Y / (width / n);
一共九種情況:圖片在中間,四角,四邊,分別判斷來確定是否移動(dòng):如下面是在中間點(diǎn)擊圖片的運(yùn)行代碼,其他情況類似:
if (node[X + 1, Y].num == index_m) { Swap(new Point(X + 1, Y), new Point(X, Y)); } else if (node[X - 1, Y].num == index_m) { Swap(new Point(X - 1, Y), new Point(X, Y)); } else if (node[X, Y + 1].num == index_m) { Swap(new Point(X, Y + 1), new Point(X, Y)); } else if (node[X, Y - 1].num == index_m) { Swap(new Point(X, Y - 1), new Point(X, Y)); }
2、設(shè)計(jì)核心技術(shù)
- 用文件流的方法設(shè)置登錄注冊(cè)界面,并保存用戶名信息
- 使用GDI+的方法對(duì)圖片進(jìn)行切割
- 打亂圖片的時(shí)候運(yùn)用大量隨機(jī)數(shù)
- 每個(gè)圖片有自己的對(duì)應(yīng)結(jié)構(gòu)體數(shù)字,為了判斷是否拼圖成功
- 當(dāng)所點(diǎn)擊圖片與空白圖片交換時(shí),分九種情況:四角,四邊,中間,按情況來寫入交換方法
- 當(dāng)拼成功時(shí),按照?qǐng)D片對(duì)應(yīng)的結(jié)構(gòu)體數(shù)字并調(diào)用判斷函數(shù)判斷
三、項(xiàng)目測(cè)試
簡要介紹采用的測(cè)試方法和測(cè)試要點(diǎn)。
點(diǎn)擊圖中按鈕后選擇一個(gè)圖片文件,將圖片顯示到窗口的左邊
然后將圖片切為指定的數(shù)目(如 3x3)的小圖片,從生成的小圖片中隨機(jī)選擇一張丟棄,將小圖片按照一定規(guī)律打亂,并將顯示到窗口的中間。
用戶可以用鼠標(biāo)點(diǎn)擊空白方塊周圍的圖片,被點(diǎn)擊的圖片移動(dòng)到原來空白的位置,被點(diǎn)擊圖片的位置變?yōu)榭瞻住?/p>
另設(shè)登錄,注冊(cè)界面
四、結(jié)論
簡要總結(jié)項(xiàng)目的主要工作、主要結(jié)果、心得感受主要發(fā)現(xiàn)以及下一步應(yīng)當(dāng)開展的主要工作等。
主要工作
:設(shè)計(jì)了一款拼圖游戲主要結(jié)果
:讓用戶有一種較好的游戲體驗(yàn),并制作完成三級(jí)項(xiàng)目心得感受
:大部分是老師上課講過的,還有一些運(yùn)用得不是很好,以及一些自己通過網(wǎng)絡(luò),書籍來獲取的知識(shí),當(dāng)然更多的知識(shí)是陌生的,需要自己去查找,去學(xué)習(xí),來達(dá)到學(xué)以致用的目的。下一步工作
:程序仍然存在缺陷,缺少背景音樂與華麗的界面,這些問題待解決 五、項(xiàng)目鏈接
這個(gè)文檔描述的版本是這個(gè):C#-PuinPhoto_jb51.rar
還有下面這個(gè)是我閑著沒事用一種極其簡單的思想做的:C#-pintu_jb51.rar
到此這篇關(guān)于C# 拼圖游戲的實(shí)戰(zhàn)(附demo)的文章就介紹到這了,更多相關(guān)C# 拼圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)實(shí)例詳解
這篇文章主要介紹了C#數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了順序表的定義、原理與具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11VSCode調(diào)試C#程序及附缺失.dll文件的解決辦法
這篇文章主要介紹了VSCode調(diào)試C#程序及附缺失.dll文件的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09c# WinForm 窗體之間傳值的幾種方式(小結(jié))
這篇文章主要介紹了WinForm 窗體之間傳值的幾種方式(小結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09c# WinForm制作圖片編輯工具(圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖)
這篇文章主要介紹了c# WinForm制作圖片編輯工具(可實(shí)現(xiàn)圖像拖動(dòng)、縮放、旋轉(zhuǎn)、摳圖),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03WPF如何自定義ProgressBar滾動(dòng)條樣式
這篇文章主要給大家介紹了關(guān)于WPF如何自定義ProgressBar滾動(dòng)條樣式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用WPF具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06