MFC课程设计之拼图游戏设计报告

合集下载

C++课程设计报告 - 拼图游戏

C++课程设计报告 - 拼图游戏

目录一、需求分析 (1)1.课程设计目的 (1)2.程序所实现的功能 (1)二、设计内容 (1)1. 主模块图 (1)2.1. 主程序流程图 (2)2.2 用例图 (2)2.3主程序调用关系图 (3)2.4函数主要调用关系图 (3)三、设计方案论述 (3)四、调试分析 (4)1.实际完成的情况 (4)2.程序的性能分析 (4)3.上机过程中出现的问题及其解决方案 (4)4.程序中可以改进、扩充的功能及设计实现构想 (4)五、用户手册 (4)六、设计总结 (5)七、程序中主要的功能函数 (6)八、主要参考文献 (6)九、附录 (6)一、需求分析1.课程设计目的(1)运用C++语言设计拼图游戏具有极强的实践性,加强我们对C++课程基础知识点的理解掌握和灵活运用理能力,培养实际分析问题能力,养成良好的编程习惯;了解C++面向对象的设计方法与技巧,有效地、深刻地理解课程内容,体会理论、方法和设计原则;培养分析实际问题和解决问题的能力,具备使用面向对象程序设计开发工具设计实际系统的能力。

(2)进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC编程的基本功能,掌握一种可视化编程的方法,学习使用CStatic控制操作位图,加强对C++面向对象程序设计的理解。

(3)掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识,学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。

(4)锻炼实际的编程能力,提高调查资料、查阅技术文献、资料以及编写软件设计文档的能力,提高自学编程的能力。

2.程序所实现的功能(1)本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随player操作自动增加,时间自动增加。

拼图游戏课程设计报告

拼图游戏课程设计报告

目录0引言 (1)1 工作计划 (2)1.1主要工作阶段划分 (2)1.2工作任务分工 (2)2需求分析 (3)2.1概述 (3)2.2用户分析 (3)2.3 约束条件 (3)2.4功能需求 (3)2.5用户界面需求 (4)3设计与实现 (6)3.1概述 (6)3.2详细设计 (6)3.2.1类的抽象及设计 (6)3.2.2表结构设计 (7)3.3 主要程序文件 (7)3.4开发环境以及部署环境要求 (8)3.5 主要源码 (8)4 测试 (14)4.1概述 (14)4.2 测试环境 (14)4.3测试计划。

(15)4.4测试项目及结果 (15)5、工作总结 (15)5.1工作成果 (15)5.2过程分析 (15)5.3经验教训及其分析 (16)0引言拼图是家喻户晓的益智类小游戏,选择该课题即可完成这门课程的课程设计还可增加学习的趣味性增加我对该课程学习兴趣。

选择这个题目一是为了将自己的所学知识加以运用,该程序要用到许多课内所学并且对其加以提高。

二是一直以来拼图这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。

我希望通过自己的所学知识把它剖析开来,真正的了解它的本质和精髓。

虽然我的编程能力不强,但是我有信心通过自己不断的学习和积极查资料,在这次学习中我将从实践和实际的项目中提高自己的编程能力。

因此我选择这个题目作为我的课程设计题目。

1 工作计划1.1主要工作阶段划分1.2工作任务分工2需求分析2.1概述本程序开发一款简单的拼图游戏,由于能力有限只能实现该游戏的基本内容:3*3,4*4拼图点击空白图片的上下做图片实现交换,另外拼图过程该游戏还为用户提供提示(图片名称)、计步、计时,帮助对话框显示原图的缩略图,即可选择游戏提供的图片还可用户自定义bmp图片,关于对话框显示该游戏的信息。

2.2用户分析1.软件中选定的图片用户不一定喜欢,应该让用户有选择图片的权利,选择用户细化的图片。

c语言拼图游戏课程设计

c语言拼图游戏课程设计

c语言拼图游戏课程设计一、课程目标知识目标:1. 学生能理解C语言的基本语法,如变量声明、数据类型、控制结构等;2. 学生能掌握C语言中数组的使用,理解二维数组的结构和操作方法;3. 学生能运用C语言编写简单的拼图游戏逻辑,理解游戏设计的基本原理。

技能目标:1. 学生能运用所学知识,独立设计并编写一个简单的拼图游戏程序;2. 学生能通过调试程序,找出并修正代码中的错误,提高问题解决能力;3. 学生能运用算法思维,优化拼图游戏的逻辑,提高程序运行效率。

