拼图游戏课程论文

拼图游戏课程论文
拼图游戏课程论文

面向对象编程实习报告题目:拼图游戏

学号

姓名

专业班级

指导教师

实践日期

目录

一、综合训练目的与要求 (1)

1.教学目的 (1)

2.教学要求 (1)

二、综合训练任务 (1)

1.训练目的: (1)

2.基本要求: (1)

三、总体设计 (1)

1.类图的设计 (1)

2.游戏实现的功能简介 (2)

四、详细设计说明 (2)

1.CPicture1View类 (2)

2.CMainFrame类 (3)

3.CPcShow类 (4)

五、调试与测试 (5)

1.打开拼图 (5)

2.打开本地图片 (6)

3.选择游戏模式4*4 (7)

3.拼图成功 (8)

六、实习日志 (8)

七、实习总结 (10)

八、附录:核心代码清单 (10)

1.MainFrm.cpp (10)

2.pictrue1View.h (11)

3.pictrue1View.cpp (14)

一、综合训练目的与要求

1.教学目的

在《面向对象程序设计》课程教学的基础上,在相对集中的实训教学时间内,通过对一个功能较完整的小型游戏的设计与开发,深入复习并进一步掌握面向对象的程序设计思想与方法。同时,作为整个实践教学体系一部分,系统培养采用面向对象的方法分析问题与解决问题的能力及团体组织与协作能力。

2.教学要求

从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求。

1)根据实现的功能,划分出合理的对象类,明确对象类间的关系。

2) 为每个对象类设计正确的域和方法,为每个方法设计合理的方法体。同时,为对象类及内部的域和方法运用正确的修饰符,如访问控制符等。

3)编程简练,程序功能齐全,能正确运行。

4)说明书、流程图要清楚,规范(必须采用UML格式)。

5)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。

二、综合训练任务

1.训练目的:

1)要求学生达到熟练掌握C++语言的基本知识和技能。

2)基本掌握面向对象程序设计的基本思路和方法。

3)能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

2.基本要求:

1)要求利用面向对象的方法以及C++的编程思想来完成系统的系统结构。

2)要求在设计的过程中,建立清晰的UML类关系图,描述出类族之间的关系。

3)在系统中定义的每个类中要有各自的属性和方法。

4)具有简单的图形界面。

5)写出设计说明书。

三、总体设计

1.类图的设计

我们在VC6.0中共用了六个类,除提供的类外还定义了CPcShow类记录原始图片信息与切割后的图片信息。

CMainFrame用来实现菜单功能和控制窗口,而在CPicture1View中则是实现拼图游

戏的主要函数。详见图1:

图1、类图

2.游戏实现的功能简介

以面向对象程序设计语言C++为编程工具,在VC6.0的开发软件环境下,完成拼图游戏的界面及功能的实现。该游戏实现的主要功能有:

1)游戏中有原图提示,有快捷键操作。

2)通过鼠标控制滑块移动拼图。

3)打开本地图片作为拼图素材。

4)选择拼图游戏的难易程度,即3*3、4*4或5*5进行游戏。

5)成功拼图后补全图片并显示所用时间与步数。

6)在已选拼图模式下实现游戏的重新开始。

四、详细设计说明

1.CPicture1View类

实现游戏的主要部分,它负责调用算法模块来实现逻辑并把逻辑转换为相应的动态演示,负责对图片进行绘制,分割,打乱以及控制滑块的移动,包含选择游戏图片,选择游戏的难易程度等响应函数,还负责判断游戏的开始与结束。

核心函数如下:

1)构造函数,默认为3*3初级拼图,并调用OnStart函数初始化游戏。

CPictrue1View()

2)选择图片,通过菜单和窗口中的图片选择待拼的图片,我在这里提供了4个图片void OnPicture1()

void OnPicture2()

void OnPicture3()

void OnPicture4()

3)难度选择,可选择任意分割方式,这里只提供了3*3,4*4,5*5的分割

void OnStage1()

void OnStage2()

void OnStage3()

4)打开图片,可打开任意bmp图片

void OnPicSelect()

5)计时器,通过调用系统时间来记录玩家游戏的时间

OnTimer(UINT nIDEvent)

6)窗口函数,用于美化窗口

BOOL PreCreateWindow(CREATESTRUCT& cs)

7)开始函数,用于初始化程序

void OnStart()

8)随机函数,用于图片的随机排列并确保拼图的可行性

void RandPic()

2.CMainFrame类

实现窗口菜单的应用,美化窗口。见图2:

图2、CMainFrame类

窗口菜单如图3:

图3、窗口菜单演示

3.CPcShow类

主要用于生成二维数组m_pShow,用picIn和picOut分别小图片的原始信息和分割

后的小图片的信息。类图见图4:

图4、CPcShow 类

五、调试与测试

1.打开拼图

图5、调试图片1

2.打开本地图片

图6、调试图片2

3.选择游戏模式4*4

图7、调试图片3

3.拼图成功

图8、调试图片4

六、实习日志

2013年2月25日星期一

今天和同伴一起分析了我们所选的题目——拼图游戏,我们要做滑块式拼图,计划玩家游戏时可以通过快捷键或菜单选择游戏的难易程度,可添加图片,并在完成后显示所用时间。这就设计到界面设计,图片的选择和填充,图片分割、随机组合的问题,也是我们将要在实习中解决的关键问题。

2013年2月26日星期二

根据前面的设想,我们决定用MFC实现拼图游戏并确定了总体类的设计。之后我们小组决定分工,一人负责游戏面板的实现及相关接口的设计,一人负责设计主要函数,完善拼图。我的任务是实现游戏面板及接口。

2013年2月27日星期三

为了用MFC实现拼图,我们不得不从头学习VC6.0及MFC,我们借阅了很多VC6.0编程的书籍,逐步熟悉我们的编程环境,还在网上搜集了许多函数资料,参考着调试了几个简单的函数,了解它们的功能。在对VC6.0大体熟悉后重点学习窗口的设置及图片的绘制。

2013年2月28日星期四

