C语言课程设计_拼图游戏
C#面向对象课程设计--拼图游戏

《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拼图游戏的兴趣,增强学生的自信心和耐心,培养学生的团队协作精神和竞争意识。
二、教学内容本课程的教学内容主要包括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#拼图游戏课程设计

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++课程设计报告 - 拼图游戏

目录一、需求分析 (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操作自动增加,时间自动增加。
拼图游戏课程设计

武汉工程大学计算机科学与工程学院项目报告设计名称:《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语言拼图游戏课程设计

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 游戏截图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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,表示游戏开始,并且以藏“空格开始”精灵。
实验三初始化随机显示方块【实验内容】步骤一、添加一个4x4的二维数组,将图案分成15份,随机摆放,剩下一个位置留空,用于移动方块。
【实验思路】游戏的原理是在一个4 * 4的方块矩阵(二维数组),前15个的值按顺序从1-15依次递增,第16个留空,我们设置为一个名称为“NULL”的精灵。
按照这个顺序排列的矩阵值代表游戏胜利。
精灵名称依次是PictureBlock1,PictureBlock2…PictureBlock15。
因此,初始化的时候,用一个数组iRandData顺序保存1到15,对应表示15个方块精灵。
再用一个二维数组g_iBlockState[4][4]表示这16个位置。
每次随机从iRandData中取一个值,赋给g_iBlockState,表示某个位置放置哪张方块图片。
为了保证同一张方块图片不会被重复使用,每次从iRandData随机取一个值以后,将该随机数后面的数组值往前移一位,并且数组大小减1。
【实验指导】1、进入Main.cpp里面,添加如下的变量声明:1)添加成员变量声明:// 二维数组,存储N*N的矩阵方块信息int g_iBlockState[BLOCK_COUNT][BLOCK_COUNT];// 一维数组,存储上面二维数组中的方块精灵的名字。
TO DO 思考一下数// 组大小一样的二维数组索引与一维数组索引如何相互转换?char g_szBlockName[BLOCK_COUNT * BLOCK_COUNT][64];其中在BLOCK的大小为42、在Main.cpp中在最后面添加下面的成员变量的声明:// 按方块大小,在编辑器里摆放的第一块方块的起始坐标const float g_fBlockStartX = -40.625f;const float g_fBlockStartY = -28.125f;// 屏幕高度75 / 4块= 18.75每块的大小.编辑器里预先摆放好的方块宽和高// 必须与此值一致const float g_fBlockSize = 18.75f;3、进入Main.cpp中填写初始化代码。
1)填写下面几行变量的定义:/* 游戏原理:4 * 4的方块矩阵(二维数组),前15个的值按顺序从1-15依次递增,* 第16个留空为0。
按照这个顺序排列的矩阵值代表游戏胜利。
初始化的时候,* 将该16个矩阵值随机排布即得到本局关卡。
为0的空位代表附近上下左右的* 4个方块可以移动过来。
一维数组g_szBlockName存储精灵名字与二维数组* 的值一一对应,当移动二维数组的值的时候,此名字数组的值也需要跟着移动*/int iLoopX = 0, iLoopY = 0, iLoop = 0;int iOneIndex = 0, iRandIndex = 0;/* 用做随机的数组,当随机抽取到此数组中的一个时,比如随机到第五个,则将* 第五个取出来用。
第五个后面的数组都往前移动一位,将第五个覆盖掉,数组* 总数减一,下次再在这剩余的14个数值里随机抽取*/int iDataCount = BLOCK_COUNT * BLOCK_COUNT - 1;int iRandData[BLOCK_COUNT * BLOCK_COUNT - 1] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};2)由于我们用于记录方块位置的成员变量是一个二维数组g_iBlockState,而我们用于保存所有方块精灵的数组是一个一维数组,所以下面我们需要用到一些自定义的函数用于从二维数组转换到一维数组。
其实二维数组的存放在内存里面也是连续存放的,我们在读取他们的值得时候当然可以使用一维数组的方法来读取它,只不过这里需要进行数组下标数值的相应改变。
例:二维数组a[x][y]转换为一维数组的计算方法是:x* 二维数组中每行的元素数+y。
在Main.cpp中添加我们自定义的二维数组索引转换成一维数组索引的函数XYToOneIndex声明并且定义:int XYToOneIndex( const int iIndexX, const int iIndexY ){return (iIndexY * BLOCK_COUNT + iIndexX);}我们使用两个for循环来遍历二维数组,第一个for循环遍历二维数g_iBlockState的第二个下标,第二个for循环遍历二维数组g_iBlockState的第一个下标。
在Main.cpp函数里面添加下面的代码:for( iLoopY = 0; iLoopY < BLOCK_COUNT; iLoopY++ ){for( iLoopX = 0; iLoopX < BLOCK_COUNT; iLoopX++ ){}}4、我们首先用刚刚我们自定义的数组下标转换函数XYToOneIndex将二维数组下标转换成一维数组的下标。
在for( iLoopX = 0; iLoopX < BLOCK_COUNT; iLoopX++ )里面填写下面的代码:iOneIndex = XYToOneIndex( iLoopX, iLoopY );iOneIndex即是二维数组在一维数组里面的下标值。
1)如果遍历到数组的最后一个,我们就将其设定为空位精灵,它的名称为‘\0’,后面我们只要判断一个精灵的周围有没有名称为”\0”的精灵就可以知道他周围是否有空位,它在二维数组中的值以0来代替。
添加下面的代码:// 数组的最后一个if( BLOCK_COUNT - 1 == iLoopX && BLOCK_COUNT - 1 == iLoopY ){g_iBlockState[iLoopY][iLoopX] = 0;g_szBlockName[iOneIndex][0] = '\0';}2)如果没有遍历到最后一个位置,我们随机从iRandData取一个值赋g_iBlockState,并且给对应名字的精灵数组g_spBlock初始化,同时将该精灵移动到对应的位置。
添加下面代码:else{// 在当前剩余未使用到的数值里随机一个出来,赋值给二维数组iRandIndex = dRandomRange( 0, iDataCount - 1 );g_iBlockState[iLoopY][iLoopX] = iRandData[iRandIndex];/* 给对应的名字数组赋值。
该名字的方块已经预先在地图里摆放好,因此只需要生成对应的名字即可,不用创建精灵*/strcpy( g_szBlockName[iOneIndex], dMakeSpriteName( "PictureBlock",g_iBlockState[iLoopY][iLoopX] ) );// 将该精灵移动到对应的位置MoveSpriteToBlock( g_szBlockName[iOneIndex], iLoopX, iLoopY );}3)在这里我们需要添加一个移动精灵到特定位置的函数MoveSpriteToBlock。
进入Main.cpp中添加函数的声明和定义:void MoveSpriteToBlock( const char *szName, const int iIndexX, const int iIndexY ){float fPosX = g_fBlockStartX + iIndexX * g_fBlockSize;float fPosY = g_fBlockStartY + iIndexY * g_fBlockSize;dSetSpritePosition( szName, fPosX, fPosY );}4)由于是随机从iRandData数组里面取一个数赋给g_iBlockState,所以我们每次赋一个需要将iRandData数组后面的值往前面移动覆盖掉改值。
因此我们需要用for循环,将抽取到的索引iRandIndex后面的数组值依次往前移动一位,同时方块总数目减一。
在两个for循环的else语句的最后代码如下:for( iLoop = iRandIndex; iLoop < iDataCount - 1; iLoop++ ){iRandData[iLoop] = iRandData[iLoop + 1];}// 剩余有效值总数减一iDataCount--;至此,本实验结束。
实验四移动方块【实验内容】步骤一、获取鼠标单击消息步骤二、判断鼠标点击的方块步骤三、判断周围是否有空位,移动方块【实验思路】遍历一维数组g_szBlockName,使用dIsPointInSprite 函数判断当前鼠标坐标是否位于某个名字的精灵内部。