情感态度价值观目标:1. 学生在课程中培养对编程的兴趣和热情,激发探究计算机科学的欲望;2. 学生通过团队协作,培养沟通与协作能力,增强团队意识;3. 学生在课程实践中,体验编程的乐趣,培养克服困难、不断尝试的良好品质。

本课程针对高年级学生,结合C语言学科特点,注重培养学生的编程实践能力和逻辑思维能力。

课程以拼图游戏为载体,使学生将所学知识应用于实际项目中,提高学生对C语言的掌握程度。

在教学过程中,关注学生个体差异,激发学生的学习兴趣,引导学生主动探究,培养其团队合作精神。

通过课程目标的设定,为教学设计和评估提供明确的方向,确保学生在课程中学有所获,提高其编程素养。

二、教学内容1. C语言基本语法复习:变量声明、数据类型、运算符、控制结构(条件语句、循环语句);2. 二维数组概念及应用:二维数组的声明、初始化、访问及操作方法;3. 游戏设计原理:拼图游戏的基本规则、界面设计、逻辑实现;4. C语言编程实践:编写拼图游戏程序,包括游戏界面绘制、用户交互、逻辑判断;5. 程序调试与优化:查找并修正代码错误,优化程序性能,提高运行效率;6. 团队协作与项目实践:分组进行项目实践,培养学生沟通协作能力。

教学内容依据课程目标,紧密结合教材,以C语言编程为核心,覆盖基本语法、数组、游戏设计等方面。

教学大纲明确,按照以下进度安排教学内容:1. 第1-2课时:复习C语言基本语法;2. 第3-4课时:学习二维数组概念及应用;3. 第5-6课时:介绍游戏设计原理,分析拼图游戏的基本规则;4. 第7-8课时:编写拼图游戏程序,实践C语言编程技能;5. 第9-10课时:进行程序调试与优化;6. 第11-12课时:团队协作完成项目实践,进行总结与展示。

拼图游戏课程设计c

拼图游戏课程设计c

拼图游戏课程设计c一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。

知识目标要求学生掌握拼图游戏的基本原理和技巧,了解不同类型的拼图游戏以及其适用场景。

技能目标要求学生能够独立完成拼图游戏,提高观察力、耐心和解决问题的能力。

情感态度价值观目标培养学生对拼图游戏的兴趣,增强自信心和团队合作意识。

通过对学生的特点和教学要求的分析,我们将课程目标分解为具体的学习成果。

学生将能够理解并运用拼图游戏的基本原理,独立完成各类拼图游戏,并在游戏中培养观察力、耐心和解决问题的能力。

同时,学生将能够积极参与团队合作,分享游戏经验和心得,培养自信心和团队合作意识。

二、教学内容根据课程目标,我们选择和了以下教学内容:1.拼图游戏的基本原理:介绍拼图游戏的概念、发展历程以及各类拼图游戏的特点和适用场景。

2.拼图游戏的技巧:讲解拼图游戏的技巧和方法,包括观察力、耐心和解决问题的能力。

3.不同类型的拼图游戏:介绍常见的拼图游戏类型,如平面拼图、立体拼图、数字拼图等,并分析其特点和适用场景。

4.团队合作拼图游戏:探讨团队合作拼图游戏的意义和价值,介绍团队合作拼图游戏的规则和方法。

教学大纲将根据以上教学内容进行详细安排,确保教学进度的合理性和科学性。

三、教学方法为了激发学生的学习兴趣和主动性,我们将采用多种教学方法:1.讲授法:通过讲解拼图游戏的基本原理和技巧,为学生提供系统的知识结构。

2.案例分析法:分析典型拼图游戏案例,引导学生理解不同类型拼图游戏的特点和适用场景。

3.实验法:学生进行团队合作拼图游戏,培养学生的观察力、耐心和解决问题的能力。

4.讨论法:鼓励学生分享拼图游戏的经验和心得,培养学生的团队合作意识和自信心。

通过多样化的教学方法,我们将激发学生的学习兴趣,培养学生的观察力、耐心和解决问题的能力,提高学生的团队合作意识和自信心。

四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备以下教学资源:1.教材:选用权威、实用的拼图游戏教材,为学生提供系统的知识结构和学习指导。

MFC课程设计——拼图游戏

MFC课程设计——拼图游戏