今天我在网上参考了拼图游戏中对图片的处理过程以及算法思想,开始设计我们的窗口界面,窗口调用了系统的文件窗口,并限制了它改变大小的功能,之后又添加了菜单,在之中添加了我们要用的选择图片和难易程度的选项。之后便开始设计响应函数了。

2013年3月1日星期五

在昨天的基础上我尝试在CPicture1View类中添加了OnPicture、OnStage等响应函数,按照之前的想法将难度控制在3*3、4*4、5*5。这其中调用了OnStart函数初始化还有重绘函数。这之中曾为菜单中的对号乱指而烦恼不已,之前用的GetSubMenu(0)->CheckMenuItem控制子菜单,但ID号误认为是我选择的与难度相关的ID号,但后来忽然想到既然是控制子菜单就应该输入子菜单中选项的ID号,所以问题就迎刃而解了。

2013年3月4日星期一

开始写随机排列的函数。结合网上查到的方法,我开始考虑把图片抽象成一个3*3的矩阵,用数字2-9来表示图片,用0来表示空白区,这样就需要一个二维数组来记录原始信息与打乱后的信息。随机函数则用来生成2到9个随机数。并用randArr数组来记录。之后便是判断拼图是否能够完成了,网上说利用逆序和,我就试着在for循环中加入了reverSum用来存储逆序和,之后加了do while来判断游戏是否可拼。

2013年3月5日星期二

在昨天解决了拼图信息存储的问题之后,今天主要是结合同伴的代码,调试程序,然后进行进一步的优化,想到用快捷键便又在网上搜了一搜,成功添加上了开始、退出和选择难易程度的快捷键。并利用系统时间成功做成了计时器。

2013年3月6日星期三

今天和同伴商量之后决定将之前定义的m_pShow数组做些改动,添加了m_pShow[][].PinIn与m_pShow[][].PinOut来分别记录拼图的原始图片记录与打乱后的拼图记录。这样判断条件便改为了在第一块小拼图回位后判断m_pShow[][].PinIn与m_pShow[][].PinOut是否完全相等,相等后弹出提示对话框。

2013年3月7日星期四

到今天为止,拼图游戏的主要功能已经实现,我们优化了一下拼图游戏,修改了对话框,在游戏结束时提示出所用时间及步数,增添了拼图游戏的图标及对游戏中鼠标的形状进行了修改,我们原想将在游戏结束时将原图显示到主窗口中,便于欣赏,但实践

过程中结果总不尽人意,后来添加了重绘的代码,并控制好坐标之后就达到我们想要的结果了。

2013年3月8日星期五

对游戏进行最后的测试及改进,撰写报告并制作PPT。答辩,将实验报告与实验计划书,答辩幻灯片,工程源代码,整理与打包提交。

七、实习总结

VC中提供了几个类,了解这几个类的功能,清晰整体的设计和类功能的划分是做好程序的基础。还有类的声明放在头文件里,而类内成员的定义应当放在同名的源文件里,这不仅是个良好的编程习惯,而且可以避免在某些环境下编译时出错。还有头文件应当有避免重复包含和编译的宏定义。

在添加菜单时,函数的定义与声明、ID号的联系一定要对应好,在设计随机函数时大量参考了网络事例,变量和函数大多没定义好,这就耗费了我大量的时间来整理和融合。但在查阅资料的同时我也学会了很多,比如添加快捷键、实现菜单功能、随机函数的使用、系统信息的调用等等,还有MSDN的使用也让我对更多的函数有了了解,也利于了我在后期的调用。

总的来说,这次实习让我学到很多,温习了C++,也更加了解了MFC及VC6.0开发环境,可以说是受益匪浅。

八、附录:核心代码清单

1.MainFrm.cpp

#include "stdafx.h"

#include "pictrue1.h"

#include "MainFrm.h"

……

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

if( !CFrameWnd::PreCreateWindow(cs) )

return FALSE;

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

cs.style&=~WS_MAXIMIZEBOX; //禁用按动最大化按钮

cs.style&=~WS_THICKFRAME;//禁止用户改变窗口大小

cs.style&=~FWS_ADDTOTITLE;//将FWS_ADDTOTITLE去掉

cs. lpszName = "拼图游戏";//改变标题,替换自己的标题

return TRUE;

}

……

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

m_hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

//设置图标

SetIcon(m_hIcon,TRUE);

SetWindowPos(NULL,100 ,100 ,ID_SIDE*6+ID_IMG_SIZE*2+ID_PIC_SIZE ,ID_PIC_SIZE+ID_SIDE*6 ,SWP_NOZORDER | SWP_NOMOVE);

GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_EASY,MF_BYCOMMAND | MF_CHECKED); //设置默认的初级菜单

GetMenu()->GetSubMenu(1)->CheckMenuItem(IDB_BITMAP2,MF_BYCOMMAND | MF_CHECKED); //设置默认的第一张图片

return 0;

}

2. pictrue1View.h

#if !defined(AFX_PICTRUE1VIEW_H__B3AD57A0_446B_417E_B888_C1A61534CD44__INCLUDED_)

#define AFX_PICTRUE1VIEW_H__B3AD57A0_446B_417E_B888_C1A61534CD44__INCLUDED_

#define ID_IMG_SIZE 100

#include "PcShow.h"

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CPictrue1View : public CView

{

public: // create from serialization only

CPictrue1View();

DECLARE_DYNCREATE(CPictrue1View)

// Attributes

public:

CPictrue1Doc* GetDocument();

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CPictrue1View)

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CPictrue1View();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CPictrue1View)

// NOTE - the ClassWizard will add and remove member functions here.

afx_msg void OnStage1();

afx_msg void OnStage2();

afx_msg void OnStage3();

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnPicture1();

afx_msg void OnPicture2();

afx_msg void OnPicture3();

afx_msg void OnTimer(UINT nIDEvent);

afx_msg void OnPicture4();

afx_msg void OnPicSelect();

afx_msg void OnBegin();

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

private:

void OnStart();

BOOL m_bTimer;

int m_nSecend;

int m_nStep;

int m_nStart;//是对打开游戏是否的判断依据

CBitmap m_bitmap;

CBitmap m_bitmap1;

CBitmap m_bitmap2;

CBitmap m_bitmap3;

