C++課程設(shè)計報告 - 拼圖游戲
《C++課程設(shè)計報告 - 拼圖游戲》由會員分享,可在線閱讀,更多相關(guān)《C++課程設(shè)計報告 - 拼圖游戲(30頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 目錄 1、 需求分析……………………………………………………………………1 1.課程設(shè)計目的…………………………………………………………………………1 2.程序所實現(xiàn)的功能……………………………………………………………………1 2、 設(shè)計內(nèi)容…………
2、………………………………………………………1 1. 主模塊圖……………………………………………………………………………1 2.1. 主程序流程圖……………………………………………………………………2 2.2 用例圖……………………………………………………………………………2 2.3主程序調(diào)用關(guān)系圖…………………………………………………………………3 2.4函數(shù)主要調(diào)用關(guān)系圖………………………………………………………………3 三、設(shè)計方案論述………………………………………………………………3 四、調(diào)試分析……………………………………………………………………4
3、 1.實際完成的情況………………………………………………………………………4 2.程序的性能分析………………………………………………………………………4 3.上機過程中出現(xiàn)的問題及其解決方案………………………………………………4 4.程序中可以改進、擴充的功能及設(shè)計實現(xiàn)構(gòu)想……………………………………4 五、用戶手冊……………………………………………………………………4 六、設(shè)計總結(jié)……………………………………………………………………5 七、程序中主要的功能函數(shù)……………………………………………………6 八、主要參考文獻………………………………………………
4、………………6 九、附錄…………………………………………………………………………6 一、需求分析 1.課程設(shè)計目的 (1)運用C++語言設(shè)計拼圖游戲具有極強的實踐性,加強我們對C++課程基礎(chǔ)知識點的理解掌握和靈活運用理能力,培養(yǎng)實際分析問題能力,養(yǎng)成良好的編程習(xí)慣;了解C++面向?qū)ο蟮脑O(shè)計方法與技巧,有效地、深刻地理解課程內(nèi)容,體會理論、方法和設(shè)計原則;培養(yǎng)分析實際問題和解決問題的能力,具備使用面向?qū)ο蟪绦蛟O(shè)計開發(fā)工具設(shè)計實際系統(tǒng)的能力。 (2)進一步領(lǐng)會程序設(shè)計的特點和應(yīng)用,提高運用C++ 以及面向?qū)ο笾R解決實際問題的能力,初步掌握MFC編程的基本功能,掌握一種
5、可視化編程的方法,學(xué)習(xí)使用CStatic控制操作位圖,加強對C++面向?qū)ο蟪绦蛟O(shè)計的理解。 (3)掌握用C++ 編寫面向?qū)ο蟮膶嵱贸绦虻脑O(shè)計方法,對面向?qū)ο蠓椒ê退枷朐黾痈行缘恼J識,學(xué)會利用C++程序設(shè)計語言編寫出一些短小、可靠的Windows實用程序,切實提高面向?qū)ο蟮某绦蛟O(shè)計能力,為后續(xù)的相關(guān)課程的學(xué)習(xí)打下基礎(chǔ)。 (4)鍛煉實際的編程能力,提高調(diào)查資料、查閱技術(shù)文獻、資料以及編寫軟件設(shè)計文檔的能力,提高自學(xué)編程的能力。 2.程序所實現(xiàn)的功能 (1)本程序除了實現(xiàn)了拼圖所要求的基本功能外,還添加了背景音樂、計算步數(shù)和游戲所用的時間,當(dāng)游戲開始時背景音樂自動循環(huán)播放,步數(shù)隨
6、player操作自動增加,時間自動增加。 (2)進入游戲界面后,player可以在菜單欄中選擇游戲的難度、圖片風(fēng)格和拼圖圖像,亦可以自定義圖片,若選擇“簡單”,程序?qū)D片分成9塊,若選擇“困難”,程序?qū)D片分成16塊. (3)單擊“重置”或按F3菜單項會彈出一個對話框讓用戶確認是否重置游戲。 (4)單擊任意圖象,圖像將隨機排列,并開始計時和記步,用戶通過鼠標(biāo)單擊空格周圍的圖片來改變其位置,用戶沒單擊一次,步數(shù)增加一次。 (5)游戲中用戶可通過單擊“提示”菜單項或按F4來查看圖像的縮略圖及游戲相關(guān)信息。 (6)游戲狀態(tài)欄顯示用戶所用時間及步數(shù),成功時狀態(tài)欄給出提
7、示信息和所花費時間、步數(shù),用戶可選擇其他圖像或難度進行游戲。 二、設(shè)計內(nèi)容 1.主模塊圖 2.1主程序流程圖 2.2 用例圖 : 返回重新選擇背景圖片及難度級別 顯示原圖 不顯示 拼圖成功 是否選擇 原圖提示 開始游戲 選擇難度級別 選擇背景圖片 用戶 2.3主程序類調(diào)用關(guān)系圖 2.4 CPicture
8、Dlg類中成員函數(shù)主要調(diào)用關(guān)系圖 三、設(shè)計方案論述 本程序有一個CPictureDlg類,它公有繼承CDialog類的一些性質(zhì)。CDialog類中包括位圖的讀入和顯示,拼圖游戲中的Picture都是位圖資源。在游戲程序中,采用Static Text即靜態(tài)文本控件來顯示位圖。靜態(tài)文本控件的功能比較簡單,可顯示字符串,圖標(biāo),位圖。 先為對話框的“游戲”中的菜單項“容易”和“困難”添加消息響應(yīng)為另外還需為CPictureDlg類添加BOOL型變量Easy來標(biāo)識游戲的難度(分為9格或16格),同時添加BOOL型變量IsRnd用來標(biāo)識圖格是否進行了隨機位置的初始化,接下來為CPictureDl
9、g對話框添加16個Static控件(可以先設(shè)置好一個控件后,再通過復(fù)制得到其它的控件),并設(shè)置它們的屬性:ID設(shè)為IDC_IMAGE0到IDC_IMAGE15,Tabstop請勾上,Type屬性設(shè)為Bitmap,控件添加好了后,我們需要添加一個CStatic類型的數(shù)組m_Image[16],與這16個Static控件相關(guān)聯(lián),通過這個操作這個數(shù)組的下標(biāo)來控制這16個控件對圖像進行分格顯示。建立關(guān)聯(lián)的代碼應(yīng)寫在CPictureDlg類中系統(tǒng)生成的OnInitDialog()函數(shù)體內(nèi),這個函數(shù)是整個對話框程序運行的入口,相當(dāng)于一個main函數(shù),在這個函數(shù)體里,我們也需要為之前聲明的變量提供初始值,即
10、將變量初始化,變量沒有初始化的后果通常會造成內(nèi)存泄露,使程序在運行時出現(xiàn)莫名奇妙的錯誤。判斷游戲是否完成的函數(shù)IsWin(),只要所有的Static控件都回到了相應(yīng)的位置,就可以認為用戶己完成了拼圖,即游戲完成。 四、調(diào)試分析 1.實際完成的情況 (1)完成的功能: 本程序除了實現(xiàn)了拼圖所要求的基本功能外,還添加了背景音樂、計算步數(shù)和游戲所用的時間,當(dāng)游戲開始時背景音樂自動循環(huán)播放,步數(shù)隨player操作自動增加,時間自動增加。 (2)支持的數(shù)據(jù)類型: BOOL類型、控件數(shù)組類型。 2. 程序的性能分析 本程序能夠很好的運行,并且畫面質(zhì)量以及音質(zhì)方面都很高
11、 3. 上機過程中出現(xiàn)的問題及其解決方案 1)開始導(dǎo)入圖片時,圖片不能顯示,重新導(dǎo)入bmp格式的圖片后解決了。 2)開始建立了時間函數(shù)OnTimer,但是游戲運行后時間并不增加,在開始游戲?qū)?yīng)的函 數(shù)中增加SetTimer函數(shù),得到想要的結(jié)果。 3)初始設(shè)置的快捷鍵無效,查閱資料后加入Accelerator及相應(yīng)的函數(shù),使得快捷鍵有效。 4. 程序中可以改進、擴充的功能及設(shè)計實現(xiàn)構(gòu)想。 1)游戲的難度等級有點少,可以適當(dāng)增加幾個等級。 2)游戲未設(shè)置根據(jù)用戶花費的時間和步數(shù)判定用戶的成績并進行排名的功能,可以增設(shè),以便用戶了解自己玩的水平。 5、
12、用戶手冊 1.打開Picture文件夾,雙擊Ppicture.dsw標(biāo)志打開程序,然后運行。 2.開始程序會出現(xiàn)以下歡迎界面: 3.用戶需要選擇圖片、難度和圖片風(fēng)格,然后單擊圖片開始游戲,計時器開始計時,用戶通過鼠標(biāo)單擊空格周圍的圖片來改變其位置,用戶每單擊一次,步數(shù)增加一次。 4.游戲中用戶可通過單擊“提示”菜單項或按F4來查看圖像的縮略圖及游戲相關(guān)信息。 圖像縮略圖 游戲相
13、關(guān)信息 5. 用戶也可以單擊菜單欄中的重置或按快捷鍵F3重置圖片,會出現(xiàn)提示信息,用戶單擊確定重置圖片。提示框如下: 6.當(dāng)完成拼圖后系統(tǒng)會自動給出成功提示,并顯示用戶的成績,用戶單擊確定后可以選擇其他圖片或難度繼續(xù)游戲,也可以選擇單擊“退出”或按Esc退出游戲。 六、設(shè)計總結(jié) 通過本次課程設(shè)計,學(xué)習(xí)并初步掌握了基于對話框的MFC程序的設(shè)計,并學(xué)會了使用CStatic控件操作位圖。熟悉了在基于對話框的工程中加入菜單操作、用代碼操作菜單、Windows位圖文件的基本結(jié)構(gòu)、Visual C++中對位圖資源的操作、Vi
14、sual C++中對自定義位圖文件的操作、設(shè)置相關(guān)位圖的概念、用Static控件顯示位圖以及用Status Bar顯示提示信息和Visual C++隨機函數(shù)。 在設(shè)計過程中,曾遇到了兩個瓶頸導(dǎo)致程序一度無法完成,第一個是位圖文件的添加,包括將圖片格式轉(zhuǎn)換成BMP格式、添加相關(guān)Static控件,尤其是對控件圖標(biāo)不熟悉的情況下,一時不知道在哪兒添加控件,后來上網(wǎng)查閱并請教同學(xué)才得以完成控件的添加,使得程序可以繼續(xù)完成。不過在程序即將結(jié)束的時候,又遇到了一個新的問題,導(dǎo)致程序差點功虧一簣,問題就是圖片的縮略圖的添加,也就是游戲中的“提示”的應(yīng)用,當(dāng)然沒有“提示”操作,并不會影響整個程序的運行環(huán)境,
15、但是為了使游戲者能夠順利的完成游戲,此“提示”操作必不可少,在糾結(jié)了一段時間之后,在與同學(xué)的商討下,終于完成了縮略圖的添加,為程序的順利完成提供了幫助。 在本次設(shè)計的完成過程中,我對軟件的開發(fā)有了一個初步的認識,一個小型游戲軟件尚且需要不斷地查閱資料、請教別人,那么完成一個大型的軟件,必定需要更加復(fù)雜的過程。所以在做軟件開發(fā)時首先要保持一個平靜的心態(tài),靜下心來潛心去研究,同時還要熟悉的掌握、靈活的運用所學(xué)知識,方能完成設(shè)計。也對MFC程序開發(fā)也有了相應(yīng)的了解,每一個函數(shù)都有其特定的用途,掌握好這其中的一些關(guān)聯(lián),對一個程序的完成不無好處,這次課程設(shè)計為我以后編程的相關(guān)學(xué)習(xí)奠定了基礎(chǔ),使我在不同
16、方面得到了鍛煉。 七、程序中類的主要的成員函數(shù) BOOL OnInitDialog(); //初始化函數(shù) void OnRun(UINT nBitmapID,UINT nMenuID);//加載位圖資源 BOOL IsWin(); //判斷拼圖是否成功 void MoveImage(int num); //移動隨機小圖塊 void Rnd(); //隨機設(shè)置小圖塊的位置 UINT MapRand(UINT nMax);
17、 //隨機函數(shù) void SetImage(); //把圖像拷貝到Static控件 void SetPos() // 初始化Staic 控件的位置 CString IntToString(int number); //為游戲添加計時器 void OnTimer(UINT nIDEvent); //計時函數(shù) void SetPre(); //生成略縮圖 void CPictureDlg::OnForHelp() //顯示略縮圖 void ShowIt
18、em(); //顯示幫助對話框 八、主要參考文獻 1.鄭莉.C++語言程序設(shè)計(第3版).北京:清華大學(xué)出版社,2005.7 2.錢能.C++程序設(shè)計教程(第2版).北京:清華大學(xué)出版社,2005.8 3.黃維通.Visual C++面向?qū)ο笈c可視化程序設(shè)計(第2版).北京:清華大學(xué)出版社, 2003.12 4..劉路放.Visual C++與面向?qū)ο蟪绦蛟O(shè)計教程(第二版).北京:高等教育出版社,2007.8 5. 潘愛民. COM原理與應(yīng)用.北京:清華大學(xué)出版
19、社,1999.11 九、附錄 BOOL CPictureDlg::OnInitDialog()//整個對話框程序運行的入口 { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Se
20、t small icon srand((unsigned)time(NULL)); hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1)); // TODO: Add extra initialization here Bitmap.LoadBitmap(IDB_BITMAP6);//初始界面是圖像BITMAP6 pKDC = new CDC; pMainMenu = GetMenu(); //獲取菜單 Style3d = TRUE; Is
21、long = FALSE; Advan = FALSE; Easy = TRUE; TimeCon = "計時器"; IntStep = 0; Strstep = "步數(shù)"; SetWindowPos(NULL,0,0,600,700,SWP_NOMOVE); //控制窗口大小 SetTimer(10,1000,NULL);//10表示計時器的名字,1000表示時間間隔是1000毫秒,NULL表示使用onTimer函數(shù)。 m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM|CCS_NODIVIDER, C
22、Rect(0,0,0,0),this,102); int static strPartDim[5] = {100,230, 330,400, -1}; m_wndStatusBar.SetParts(4,strPartDim);//將狀態(tài)顯示欄分為四塊 m_wndStatusBar.SetText(TimeCon,1,0); m_wndStatusBar.SetText(Strstep,2,0); m_wndStatusBar.SetText("Player",3,0); m_Image[0].SubclassDlgItem(IDC_IMAGE0,this);
23、 m_Image[1].SubclassDlgItem(IDC_IMAGE1,this); m_Image[2].SubclassDlgItem(IDC_IMAGE2,this); m_Image[3].SubclassDlgItem(IDC_IMAGE3,this); m_Image[4].SubclassDlgItem(IDC_IMAGE4,this); m_Image[5].SubclassDlgItem(IDC_IMAGE5,this); m_Image[6].SubclassDlgItem(IDC_IMAGE6,this); m_Image[7].Subcla
24、ssDlgItem(IDC_IMAGE7,this); m_Image[8].SubclassDlgItem(IDC_IMAGE8,this); m_Image[9].SubclassDlgItem(IDC_IMAGE9,this); m_Image[10].SubclassDlgItem(IDC_IMAGE10,this); m_Image[11].SubclassDlgItem(IDC_IMAGE11,this); m_Image[12].SubclassDlgItem(IDC_IMAGE12,this); m_Image[13].SubclassDlgItem(I
25、DC_IMAGE13,this); m_Image[14].SubclassDlgItem(IDC_IMAGE14,this); m_Image[15].SubclassDlgItem(IDC_IMAGE15,this); m_Preview.SubclassDlgItem(IDC_PREVIEW,this); OnBegin(); PlaySound("rain.wav", NULL,SND_LOOP | SND_ASYNC); return TRUE; // return TRUE unless you set the focus to a control
26、 } void CPictureDlg::OnSysCommand(UINT nID, LPARAM lParam)//截獲控制命令的函數(shù) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal();//用來顯示一個模態(tài)對話框,其返回值對應(yīng)于用來關(guān)閉對話框的控件的ID } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to you
27、r dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CPictureDlg::OnPaint() //系統(tǒng)自動生成重繪窗口函數(shù) { if (IsIconic()) { CPaintDC dc(this); // device context for painting
28、SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() -
29、 cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); SetImage();//調(diào)用SetImage函數(shù)將圖片拷貝到Static控件上面 } if(pKDC) pKDC->DeleteDC(); } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCU
30、RSOR CPictureDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CPictureDlg::OnRun(UINT nBitmapID, UINT nMenuID) { pSubMenu = pMainMenu->GetSubMenu(1);//用GetSubMenu得到指向彈出菜單對象的指 pSubMenu->CheckMenuItem(ID_PICTURE1,MF_UNCHECKED);//用CheckMenuItem方法為nMenuID所指定的菜單項放置選中標(biāo)記 pSubMe
31、nu->CheckMenuItem(ID_PICTURE2,MF_UNCHECKED);//用CBitmap對象的LoadBitmap方法將nBitmapID所指定的位圖載入 pSubMenu->CheckMenuItem(ID_PICTURE3,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_PICTURE4,MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_ADVAN,MF_UNCHECKED); pSubMenu->CheckMenuItem(nMenuID, MF_CHECKED);
32、 count = 0; Islong = FALSE; CanCount = FALSE; IsRnd = FALSE; Advan = FALSE; Bitmap.DeleteObject();//先調(diào)用函數(shù)CGdiObject::DeleteObject刪除由LoadBitmap加載過的位圖 Bitmap.LoadBitmap(nBitmapID);//用LoadBitmap方法載入新的位圖對象 SetPos(); SetImage(); //IsWin(); } void CPictureDlg::On
33、Picture1() { // TODO: Add your command handler code here OnRun(IDB_BITMAP1, ID_PICTURE1);//調(diào)用OnRun()函數(shù)加載位圖 m_wndStatusBar.SetText("三只小熊",0,0); IntStep = 0;//設(shè)定初始步數(shù)為0 SetStep(IntStep);//調(diào)用記步函數(shù),計算步數(shù) PlaySound("yin.wav", NULL, SND_LOOP | SND_ASYNC); } void CPictureDlg::OnPicture2()
34、{ // TODO: Add your command handler code here OnRun(IDB_BITMAP2, ID_PICTURE2);//調(diào)用OnRun()函數(shù)加載位圖 m_wndStatusBar.SetText("阿貍",0,0); IntStep = 0;//設(shè)定初始步數(shù)為0 SetStep(IntStep);//調(diào)用記步函數(shù),計算步數(shù) PlaySound("yue.wav", NULL, SND_LOOP | SND_ASYNC); } void CPictureDlg::OnPicture3() { // TODO:
35、 Add your command handler code here OnRun(IDB_BITMAP3, ID_PICTURE3);//調(diào)用OnRun()函數(shù)加載位圖 m_wndStatusBar.SetText("小可愛",0,0); IntStep = 0;//設(shè)定初始步數(shù)為0 SetStep(IntStep);//調(diào)用記步函數(shù),計算步數(shù) PlaySound("l.wav", NULL, SND_LOOP | SND_ASYNC); } void CPictureDlg::OnPicture4() { // TODO: Add your
36、command handler code here OnRun(IDB_BITMAP4, ID_PICTURE4);//調(diào)用OnRun()函數(shù)加載位圖 m_wndStatusBar.SetText("小象",0,0); IntStep = 0;//設(shè)定初始步數(shù)為0 SetStep(IntStep);//調(diào)用記步函數(shù),計算步數(shù) PlaySound("ai.wav", NULL, SND_LOOP | SND_ASYNC); } void CPictureDlg::OnPicture5() { // TODO: Add your command handler co
37、de here OnRun(IDB_BITMAP5, ID_PICTURE5);//調(diào)用OnRun()函數(shù)加載位圖 m_wndStatusBar.SetText("比卡丘",0,0); IntStep = 0;//設(shè)定初始步數(shù)為0 SetStep(IntStep);//調(diào)用記步函數(shù),計算步數(shù) PlaySound("天籟童聲 - Tell Me Why.wav", NULL, SND_LOOP | SND_ASYNC); } void CPictureDlg::OnAdvan() //自定義圖片的函數(shù) {//用LoadImage方法來加載自定義文件中的位圖資源
38、,然后用GetObject方法得到其BITMAP對象 // TODO: Add your command handler code here CFileDialog dlg(TRUE, NULL, NULL, NULL, "位圖文件(*.bmp)|*.bmp"); INT Result = dlg.DoModal(); //PlaySound("l.wav", NULL, SND_LOOP | SND_ASYNC); if(Result == IDOK) { count = 0; CanCount = FALSE; IsRnd = FALSE; Advan
39、= TRUE; hBitmap = (HBITMAP)::LoadImage(NULL, dlg.GetFileName(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); BITMAP bm; ::GetObject(hBitmap, sizeof(BITMAP), &bm); if(bm.bmWidth >= bm.bmHeight)//判斷圖片是否是長大于高 { hBitmap = (HBITMAP)::LoadImage(NULL, dlg.GetFileName(), IMAGE_BI
40、TMAP, 650, 600, LR_LOADFROMFILE);//限定自定義圖片的大小 Width = 650; Height = 600; Islong = FALSE; } else if(bm.bmWidth < bm.bmHeight) { hBitmap = (HBITMAP)::LoadImage(NULL,dlg.GetFileName(), IMAGE_BITMAP, 600, 650, LR_LOADFROMFILE); Width =600; Height = 650; Islong = TRUE;
41、 } Bitmap.DeleteObject(); SetPos(); SetImage(); //IsWin(); m_wndStatusBar.SetText(dlg.GetFileTitle(),0,0); } else if(Result == IDCANCEL) return; } void CPictureDlg::OnEasy() //簡單游戲函數(shù) { // TODO: Add your command handler code here pSubMenu = pMainMenu->GetSubMenu(0);
42、 pSubMenu->CheckMenuItem(ID_HARD, MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_EASY, MF_CHECKED); Easy = TRUE; IsRnd = FALSE; CanCount=FALSE; SetPos(); m_wndStatusBar.SetText("加油!",0,0); IntStep = 0;//設(shè)定初始步數(shù)為0 SetStep(IntStep);//調(diào)用記步函數(shù) } void CPictureDlg::OnHard()//困難游戲函數(shù) { //
43、 TODO: Add your command handler code here pSubMenu = pMainMenu->GetSubMenu(0); pSubMenu->CheckMenuItem(ID_EASY, MF_UNCHECKED); pSubMenu->CheckMenuItem(ID_HARD, MF_CHECKED); Easy = FALSE; IsRnd = FALSE; CanCount=FALSE; SetPos(); m_wndStatusBar.SetText("有點難度!",0,0); IntStep = 0; SetS
44、tep(IntStep); } void CPictureDlg::SetPos()//對Static控件的位置進行初始化 { BITMAP bm; INT con, move; if(Advan == FALSE) { Bitmap.GetObject(sizeof(BITMAP),&bm); Width = bm.bmWidth; Height = bm.bmHeight; } if(Easy) {x = Width / 3; y = Height / 3; con = 2;} else if(!Easy) {x = Width /
45、 4; y = Height / 4; con = 3;} if(Islong) move = 70; else move = 0; for(int i = 0; i <= con; i++) { m_Image[i].SetWindowPos(NULL,x*i+move,0,0,0,SWP_NOSIZE); m_Image[i].SetWindowPos(NULL,0, 0, x, y, SWP_NOMOVE); } for(int j = 0; j <= con; j++) { m_Image[con+1+j].SetWindowPos(NUL
46、L,x*j+move,y,0,0,SWP_NOSIZE); m_Image[con+1+j].SetWindowPos(NULL,0, 0, x, y, SWP_NOMOVE); } for(int k = 0; k <= con; k++) { m_Image[(con+1)*2+k].SetWindowPos(NULL,x*k+move,2*y,0,0,SWP_NOSIZE); m_Image[(con+1)*2+k].SetWindowPos(NULL,0,0,x,y,SWP_NOMOVE); } if(!Easy) for(int l = 0;
47、 l <= 3; l++) { m_Image[l+12].SetWindowPos(NULL,x*l+move,3*y,0,0,SWP_NOSIZE); m_Image[l+12].SetWindowPos(NULL,0,0,x,y,SWP_NOMOVE); CClientDC dc(&m_Image[l+12]); } } void CPictureDlg::SetImage()//將圖像拷貝到Static控件上面 { INT con; HANDLE picture; CRect rect(0,0,x,y); if(Advan==TRUE
48、) picture = hBitmap; else if(Advan==FALSE) picture = Bitmap; if(Easy) con = 2; else if(!Easy) con = 3; for(int i = 0; i <= con; i++) { CDC *pDC = new CDC; CClientDC dc(&m_Image[i]); pDC->CreateCompatibleDC(&dc); pDC->SelectObject(picture); dc.BitBlt(0,0,x,y,pDC,x*i,0,SRCCOPY
49、); if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT); else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,)); delete pDC; UpdateWindow(); } for(int j = 0; j <= con; j++) { CClientDC dc(&m_Image[con+1+j]); CDC *pDC = new CDC; pDC->CreateCompatibleDC(&dc); pDC->Se
50、lectObject(picture); dc.BitBlt(0,0,x,y,pDC,x*j,y,SRCCOPY); if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT); else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,)); delete pDC; } for(int k = 0; k <= con; k++) { CClientDC dc(&m_Image[(con+1)*2+k]); CDC *pDC =
51、new CDC; pDC->CreateCompatibleDC(&dc); pDC->SelectObject(picture); dc.BitBlt(0,0,x,y,pDC,x*k,2*y,SRCCOPY); if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT); else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,)); delete pDC; } if(!Easy) for(int l = 0; l <= 3; l++) {
52、 CClientDC dc(&m_Image[l+12]); CDC *pDC = new CDC; pDC->CreateCompatibleDC(&dc); pDC->SelectObject(picture); dc.BitBlt(0,0,x,y,pDC,x*l,3*y,SRCCOPY); if(Style3d) dc.DrawEdge(rect,EDGE_RAISED,BF_RECT); else if(!Style3d) dc.Draw3dRect(rect,RGB(0,0,0,),RGB(0,0,0,)); delete pDC; } i
53、f(!IsRnd) { pSubMenu = pMainMenu->GetSubMenu(0); pSubMenu->EnableMenuItem(ID_FORHELP,MF_DISABLED|MF_GRAYED); } } void CPictureDlg::On3d()//圖片3D效果 { // TODO: Add your command handler code here pSubMenu = pMainMenu->GetSubMenu(2); pSubMenu->CheckMenuItem(ID_FLAT,MF_UNCHECKED);
54、pSubMenu->CheckMenuItem(ID_3D,MF_CHECKED); Style3d = TRUE; SetImage(); } void CPictureDlg::OnFlat() //圖片平面效果 { // TODO: Add your command handler code here pSubMenu = pMainMenu->GetSubMenu(2); pSubMenu->CheckMenuItem(ID_FLAT,MF_CHECKED); pSubMenu->CheckMenuItem(ID_3D,MF_UNCHECKED);
55、 Style3d = FALSE; SetImage(); } UINT CPictureDlg::MapRand(UINT nMax)//隨機函數(shù) { int nRand = rand(); float fMap = (float)nMax / RAND_MAX; float fRetVal = (float)nRand*fMap+0.5f; return (UINT)fRetVal; } void CPictureDlg::Rnd()//設(shè)定隨機圖格的位置 { int xnum,ynum,level; UINT rand;
56、if(Easy) level = 8; //如果是9格 else if(!Easy) level = 15;//如果是16格 WINDOWPLACEMENT wpnum, wp15; for(int a = 0; a <= 600; a++) { rand = MapRand(4); if(rand==1) for(int b = 0; b <= level - 1; b++) { m_Image[level].GetWindowPlacement(&wp15); m_Image[b].GetWindowPlaceme
57、nt(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.top == wp15.rcNormalPosition.top && wpnum.rcNormalPosition.left ==wp15.rcNormalPosition.left - x) { m_Image[b].SetWindowPos(NULL,xnum+x,ynum,0,0,SWP_NOSIZE);m_Image
58、[level].SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE);} } if(rand == 2) for(int c = 0; c <= level - 1; c++) { m_Image[level].GetWindowPlacement(&wp15); m_Image[c].GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpn
59、um.rcNormalPosition.top==wp15.rcNormalPosition.top && wpnum.rcNormalPosition.left ==wp15.rcNormalPosition.left + x) {m_Image[c].SetWindowPos(NULL,xnum-x,ynum,0,0,SWP_NOSIZE); m_Image[level].SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE);} } if(rand == 3) for(int d = 0; d <= level -
60、1; d++) { m_Image[level].GetWindowPlacement(&wp15); m_Image[d].GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.left==wp15.rcNormalPosition.left && wpnum.rcNormalPosition.top ==wp15.rcNormalPositi
61、on.top + y) {m_Image[d].SetWindowPos(NULL,xnum,ynum-y,0,0,SWP_NOSIZE); m_Image[level].SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE);} } if(rand == 4) for(int e = 0; e <= level - 1; e++) { m_Image[level].GetWindowPlacement(&wp15); m_Image[e].GetWindowPlacement(&wpnum); xnum
62、 = wpnum.rcNormalPosition.left; ynum = wpnum.rcNormalPosition.top; if(wpnum.rcNormalPosition.left== wp15.rcNormalPosition.left && wpnum.rcNormalPosition.top ==wp15.rcNormalPosition.top - y) { m_Image[e].SetWindowPos(NULL,xnum,ynum+y,0,0,SWP_NOSIZE);m_Image[level].SetWindowPos(NUL
63、L,xnum,ynum,0,0,SWP_NOSIZE);} } } if(Easy) m_Image[8].ShowWindow(SW_HIDE); else if(!Easy) { m_Image[8].ShowWindow(SW_SHOW); m_Image[15].ShowWindow(SW_HIDE); } pSubMenu = pMainMenu->GetSubMenu(0); pSubMenu->EnableMenuItem(ID_FORHELP,MF_ENABLED); IsRnd = TRUE; CanCount=TRUE;
64、 } void CPictureDlg::MoveImage(int num)//移動隨機圖格的函數(shù) { int xnum,ynum,level; if(Easy) level = 8; else if(!Easy) level = 15; WINDOWPLACEMENT wpnum, wp15; m_Image[level].GetWindowPlacement(&wp15); m_Image[num].GetWindowPlacement(&wpnum); xnum = wpnum.rcNormalPosition.left; ynum = wpn
65、um.rcNormalPosition.top; if(num!=level) { if(wpnum.rcNormalPosition.top==wp15.rcNormalPosition.top &&wpnum.rcNormalPosition.left ==wp15.rcNormalPosition.left - x) { m_Image[num].SetWindowPos(NULL,xnum + x,ynum,0,0,SWP_NOSIZE); m_Image[level].SetWindowPos(NULL,xnum,ynum,0,0,S
66、WP_NOSIZE); } if(wpnum.rcNormalPosition.top==wp15.rcNormalPosition.top &&wpnum.rcNormalPosition.left ==wp15.rcNormalPosition.left + x) { m_Image[num].SetWindowPos(NULL,xnum - x,ynum,0,0,SWP_NOSIZE); m_Image[level].SetWindowPos(NULL,xnum,ynum,0,0,SWP_NOSIZE); } if(wpnum.rcNormalPosition.left==wp15.rcNormalPosition.left &&wpnum.rcNormalPosition.top ==wp15.rcNormalPosition.top + y) { m_Image[num].SetWindowPos(NULL,xnum,ynum - y,0,0,SWP_NOSIZE); m
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版小學(xué)數(shù)學(xué)五年級下冊圖形的運動(三)-1課件
- 供應(yīng)鏈管理方法
- 2019最新青島版數(shù)學(xué)一年級上冊第三單元《走進花果山-10以內(nèi)的加減法》(信息窗6)課件
- 第四章勞動中的心理、生理狀態(tài)對安全的影響
- 201x九年級物理上冊-雙休作業(yè)八(新版)教科版課件
- 課件:項目一-電子商務(wù)物流系統(tǒng)規(guī)劃
- 【人教版】2012-2013學(xué)年九年級(全一冊)數(shù)學(xué)小復(fù)習(xí):第27章相似復(fù)習(xí)課件
- 消化腺(全英文)課件
- 小學(xué)語文資源五年級上冊課件《落花生》課件第一課時
- 納米材料的基本效應(yīng)課件
- 分析化學(xué)概論-課件
- 沉浸式光影解決方案課件
- 第六講加固Windows操作系統(tǒng)安全ppt課件
- 民主選舉投出理性一票ppt課件
- 高二數(shù)學(xué)選修正態(tài)分布推薦實用全套PPT