课程设计Visual C++指导老师:孔令德班级1020542学号03姓名李伯涵目录1 设计描述1.1项目简介 (1)1.2设计目的 (1)2 设计分析2.1设计特点 (1)2.2主要头文件、源文件 (1)3 项目代码3.1头文件 (2)3.2源文件 (3)4 游戏截图 (1)1设计描述1.1项目简介设计主要为MFC对位图的处理,包括窗口背景、位图透明处理、双缓冲处理动画等。

内容为一张分成若干块的图片,当鼠标点击其中一部分,被点击部分自动移动到空白部分,其中默认有两张图,也可以自己导入图片,游戏可选择难度,即图片被分成的块数。

界面右边有实例图,并统计移动次数。

1.2设计目的设计是对于mfc处理位图的巩固,及鼠标消息的应用,学习双缓冲处理技术、对话框的设计、在菜单栏工具栏添加功能按钮,获得系统资源,对mfc技术进行小规模综合应用。

2设计分析2.1设计特点程序默认窗口大小显示,动画自然,可以导入自己喜欢的图片,选择适当难度。

2.2主要头文件、源文件1头文件:pintu.h pintuDlg.h picture.h spell.h2 源文件:pintu.cpp pintuDlg.cpp picture.cpp spell.cpp3 项目代码3.1头文件#include "resource.h"// CMyApp:class CMyApp : public CWinApp{public:CMyApp();DECLARE_MESSAGE_MAP()}#include "picture.h"class CMyDlg : public CDialogpublic:CMyDlg(CWnd* pParent = NULL);protected:HICON m_hIcon;int step; // 移动的步数BOOL begin; // 游戏是否完成CPicture pic;int size; // 方块数BOOL border; // 边框void Show(CDC * dc);DECLARE_MESSAGE_MAP()};#include <atlbase.h>class CPicture {public:CPicture();~CPicture();BOOL Load(UINT nIDRes);BOOL Load(LPCTSTR pszPathName);BOOL Load(CFile& file);BOOL Load(CArchive& ar);BOOL Load(IStream* pstm);BOOL Render(CDC* pDC, CRect rc=CRect(0,0,0,0),LPCRECT prcMFBounds=NULL) const;CSize GetImageSize(CDC* pDC=NULL) const;operator IPicture*() {return m_spIPicture;}void GetHIMETRICSize(OLE_XSIZE_HIMETRIC& cx, OLE_YSIZE_HIMETRIC& cy) const { cx = cy = 0;const_cast<CPicture*>(this)->m_hr = m_spIPicture->get_Width(&cx);ASSERT(SUCCEEDED(m_hr));const_cast<CPicture*>(this)->m_hr = m_spIPicture->get_Height(&cy);ASSERT(SUCCEEDED(m_hr));}void Free() {if (m_spIPicture) {m_spIPicture.Release();}}protected:CComQIPtr<IPicture>m_spIPicture;HRESULT m_hr;class CSpell{protected:int * map;int width, height; // 长宽int blank; // 空白块的位置#define LENGTH width*height // 总长度public:CSpell(int w = 3, int h = 3, int bx = 0, int by = 0); // 构造函数,传入长宽和空白块位置~CSpell();int GetPic(int w, int h); // 获取个某个位置的图片int Move(int w, int h); // 移动某个位置的图片void Init(); // 初始化(生成随机位置)void ReCreate(int w, int h, int bx = 0, int by = 0); // 重新构建大小};3.2源文件#include "stdafx.h"#include "pintu.h"#include "pintuDlg.h"BOOL CMyApp::InitInstance(){AfxEnableControlContainer();#ifdef _AFXDLLEnable3dControls();#elseEnable3dControlsStatic();#endifCMyDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is}Return FALSE;}#include "stdafx.h"#include "pintu.h"#include "pintuDlg.h"#include "spell.h"CSpell spell(3, 3, 2, 2);void ShowTranBmp(CDC * dc, CBitmap * bmp, COLORREF bgcolor, int x, int y, int w, int h, int bx, int by, int bw, int bh){CDC mdc;CDC tdc; // 图像CDC ddc; // 遮罩CBitmap tbmp;CBitmap dbmp;CBitmap *ob;CBitmap *tob;CBitmap *dob;mdc.CreateCompatibleDC(dc);tdc.CreateCompatibleDC(dc);ddc.CreateCompatibleDC(dc);tbmp.CreateBitmap(bw, bh, 1, 32, NULL);dbmp.CreateBitmap(bw, bh, 1, 1, NULL);ob = mdc.SelectObject(bmp);tob = tdc.SelectObject(&tbmp);dob = ddc.SelectObject(&dbmp);tdc.BitBlt(-bx, -by, bw+bx, bh+by, &mdc, 0, 0, SRCCOPY);tdc.SetBkColor(bgcolor);ddc.BitBlt(0, 0, bw, bh, &tdc, 0, 0, SRCCOPY);dc->BitBlt(x, y, w, h, &tdc, 0, 0, SRCINVERT);dc->BitBlt(x, y, w, h, &ddc, 0, 0, SRCAND);dc->BitBlt(x, y, w, h, &tdc, 0, 0, SRCINVERT);mdc.SelectObject(ob);tdc.SelectObject(tob);ddc.SelectObject(dob);class CAboutDlg : public CDialog{public:CAboutDlg();DECLARE_MESSAGE_MAP()};void CAboutDlg::OnPaint(){CPaintDC dc(this); // device context for paintingCBitmap lygame;lygame.LoadBitmap(IDB_ABOUTIM);ShowTranBmp(&dc, &lygame, RGB(0,0,0), 8, 8, 307, 92);CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);begin = TRUE;step = 0;pic.Load(IDR_IMAGEB);size = 3;border = TRUE;}BOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);CMenu* pMenu = this->GetMenu(); pMenu->CheckMenuItem(ID_MENU_3, MF_CHECKED);pMenu->CheckMenuItem(ID_MENU_BORDER, MF_CHECKED);return TRUE; }void CMyDlg::OnPaint(){CPaintDC dc(this);if (IsIconic()){SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);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() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}Show(&dc);}HCURSOR CMyDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMyDlg::Show(CDC * dc){CDC tdc;CBitmap bmp, *obmp;bmp.LoadBitmap(IDB_BG);tdc.CreateCompatibleDC(dc);obmp = tdc.SelectObject(&bmp);CDC bmpdc, picdc;bmpdc.CreateCompatibleDC(dc);picdc.CreateCompatibleDC(dc);CBitmap bbmp, * obbmp;CBitmap pbmp, * opbmp;bbmp.CreateCompatibleBitmap(dc, 360, 360);pbmp.CreateCompatibleBitmap(dc, (360/size), (360/size));obbmp = bmpdc.SelectObject(&bbmp);opbmp = picdc.SelectObject(&pbmp);pic.Render(&bmpdc, CRect(0, 0, 360, 360));int i;if(border){ //画边框CPen pen, * open;pen.CreatePen(PS_SOLID, 1, RGB(96, 96, 96));open = bmpdc.SelectObject(&pen);for(i = 0; i < size; i++){bmpdc.MoveTo(0, (360/size)*(i+1)-1);bmpdc.LineTo(359, (360/size)*(i+1)-1);bmpdc.MoveTo((360/size)*(i+1)-1, 0);bmpdc.LineTo((360/size)*(i+1)-1, 359);}bmpdc.SelectObject(open);pen.DeleteObject();pen.CreatePen(PS_SOLID, 1, RGB(240, 240, 240));open = bmpdc.SelectObject(&pen);for(i = 0; i < size; i++){bmpdc.MoveTo(0, (360/size)*i);bmpdc.LineTo(359, (360/size)*i);bmpdc.MoveTo((360/size)*i, 0);bmpdc.LineTo((360/size)*i, 359);}bmpdc.SelectObject(open);}obmp = tdc.SelectObject(&bmp);for(i = 0; i < size; i++){for(int j = 0; j < size; j++){int n = spell.GetPic(i, j);if(n != size*size-1){picdc.BitBlt(-(n%size)*(360/size), -(n/size)*(360/size), 360, 360, &bmpdc, 0, 0, SRCCOPY);tdc.BitBlt((360/size)*i+2, (360/size)*j+2, (360/size), (360/size), &picdc, 0, 0, SRCCOPY);}dc->BitBlt(10, 10, 364, 364, &tdc, 0, 0, SRCCOPY);pic.Render(&bmpdc, CRect(0, 0, 150, 150));dc->BitBlt(393, 45, 150, 150, &bmpdc, 0, 0, SRCCOPY);dc->MoveTo(392, 44);dc->LineTo(392, 194);dc->LineTo(542, 194);dc->LineTo(542, 44);dc->LineTo(392, 44);bmpdc.SelectObject(obbmp);picdc.SelectObject(opbmp);tdc.SelectObject(obmp);}void CMyDlg::OnMenuAbout() {// 关于对话框CAboutDlg dlgAbout;dlgAbout.DoModal();}void CMyDlg::OnMenuExit() {// 退出OnOK();}void CMyDlg::OnMenuBegin() {// 重新开始游戏spell.Init();step = 0;SetDlgItemText(IDC_STEP, "0");begin = TRUE;Invalidate(FALSE);}void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point){if(begin){if(point.x > 12 && point.x < 372 && point.y > 12 && point.y < 372){ int w = (point.x - 12) / (360/size);int h = (point.y - 12) / (360/size);int r = spell.Move(w, h);Invalidate(FALSE);if(0 <= r){step ++;CString str;str.Format("%d", step);SetDlgItemText(IDC_STEP, str);}if(1 == r){MessageBox("完成!");begin = FALSE;}CDialog::OnLButtonDown(nFlags, point);}void CMyDlg::OnMenuHard() {// 选择数字pic.Load(IDR_IMAGEH);Invalidate(FALSE);}void CMyDlg::OnMenuBird() {// 选择风景pic.Load(IDR_IMAGEB);Invalidate(FALSE);}void CMyDlg::OnMenuCatone() {// 选择草莓pic.Load(IDR_IMAGEC);Invalidate(FALSE);}void CMyDlg::OnMenu3() {// 选择3*3的方块if(3 != size){CMenu* pMenu = this->GetMenu();pMenu->CheckMenuItem(ID_MENU_3, MF_CHECKED);pMenu->CheckMenuItem(ID_MENU_4, MF_UNCHECKED);pMenu->CheckMenuItem(ID_MENU_5, MF_UNCHECKED);spell.ReCreate(3, 3, 2, 2);size = 3;OnMenuBegin();void CMyDlg::OnMenu4() {// 选择4*4的方块if(4 != size){CMenu* pMenu = this->GetMenu();pMenu->CheckMenuItem(ID_MENU_4, MF_CHECKED);pMenu->CheckMenuItem(ID_MENU_3, MF_UNCHECKED);pMenu->CheckMenuItem(ID_MENU_5, MF_UNCHECKED);spell.ReCreate(4, 4, 3, 3);size = 4;OnMenuBegin();void CMyDlg::OnMenu5() {// 选择5*5的方块if(5 != size){CMenu* pMenu = this->GetMenu();pMenu->CheckMenuItem(ID_MENU_5, MF_CHECKED);pMenu->CheckMenuItem(ID_MENU_3, MF_UNCHECKED);pMenu->CheckMenuItem(ID_MENU_4, MF_UNCHECKED);spell.ReCreate(5, 5, 4, 4);size = 5;OnMenuBegin();void CMyDlg::OnMenuBorder() {// 是否有边框border = !border;CMenu* pMenu = this->GetMenu();pMenu->CheckMenuItem(ID_MENU_BORDER, border?MF_CHECKED:MF_UNCHECKED); Invalidate(FALSE);}void CMyDlg::OnMenuOpen() {// 打开文件CFileDialog file(true, NULL, NULL, OFN_OVERWRITEPROMPT, "图片文件|*.bmp;*.jpg;*.gif|*.jpg|*.jpg|*.bmp|*.bmp|*.gif|*.gif|", NULL);if(file.DoModal()==IDOK){pic.Load(file.GetPathName());Invalidate(FALSE);#include "StdAfx.h"#include "Picture.h"CPicture::~CPicture()BOOL CPicture::Load(UINT nIDRes)HINSTANCE hInst = AfxGetResourceHandle();HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(nIDRes),"IMAGE");if (!hRsrc)return FALSE;DWORD len = SizeofResource(hInst, hRsrc);BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);if (!lpRsrc)return FALSE;CMemFile file(lpRsrc, len);BOOL bRet = Load(file);FreeResource(hRsrc);GlobalFree(lpRsrc);return bRet;}BOOL CPicture::Load(LPCTSTR pszPathName){CFile file;if (!file.Open(pszPathName, CFile::modeRead|CFile::shareDenyWrite))return FALSE;BOOL bRet = Load(file);file.Close();return bRet;}BOOL CPicture::Load(CFile& file){CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete);return Load(ar);}BOOL CPicture::Load(CArchive& ar){CArchiveStream arcstream(&ar);return Load((IStream*)&arcstream);}BOOL CPicture::Load(IStream* pstm){Free();HRESULT hr = OleLoadPicture(pstm, 0, FALSE,IID_IPicture, (void**)&m_spIPicture);ASSERT(SUCCEEDED(hr) && m_spIPicture);return TRUE;}BOOL CPicture::Render(CDC* pDC, CRect rc, LPCRECT prcMFBounds) const{ASSERT(pDC);if (rc.IsRectNull()) {CSize sz = GetImageSize(pDC);rc.right = sz.cx;rc.bottom = sz.cy;}long hmWidth,hmHeight;GetHIMETRICSize(hmWidth, hmHeight);m_spIPicture->Render(*pDC, rc.left, rc.top, rc.Width(), rc.Height(),0, hmHeight, hmWidth, -hmHeight, prcMFBounds);return TRUE;}CSize CPicture::GetImageSize(CDC* pDC) const{if (!m_spIPicture)return CSize(0,0);LONG hmWidth, hmHeight;m_spIPicture->get_Width(&hmWidth);m_spIPicture->get_Height(&hmHeight);CSize sz(hmWidth,hmHeight);if (pDC==NULL) {CWindowDC dc(NULL);dc.HIMETRICtoDP(&sz);} else {pDC->HIMETRICtoDP(&sz);}return sz;}#include "spell.h"#include <stdlib.h>#include <time.h>CSpell::CSpell(int w, int h, int bx, int by){// 构造函数,传入长和宽width = w;height = h;bx = (bx>=w)?(w-1):(bx<0 ? 0 : bx);by = (by>=h)?(h-1):(by<0 ? 0 : by);blank = by * w + bx;map = new int[w*h];for(int i = 0; i < w*h; i++){map[i] = i;}CSpell::~CSpell(){delete [] map;}void CSpell::ReCreate(int w, int h, int bx, int by){ // 重新构建大小delete [] map;width = w;height = h;bx = (bx>=w)?(w-1):(bx<0 ? 0 : bx);by = (by>=h)?(h-1):(by<0 ? 0 : by);blank = by * w + bx;map = new int[w*h];for(int i = 0; i < w*h; i++){map[i] = i;} // 初始化Init();}int CSpell::GetPic(int w, int h){// 获取个某个位置的图片if(w < 0 || w >= width || h < 0 || h >= height){return -1;}return map[h*width + w];}int CSpell::Move(int w, int h){// 移动某个位置的图片if(w < 0 || w >= width || h < 0 || h >= height){return -10;}if(blank == map[h*width+w]){return -1;}if(blank == GetPic(w-1, h)){int t = map[h*width+w];map[h*width+w] = map[h*width+w-1];map[h*width+w-1] = t;}else if(blank == GetPic(w, h-1)){int t = map[h*width+w];map[h*width+w] = map[(h-1)*width+w];map[(h-1)*width+w] = t;}else if(blank == GetPic(w, h+1)){int t = map[h*width+w];map[h*width+w] = map[(h+1)*width+w];map[(h+1)*width+w] = t;}else{return -1;}for(int i = 0; i < LENGTH; i++){if(i != map[i]){return 0;}return 1;}4 游戏截图。