CBitmap m_bitmap4;

int m_nImgOrgY;

int m_nImgOrgX;//每一小片图片在窗口显示的大小

BITMAP m_bmp;

int m_nPicWidth;//位图的宽度

int m_nStage;//每行分的块数

void RandPic();

BOOL IsWin(int m_nstage);

void Prompt();

CPcShow m_pShow[STAGE3+1][STAGE3];

};

#ifndef _DEBUG // debug version in pictrue1View.cpp

inline CPictrue1Doc* CPictrue1View::GetDocument()

{ return (CPictrue1Doc*)m_pDocument; }

#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PICTRUE1VIEW_H__B3AD57A0_446B_417E_B888_C1A61534CD44__INCLUDED_)

3. pictrue1View.cpp

……

CPictrue1View::CPictrue1View()

{ //随机时间

srand((unsigned)time(NULL));

//默认进入游戏是初级

m_nStage=STAGE1;

//CBitmap 对象关联位图句柄

m_bitmap.LoadBitmap(IDB_BITMAP2); //m_bitmap是程序运行过程中的当前位图

m_bitmap1.LoadBitmap(IDB_BITMAP2);

m_bitmap2.LoadBitmap(IDB_BITMAP3);

m_bitmap3.LoadBitmap(IDB_BITMAP4);

m_bitmap4.LoadBitmap(IDB_BITMAP5);

//未设置定时器

m_bTimer=FALSE;

//[开始按钮] 同时可以把一些初始化的工作放到这个函数里面来执行

OnStart();

}

void CPictrue1View::OnStart()

{

m_bitmap.GetBitmap(&m_bmp); //m_bmp获得位图信息放到BITMAP结构体中m_nPicWidth= ID_PIC_SIZE/m_nStage; // 图像宽度= 图像的大小/分的块数相当于一个正方形做的

RandPic();

//被分割后每一小片图片在窗口显示的大小

//图片的高和宽可能不一样要区分开来

m_nImgOrgX=m_bmp.bmWidth/m_nStage;//bmWidth是系统中图片的宽度

m_nImgOrgY=m_bmp.bmHeight/m_nStage;

m_nSecend=0; //已用时间

m_nStep=0; //已走步数

m_nStart=0; //是否已经开始拼图游戏如果已经开始了则开始计时和计步

if (m_bTimer) //因为每次都要清空,如果当前有定时器存在则删除定时器

{

KillTimer(1);//是一毫秒为单位的

m_bTimer=FALSE; //删除定时器后现在就没有定时器了

}

}

void CPictrue1View::RandPic()

{

int randNum; //存储随机数

int i,j;

int randArr[STAGE3*STAGE3]; //存储随机数的数组

int reverSum; //存储逆序和

do

{

reverSum=0;

//for循环:只用存储m_nStage*m_nStage 个随机数即可

// 0 2 3

// 4 5 6

// 7 8 9

for (i=1 ;i

{

randNum=int(rand()%(m_nStage*m_nStage-1))+2; //获得2 -- m_nStage*m_nStage的随机数

//比较重复情况

for (j=1 ;j

{

if (randArr[j] == randNum) //用上面获得的随机数和他之前的随机数比较

{ //如果发现有重复的随机数则重新随机

j=0;

randNum=int(rand()%(m_nStage*m_nStage-1))+2;

}

}

randArr[i]=randNum; //整形数组存储不重复的随机数

//获得逆序和

for (int n=1 ;n<=i ;n++)

{

if (randArr[i]

{

reverSum++;

}

}

}

}while(reverSum%2!=0); //如果逆序和为奇数则重新随即

randArr[0]=0; //第一个赋值为0

int pic=0;

for (i=0 ;i

{ // * * *

for (j=0 ;j

{

m_pShow[i][j].picIn=i*m_nStage+j; //picIn 是真实的

m_pShow[i][j].picOut=randArr[pic]; //picOut 是显示的取出数组中的不重复的随机数

pic++;

}

}

m_pShow[0][0].picIn=0; //第一行第一个为0

m_pShow[0][0].picOut=0; //0 表示为空可以移到到那个位置

//随机生成完毕

}

CPictrue1View::~CPictrue1View()

{

}

BOOL CPictrue1View::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

……

// 3*3 初级

void CPictrue1View::OnStage1()

{

m_nStage=STAGE1;

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_EASY,MF_BYCOMMAND | MF_CHECKED);

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_MIDDLE,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_HARD,MF_BYCOMMAND | MF_UNCHECKED);

OnStart();

Invalidate(TRUE);

}

// 4*4 中级

void CPictrue1View::OnStage2()

{

m_nStage=STAGE2;

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_EASY,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_MIDDLE,MF_BYCOMMAND | MF_CHECKED);

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_HARD,MF_BYCOMMAND | MF_UNCHECKED);

OnStart();

Invalidate(TRUE);

}

//5*5 高级

void CPictrue1View::OnStage3()

{

m_nStage=STAGE3;

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_EASY,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_MIDDLE,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_GAME_HARD,MF_BYCOMMAND | MF_CHECKED);

OnStart();

Invalidate();

}

……

void CPictrue1View::OnTimer(UINT nIDEvent)

{

CString strTime,strStep;

strTime.Format("已用时间: %d 秒",++m_nSecend);

CClientDC dc(this);

dc.SetBkColor(MARK_BK_COLOR);

dc.TextOut(XXX + ID_PIC_SIZE +ID_SIDE/5 ,300,strTime);

CView::OnTimer(nIDEvent);

}

void CPictrue1View::OnPicture1()

{

m_bitmap.DeleteObject();

m_bitmap.LoadBitmap(IDB_BITMAP2);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE1,MF_BYCOMMAND | MF_CHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE2,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE3,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE4,MF_BYCOMMAND | MF_UNCHECKED);

OnStart();

Invalidate();

}

void CPictrue1View::OnPicture2()

{

m_bitmap.DeleteObject();

m_bitmap.LoadBitmap(IDB_BITMAP3);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE1,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE2,MF_BYCOMMAND | MF_CHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE3,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE4,MF_BYCOMMAND | MF_UNCHECKED);

OnStart();

