C++课程设计报告 - 拼图游戏
- 格式:doc
- 大小:1.34 MB
- 文档页数:30
《C#程序设计》课程设计题目:拼图游戏专业:计算机科学与技术学号:姓名:指导老师:完成日期: 2012/12/26《C#课程设计》评分标准题目:拼图游戏专业:计算机科学与技术学号:姓名:目录1 前言 (4)2 需求分析 (4)要求 (4)任务 (4)运行环境 (4)开发工具 (4)3 概要设计与详细设计 (5)系统流程图 (5)结构功能图 (5)4 编码与实现 (6)编码分析 (6)具体代码实现(附源代码) (9)5 课程设计总结 (18)参考文献 (19)1.前言拼图游戏一款非常经典的小游戏,因为它比较简单有趣,无论老少都比较适合。
拼图的设计对每一个C#语言设计者进行语言提高和进阶都是一个很好的锻炼机会。
拼图游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。
因此,如何设计和开发好这个拼图游戏,对于提高C#开发水平和系统的设计能力有极大的帮助。
在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。
一个3×3的魔板,有一个格子是空的,其他格子内随机放置1-8共8个编号的方块,通过单击任意一个与空格子相邻的方块可以把该方块移入空格子,不断的移动方块,直到方块按照图片的原来的顺序排好。
2 需求分析要求(1)用C#语言实现程序设计;(2)利用PictureBox控件来实现图片的移动(3)超过200步提示重新来(4)界面友好(良好的人机互交),程序要有注释。
任务(1)制作流程图(2)编写代码;(3)程序分析与调试。
运行环境(1)WINDOWS2000/XP/win7系统(2)编译环境开发工具C#语言3 概要设计与详细设计系统流程图如图所示。
图系统流程图功能结构图如图所示。
c 拼图游戏课课程设计一、教学目标本课程的目标是让学生了解和掌握C拼图游戏的基本原理和技巧,培养学生的逻辑思维能力和团队协作能力。
具体目标如下:知识目标:使学生了解C拼图游戏的历史、类型和规则,理解游戏中的基本概念和原理。
技能目标:培养学生能够独立完成C拼图游戏,并能够分析和解题的能力。
情感态度价值观目标:培养学生对C拼图游戏的兴趣,增强学生的自信心和耐心,培养学生的团队协作精神和竞争意识。
二、教学内容本课程的教学内容主要包括C拼图游戏的基本概念、原理、技巧和实战演练。
具体内容包括:1.C拼图游戏的历史和发展:介绍C拼图游戏的起源、发展及其在世界各地的流行情况。
2.C拼图游戏的类型和规则:讲解不同类型的C拼图游戏及其规则,使学生了解各种游戏的特点和玩法。
3.C拼图游戏的技巧和方法:教授学生如何观察、思考和操作,以便快速完成游戏。
4.实战演练:安排一定的课时让学生进行实际操作,锻炼学生的解题能力和团队协作能力。
三、教学方法为了提高教学效果,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法和实验法等。
具体方法如下:1.讲授法:教师讲解C拼图游戏的基本概念、原理和技巧。
2.讨论法:学生就C拼图游戏的相关问题进行讨论,促进学生思考。
3.案例分析法:分析典型的C拼图游戏案例,使学生掌握解题方法和技巧。
4.实验法:让学生进行实战演练,提高学生的实际操作能力和团队协作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:选用国内权威、实用的C拼图游戏教材,作为学生学习的主要参考资料。
2.参考书:推荐学生阅读一些与C拼图游戏相关的书籍,以拓宽知识面。
3.多媒体资料:制作和收集一些与C拼图游戏相关的多媒体资料,如视频、图片等,以直观展示游戏原理和技巧。
4.实验设备:准备足够的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基础,图像处理;第三课时:拼图游戏核心算法,游戏界面设计;第四课时:游戏功能实现,调试与优化。
目录一、需求分析 (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操作自动增加,时间自动增加。
青岛理工大学C++面向对象课程设计报告院(系):计算机工程学院专业:计算机科学与技术学生姓名:__班级:___学号:题目:__拼图游戏设计_____起迄日期:__2011.7.4—2011.7.设计地点:指导教师:完成日期: 2010 年月日一、课程设计目的(1)通过拼图游戏设计加强对C++课程基础知识点的理解和掌握,培养对基础知识综合运用能力、实际分析问题能力,养成良好的编程习惯。
(2)通过拼图游戏设计进一步领会程序设计的特点和应用,提高运用C++ 以及面向对象知识解决实际问题的能力,初步掌握MFC编程的基本功能,掌握一种可视化编程的方法,加强对C++面向对象程序设计的理解。
(3)通过拼图游戏设计掌握用C++ 编写面向对象的实用程序的设计方法,对面向对象方法和思想增加感性的认识,学会利用C++程序设计语言编写出一些短小、可靠的Windows实用程序,切实提高面向对象的程序设计能力,为后续的相关课程的学习打下基础。
(4)通过拼图游戏设计锻炼实际的编程能力,提高调查资料、查阅技术文献、资料以及编写软件设计文档的能力,初步接触自学编程的思想,转变死读的观念。
二、课程设计内容与实现的功能(1)课程设计内容将一张图片切分成若干小片,打乱顺序任意显示,用户通过操作各小片到正确位置以恢复原来的图像,要求有不同的等级,切分成不同的片数,完成拼图后程序可以判断是否完成,游戏还应有显示原图片的功能。
(2)实现的功能①本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐和游戏所用的时间,当游戏开始时背景音乐自动播放,时间自动增加。
②为了制作拼图游戏,首先要动态创建一组静态控件,这些控件将作为拼图块进行移动。
用户用户需要选择拼图图像,可以使用程序中自带的图像,亦可以自己选则择图像,然后程序将根据用户选择的游戏级别设置静态控件的大小和位置,并将用户选择的图像绘制到静态控件上。
当用户选择开始游戏以后,程序将隐藏右下角的拼图块,使拼图空出一个位置,用户可以使用上、下、左、右键来控制剩余拼图块的移动,在移动的过程中,用户可以通过菜单栏的游戏助手来查看原图片。
武汉工程大学计算机科学与工程学院项目报告设计名称:《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语言拼图游戏课程设计一、课程目标知识目标: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一、教学目标本课程的学习目标包括知识目标、技能目标和情感态度价值观目标。
知识目标要求学生掌握拼图游戏的基本原理和技巧,了解不同类型的拼图游戏以及其适用场景。
技能目标要求学生能够独立完成拼图游戏,提高观察力、耐心和解决问题的能力。
情感态度价值观目标培养学生对拼图游戏的兴趣,增强自信心和团队合作意识。
通过对学生的特点和教学要求的分析,我们将课程目标分解为具体的学习成果。
学生将能够理解并运用拼图游戏的基本原理,独立完成各类拼图游戏,并在游戏中培养观察力、耐心和解决问题的能力。
同时,学生将能够积极参与团队合作,分享游戏经验和心得,培养自信心和团队合作意识。
二、教学内容根据课程目标,我们选择和了以下教学内容:1.拼图游戏的基本原理:介绍拼图游戏的概念、发展历程以及各类拼图游戏的特点和适用场景。
2.拼图游戏的技巧:讲解拼图游戏的技巧和方法,包括观察力、耐心和解决问题的能力。
3.不同类型的拼图游戏:介绍常见的拼图游戏类型,如平面拼图、立体拼图、数字拼图等,并分析其特点和适用场景。
4.团队合作拼图游戏:探讨团队合作拼图游戏的意义和价值,介绍团队合作拼图游戏的规则和方法。
教学大纲将根据以上教学内容进行详细安排,确保教学进度的合理性和科学性。
三、教学方法为了激发学生的学习兴趣和主动性,我们将采用多种教学方法:1.讲授法:通过讲解拼图游戏的基本原理和技巧,为学生提供系统的知识结构。
2.案例分析法:分析典型拼图游戏案例,引导学生理解不同类型拼图游戏的特点和适用场景。
3.实验法:学生进行团队合作拼图游戏,培养学生的观察力、耐心和解决问题的能力。
4.讨论法:鼓励学生分享拼图游戏的经验和心得,培养学生的团队合作意识和自信心。
通过多样化的教学方法,我们将激发学生的学习兴趣,培养学生的观察力、耐心和解决问题的能力,提高学生的团队合作意识和自信心。
四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备以下教学资源:1.教材:选用权威、实用的拼图游戏教材,为学生提供系统的知识结构和学习指导。
课程设计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 游戏截图。
c语言拼图课程设计一、课程目标知识目标:1. 理解C语言的基本语法,掌握数组的使用和二维数组在拼图游戏中的应用;2. 学会使用循环和条件语句实现拼图的逻辑功能;3. 掌握在C语言中处理图形用户界面(GUI)的基本方法,并应用于拼图游戏设计。
技能目标:1. 能够编写C语言代码实现拼图游戏的逻辑,包括初始化、移动和胜利条件判断;2. 能够运用所学的编程技能解决拼图过程中出现的问题,具备调试程序的能力;3. 能够在团队合作中发挥个人优势,与他人协作完成一个完整的拼图游戏项目。
情感态度价值观目标:1. 培养学生对C语言的兴趣,激发编程热情,形成主动学习和探究的良好习惯;2. 培养学生面对问题时的分析、解决能力,增强自信心和挑战精神;3. 通过团队协作,培养学生的沟通能力、团队精神,使其体会集体智慧的力量。
分析课程性质、学生特点和教学要求,本课程旨在使学生在掌握C语言基础知识的基础上,通过拼图游戏的实践,提高编程技能,培养解决问题的能力,同时注重培养团队协作精神和良好的情感态度价值观。
课程目标具体明确,便于后续教学设计和评估。
二、教学内容1. C语言基础知识回顾:数组、循环、条件语句等基本概念与使用方法,对应教材第二章和第三章内容。
2. 二维数组在拼图游戏中的应用:介绍如何使用二维数组表示拼图游戏的界面,以及如何通过数组操作实现拼图移动,对应教材第三章和第四章内容。
3. 拼图游戏逻辑设计:讲解拼图游戏的基本规则,引导学生运用C语言实现拼图逻辑,包括初始化、移动和胜利条件判断,对应教材第五章内容。
4. 图形用户界面(GUI)设计:介绍简单的图形用户界面设计方法,使学生能够将拼图游戏界面可视化,对应教材第六章内容。
5. 程序调试与优化:教授学生如何调试程序,找出并修复代码中的错误,提高程序性能,对应教材第七章内容。
6. 团队协作与项目实践:组织学生分组,每组共同完成一个拼图游戏项目,培养学生团队协作能力和实际操作能力。
目录一、需求分析 (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操作自动增加,时间自动增加。
(2)进入游戏界面后,player可以在菜单栏中选择游戏的难度、图片风格和拼图图像,亦可以自定义图片,若选择“简单”,程序将图片分成9块,若选择“困难”,程序将图片分成16块.(3)单击“重置”或按F3菜单项会弹出一个对话框让用户确认是否重置游戏。
(4)单击任意图象,图像将随机排列,并开始计时和记步,用户通过鼠标单击空格周围的图片来改变其位置,用户没单击一次,步数增加一次。
(5)游戏中用户可通过单击“提示”菜单项或按F4来查看图像的缩略图及游戏相关信息。
(6)游戏状态栏显示用户所用时间及步数,成功时状态栏给出提示信息和所花费时间、步数,用户可选择其他图像或难度进行游戏。
二、设计内容1.主模块图2.1主程序流程图2.2用例图:用户选择背景图片选择难度级别开始游戏是否选择不显示显示原图原图提示拼图成功返回重新选择背景图片及难度级别2.3主程序类调用关系图2.4 CPictureDlg类中成员函数主要调用关系图三、设计方案论述本程序有一个CPictureDlg类,它公有继承CDialog类的一些性质。
CDialog类中包括位图的读入和显示,拼图游戏中的Picture都是位图资源。
在游戏程序中,采用Static Text即静态文本控件来显示位图。
静态文本控件的功能比较简单,可显示字符串,图标,位图。
先为对话框的“游戏”中的菜单项“容易”和“困难”添加消息响应为另外还需为CPictureDlg 类添加BOOL型变量Easy来标识游戏的难度(分为9格或16格),同时添加BOOL型变量IsRnd 用来标识图格是否进行了随机位置的初始化,接下来为CPictureDlg对话框添加16个Static 控件(可以先设置好一个控件后,再通过复制得到其它的控件),并设置它们的属性:ID 设为IDC_IMAGE0到IDC_IMAGE15,Tabstop请勾上,Type属性设为Bitmap,控件添加好了后,我们需要添加一个CStatic类型的数组m_Image[16],与这16个Static控件相关联,通过这个操作这个数组的下标来控制这16个控件对图像进行分格显示。
建立关联的代码应写在CPictureDlg类中系统生成的OnInitDialog()函数体内,这个函数是整个对话框程序运行的入口,相当于一个main函数,在这个函数体里,我们也需要为之前声明的变量提供初始值,即将变量初始化,变量没有初始化的后果通常会造成内存泄露,使程序在运行时出现莫名奇妙的错误。
判断游戏是否完成的函数IsWin(),只要所有的Static控件都回到了相应的位置,就可以认为用户己完成了拼图,即游戏完成。
四、调试分析1.实际完成的情况(1)完成的功能:本程序除了实现了拼图所要求的基本功能外,还添加了背景音乐、计算步数和游戏所用的时间,当游戏开始时背景音乐自动循环播放,步数随player操作自动增加,时间自动增加。
(2)支持的数据类型:BOOL类型、控件数组类型。
2.程序的性能分析本程序能够很好的运行,并且画面质量以及音质方面都很高3.上机过程中出现的问题及其解决方案1)开始导入图片时,图片不能显示,重新导入bmp格式的图片后解决了。
2)开始建立了时间函数OnTimer,但是游戏运行后时间并不增加,在开始游戏对应的函数中增加SetTimer函数,得到想要的结果。
3)初始设置的快捷键无效,查阅资料后加入Accelerator及相应的函数,使得快捷键有效。
4.程序中可以改进、扩充的功能及设计实现构想。
1)游戏的难度等级有点少,可以适当增加几个等级。
2)游戏未设置根据用户花费的时间和步数判定用户的成绩并进行排名的功能,可以增设,以便用户了解自己玩的水平。
五、用户手册1.打开Picture文件夹,双击Ppicture.dsw标志打开程序,然后运行。
2.开始程序会出现以下欢迎界面:3.用户需要选择图片、难度和图片风格,然后单击图片开始游戏,计时器开始计时,用户通过鼠标单击空格周围的图片来改变其位置,用户每单击一次,步数增加一次。
4.游戏中用户可通过单击“提示”菜单项或按F4来查看图像的缩略图及游戏相关信息。
图像缩略图游戏相关信息5.用户也可以单击菜单栏中的重置或按快捷键F3重置图片,会出现提示信息,用户单击确定重置图片。
提示框如下:6.当完成拼图后系统会自动给出成功提示,并显示用户的成绩,用户单击确定后可以选择其他图片或难度继续游戏,也可以选择单击“退出”或按Esc退出游戏。
六、设计总结通过本次课程设计,学习并初步掌握了基于对话框的MFC程序的设计,并学会了使用CStatic控件操作位图。
熟悉了在基于对话框的工程中加入菜单操作、用代码操作菜单、Windows位图文件的基本结构、Visual C++中对位图资源的操作、Visual C++中对自定义位图文件的操作、设置相关位图的概念、用Static控件显示位图以及用Status Bar显示提示信息和Visual C++随机函数。
在设计过程中,曾遇到了两个瓶颈导致程序一度无法完成,第一个是位图文件的添加,包括将图片格式转换成BMP格式、添加相关Static控件,尤其是对控件图标不熟悉的情况下,一时不知道在哪儿添加控件,后来上网查阅并请教同学才得以完成控件的添加,使得程序可以继续完成。
不过在程序即将结束的时候,又遇到了一个新的问题,导致程序差点功亏一篑,问题就是图片的缩略图的添加,也就是游戏中的“提示”的应用,当然没有“提示”操作,并不会影响整个程序的运行环境,但是为了使游戏者能够顺利的完成游戏,此“提示”操作必不可少,在纠结了一段时间之后,在与同学的商讨下,终于完成了缩略图的添加,为程序的顺利完成提供了帮助。
在本次设计的完成过程中,我对软件的开发有了一个初步的认识,一个小型游戏软件尚且需要不断地查阅资料、请教别人,那么完成一个大型的软件,必定需要更加复杂的过程。
所以在做软件开发时首先要保持一个平静的心态,静下心来潜心去研究,同时还要熟悉的掌握、灵活的运用所学知识,方能完成设计。
也对MFC程序开发也有了相应的了解,每一个函数都有其特定的用途,掌握好这其中的一些关联,对一个程序的完成不无好处,这次课程设计为我以后编程的相关学习奠定了基础,使我在不同方面得到了锻炼。
七、程序中类的主要的成员函数BOOL OnInitDialog(); //初始化函数void OnRun(UINT nBitmapID,UINT nMenuID);//加载位图资源BOOL IsWin(); //判断拼图是否成功void MoveImage(int num); //移动随机小图块void Rnd(); //随机设置小图块的位置UINT MapRand(UINT nMax); //随机函数void SetImage(); //把图像拷贝到Static控件void SetPos() // 初始化Staic 控件的位置CString IntToString(int number); //为游戏添加计时器void OnTimer(UINT nIDEvent); //计时函数void SetPre(); //生成略缩图void CPictureDlg::OnForHelp() //显示略缩图void ShowItem(); //显示帮助对话框八、主要参考文献1.郑莉.C++语言程序设计(第3版).北京:清华大学出版社,2005.72.钱能.C++程序设计教程(第2版).北京:清华大学出版社,2005.83.黄维通.Visual C++面向对象与可视化程序设计(第2版).北京:清华大学出版社,2003.124..刘路放.Visual C++与面向对象程序设计教程(第二版).北京:高等教育出版社,2007.85. 潘爱民.COM原理与应用.北京:清华大学出版社,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 dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconsrand((unsigned)time(NULL));hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERA TOR1));// TODO: Add extra initialization hereBitmap.LoadBitmap(IDB_BITMAP6);//初始界面是图像BITMAP6pKDC = new CDC;pMainMenu = GetMenu(); //获取菜单Style3d = TRUE;Islong = FALSE;Advan = FALSE;Easy = TRUE;TimeCon = "计时器";IntStep = 0;Strstep = "步数";SetWindowPos(NULL,0,0,600,700,SWP_NOMOVE); //控制窗口大小SetTimer(10,1000,NULL);//10表示计时器的名字,1000表示时间间隔是1000毫秒,NULL表示使用onTimer函数。