课程设计报告-拼图游戏

课程设计报告-拼图游戏

void draxSegment(int seg,int x,int y){ int dx=seg%4*sx, dy=seg/4*sy;
创建按钮并做事件处理算法: void initButtons(){ bStart.addActionListener(new ActionListtener(){ public void actionPerformed(ActionEvent ae){ initMap(); drawScreen(); running=true; bSee.setLabel("显示正确图像"); } }); bSee.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ //bSee 按钮标题为“继续游戏” if(bSee.getLabel().equals("继续游戏")){ drawScreen(); bSee.setLabel("显示正确图像"); } else{ //bSee gs.draxImage(imgPuzzle,0,0,screen); bSee.setLabel("继续游戏"); } } 绘制图画,将全部图像绘制在 screen 中算法:
Байду номын сангаас
buff=createImage(imgPuzzle.getWidth(this),imgPuzzle.getHeight(this)); gb=buff.getGraphics(); } 初始化 map 并使用 Rondom 混排图像块算法: void initMap(){ java.util.Random rnd=new java.util.Random(); int temp,x1,y1,x2,y2; for(int i=0;i<100;i++){ x1=rnd.nextInt(4); x2=rnd.nextInt(4); y1=rnd.nextInt(4); y2=rnd.nextInt(4); temp=map[x1][y1]; map[x1][y1]=map[x2][y2]; map[x2][y2]=temp; } outer:for(int j=0;j<4;j++) for(int i=0;i<4;i++)

拼图游戏设计_课程设计报告

拼图游戏设计_课程设计报告

2016-2017学年第一学期《Windows程序设计》课程设计报告题目:拼图游戏设计专业:班级:姓名:指导教师:成绩:学院二0一六年十一月十五日目录1.设计目的与要求 (3)1.1设计目的 (3)1.2设计要求 (3)2.设计分析 (3)2.1游戏内容说明 (3)2.2设计环境 (3)2.3设计流程图 (4)2.4设计功能结构图 (4)3.实现过程 (5)3.1游戏开始 (5)3.2游戏进行中 (6)3.3游戏复位 (7)3.4游戏完成 (9)4.设计心得 (12)5.参考文献 (13)6.附录 (14)1.设计目的与要求1.1设计目的通过拼图游戏设计,使我掌握Visual Studio中Windows窗体的建立及窗体中各个控件的使用,以及界面的设,从而让我进一步熟悉C#语言的编程,对编程有了进一步巩固,并提高分析和解决实际问题的能力。

同时让我熟悉软件的设计,调试的全过程。

1.2设计要求界面要求:要求界面简洁美观,简单易用。

设计要求:(1)用C#语言实现程序设计;(2)利用PictureBox控件来实现图片的移动;(3)超过200步提示重新来;(4)良好的人机互交,程序要有注释。

2.设计分析2.1游戏内容说明拼图游戏一款非常经典的小游戏,因为它比较简单有趣,无论老少都比较适合。

拼图的设计对每一个C#语言设计者进行语言提高和进阶都是一个很好的锻炼机会。

在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。

在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。

一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断的移动方块,直到方块按照图片的原来的顺序排好。

MFC课程设计之拼图游戏设计报告

MFC课程设计之拼图游戏设计报告

拼图游戏实验报告一、实验目的1、通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。

2、通过实践进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC变成的基本功能。

3、通过实践掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。

二、小组分工为了发挥组内同学的各自特长,我们小组分工如下:1、苏嘉彬——前期进行系统需求分析,系统结构设计,完成拼图界面的设计工作,后期完成课程设计报告2、嵇鹏飞(组长)——完成主要程序的编写工作(图形分割、存储、拼图)3、依代吐力·艾尼——搜集资料,完成计时器的设计工作,软件接口的设计及测试三、程序设计思路1、初步方案讨论拼图游戏是同学们喜欢的益智游戏之一,带着浓厚的兴趣,我们选择拼图游戏设计作为我们小组本次MFC课程设计的课题。

在讨论中,有的同学希望用单文档(SDI)的形式完成本次设计,有的同学则偏向于用对话框(Dialogue)的形式,最终我们小组讨论决定最终的设计采用对话框形式实现拼图功能。

2、方案变更、疑难解决(1)最初我们决定采用对话框形式来实现拼图的基本功能,但是在实施过程中出现了几次很严重的错误:Debug Assertion Failed,缺少ivewers.dll文件等等,在最后的尝试中我们发现如果采用单文档(SDI)形式写拼图的话,可以实现最基本的功能,因此我们最终决定使用单文档来完成该课程设计。

(2)一开始我们讨论决定采用的方式是将位图读入后再进行图片的分割,而在实际的操作过程中由于图片的分割有一定的困难,因此我们最后采用的方式是将位图进行分割完毕后再逐个用Brush在指定位置上进行绘画,实现图形的分割。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

拼图游戏
实验报告
一、实验目的
1、通过实践加强对程序设计语言课程知识点的理解和掌握,培养对课程知识综合运用能力、实际分析问题能力及编程能力,养成良好的编程习惯。

2、通过实践进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC变成的基本功能。

3、通过实践掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识;学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。

二、小组分工
为了发挥组内同学的各自特长,我们小组分工如下:
1、苏嘉彬——前期进行系统需求分析,系统结构设计,完成拼图界面的设计工作,
后期完成课程设计报告
2、嵇鹏飞(组长)——完成主要程序的编写工作(图形分割、存储、拼图)
3、依代吐力·艾尼——搜集资料,完成计时器的设计工作,软件接口的设计及测

三、程序设计思路
1、初步方案讨论
拼图游戏是同学们喜欢的益智游戏之一,带着浓厚的兴趣,我们选择拼图游戏设计
作为我们小组本次MFC课程设计的课题。

在讨论中,有的同学希望用单文档(SDI)
的形式完成本次设计,有的同学则偏向于用对话框(Dialogue)的形式,最终我们小组
讨论决定最终的设计采用对话框形式实现拼图功能。

2、方案变更、疑难解决
(1)最初我们决定采用对话框形式来实现拼图的基本功能,但是在实施过程中出
现了几次很严重的错误:Debug Assertion Failed,缺少ivewers.dll文件等等,在最后的
尝试中我们发现如果采用单文档(SDI)形式写拼图的话,可以实现最基本的功能,因
此我们最终决定使用单文档来完成该课程设计。

(2)一开始我们讨论决定采用的方式是将位图读入后再进行图片的分割,而在实
际的操作过程中由于图片的分割有一定的困难,因此我们最后采用的方式是将位图进行
分割完毕后再逐个用Brush在指定位置上进行绘画,实现图形的分割。

3、系统需求分析
(1)系统功能
简单的拼图游戏应该有拼图、计时、判断拼图成功、游戏者用时统计排名等功能,
拼图内部还应该有难度选择、相邻拼图块自动拼图等功能。

图1所示是拼图游戏的用例
图,表明拼图游戏的主要功能。

图1

2)对象识别
(3)类关系图及类成员
CMosaicApp :拼图游戏线程,应用程序
CMosaicDoc :拼图文档类
CAboutDlg :一个About对话框
CMainFrame :单文档主要框架、计时器
CMosaicView :控制游戏的开始、结束,难度的选择、底图的选取CPlacePicture :存放图形坐标、判断拼图成功与否
public
图2
四、软件接口设计
class CMosaicView : public CView{
protected:
{
void OnMouseMove(UINT nFlags, CPoint point); //拖动鼠标
void OnLButtonDown(UINT nFlags, CPoint point); //点击鼠标左键
void OnLButtonUp(UINT nFlags, CPoint point); //放开鼠标左键
void OnGameCustomnew(); //自定义
void OnBegingame(); //开始游戏
void OnHard(); //超难
void OnPicture1(); //底图1
void OnPicture2(); //底图2
void OnPicture3(); //底图3
void OnPicture4(); //底图4
void OnVeryeasy(); //简约
void OnEasy(); //简单
void OnLittlehard(); //很难
void OnBack();
void OnReset(); //重置
}
};
class CPlacePicture
{
public:
CPlacePicture(); //构造函数初始化virtual ~CPlacePicture(); //析构函数bool LoadPicture(char *strFileName); //载入位图bool InitPatches(DWORD nWdith,int srcx,int srcy,int dstx,int dsty); //初始化矩阵bool IsWin(); //判断拼图胜利
bool ClearAll(); //清除位图
bool DrawPatches(CDC *pDC); //画矩阵
void GetPatchAtPos(POINT *pt,long *pnSrcDest,long *pnPatchIndex); //获得坐标
void OnStartDrag(POINT *pt); //开始拖动
void OnMove(POINT *pt); //拖动
void OnEndDrag(POINT *pt); //结束拖动,判断是否拖动成功
五、流程图
图3
图4
七、程序调试
(1)拼图成功界面
(2)拼图失败界面
八、使用说明
1、进入拼图界面后,点击选择难度可以选不同难度,分为很简单、简单、苦难、很困难,分别可以将位图分为3×3,4×4,5×5,6×6四种
2、点击不同的图片或者从文件读入可以选择不同的图片作为底图
3、点击开始游戏才可以开始移动图片进行拼图,同时计时器开始计时,根据图片的坐标可以确定拼图是否正确
4、当完成拼图时,会出现“你赢了”,拼图游戏结束
5
9.1参考书籍:
1)C++程序设计实践教程第2版吴乃陵李海文高等教育出版社
2)深入浅出MFC第2版候俊杰华中科技大学出版社
3)Visual C++从入门到实践葛亮清华大学出版社
9.2声明
本设计团队对该拼图游戏拥有完全版权,未经本团队允许,不得进行商业交易和任何非法用途。

由于时间仓促,还有许多不当及错误之处,还请高人不吝指正。

联系方式:。

相关文档
最新文档