Invalidate();

}

void CPictrue1View::OnPicture3()

{

m_bitmap.DeleteObject();

m_bitmap.LoadBitmap(IDB_BITMAP4);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE1,MF_BYCOMMAND | MF_UNCHECKED);

GetParent()->GetMenu()->GetSubMenu(1)->CheckMenuItem(ID_PICTURE2,MF_BYCOMMAND | MF_UNCHECKED);

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)编译环境 开发工具

基于Android 益智拼图游戏设计毕业论文

基于Android 益智拼图游戏设计毕业论文 目录 摘要........................................................... I I Abstract....................................................... I II 1 绪论. (1) 1.1 课题开发的背景 (1) 1.2 课题意义 (1) 2 Android架构与开发平台搭建 (2) 2.1 Android的系统架构 (2) 2.2 Window下Android开发环境的搭建 (4) 3 流程介绍与概要设计 (5) 3.1 游戏流程介绍 (5) 3.2 系统概要设计 (6) 3.2.1 界面布局模块 (6) 3.2.2 难度选择模块 (6) 3.2.3 图片选择模块 (7) 3.2.4 步数和时间模块 (7) 3.2.5 游戏实现模块 (7) 4 系统详细设计与实现 (8) 4.1 界面布局实现 (8) 4.1.1 选择界面布局 (8) 4.1.2 游戏界面布局 (9) 4.2 游戏功能实现 (11) 4.2.1 难度选择 (11) 4.2.2 图片选择 (12) 4.2.3 步数和时间设置 (13) 4.2.4 拼图的实现 (14)

5 系统测试 (17) 5.1 Android仿真器介绍 (17) 5.2 功能模块测试 (17) 5.3 出现的错误及解决方案 (20) 6 总结与展望 (21) 参考文献 (22) 附录 (23) 致谢 (33)

基于Android益智拼图游戏设计 摘要 随着移动设备的日益普及,使用Android技术开发手机软件受到越来越多人的青睐。在此背景下,本课题开发了一款Android平台下的手机游戏——益智拼图。 本文首先对Android的研究背景,系统架构以及开发环境进行介绍,然后就玩家对游戏的需求进行一定的分析,最后运用Android技术实现拼图游戏的开发,并合理布局游戏界面,使游戏界面更加美观和人性化,实现了游戏的基本功能,最终可以让玩家享受拼图游戏的乐趣。 关键词:Android;拼图游戏;Activity;架构

数字拼图游戏

安徽新华学院计科软件测试方法和技术 课程设计任务书 一、设计题目:数字拼图游戏(出题人:於世芳) 说明:一个拼图游戏。 二、目的与要求 1.目的 培养学生综合利用JAVA语言进行程序设计的能力,主要是培养学生利用JAVA的标准控件进行应用程序设计的技能。 2.基本要求 ?能够实现拼图功能。 ?可以通过初始化任意次的重新游戏。 ?游戏完成后做出相应提示. 3.创新要求 在基本要求达到后,可以参考其他拼图游戏,进行创新设计,创新方向提示如下: ★将数字换成图片。 ★可以记录游戏者成绩并排行 ★增加暂停功能或窗口最小化时暂停计时。 三、设计方法和基本原理 1.问题描述 程序界面见题图。 2.问题的解决方案 ①设计程序界面 因为用的全是基本控件,界面设计没有什么难度,这里涉及到动态添加控件数组,可参见课本控件数组一节内容。 ②编写代码 代码包括事件处理过程和功能函数,还有必要的声明。变量声明部分声明本程序所需要的变量和数组。

事件处理包括下面的主要事件: Form_Load() 作一些初始化的工作。主要是设定初始等级,动态添加控件数组。 Private Static Sub cmdButton_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) 游戏运行。 cmd_Click( ) 游戏初始化 其它功能的处理不再一一描述了 四、主要技术问题的描述 虽然界面操作有些复杂,但难点显然并不在于此。下面是初始化设置中的一段程序:package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; import flash.text.TextField; //import mx.controls.Alert; public class Main extends Sprite{ var arr:Array=new Array(1,2,3,4,5,6,7,8); var ditu:Array=new Array(new Array(3),new Array(3),new Array(3)); var pailie:Array=new Array(new Array(0,0),new Array(40,0),new Array(80,0), new Array(0,40),new Array(40,40),new Array(80,40), new Array(0,80),new Array(40,80),new Array(80,80));

java拼图游戏面向对象课程设计报告

姓名Name 学号 Student No. 20137045 班级 Class 代码总行数Code Lines 222 项目名称 Item 1.实验目的 本次课程设计旨在通过一个完整项目的开发,巩固面向对象程序设计、软件工程、数据库技术等课程的相关知识,加深学生对Java语言的理解,尤其是对面向对象思想、Java编码规范、JDBC访问数据库的理解,使学生进一步掌握环境构建、代码编写、文档阅读与理解、文档编写、软件测试、发行与部署等技能,进一步提高学生的学习能力、理解能力、表达能力及沟通能力。 2.实验内容 本次课程设计选定的实验项目是使用JAVA语言编写一个拼图游戏并实现其基本功能。不用自己手动切割图片,再进行加载。而是应用类方法在内存中进行图片切割和加载,方便了用户的使用。 利用了Graphics中的public abstract boolean drawImage()方法把img 中由(sx1, sy1)(sx2, sy2)指定的矩形区域画到observer 中由(dx1, dy1)(dx2, dy2)指定的矩形区域内进行构思拼图游戏的具体实现。 导入了一个可播放背景音乐的jar包,在玩游戏时可以欣赏背景音乐。 3.类图

4.运行界面

图1、游戏初始界面 图2、游戏运行界面

图3、拼图成功界面 5.关键代码(要求在类的定义以及方法定义的前面给出相关描述信息)//定义一个Pintu类 public class Jpgsaw extends JFrame{

