MFC课程设计之拼图游戏设计报告
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语言拼图游戏课程设计一、课程目标知识目标: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一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握拼图游戏的基本原理和技巧,了解不同类型的拼图游戏以及其适用场景。
技能目标要求学生能够独立完成拼图游戏,提高观察力、耐心和解决问题的能力。
情感态度价值观目标培养学生对拼图游戏的兴趣,增强自信心和团队合作意识。
通过对学生的特点和教学要求的分析,我们将课程目标分解为具体的学习成果。
学生将能够理解并运用拼图游戏的基本原理,独立完成各类拼图游戏,并在游戏中培养观察力、耐心和解决问题的能力。
同时,学生将能够积极参与团队合作,分享游戏经验和心得,培养自信心和团队合作意识。
二、教学内容根据课程目标,我们选择和了以下教学内容:1.拼图游戏的基本原理:介绍拼图游戏的概念、发展历程以及各类拼图游戏的特点和适用场景。
2.拼图游戏的技巧:讲解拼图游戏的技巧和方法,包括观察力、耐心和解决问题的能力。
3.不同类型的拼图游戏:介绍常见的拼图游戏类型,如平面拼图、立体拼图、数字拼图等,并分析其特点和适用场景。
4.团队合作拼图游戏:探讨团队合作拼图游戏的意义和价值,介绍团队合作拼图游戏的规则和方法。
教学大纲将根据以上教学内容进行详细安排,确保教学进度的合理性和科学性。
三、教学方法为了激发学生的学习兴趣和主动性,我们将采用多种教学方法:1.讲授法:通过讲解拼图游戏的基本原理和技巧,为学生提供系统的知识结构。
2.案例分析法:分析典型拼图游戏案例,引导学生理解不同类型拼图游戏的特点和适用场景。
3.实验法:学生进行团队合作拼图游戏,培养学生的观察力、耐心和解决问题的能力。
4.讨论法:鼓励学生分享拼图游戏的经验和心得,培养学生的团队合作意识和自信心。
通过多样化的教学方法,我们将激发学生的学习兴趣,培养学生的观察力、耐心和解决问题的能力,提高学生的团队合作意识和自信心。
四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备以下教学资源:1.教材:选用权威、实用的拼图游戏教材,为学生提供系统的知识结构和学习指导。
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课程设计之拼图游戏设计报告
拼图游戏实验报告一、实验目的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.用C#语言实现程序设计;
2.利用PictureBox控件来实现图片的移动;
3.超过200步提示重新来;
4.良好的人机互交,程序要有注释。
工
作
量
两周内完成编程,写成报告形式
工
作
计
划
1.确定编写程序题目
2.思考程序设计思路
课程设计材料
(2016-----2017学年度第一学期)
题目:拼图游戏设计
学生姓名:
学生学号:1608220203
专业:
班级:
指导教师:
学院制
二0一六年十月十五日
课程设计任务书
学号
1608220203
学生姓名
专业(班级)
题目
拼图游戏设计
设
计
技
术
参
数
1.操作系统:Windows7
2.语言环境:Visual Studio 2012,
年月日
答辩教师评语
成绩
评定
答辩教师签字:
年月日
二级学院工作小组意见
成绩
评定
二级学院领导签字(盖章):
年ቤተ መጻሕፍቲ ባይዱ日
3.查找相关资料
4.编写程序,调试运行代码
5.整理相关资料,完成报告
参
考
资
料
[1]王小科,吕双,梁冰.C#程序开发范例宝典.第二版[M].人民邮电出版社,2009
[2]郑阿奇,梁敬东.C#程序设计教程[M].电子工业出版社,2005
[3]张家祥,方凌江等.C#范例解析[M].北京大学出版社,2006
FunCodeC++拼图游戏报告
说明
一、计算机应用实践是本科教学重要的实践教学环节,是提高学生应用计算机
能力的重要措施。
所有参加计算机应用实践教学活动的学生都必须撰写实践报告
二、计算机应用实践报告的质量反映了计算机应用实践的教学质量,它是评定
计算机应用实践成绩的主要依据之一。
不交实践报告者不得参加实习成绩评定。
三、指导教师必须对学生的实践报告写出评语并在相应位置给出成绩并签字,
否则本实践报告无效。
四、实践报告要求条理清晰,内容详尽,数据准确,字数不少于5000字。
五、计算机应用实践活动结束后请将本报告上交学院存档保存。
四、运行效果
图一
图二
五、小组分工
一人独自完成。
拼图游戏设计报告.doc
1.设计题目:拼图游戏2.设计思路:(1)划分功能模块:运行程序后,点击进入游戏,加载游戏界面,点击开始图片随机分布(2)可以通过选择游戏的级别,选择四图、九图还是十六图的游戏3.过程和函数的调用关系:源程序:Private Sub C1_Click()’点击进入游戏,默认进入级别为一般的九图的游戏界面Load Form1Form1.ShowUnload Form2End SubPrivate Sub C2_Click()’点击退出游戏,退出游戏界面运行EndEnd SubPrivate Sub exit_Click()’点击左上角游戏下拉菜单中的退出,退出游戏EndEnd SubPrivate Sub help_Click()’点击帮助菜单,提示关于拼图的信息MsgBox "拼图是一种老少皆宜、容易上手的益智类小游戏。
指定一幅完整的图片,将其分割成小的图块,并且打乱顺序后重新排列,其中有一块没有任何东西的空档,使用鼠标单击与空档相邻的图块,使该图块与空档位置互换,利用空档位置移动各图块,最终恢复图片原样,完成拼图。
移动的步数越少则表明游戏者的水平越高。
游戏过程中用参考图来获得帮助查找每图块的相对正确的位置.", , "帮助"End SubPrivate Sub jiandan_Click()’选择简单级别,打开四图游戏Load Form4Form4.ShowUnload Form2End SubPrivate Sub kunnan_Click()’选择困难级别,打开十六图游戏Load Form6Form6.ShowUnload Form2End SubPrivate Sub newgame_Click()’单击新游戏,打开新游戏Load Form1Form1.ShowUnload Form2End SubPrivate Sub yiban_Click()’选择一般级别,打开九图游戏Load Form1Form1.ShowUnload Form2End SubOption Explicit’一系列变量的定义Dim shunxu(8) As Integer '记录图片排列顺序的数组Dim Position As Integer '被点击的图片位置Dim kongtuposition As Integer '空图片的位置Dim MoveTimes As Integer '记录移动次数Dim newposition As Integer '用于计算位置,即新位置Dim Started As Boolean '逻辑型Dim Win As BooleanDim Pic(8) As PictureDim i As IntegerPrivate Sub Command2_Click()’返回主界面Load Form2Form2.ShowUnload Form8End SubPrivate Sub Command3_Click()’显示原图Load Form9Form9.ShowEnd SubPrivate Sub jiandan_Click()’单击简单,打开四图游戏界面Load Form4Form4.ShowUnload Form8End SubPrivate Sub kunnan_Click()’单击困难,打开十六图游戏界面Load Form6Form6.ShowUnload Form8End SubPrivate Sub newgame_Click()’单击新游戏,与点击开始的效果一样,小图块重新分布Dim Temp(8) As IntegerDim ChosenNumber As IntegerFor i = 0 To 8Temp(i) = iNextRandomize (Timer)For i = 8 To 0 Step -1ChosenNumber = Int(i * Rnd) '开始图片随机分布shunxu(8 - i) = Temp(ChosenNumber)Temp(ChosenNumber) = Temp(i)NextFor i = 0 To 8Picture1(i).Picture = Pic(shunxu(i))If shunxu(i) = 8 Then kongtuposition = iNextStarted = TrueMoveTimes = 0End SubPrivate Sub Picture1_Click(Index As Integer)’主要是确定空图的位置,然后根据空图位置确定所点击的图片往哪个方向移动Position = Index '所点图片位置If Started = False Then Exit SubIf ((Position <> 0) And (Position <> 3) And (Position <> 6)) Thennewposition = Position - 1’向左移If (newposition = kongtuposition) Then continueEnd IfIf ((Position <> 2) And (Position <> 5) And (Position <> 8)) Thennewposition = Position + 1’向右移If (newposition = kongtuposition) Then continueEnd IfIf (Position >= 3) Thennewposition = Position – 3’向上移If (newposition = kongtuposition) Then continueEnd IfIf (Position <= 5) Thennewposition = Position + 3’向下移If (newposition = kongtuposition) Then continueWin = TrueFor i = 0 To 7If (shunxu(i) <> i) Then Win = False’判断拼图是否拼对If Win = False Then Exit ForNextIf (Win = True) ThenMsgBox "恭喜恭喜!你很聪明。
mfc拼图游戏课程设计
mfc拼图游戏课程设计一、课程目标知识目标:1. 让学生掌握MFC编程的基本框架和常用控件的使用,特别是拼图游戏中涉及到的图片处理和鼠标事件处理。
2. 使学生理解拼图游戏的逻辑规则,并能用MFC实现拼图的随机打散和正确性判断。
技能目标:3. 培养学生运用MFC进行简易游戏开发的能力,通过实践操作,掌握编程解决问题的方法和技巧。
4. 提高学生团队协作和沟通能力,通过分组合作完成拼图游戏的开发。
情感态度价值观目标:5. 培养学生对计算机编程的兴趣,激发创造力和创新意识,形成积极主动探索新知识的良好习惯。
6. 增强学生的自信心和成就感,通过完成拼图游戏项目,认识到努力和坚持的重要性,培养面对困难的勇气和毅力。
7. 引导学生树立正确的价值观,认识到编程在生活中的广泛应用和实际意义,激发为我国信息技术产业发展贡献力量的责任感。
二、教学内容本课程教学内容主要包括以下几部分:1. MFC编程基础:复习MFC的基本框架,包括窗口创建、消息映射等,涉及教材第三章内容。
2. 常用控件使用:学习使用按钮、图片框等控件,为拼图游戏界面设计打下基础,涉及教材第四章内容。
3. 图像处理:学习图像的加载、显示和剪切等操作,为拼图游戏图片处理提供技术支持,涉及教材第五章内容。
4. 鼠标事件处理:学习鼠标点击、移动等事件的处理方法,为拼图游戏的交互功能实现提供技术支持,涉及教材第六章内容。
5. 拼图游戏逻辑:分析拼图游戏的逻辑规则,学习随机打散和正确性判断的实现方法,涉及教材第七章内容。
6. 项目实践:分组进行拼图游戏的开发,将所学知识运用到实际项目中,巩固和提高编程能力。
7. 教学进度安排:共8课时,第1-2课时复习MFC基础和常用控件;第3-4课时学习图像处理和鼠标事件处理;第5-6课时分析拼图游戏逻辑;第7-8课时进行项目实践和总结。
教学内容的选择和组织确保了科学性和系统性,旨在帮助学生掌握MFC编程及相关知识,为开发拼图游戏打下坚实基础。
c拼图游戏课程设计
c 拼图游戏课程设计一、教学目标本课程旨在通过C拼图游戏的学习,让学生掌握C语言的基本语法和编程技巧,培养学生解决实际问题的能力。
具体目标如下:1.理解并掌握C语言的基本语法和数据类型。
2.学会使用C语言进行控制结构和函数的编写。
3.了解C语言的输入输出操作和文件操作。
4.能够运用C语言编写简单的程序,解决实际问题。
5.具备调试和运行C语言程序的能力。
6.能够阅读和理解C语言的代码和文档。
情感态度价值观目标:1.培养学生对计算机编程的兴趣和热情。
2.培养学生解决问题的耐心和毅力。
3.培养学生团队协作和分享成果的意识。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、控制结构、函数、输入输出操作和文件操作。
具体安排如下:1.第一章:C语言概述和基本语法。
2.第二章:数据类型和变量。
3.第三章:控制结构(条件语句、循环语句)。
4.第四章:函数和数组。
5.第五章:输入输出操作和文件操作。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:通过教师的讲解,让学生掌握C语言的基本概念和语法。
2.讨论法:引导学生进行问题讨论,培养学生的思考和解决问题的能力。
3.案例分析法:通过分析实际案例,让学生学会运用C语言解决实际问题。
4.实验法:让学生动手编写C语言程序,培养学生的编程能力和实践能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《C语言程序设计》。
2.参考书:《C语言编程思想》。
3.多媒体资料:教学PPT、视频教程。
4.实验设备:计算机、编程环境。
以上是本课程的教学设计,通过明确的教学目标和多样化的教学方法,以及丰富的教学资源,相信能够有效地帮助学生掌握C语言编程知识,提高解决实际问题的能力。
五、教学评估为了全面、客观、公正地评估学生在C拼图游戏课程中的学习成果,我们将采用多种评估方式:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现,评估其学习态度和积极性。
c语言课程设计--拼图游戏
c语言课程设计–拼图游戏一、教学目标本课程的教学目标是使学生掌握C语言的基本语法和编程技巧,通过制作一个简单的拼图游戏,培养学生的编程思维和实际操作能力。
具体目标如下:1.知识目标:学生能够熟练使用C语言进行简单的程序设计,理解基本的数据结构和算法。
2.技能目标:学生能够独立完成一个拼图游戏的程序设计,包括游戏逻辑的实现、用户界面的设计等。
3.情感态度价值观目标:通过课程的学习,学生能够培养团队合作的精神,增强对计算机科学的兴趣和热情。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据结构、算法和游戏设计。
具体安排如下:1.C语言的基本语法:包括变量、数据类型、运算符、控制结构等。
2.数据结构:包括数组、链表、栈和队列等。
3.算法:包括排序、查找等基本算法。
4.游戏设计:包括游戏逻辑的实现、用户界面的设计等。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
1.讲授法:用于讲解C语言的基本语法和数据结构。
2.讨论法:通过小组讨论,培养学生的团队合作精神和解决问题的能力。
3.案例分析法:通过分析已有的拼图游戏案例,帮助学生理解游戏设计的原理和方法。
4.实验法:学生通过实际操作,完成拼图游戏的编程和调试。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《C语言参考手册》3.多媒体资料:PPT课件、视频教程等。
4.实验设备:计算机、网络等。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面客观地评价学生的学习成果。
1.平时表现:包括课堂参与度、团队合作、问题解决能力等,占总评的30%。
2.作业:包括编程练习和小项目等,占总评的40%。
3.考试:包括期中考试和期末考试,占总评的30%。
评估方式将采用客观、公正的原则,通过教师评分和学生互评相结合的方式进行。
数字拼图游戏课程设计
数字拼图游戏课程设计一、课程目标知识目标:1. 学生能够理解数字拼图游戏的基本规则和概念;2. 学生能够掌握数字拼图游戏中数字的排列规律和组合方法;3. 学生能够运用加减乘除等基本运算解决数字拼图问题。
技能目标:1. 学生能够运用逻辑思维和空间想象力进行数字拼图的组合与解构;2. 学生能够通过观察、分析、推理等步骤,解决数字拼图中的问题;3. 学生能够与同伴合作,共同完成数字拼图任务,提高团队协作能力。
情感态度价值观目标:1. 学生对数字拼图游戏产生兴趣,培养学习数学的积极性;2. 学生在数字拼图游戏中,体会数学的趣味性和实用性,增强数学学习的自信心;3. 学生通过合作完成数字拼图任务,培养团队协作精神,学会互相尊重和倾听他人意见。
课程性质:本课程为数学学科的一节实践活动课,通过数字拼图游戏,培养学生对数学知识的理解和应用能力。
学生特点:三年级学生具备一定的数学基础,对游戏形式的活动有较高的兴趣和参与度,但独立解决问题的能力有待提高。
教学要求:教师应结合学生特点,设计难度适中的数字拼图游戏,引导学生主动参与,注重培养学生的逻辑思维能力和团队协作精神。
在教学过程中,关注学生的个体差异,给予适当的指导和鼓励,确保课程目标的实现。
通过本课程的学习,使学生能够将所学知识应用于实际情境,提高数学素养。
二、教学内容本课程以《数学》三年级教材中“有趣的数字组合”章节为基础,结合数字拼图游戏进行教学设计。
教学内容主要包括:1. 数字拼图游戏规则介绍:介绍数字拼图游戏的基本规则,使学生了解游戏的目标和挑战。
2. 数字组合与运算:回顾加减乘除基本运算,引导学生运用这些运算解决数字拼图问题。
3. 数字拼图技巧与方法:教授观察、分析、推理等解题技巧,帮助学生掌握数字拼图的组合与解构方法。
4. 实践活动:设计不同难度级别的数字拼图任务,让学生在实践活动中运用所学知识解决问题。
教学安排和进度:第一课时:导入数字拼图游戏,讲解游戏规则,进行简单的数字拼图实践。
c拼图游戏课程设计
c 拼图游戏课程设计一、课程目标知识目标:1. 学生能理解并掌握C拼图游戏的基本原理和算法逻辑;2. 学生能够运用所学知识,设计并实现一个简单的C拼图游戏;3. 学生了解程序设计中的顺序、循环和条件语句,并能将其应用于C拼图游戏中。
技能目标:1. 学生能够运用C语言编写程序,实现拼图游戏的基本功能;2. 学生通过分析问题,培养解决问题的能力,提高逻辑思维能力;3. 学生在团队协作中,学会沟通与表达,提高团队协作能力。
情感态度价值观目标:1. 学生在编程实践中,培养对计算机科学的兴趣和热情;2. 学生在克服困难、解决问题的过程中,增强自信心和自主学习能力;3. 学生通过C拼图游戏的设计与实现,体验创新的乐趣,培养创新精神。
课程性质分析:本课程为计算机编程入门课程,通过设计C拼图游戏,使学生在实际操作中掌握编程知识和技能,培养编程兴趣。
学生特点分析:学生处于初级阶段,对编程有一定的好奇心,但缺乏实际操作经验。
因此,课程设计需注重实践操作,激发学生的学习兴趣。
教学要求分析:教师需关注学生的个体差异,提供个性化的指导与帮助。
课程要求学生在掌握基本知识的基础上,提高实际操作能力和团队协作能力。
通过分解课程目标,确保学生能够实现具体的学习成果。
二、教学内容1. C语言基础:变量定义、数据类型、运算符、表达式、输入输出函数等;教材章节:第一章至第三章。
2. 控制结构:顺序结构、选择结构、循环结构;教材章节:第四章至第六章。
3. 数组与字符串:一维数组、二维数组、字符串操作;教材章节:第七章。
4. 函数:函数定义、函数调用、传参方式;教材章节:第八章。
5. 拼图游戏原理:游戏规则、算法逻辑;教材章节: 第九章实例分析。
6. 编程实践:设计并实现C拼图游戏;教材章节:实践环节。
教学安排与进度:1. 第一周:C语言基础学习,完成相关练习;2. 第二周:学习控制结构,完成相关练习;3. 第三周:数组与字符串知识学习,完成相关练习;4. 第四周:学习函数相关知识,完成相关练习;5. 第五周:讲解拼图游戏原理,分析案例;6. 第六周至第七周:分组进行编程实践,设计并实现C拼图游戏;7. 第八周:展示成果,总结评价。
拼图游戏课程设计
武汉工程大学计算机科学与工程学院项目报告设计名称:《Windows程序设计》综合项目设计题目:MFC开发拼图游戏实验学生学号:1005110201专业班级:二〇一〇级信息技术02班学生姓名:蔡杰猛学生成绩:指导教师(职称):课题工作时间:2012年4月成绩评定表答辩记录表目录摘要 (I)ABSTRACT (II)第一章课题背景(或绪论、概述) (1)1.1课题背景 (1)1.2课题目的及意义 (1)1.3应解决的主要问题及应达到的技术要求 (1)1.4本设计的基本理论依据和主要工作内容 (1)第二章设计简介及设计方案论述.............................................................................................................................. - 2 -2.1设计简介 (2)2.2设计方案论述 (2)第三章详细设计 ............................................................................................................................................................. - 4 -3.1创建初始界面 (4)3.2位图的读入和显示 (6)3.2.1 Windows位图的基本结构........................................................................................................................... - 6 -3.2.2 位图资源的读入......................................................................................................................................... - 7 -3.2.3 自定义位图文件的读入.............................................................................................................................. - 9 -3.3用S TATIC控件显示位图 (12)3.3.1 设置Static 控件的初始位置................................................................................................................ - 12 -3.3.2 图格的显示.................................................................................................................................................. - 16 -3.4图格的移动 (20)3.5游戏的启动代码 (25)3.6游戏完成条件的判断 (27)3.7游戏的进一步完善 (29)3.7.1 添加帮助画面.............................................................................................................................................. - 29 -3.7.2 用Status Bar显示提示信息................................................................................................................. - 32 -3.7.3 游戏计时器的加入..................................................................................................................................... - 36 -第四章设计结果及分析.............................................................................................................................................. - 38 -4.1初始化选择拼图中的手帕图片(简单) (38)4.2选择拼图中的手帕图片(困难) (39)4.3开始游戏的图片 (40)4.4选择图片风格(平面) (41)4.5选择图片风格(3D) (42)4.6自定义一张图片进行游戏 (42)总结 ............................................................................................................................................................................... - 43 -致谢 ............................................................................................................................................................................... - 44 -参考文献............................................................................................................................................................................. - 45 -附录.................................................................................................................................................................................. - 46 -摘要摘要:“拼图”游戏的核心规则是将一张整图分成N小块,随机打乱,让用户拼回原图,根据用户所花费的时间和步数的多少来评价其玩游戏的水平。
C语言拼图游戏实验报告
课程设计实验报告班级:光电104—2 姓名:刘云龙学号:201058501220一、实验题目:使用C语言编写一个小游戏(拼图游戏)二、实验目的:C语言是每一个通信学生的必修课之一,此次课程设计要求我们使用C语言编写一个小游戏,在完成课程设计的过程中,加强了我们对C语言的综合应用。
虽然在平时的课堂上积累了很多的理论知识,但在实际应用时还是有很多不明白的地方。
为了更好地完成实验要求,通过翻课本,请教同学,在网上查找资料等途径解决了试验中遇到的疑难。
在完成实验的过程中,暴露了自己在C语言学习上的很多不足和缺陷,同时也解决了很多平时不明白的地方。
三、实验内容本次试验选定的实验项目是使用C语言编写一个拼图游戏以下是拼图游戏的源代码:// 九宫格拼图Dlg.cpp : implementation file//#include "stdafx.h"#include "九宫格拼图.h"#include "九宫格拼图Dlg.h"#include "spell.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifCSpell 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);}void ShowTranBmp(CDC * dc, CBitmap * bmp, COLORREF bgcolor, int x, int y, int w, int h){CDC tdc; // 图像CDC ddc; // 遮罩CBitmap dbmp;CBitmap *tob;CBitmap *dob;tdc.CreateCompatibleDC(dc);ddc.CreateCompatibleDC(dc);dbmp.CreateBitmap(w, h, 1, 1, NULL);tob = tdc.SelectObject(bmp);dob = ddc.SelectObject(&dbmp);tdc.SetBkColor(bgcolor);ddc.BitBlt(0, 0, w, h, &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);tdc.SelectObject(tob);ddc.SelectObject(dob);}/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)virtual BOOL OnInitDialog();afx_msg void OnPaint();//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)ON_WM_PAINT()//}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CAboutDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereSetDlgItemText(IDC_QQ, "252351107");SetDlgItemText(IDC_EMAIL, "_tg15@");return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void CAboutDlg::OnPaint(){CPaintDC dc(this); // device context for paintingCBitmap tg15;tg15.LoadBitmap(IDB_TG15);ShowTranBmp(&dc, &tg15, RGB(255,255,255), 8, 8, 93, 96);// Do not call CDialog::OnPaint() for painting messages}/////////////////////////////////////////////////////////////////////////////// CMyDlg dialogCMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);begin = TRUE;step = 0;pic.Load(IDR_PIC_VIEW);size = 3;border = TRUE;// m_pp5.SetText(_T(""));}void CMyDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CMyDlg, CDialog)//{{AFX_MSG_MAP(CMyDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_COMMAND(ID_MENU_EXIT, OnMenuExit)ON_COMMAND(ID_MENU_ABOUT, OnMenuAbout)ON_WM_LBUTTONDOWN()ON_COMMAND(ID_MENU_BEGIN, OnMenuBegin)ON_COMMAND(ID_MENU_NUMBER, OnMenuNumber)ON_COMMAND(ID_MENU_VIEW, OnMenuView)ON_COMMAND(ID_MENU_PERSON, OnMenuPerson)ON_COMMAND(ID_MENU_3, OnMenu3)ON_COMMAND(ID_MENU_4, OnMenu4)ON_COMMAND(ID_MENU_5, OnMenu5)ON_COMMAND(ID_MENU_6, OnMenu6)ON_COMMAND(ID_MENU_BORDER, OnMenuBorder)ON_COMMAND(ID_MENU_OPEN, OnMenuOpen)ON_WM_LBUTTONDBLCLK()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMyDlg message handlersBOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);// CMenu* pSysMenu = GetSystemMenu(FALSE);// if (pSysMenu != NULL)// {// CString strAboutMenu;// strAboutMenu.LoadString(IDS_ABOUTBOX);// if (!strAboutMenu.IsEmpty())// {// pSysMenu->AppendMenu(MF_SEPARATOR);// pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); // }// }// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization hereCMenu* pMenu = this->GetMenu();pMenu->CheckMenuItem(ID_MENU_3, MF_CHECKED);pMenu->CheckMenuItem(ID_MENU_BORDER, MF_CHECKED);pp5.m_link = _T("");pp5.SubclassDlgItem(IDC_PP5, this);return TRUE; // return TRUE unless you set the focus to a control}void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your 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 CMyDlg::OnPaint(){CPaintDC dc(this); // device context for paintingif (IsIconic()){SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint 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;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}Show(&dc);}// The system calls this to obtain the cursor to display while the user drags // the minimized window.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){// TODO: Add your message handler code here and/or call defaultif(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::OnMenuNumber() {// 选择数字pic.Load(IDR_PIC_NUMBER);Invalidate(FALSE);}void CMyDlg::OnMenuView() {// 选择风景pic.Load(IDR_PIC_VIEW);Invalidate(FALSE);}void CMyDlg::OnMenuPerson() {// 选择草莓pic.Load(IDR_PIC_CM);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);pMenu->CheckMenuItem(ID_MENU_6, 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);pMenu->CheckMenuItem(ID_MENU_6, 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);pMenu->CheckMenuItem(ID_MENU_6, MF_UNCHECKED);spell.ReCreate(5, 5, 4, 4);size = 5;OnMenuBegin();}}void CMyDlg::OnMenu6() {// 选择5*5的方块if(6 != size){CMenu* pMenu = this->GetMenu();pMenu->CheckMenuItem(ID_MENU_6, MF_CHECKED);pMenu->CheckMenuItem(ID_MENU_3, MF_UNCHECKED);pMenu->CheckMenuItem(ID_MENU_4, MF_UNCHECKED);pMenu->CheckMenuItem(ID_MENU_5, MF_UNCHECKED);spell.ReCreate(6, 6, 5, 5);size = 6;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);}}四、实验结果选择这个小游戏的时候,没有想到会有这么难做,开始做甚至不知道从哪里下手,问了很多的人,加上上网查阅,最后才把这个小游戏做出来。
c#拼图游戏课程设计
c#拼图游戏课程设计一、课程目标知识目标:1. 学生理解C#编程语言的基本语法和结构,掌握面向对象编程的基本概念;2. 学生掌握Windows Forms应用程序开发流程,理解事件驱动编程机制;3. 学生了解并能运用图形图像处理相关类库,实现拼图游戏界面设计。
技能目标:1. 学生能够运用C#编写拼图游戏的逻辑代码,实现游戏的基本功能;2. 学生能够运用Windows Forms设计拼图游戏的用户界面,提高用户交互体验;3. 学生能够通过调试和优化代码,提高拼图游戏的性能和稳定性。
情感态度价值观目标:1. 学生培养对编程的兴趣,增强学习信息技术的自信心;2. 学生培养团队协作精神,提高沟通与表达能力;3. 学生通过拼图游戏的设计与开发,培养创新思维和问题解决能力。
课程性质:本课程为信息技术课程,以实践操作为主,理论讲解为辅。
学生特点:学生具备一定的C#编程基础,对游戏开发感兴趣,具有较强的动手能力和学习积极性。
教学要求:教师需引导学生掌握拼图游戏的核心算法,关注学生个体差异,鼓励学生创新和优化代码,提高游戏品质。
通过本课程的学习,使学生能够将所学知识运用到实际项目中,培养具备实际操作能力的编程人才。
二、教学内容1. C#语言基础回顾:变量、数据类型、运算符、控制结构(选择、循环);2. 面向对象编程:类与对象、属性、方法、构造函数、继承与多态;3. Windows Forms基础:窗体与控件、事件与委托、图形绘制;4. 图像处理:位图与图像类、图像加载与显示、图像变换;5. 拼图游戏核心算法:拼图布局生成、图片切割与随机排列、移动与验证;6. 游戏界面设计:界面布局、控件使用、用户交互;7. 游戏功能实现:计时器、分数统计、游戏难度设置;8. 调试与优化:异常处理、性能优化、用户体验改进。
教学大纲安排:第一课时:C#语言基础回顾,面向对象编程;第二课时:Windows Forms基础,图像处理;第三课时:拼图游戏核心算法,游戏界面设计;第四课时:游戏功能实现,调试与优化。
C语言课程设计_拼图游戏
C语言课程设计--拼图游戏一、实验内容玩家通过鼠标单击相邻位有空位的方块来移动方块,从而最终将一副散乱的图片拼成完整的图片。
要求如下:1.游戏的初始界面如图一,单击空格键进入游戏,进入游戏之后系统将完成的图片分成大小相同的15分并随机摆放成如图二。
图一图二2.启动游戏,单击空格键进入游戏。
通过鼠标单击周围有空格的方块来移动方块,直到全图拼接成图二中右下角的图案样式,游戏结束,重新回到图一界面。
3.游戏的原理是定义一个4 * 4的方块矩阵(二维数组),前15个的值按顺序从1-15依次递增,第16个留空为0。
按照这个顺序排列的矩阵值代表游戏胜利。
初始化的时候,将该16个矩阵值随机排布即得到本局关卡。
为0的空位代表附近上下左右的4个方块可以移动过来4.每次单击鼠标左键,方块移动一格。
鼠标必须移动到方块范围内单击才能有效移动方块。
二、实验指南实验一开始实验【实验任务】步骤一、打开FunCode,创建一个的C语言项目;步骤二、导入Puzzle模板。
【实验思路】按实验指导完成。
【实验指导】1、打开FunCode,点击“项目”菜单,选择“创建C语言工程”注意:工程名名称要求字母开头,只能包含字母和数字,且名字中间不能有空格。
2、点击菜单“项目”中的“导入地图模块”,如图一。
跳出一个对话框,选中“Puzzle”模板,点击“导入到工程”按钮,如图二。
图一图二3、导入成功后的,界面如下图所示:实验二单击空格键,开始游戏【实验内容】步骤、启动游戏显示“空格开始”,单击空格键进入游戏初始界面。
【实验思路】系统会自动响应d OnKeyDown函数来响应键盘按下消息,这部分代码实现在main.cpp 里。
我们要做的就是通过在main.cpp的dOnKeyDown函数里实现我们的代码。
当用户单击键盘上的空格键之后,设置GameBegin即“空格开始”精灵不可见。
【实验指导】1、游戏是有状态的,我们定义一个全局的游戏状态变量g_iGameState2、判断空格键是否按下,如果按下,我们就转变游戏的状态为1,表示游戏开始,并且以藏“空格开始”精灵。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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声明
本设计团队对该拼图游戏拥有完全版权,未经本团队允许,不得进行商业交易和任何非法用途。
由于时间仓促,还有许多不当及错误之处,还请高人不吝指正。
联系方式:。