private Image image, buff; //原始图片,缓存图片 private int[][] map = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8} }; //定义数组map,给分割后的图片标号 private Point point = new Point(2, 2); //记录第九块图片位置 private int sx; //分割后每一个图片的宽度 private int sy; //分割后每一个图片的高度 private Canvas canvas; //加载图片容器,定义可以显式定位子元素使用坐标是相对 Canvas 区域的区域,绘制图形 private Graphics gs; //gs画出Canvas图片坐标 private Graphics gb; //gb画出buff图像 private boolean isRunning = false; //游戏是否正在进行 private JButton start = new JButton("开始新的游戏"); // 按钮1 private JButton show = new JButton("显示正确图片"); //按钮2 private JTextArea showStep = new JTextArea("显示步骤");//设置步骤显示 private JPanel panel = new JPanel(); //一般轻量级面板容器,装在上面2个按钮 private int steps = 0; // 记录移动的步骤 public Jpgsaw(String title) { //构造方法,初始化变量 super(title);//调用了当前类Jpgsaw的父类JFrame的构造方法 try { //异常抛出 image = ImageIO.read(new File("gg.jpg")); //装载图片 } catch (IOException e) {//捕获自定义的异常 e.printStackTrace(); } initScreen(); //用此方法来初始化canvas,由于canvas 初始化较复杂,所以单独写一个方法 buff = new BufferedImage(715, 381, BufferedImage.TYPE_INT_BGR);//Image的一个子类,BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片 gb = buff.getGraphics();//存在于Image类中,存在于缓冲器中的图片,设置坐标 sx = image.getWidth(this) / 3;//图片分割后每一个图片的宽度 sy = image.getHeight(this) / 3;//图片分割后每一个图片的高度 setLayout(new BorderLayout());//设置此布局方法,加入控件 add(panel, BorderLayout.SOUTH);//布置容器的边框布局,它可以对容器组件进行安排,并调整其大小 add(canvas, BorderLayout.CENTER); panel.setLayout(new GridLayout(1, 4));//把组件按指定的几行几列分开,添加其他组件时,会按添加的顺序挨个添加到该组件上 panel.add(start); panel.add(show); panel.add(showStep); showStep.setEditable(false);//步骤默认false,使调用这个函数的控件不能被编辑 showStep.setFont(new Font("黑体", Font.PLAIN, 16));//设置字体

Java课程设计——拼图游戏

拼图游戏 1.游戏规则介绍 (1)本游戏中有一个格子是空的,其他格子内随机放置由要拿来拼图切割成的8个小图片。在开始游戏之前,会出现一张完整的图片,点击“菜单”里面的“开始”, 进行拼图游戏,通过将空格旁边的小图片与空格交换位置(不断的移动方块), 来实线拼图,直到方块一行一行的按图片的原始样子拼好即可完成该游戏。在 移动过程中,窗口右边会显示移动的步数。 (2)游戏拼完后,会弹出一个信息框,询问是否再玩一局,点击“Yes”将再打开一个游戏开始的界面,可以继续新的一局游戏,点击“No”将结束游戏,关闭所有窗 口。 2.游戏实现的功能 (1)点击运行程序,将弹出一个窗口,显示一张完整的图片。 (2)菜单栏的菜单,会出现3个菜单项:“开始”、“重新开始”、“结束”。 点击“开始”,即开始一局游戏;“在游戏的任何时候点击”重新开始“,即结束 当前游戏,重新开始一局新的游戏;点击“退出“,立即退出游戏,关闭窗口。 (3)在游戏过程中,游戏界面右边会同步显示当前的步数。 游戏的一些界面: (1)主界面: (2)菜单项:

(3)帮助--->关于 (4)点击开始 (5)游戏过程 (6)游戏成功

(7)破纪录 3.程序实现 Pt类: (1)建立一个类Pt,public class Pt extends JFrame implements KeyListener{}。该类继承父类JFrame,实现KeyListener接口。 (2)Pt类的构造函数Pt()。定义窗口参数,添加菜单栏和多个标签;调用读文件函数read (),读取该游戏的最高记录,并将该记录输出到标签上;为各个菜单添加事件,鼠标点击“开

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在指定位置上进行绘画,实现图形的分割。 3、系统需求分析 (1)系统功能 简单的拼图游戏应该有拼图、计时、判断拼图成功、游戏者用时统计排名等功能, 拼图内部还应该有难度选择、相邻拼图块自动拼图等功能。图1所示是拼图游戏的用例 图,表明拼图游戏的主要功能。 图1 (

java拼图游戏图片插入与分割

public static void cut(String srcImageFile, String descDir, int destWidth, int destHeight) { try { Image img; ImageFilter cropFilter; // 读取源图像 BufferedImage bi = ImageIO.read(new File(srcImageFile)); int srcWidth = bi.getHeight(); // 源图宽度 int srcHeight = bi.getWidth(); // 源图高度 if (srcWidth > destWidth && srcHeight > destHeight) { Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT); destWidth = 200; // 切片宽度 destHeight = 150; // 切片高度 int cols = 0; // 切片横向数量 int rows = 0; // 切片纵向数量 // 计算切片的横向和纵向数量 if (srcWidth % destWidth == 0) { cols = srcWidth / destWidth; } else { cols = (int) Math.floor(srcWidth / destWidth) + 1; } if (srcHeight % destHeight == 0) { rows = srcHeight / destHeight; } else { rows = (int) Math.floor(srcHeight / destHeight) + 1; } // 循环建立切片 // 改进的想法:是否可用多线程加快切割速度 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // 四个参数分别为图像起点坐标和宽高 // 即: CropImageFilter(int x,int y,int width,int height) cropFilter = new CropImageFilter(j * 200, i * 150, destWidth, destHeight); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(img, 0, 0, null); // 绘制缩小后的图 g.dispose(); // 输出为文件

java课程设计-拼图游戏代码

package love; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.*; public class Games extends JFrame implements ActionListener { private JButton buttons[][];// 存储按键的数组 private Container container;// 一个容器 private GridLayout layout;// 布局方式为GridLayout private int count = 0, is[] = new int[8];// count的作用是计算按键移动的次数,is[]储存一个随机产生的1到8数字数组 public Games() { super("拼图游戏");// 设置标题 layout = new GridLayout(3, 3);// 3行3列 container = getContentPane();// 该容器的布局方式,及其重要,否则产生空引用异常 container.setLayout(layout);// 将该布局方式作用于容器 buttons = new JButton[3][3];// 给按键数组分配储存空间 int locate1, locate2;// locate1用来指示当前产生的元素 locate2用来指示locate1之前的元素 for (locate1 = 0; locate1 < 8; locate1++) {// 该方法作用是产生1到8这8个数,随机分配给数组,即无序排列 int g = new Random().nextInt(8) + 1;// 随机产生一个空白按键,即不显示的那个 is[locate1] = g; for (locate2 = locate1 - 1; 0 <= locate2; locate2--) { if (is[locate1] == is[locate2]) break; } if (locate2 != -1) locate1--; } int temp = 0; int r = new Random().nextInt(3);// 随机产生一个0到3的数,代表空白按键的行 int l = new Random().nextInt(3);// 随机产生一个0到3的数,代表空白按键的列 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) {

java拼图游戏代码

Puzzle类: package com.eavan; public class Puzzle { public static void main(String[] args) { // TODO Auto-generated method stub new PuzzleWin(); } } PuzzleWin类: /** * 可以为游戏添加一个计时的功能,让时间成为一个判定标准* 可以分析一下为什么图片不清楚 * 可以向怎么能够让选择图片和选择难度没有顺序性(较容易)* */ package com.eavan; import java.awt.Color; import java.awt.FileDialog; import java.awt.Graphics; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.GridLayout; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Transparency; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel;

VB课程设计报告--拼图游戏

VB课程设计报告 —拼图游戏 知识点:控件数组,公共对话框控件,PictureClip控件,多模块程序设计,图片的应用。 1.题目介绍 “拼图”是一种老少皆宜、容易上手的益智类小游戏,本题目要求编制一个拼图游戏程序。使用方法如下: (1)指定一幅图片,将其分割成m × n 个小图块并且打乱顺序后重新排列,其中有一块没有图块的“空挡”。 (2)使用鼠标单击与空挡相邻的图块使该图块与空挡的位置互换。(3)利用空挡位置移动各图块,最终恢复图片原貌,完成拼图。移动的步数越少则说明游戏者的水平越高。游戏过程中,可以打开参考图帮助找到正确的位置。 2.功能要求 (1)运行程序,在进入游戏之前显示一个背景图片。 (2)选择菜单中的“打开图片”命令,显示打开图片对话框,“打开图片”对话框使用公共对话框控件实现,并且只能指定以*.jpg *.bmp 为扩展名的文件。可以在查看菜单中选着“缩略图”进行预览。(3)选择图片之后,程序弹出“指定行列数”对话框,提示将图片分几行几列。使用微调按钮可以调节行数和列数,限制在3-7之间。(4)指定行列数之后,单击确定返回主窗口,程序自动按照指定的

行列数将图片进分割,然后随机排列。 (5)打乱的图片中一空挡位置,用户单击与空挡相邻的图块可以与其互换位置。点击了空挡或者与其不相邻的,程序不做任何操作。原图只少右下角的图块。 (6)图片复原时,程序显示消息框表示祝贺,同时显示游戏共使用的步数。 (7)游戏过程中,如果用户希望参考原图,可以单击“显示原图”按钮,打开“参考图”窗口。 (8)窗体中的背景颜色可以改变,从菜单中选择“背景颜色”命令,弹出“颜色”飞、公共对话框,用户从中选择一颜色即可。 (9)在游戏过程中或在完成后,均可退出程序或选择“打开图片”菜单命令重新开始一个新图片。 (10)“参考图”窗口应是一个非模态窗口,在关闭主窗口时同时卸载,而不是隐藏,否则该程序不会完全关闭,仍会驻留内存。 3.程序设计 概述:(1)PictureClip 控件来管理打开图片并将其分为指定的行列图块,其Picture、Rows、Cols等属性值应在程序中设定。 (2)使用image控件数组来显示图块,设计时只需在窗体上放置一个image控件并将其的index设为0 ,其他的用load语句加载。 (3)“打开图片”和“颜色”对话框commondialog控件实现。设置其filter属性使之只能打开bmp和jpg类型的图片文件。 (4)将image控件的stretch属性设计为TRUE。

java拼图游戏设计报告

《Web程序开发》课程 大作业 拼图游戏 3011212046 张杰 2014.11

一、题目说明 拼图游戏不仅可以帮助人们打发时间,还可以用于锻炼儿童脑力,帮助少儿开发大脑思维,拼图游戏结合了许多元素,可以图片切割,游戏拼图,游戏成功时和打破记录时的判断,同时还有游戏时间和步数的记录,并以文档形式进行保存。在拼图时首先把图片添加到background目录下,程序会自动获取该目录下的所有文件,并加载到游戏中,进行切割后,显示在拼图按钮上。 本游戏使用Java语言设计,开发平台为JDK。开发工具Eclipse。JDK是Sun Microsystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。JDK是学好Java的第一步。从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。 二、题意分析 因为要制作拼图游戏,所以首先要实现图片的导入。这是通过getImage()函数来实现的,该函数有两个参数,第一个参数指明图片的路径,第二个参数指明图片的名称。然后,因为要实现图片摆放的随意性,所以要通过initgame()函数来实现。Initgame()函数是自写函数,在函数体内,通过调用Math.random()函数产生随机数,用来达到图片位置摆放的随意性和随机性。最后,因为要实现人机交互.,所以首先要通过一系列函数来实现对鼠标事件的监听和响应,这是通过函数addMouseListener(this) 和addMouseMotionListener(this)来完成的。这样程序会区分用户对鼠标不同的操作,正确执行相应的功能。 游戏操作流程: 开始游戏 操作游戏 游戏完成

Flash拼图游戏制作课程设计报告

目录 第1章需求分析 (1) 1.1 引言 (1) 1.2 课程设计题目 (1) 1.3 课程设计目的 (1) 1.4 程序运行环境及开发工具 (1) 1.5 课程设计任务及要求 (1) 第2章概要设计 (2) 2.1 设计原理及方法 (2) 第3章详细设计 (3) 3.1 第一步: (3) 3.2 第二步: (3) 3.3 第三步 (4) 3.4 第四步 (5) 3.5 第五步 (5) 3.6 第六步 (6) 3.7 第七步 (7) 3.8 第八步 (8) 3.9 第九步 (8) 3.10 第十步 (9) 3.11 第十一步 (9) 3.12 第十二步 (10) 3.13 第十三步 (10) 3.14 第十四步 (11) 第4章系统调试与运行结果 (13) 4.1 系统调试 (13) 4.2 运行结果 (14) 第5章总结与体会 (15) 参考文献: (15)

第1章需求分析 1.1 引言 FLASH作为一款目前最流行的网络动画制作软件,恐怕不知道的人少之又少。其实FLASH强大的功能不光能让我们轻松制作动画,我们还可以利用它完成一些意想不到的工作。比如说是拼图游戏,在这个领域应用非常广泛!而且可以制作各种丰富有趣的小游戏来,是非常的有趣的! 1.2 课程设计题目 拼图游戏设计 1.3 课程设计目的 本课程的设计的目的是通过实践使同学们经历多媒体应用系统开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的知识。结合具体的案例,理解并初步掌握常用多媒体软件的使用,利用多媒体计算机等设备进行音频与视频数据的获取和处理、图像处理与图像文件格式转换、超文本超媒体在交互式多媒体软件的应用;通过《多媒体课程设计》实验,使学生能够达到提高多媒体技术的实际开发应用能力,了解系统分析、系统设计、系统实施的主要环节和步骤以及软件文档的制作过程。 1.4 程序运行环境及开发工具 硬件:PC机一台 软件:Windows 7,PhotoshopCS4,Flash8 1.5 课程设计任务及要求 设计“拼图游戏”,游戏是Flash制作中很重要的一部分,主要应用的是flash内

课程设计与开发

课程设计与开发

任务导向式课程设计与开发方法培训 解决任何问题的核心是:学习成长改变 学习:要有终身学习的能力,也就是学力 成长:当你的成长速度跟不上爱人时,婚姻就出现问题 当你的成长速度跟不上学生时,教育就出现问题 当你的成长速度跟不上老板时,工作就出现问题 当你的成长速度跟不上下级时,管理就出现问题 当你的成长速度跟不上市场时,公司就出现问题 改变:改变才是最伟大的历练。 情商和平台:一根绳子可以卖五块,但绑在螃蟹上就值五十块,这就是平台。想成功先发疯,头脑简单往前冲。 进入课程: 小组讨论: 问题:任务完成过程中的知识点如何体现? 开发目标 信息化 标准定位 到底对学生有没有帮助? 一、课程开发是什么? 开发一门课,包含什么 为什么有这么多问题出现? 1.没有统一的方法论。 2.每一个任课教师永远站在局部,不知专业标准是什么。 3.其实课程开发的能力是教育部对每一个教师的要求。 二、为什么是企业的人来分享职业教育课程设计与开发? 1.我国职业教育面临的挑战 一是高校专业设置,人才培养方向与市场需求变化不同步

课程开发项目管理 团队、时间和预算是三个要素 (一)课程开发计划 团队、时间和预算 团队: 1.需要什么角色的人(项目经理、教学设计者、业务内容专家、图形美化师、文档开发者、种子讲师); 2.主要角色的职责与能力要求 游戏:拼图游戏 时间 阶段划分(时间配比):分析(20-25%)、设计(10-20%)、开发(25-40%)、验证(15-30%)、评估(5-10%)。 预算 实操练习: 任务:根据选定的课题,明确开发团队角色分工、细化开发进度,参照课程开发计划模板,完成课程开发计划 成果:《课程开发计划》海报

VB课程设计:拼图游戏

Visual Basic课程设计报告 题目1:拼图游戏难度: *** 指导教师: 姓名: 学号: 专业: 班级: 学院: 日期:

1.题目简介 (1)本题目要求设计一个拼图游戏程序,要求如下: 指定一幅完整的图片,将其分割成m*n个小图块,打乱后重新排列,其中有一个没有图片的“空当”如图———— (2)使用鼠标单击与空当相邻的图块可以与其互换位置。 (3)利用空当位置使原图恢复原来的顺序,并记下玩家的移动步数,游戏过程中可以查看参考图以方便顺利通过游戏。

2、设计思路与总体方案 本程序包含五个窗体模块,其中以窗体frmMain的作用最为主要,该模块负责加载选定的图片并按所选的行列数分割,进行随机排列并加载空当,实现鼠标点击时其中的图块时与相邻的空当进行替换,实现拼图完成这个结束动作。 该模块中主要的变量有Rows ,Cols ,Arrange() ,space,started,steps showref Function isOK() 其中,Rows ,Cols ,showref这三个为全局变量,分别表示行数,列数,以及是否显示参考图(因此showref为逻辑型变量)其余变量为模块级变量,started也为逻辑变量,负责显示游戏是否已开始,Arrange()数组表示联系图像控件与数组的关系,space显示空当的位置,steps来记录玩家所走的步数,Function isOK()用来检验拼图是否已经完成的函数,为逻辑性变量。除外,过程变量tt(0 to2),b(0 to 2),s ,r ,c用来写入或读取排行榜中的记录。 其中,还设有菜单栏,通过CommonDialog控件负责实现“打开图片”与“配置颜色”对话框,并同时还拥有打开frmRecod(排行榜窗体模块)的工能。 主要代码(游戏初始时加载图片): Dim i As Integer Dim n As Integer CD.Filter = "图片文件(*.JPG,*.BMP)|*.jpg;*.bmp" CD.DialogTitle = "打开图片" CD.InitDir = App.Path & "\pics" CD.ShowOpen (显示指定图片对话框)If CD.FileName = "" Then Exit Sub If started Then For i = 1 To Rows * Cols - 1 '(清除已有的控件数组元素) Unload imgPT(i) Next imgPT(0).Picture = LoadPicture() If showref Then frmRef.Image1.Picture = LoadPicture() Else Me.Picture = LoadPicture() End If frmDivide.Show 1, Me ' (显示指定行列对话框)PC.Picture = LoadPicture(CD.FileName) PC.Rows = Rows PC.Cols = Cols n = Rows * Cols imgPT(0).Width = 320 / Cols ('窗体以像素为单位)

拼图游戏案例的设计

拼图游戏案例的设计 摘要:拼图游戏的设计,首先考虑窗口布局,因为在窗口的上部需要边界布局,而 那二十五个小按钮需要采用网格布局,因而直接将组件添加到Jframe窗口中是不可行的,可以通过将窗口上部和下部的组件分别添加到两个面板Jpanel中,将两个面板加到Jframe窗口中。然后实现图片的随机排放,通过循环生成图片正确摆放顺序的二维数组和图片随机摆放顺序的二维数组来实现。最后,实现图片的移动,通过两个按钮的行索引想减得绝对值与列索引想减得绝对值的和是否为1,来判断被点击按钮与空白按钮是否相邻,如果相邻,则令显示空白图片的按钮显示被单击按钮显示的图片,令被单击的按钮显示空白的图片。 关键字:Java软件拼图游戏Jpanel面板 引言:拼图游戏是一种弹性很好且耐玩的游戏,它可以启发智力及帮助其养成解决 事情的能力。玩拼图有助于手眼协调,它能训练和了解“部分”与“全部”的关系—可以知道许多的“部分”能拼凑出一个“全部”,以及“一个全部”是由“许多部分”所组成的。拼图平面组合的概念—积木是立体的组合,而拼图是一种平面组合的概念,在局限的2D范围内拼出一个物品,一个合乎与逻辑的东西。拼图游戏需要耐心的操作和手眼协调能力,只要一不协调就不能将数据块放在正确的位置。 一基础知识 JButton(按钮)组件:通过SetText(String text)方法设置按钮的标签文本,通过setIcon(Icon defaultIcon)方法设置按钮在默认状态下显示的图片。JButton组件只是在按下和释放两个状态之间进行切换,当Button按钮被点击时,会触发ActionEvent事件,此事件由ActionListener(事件监听器)接受并做处理,因而调用按钮的addActionListener(ActionEvent e)方法,为该按钮指定监听者。 Jlabel(标签)组件:Jlabel组件用来显示文本和图像,通过setText(String text)方法设置标签显示的文本,通过setIcon(Icon icon)方法设置标签显示图片。BorderLayout布局管理器:由BorderLayout类实现的布局管理器称为边界布局管理器,它的布局方式是将容器划分为五个部分,即NORTH(容器顶部)、WEST(容器左侧)、CENTER(容器中间)、EAST(容器右侧)、SOUTH(容器底部)。如果组件容器采用了边界布局管理器,在将组件添加到容器时,需要设置组件的显示位置,通过方法add(Component comp,Object constraints)添加并设置,该方法的第一个参数为欲添加的组件对象,第二个参数为组件的显示位置。 GridLayout布局管理器:由GridLayout类实现的布局管理器称为网格布局管理器,它的布局方式是将容器按照用户的设置平均划分成若干网,通过构造方法GridLayout(int rows,int cols)创建网格布局管理器对象是,参数rows用来设置网格的行数,参数cols用来设置网格的列数。 JPanel面板:如果将所有的组件都添加到Jframe窗体提供的默认组件容器中,则在一个界面中的所有组件只能采用一种布局方式,很难得到一个美观的界面,并且有些布局方式只能管理有限个组件。通过使用Jpanel面板,首先将面板和组件添加到Jframe窗体中,然后再将子面板和组件添加到上级面板中,这样就可以向面板中添加无数个组件,并且通过对每个面板采用不同的布局管理器,解决众多组件间的布局问题。Jpanel面板默认采用FlowLayout布局管理器。 Java程序的Application类型:特点是“Java应用”是可以独立运行的java程序。需要经过三个步骤:编写源文件,一个java应用程序必须有一个类含有public static void main (String args[])方法,这个类是应用程序的主类,源文件的名字和主类的名字完全相同。编译java源程序,创建源文件后,就要使用编译器(javac.exe)对其进行编译。运行java程序,从主类的main方法开始执行。 二拼图游戏设计思路与步骤 题目要求:所谓拼图游戏,是指将一个完整的图片分割成若干个规则的小图片,然后将这些小图片随机地拼接在一起,然后由玩家按照原图重新拼接出正确的图片。程序运行界面如下图所示,左上角的图片为供玩家参考的原图,下面每一个小网格都是一个小图片,在开始游戏时这些小图片是杂乱无章的,在图中有一个网格是空白的,玩家可以通过单击与其相邻的网格,即位于其上、下、左、右的四个网格,将被单击网格中显示的小图片移动到空白网格中,然后被单击的网格将变为空白,经过这样反复的移动,将会将图片重新拼接成原图像。当点击按钮“下一局”时,每个移动模块中的图片自动随机更新。 第 1 页共6 页第 2 页共6 页

java拼图游戏完整代码

// Cell.java package cn.itcast.picture.ui; import javax.swing.Icon; import javax.swing.JButton; /* * 图片小方格类 */ public class Cell extends JButton { //带有图片的小方格 public Cell(Icon icon) { super(icon); //设置小方格大小 this.setSize(150, 150); } //带有图片和文字的小方格 public Cell(String text, Icon icon) { super(text, icon); //设置小方格大小 this.setSize(150, 150); this.setHorizontalTextPosition(CENTER);//设置文字水平居中显示 this.setVerticalTextPosition(CENTER);//设置文字垂直居中显示 } // public void move(String direction) { switch (direction) { case "UP": this.setLocation(this.getBounds().x,this.getBounds().y-150); break; case "DOWN": this.setLocation(this.getBounds().x,this.getBounds().y+150); break; case "LEFT": this.setLocation(this.getBounds().x-150,this.getBounds().y); break; case "RIGHT": this.setLocation(this.getBounds().x+150,this.getBounds().y);

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

目录 一、题目介绍、、、、 (3) 1、题目、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、3 2、任务、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、3 3、要求、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、3 二、需求分析、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、3 三、概要设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4 1、功能分析、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4

2、界面初始化、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4 3、事件处理(1)鼠标事件、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、4 4、事件处理(2)键盘事件、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、5 5、状态判断、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、5 6、程序流程图、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、5 四、详细设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、6 1、、html代码设计、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、6