《游戏开发基础-基于Unity游戏引擎》全套教学课件_第1页
《游戏开发基础-基于Unity游戏引擎》全套教学课件_第2页
《游戏开发基础-基于Unity游戏引擎》全套教学课件_第3页
《游戏开发基础-基于Unity游戏引擎》全套教学课件_第4页
《游戏开发基础-基于Unity游戏引擎》全套教学课件_第5页
已阅读5页,还剩279页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Unity游戏引擎介绍全套可编辑PPT课件什么是游戏引擎一款完整的游戏引擎,能够提供给游戏开发者稳定的底层框架和完善的游戏创作工具,使得开发者更加关心游戏的内容和可玩性,不用再去过多地担心游戏程序的底层细节,而且能够让开发出来的游戏产品更加稳定可靠。有了游戏引擎,游戏的开发过程更加简单,同时大大降低开发成本、缩短开发周期,进而降低研发的风险。出于以上原因,越来越多的开发者倾向于使用健全的游戏引擎来制作自己的游戏。正因为有庞大的市场需求,游戏引擎的市场才逐渐形成。UnrealEngine4(虚幻引擎,UE4)CryEngineCocos2DUnityEngine什么是游戏引擎简单地说,引擎就是“用于控制所有游戏功能的主程序,从计算图形图像、碰撞、物理系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等。”无论是2D游戏还是3D游戏,无论是角色扮演游戏、即时策略游戏、冒险解谜游戏或是动作射击游戏,哪怕是一个只有1兆的小游戏,都有这样一段起控制作用的代码。经过不断的进化,如今的游戏引擎已经发展为一套由多个子系统共同构成的复杂系统,从建模渲染、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业的所见即所得编辑工具和插件,几乎涵盖了开发过程中的所有重要环节。总而言之,游戏引擎是一种可复用的、适应性较强的游戏开发中间件,游戏开发人员可以使用同一套游戏引擎来开发出不同的游戏产品甚至可以很方便地把同一款游戏产品发布到不同的运行平台上。/madewith资源商店提供了各种免费或者付费的资源和插件。Unity的下载与安装Unity官方地址:Unity的下载与安装Unity下载地址(点击首页的“获取Unity”进入):/cnUnity的下载与安装点击“使用个人版”进入下载页面->下载Windows版安装程序(如果是苹果Mac操作系统,请选择MacOSX版的安装程序),下载Unity安装助手Unity的下载与安装运行Unity安装助手Unity的下载与安装运行Unity安装助手运行Unity双击Unity图标,打开UnityUnity游戏工程的构成结构Project工程:一个游戏便是一个工程;Scene场景:一个游戏包括一个或者多个游戏场景/关卡。GameObject游戏对象:构成游戏的各种对象,例如场景模型、角色以及其他抽象(如某种控制模块)的但是确实存在于场景中的对象。Component组件:是Unity的核心架构。每个游戏对象由一个或者多个组件构成,每种组件赋予游戏对象某种功能。Script脚本:是实现Component的脚本程序,现在Unity支持C#语言(一种与Java语言类似的语言,只要会Java,上手C#非常简单)。Unity中定义的重要概念资源(Assets):在3D游戏的制作过程中,需要用到各种各样的资源,这些资源包括模型、贴图、声音、程序脚本等等。在Unity3D中通通被称为资源(Asset),可以把资源比喻成3D游戏制作过程中的原材料,通过原材料的不同组合和利用,便形成了一个游戏产品。Unity中定义的重要概念工程(Project):在Unity3D中,工程就是一个游戏项目。这个工程包括了该游戏场景所需要的各种资源,还有关卡、场景和游戏对象等等。在创建一个新的游戏之前,必须先创建一个游戏工程。游戏工程可以想象成实现游戏的工厂。它里面有游戏的资源仓库、制作游戏的装配间和打包输出的车间等等。Unity中定义的重要概念场景(Scenes):场景可以想象成一个游戏界面,或者一个游戏关卡。在一个打开的场景中,游戏开发者通过编辑器为该场景组装各种游戏资源,这些资源被放置到场景中之后成为一个个游戏对象,通过这些游戏对象实现该游戏关卡中的各种功能。场景相当于制作游戏过程中不同部分的不同车间,在不同的车间中,搭建不同的场景。。Unity中定义的重要概念游戏对象(GameObject):游戏对象是组成游戏场景必不可少的对象。各种各样的游戏对象通过资源的组装并加入到游戏场景中,只有某种资源被放置在游戏场景中,才会生成游戏对象。游戏对象根据功能的需要有不同的属性,通过这些属性来控制游戏对象的不同行为。。Unity中定义的重要概念组件(Component),在Unity3D中是用于控制游戏对象属性的集合。每一个组件包括了游戏对象的某种特定的功能属性,例如Transform组件,用于控制物体的位置、旋转和缩放。可以通过组件中的参数来修改物体的属性,甚至你通过编写一个脚本程序并把该程序添加到游戏对象中,成为它的一个组件,并利用监视器(Inspector)来编辑你想要的属性值。简而言之,组件其实就是定义了游戏对象的属性和行为。Unity中定义的重要概念脚本(Scripts):我们知道,游戏与其他娱乐方式(电影、图书、电视、广播等等)的最大区别在于可互动性。互动性是游戏的最基本特征之一,而程序脚本便是实现可互动性的最有利的工具。通过编写程序可以控制游戏中的每一个游戏对象,我们可以让他们根据我们的需要改变他们的状态和行为。最新版本的Unity支持C#程序语言。Unity支持使用C++、Java等其他语言编写的插件。Unity中定义的重要概念预置(Prefabs):有的时候我们会在Unity3D中为游戏对象添加各种组件,并设置好它的属性和行为,最后需要反复利用这些已经修改好的对象。Unity3D为我们提供了一种保存这种设置的方法,该种方法称为保存预置(Prefab)。界面与操作介绍Unity中的C#程序基本语法变量声明(变量名规定首字母为小写,使用驼峰命名法):[public/private][int/float/bool/double/string/GameObect]ValName=[defaultVal];如publicintscore=0;privatefloatspeedVal=20f;函数声明(函数名规定首字母为大写,使用驼峰命名法):[public/private]returnValFunctionName(ParametersList){FunctionBlock}如publicintHurtCharacter(intdamageVal){damage-=damageVal;}类的声明(类名规定首字母为大写,使用驼峰命名法):[public/private]ClassName:[SuperClass]{}学习要点:语法与Java的语法非常类似,只是一些表达方式有所区分,如继承的表达在java中是extends,在C#中用的是冒号:。在编程的学习中,不要刻意追求某种语言的好与坏,只有是否合适,没有最好的。同时,掌握了基本的编程思想(如面向对象编程、面向过程编程、数据结构以及相关算法)后,基本上可以做到语言无关。使用Unity中的C#进行程序编程,除了面向对象的基本语法之外,还需要了解它所提供的API,同时要熟悉一些常用的API。Unity手册:

/Manual/index.htmlUnity脚本APIDocumentation:

/ScriptReference/index.htmlUnity中的关键事件回调机制在游戏的整个运行机制中,最关键的一个架构便是游戏大循环,如果使用C++或者java等实现一个游戏时,基本上都要使用到大(主)循环。但是在游戏引擎中,该大循环已经给你封装起来,只为你提供相关的调用接口,所以需要熟悉这些接口的调用时机和作用。Unity中的关键事件回调机制Awake():一个游戏对象被创建之前会被调用一次,主要用于初始化一些参数。Start():一个游戏对象被激活时调用一次,也是用于初始化一些参数。Update():游戏大循环的入口,每一帧会被调用一次,直到游戏结束。该函数主要用于监听和更新各种事件和参数。比如监听键盘输入,使游戏对象改变位置等等。OnEnable():当一个游戏对象被激活时调用一次。OnDisable():当一个游戏对象失效时,但未销毁时被调用一次。其他回调函数:在Unity中,如果函数前面带有On介词,那么便表示为回调函数。要使得脚本具有以上回调函数功能,该类需要继承自Unity的MonoBehavior类。其他回调函数可以参考文档:

/Manual/ExecutionOrder.html代码演示创建一个脚本,名为:EventTest输入一下代码:保存后把代码挂在场景中的MainCamera对象上。点击运行,观察控制台。

游戏开发基础

--打地鼠游戏制作(Whac-A-Mole)浙江传媒学院:张帆本章内容介绍—打地鼠游戏洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。当时间少于15秒时增加地鼠出现频率。实现锤子的击打动画。为游戏加上音效。重新开始游戏。导出游戏。《打地鼠》游戏介绍《打地鼠》(原名:Whac-A-Mole)最早可以追溯到1976年由美国创意工程股份有限公司(CreativeEngineering,Inc.)推出的一款有偿街机游戏。游戏规则在一定时间内,地鼠随机出现在洞口,玩家要在它出现的时候击中它,击中加分,反之地鼠会自动消失,时间耗尽则游戏结束。随着游戏时间的减少,老鼠出现的频率越来越高,存在的时间也越来越短,游戏难度逐步上升。所需图片资源-Sprite游戏背景洞口地鼠锤子SortLayer—用于图片资源的绘制顺序程序实现要点洞口位置的存储结构和计算。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。开始初始化洞口位置随机位置生成地鼠是否打到地鼠计时结束游戏结束否是生成被打到地鼠图像并计分一定时间后销毁地鼠否是否程序实现要点洞口位置的存储结构和计算。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。GameController:用于洞口生成以及判断游戏进程。Mole:用于控制地鼠的消失、判断是否地鼠被打到以及计分。Beaten:用于地鼠被打到后的销毁工作。Timer:用于计时。Restart:用于游戏重启。ChangeCursor:用于锤子的打击反馈动画。程序实现要点洞口位置的存储结构和计算。(思考,应该使用什么数据结构呢?)地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。程序实现要点洞口位置的存储结构和计算。9个洞口的位置和状态可用3x3二维数组存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。[2,0][2,1][2,2][1,0][1,1][1,2][0,0][0,1][0,2]9个洞口对应的二维数组的行列索引,每个元素保存了该洞口的具体位置以及是否有地鼠的状态。注:该例子以左下角对应数据的索引号[0,0]。程序实现要点洞口位置的存储结构和计算。9个洞口的位置和状态可用3x3二维数组存储。为后续随机索引方便,把二维数组映射成一维数组。(思考:如何把二维数组映射到一位数组呢?)地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。[2,0][2,1][2,2][1,0][1,1][1,2][0,0][0,1][0,2]把a[m][n]映射到b[k]的公式为:k=i*n+jm、n分别表示二维数组的行数和列数,i为元素所在行,j为元素所在列,同时0<=i<m,0<=j<n。程序实现要点洞口位置的存储结构和计算。9个洞口的位置和状态可用3x3二维数组存储。为后续随机索引方便,把二维数组映射成一维数组。每个洞口的位置,设相邻洞口之间的横向间隔为2个单位,纵向为1个单位。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。1个单位2个单位程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。使用到InvokeRepeating()函数程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。使用到InvokeRepeating()函数函数说明:程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。生成对象用Instantiate函数销毁对象用Destroy函数游戏时间和分数。Instantiate函数文档:/ScriptReference/Object.Instantiate.htmlDestroy函数文档:/ScriptReference/Object.Destroy.html参数: obj:要销毁的对象 t:执行该代码之后多长时间后才把该对象销毁。

如:Destroy(this.gameObject,3.0f);

执行该函数之后过3秒钟把该对象销毁掉。 ***this.gameObject或者直接使用gameObject表示挂载了当前组件脚本的对象。也就是自身。如地鼠对象挂载了该脚本,那么gameObject对象指的就是地鼠对象。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。销毁对象用Destroy函数生成对象用Instantiate函数游戏时间和分数。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。销毁对象用Destroy函数生成对象用Instantiate函数游戏时间和分数。Instantiate函数文档:/ScriptReference/Object.Instantiate.htmlDestroy函数文档:/ScriptReference/Object.Destroy.html参数: original:要生成的对象 position:在哪个位置生成该对象 rotation:对象生成后的初始朝向返回值:返回任何继承自Object(Unity中的基类)的对象。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。销毁对象用Destroy函数生成对象用Instantiate函数游戏时间和分数。Instantiate函数文档:/ScriptReference/Object.Instantiate.htmlDestroy函数文档:/ScriptReference/Object.Destroy.html参数: original:要生成的对象 position:在哪个位置生成该对象 rotation:对象生成后的初始朝向返回值:返回任何继承自Object(Unity中的基类)的对象。如:Instantiate(Gophers,newVector3(0,0.4F,-0.1F),Quaternion.identity);//在(0,0.4,-0.1)的位置上生成一个地鼠。**Quaternion.identiy表示默认初始旋转角度。***Quaternion为四元数,用于表示旋转,可防止万向锁。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。销毁对象用Destroy函数生成对象用Instantiate函数鼠标左键击打地鼠。游戏时间和分数。Instantiate函数文档:/ScriptReference/Object.Instantiate.htmlDestroy函数文档:/ScriptReference/Object.Destroy.html程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。计时:配合回调函数Update()和静态变量Time.deltaTime来实现。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。计时:配合回调函数Update()和静态变量Time.deltaTime来实现。**Update()函数是游戏制作的最关键函数之一,它在游戏大循环的每一帧调用一次,实现数据的更新,比如位置的改变等。程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。计时:配合回调函数Update()和静态变量Time.deltaTime来实现。**Update()函数是游戏制作的最关键函数之一,它在游戏大循环的每一帧调用一次,实现数据的更新,比如位置的改变等。***Time.deltaTime则是两帧之间的时间差,即Time.deltaTime=currentFrameTime–preFrameTime;程序实现要点洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。Summary洞口位置的计算和存储。地鼠出现的频率控制。地鼠的随机生成和销毁。游戏时间和分数。当时间少于15秒时增加地鼠出现频率。实现锤子的击打动画。为游戏加上音效。重新开始游戏。导出游戏。关于OnMouseDown函数是Unity中的一种回调函数。当鼠标按下按键的事件发生时会被调用。以后在Unity中发现有函数的最前面有On修饰,则表示该函数是在某种状态下会被触发运行。《翻牌子》(Memory、PairsGame…)Unity2017经典游戏开发教程:算法分析与实现《翻牌子》游戏规则介绍又名《卡牌对对翻》或叫《记忆翻牌》等等。游戏规则:找到两两对应的牌子即可得分,找到所有对应的卡牌结束游戏。玩家每次可以翻开两张牌,若一样,则两张牌将始终处于正面,否则,再次翻转为背面。当所有卡牌配对成功后,计时停止,游戏结束。本章内容介绍--《记忆翻牌》游戏游戏资源导入与场景搭建。卡牌池生成和卡牌排列。洗牌。卡牌状态。卡牌的配对。本章内容介绍--《记忆翻牌》游戏游戏资源导入与场景搭建。卡牌池生成和卡牌排列。洗牌。卡牌状态。卡牌的配对。程序实现要点卡片排列和卡片池生成。洗牌(卡牌随机生成)。卡片状态。卡片的配对。程序实现要点卡片排列和卡片池生成。卡片在场景中的布局;该例子中共有12张卡牌,以3行4列的方式排列。使用一个数组来保存卡牌数据。洗牌(卡牌随机生成)。卡片状态。卡片的配对。程序实现要点卡片排列和卡片池生成。卡片在场景中的布局;该例子中共有12张卡牌,以3行4列的方式排列。使用一个数组来保存卡牌数据。洗牌(卡牌随机生成)。卡片状态。卡片的配对。(-3,0)(-1,0)(1,0)(3,0)(-3,2.5)(-3,5)(-1,2.5)(1,2.5)(3,2.5)(-1,5)(1,5)(3,5)以每张卡片的中心为锚点,以左下角卡片为起始点。坐标为originalX=-3,originalY=0;相邻两张卡片横向间隔设为offsetX=2,纵向间隔设offsetY=2.5;则每张卡片相对于左下角卡片的位置为:(x,y)=(offsetX*j+originalX,offsetY*i+originalY)i和j分别表示第i行和第j列i=0i=1i=2J=0J=1J=2J=3程序实现要点卡片排列和卡片池生成。卡片在场景中的布局;该例子中共有12张卡牌,以3行4列的方式排列。使用一个数组来保存卡牌数据。洗牌(卡牌随机生成)。共有12张牌,6种不同的牌面,每种牌面2张(如何确保每种卡片有2张?)。卡片状态。卡片的配对。程序实现要点创建一个共有6个元素的一维数组images,用于存放6种不同的牌面。创建一个共有12个元素的一维数组numbers,并初始化给数组为:{0,0,1,1,2,2,3,3,4,4,5,5},每个元素的值代表images数组的对应索引值。对numbers数组进行洗牌,把元素中的数值打乱。按照场景卡牌的布局,在每一个对应的位置生成卡牌的牌面对象。根据i和j,从numbers数组中取出对应的image索引值,再按照该索引值找到每个牌面的图像。Images数组初始的Numbers数组{0,0,1,1,2,2,3,3,4,4,5,5}洗牌后的Numbers数组{1,0,3,2,4,0,1,3,4,5,5,2}程序实现要点关于洗牌:可采取很多的方式来进行洗牌功能的操作。本例子的洗牌方式为:遍历整个Numbers数组,获得当前索引i的元素值。从当前元素的索引到最后元素的索引之间取随机数r。对调i索引的元素和r索引的元素的值。直到i为最后元素的索引。{0,0,1,1,2,2,3,3,4,4,5,5}iri{1,0,0,1,2,2,3,3,4,4,5,5}ri{1,3,0,1,2,2,3,0,4,4,5,5}r{1,0,0,1,2,2,3,3,4,4,5,5}ri程序实现要点按照场景卡牌的布局(3行4列),在每一个对应的位置生成卡牌的牌面对象。根据i行和j列,从numbers数组中取出对应的image索引值,再按照该索引值找到每个牌面的图像。Images数组洗牌后的Numbers数组{1,0,3,2,4,0,1,3,4,5,5,2}通过Numbers获得Images中的卡片类型为:Images[number[i*gridCols+j]];如场景中第2行,第1列所对应的Numbers的索引值为2*4+1=9,即该卡牌对应Numbers中的元素为Numbers[9]=5,也就是获得了Images所对应的第5个卡片,即Images[5]=方块卡片,最后把该图片对象赋值给对应位置的卡片对象即可。**Numbers中只是保存了Images对应的索引号,而Images才是保存了实际的图片素材。程序实现要点卡片池生成和卡牌排列。洗牌(卡牌随机生成)。卡片状态:共有三种状态:未被翻开状态;翻开状态配对成功状态。卡片的配对。未被翻开状态翻开状态配对成功状态状态转换图程序实现要点卡片池生成。卡片状态。卡片的配对。为每种类型设置不同的ID号,当有两张牌处于翻开状态时,判断这两张牌的ID号是否相等,如果相等,则表示配对成功,否则配对失败。//伪代码If(_firstRevealed.id==secondReveled.id){ //配对成功的操作,如加分等。}else{ //配对不成功的操作,如重新把牌翻回背面等。}关于协同程序(Coroutine)协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。最常见的用法是让某个功能块运行到某个位置并暂停该功能块的运行,等到一定时间之后再继续完成该功能块的指令。用法:声明一个返回值为Ienumerator的函数;在函数的某个位置编写暂停语句:yieldreturnnewWaitForSeconds(1.5f);//让该函数暂停1.5秒。在主线程的某个位置调用该协同程序,StartCoroutine(协同程序函数的函数名);/ScriptReference/Coroutine.html/ScriptReference/MonoBehaviour.StartCoroutine.html/ScriptReference/WaitForSeconds.html/ScriptReference/WaitForEndOfFrame.html/ScriptReference/MonoBehaviour.StopCoroutine.html拼图(jigsawpuzzle)Unity2017经典游戏开发教程:算法分析与实现《拼图》游戏介绍它的历史可以追溯到1760年左右。英国雕刻师和制图师约翰•斯皮尔斯伯里(JohnSpilsbury)将地图贴在硬木板上,然后沿着国界线进行切割,制作了最原始的拼图。最初的拼图是具有教育意义的,拼图所用的图片有些附有适合青少年阅读的短文,有些则用于向新兴资产阶级传授历史或地理知识。游戏规则将一张图片分成若干份(碎片),玩家把这些碎片按照原图的样式拼接起来,则视为游戏成功。本章内容介绍--《拼图》游戏游戏资源导入与场景搭建。碎片对象的生成与初始化位置。原图与碎片位置的对应关系。鼠标拖拽移动碎片。碎片放置位置正确性判断。工程创建与资源导入程序实现要点碎片对象的生成与初始化位置。原图与碎片位置的对应关系。鼠标拖拽移动碎片。碎片放置位置正确性判断。程序实现要点-碎片对象的生成与初始化位置碎片对象的生成使用Resources类来进行碎片图片资源的读入与对象生成,并保存在一个数组中。程序实现要点-原图与碎片位置的对应关系使用二维数组来保存每个碎片的对象(本例子中共有3x3=9张碎片)。假设二维数组第一个元素[0,0]保存第一张碎片,最后一个元素[2,2]保存最后一张碎片。二维数组中的每个碎片对象对应一维数组碎片图片的索引号为:图片一维数组索引号=Row*ColNumber+Col其中:Row表示当前二维数组一个元素所在的行号,ColNumber表示二维数组每一行的列数,Col表示当前二维数组一个元素所在的列号。例如[1,2]对应的碎片需要获取的图片为一维数组里的索引号为:1*3+2=5的图片。[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]程序实现要点-碎片的初始化位置碎片的初始化放置只需要使用随机数(Random.Range)即可。程序实现要点-原图与碎片位置的对应关系

1/2WWW程序实现要点-原图与碎片位置的对应关系

WW[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]

1/2WWW程序实现要点-鼠标拖拽移动碎片判断鼠标点击的位置是否在碎片内:把鼠标的屏幕坐标转换为世界坐标(Mx,My);获取碎片的坐标(Sx,Sy).如果|Mx-Sx|<W/2,|My-Sy|<H/2,则表明鼠标的世界坐标位置在此碎片的范围内,则判定碎片被选中。(此处不考虑图层深度)实现被拖拽的碎片跟随鼠标移动。获得鼠标的屏幕坐标位置,并转换为世界坐标下的位置。碎片新的坐标=鼠标的世界坐标+碎片位置与鼠标位置的偏移量。鼠标松开时,则进行碎片位置匹对判断。程序实现要点-碎片放置位置正确性判断

[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序实现要点-碎片放置位置正确性判断

[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序实现要点-碎片放置位置正确性判断

[0,0][0,1][0,2][1,0][2,0][1,1][1,2][2,2][2,1]A(x1,y1)B(x2,y2)程序实现要点-碎片放置位置正确性判断

if(|X2–X1|<临界值&&|Y2–Y1|<临界值){碎片坐标=正确坐标}else{碎片回到原来的位置;}其他Sprite类为Unity中用于2D图片的类GameObject为Unity中代表游戏对象的类。Transform类,用于保存游戏对象的位置、旋转和缩放数据。Camera类,用于控制摄像机的行为和属性等。Vector2/Vector3:数学中的二维向量和三维向量。Resources类,可用于载入保存在Resources目录下的资源,包括图片、音频等等。Mathf类:实现了常用的数学计算函数,如绝对值(ABS)、正弦(Sin)等等。Start函数为回调函数,在MonoBehavior类中声明,在子类中实现,一般用于初始化一个游戏对象。Update函数为回调函数,在MonoBehavior类中声明,在子类中实现,每帧调用一起,用于数据(如位置数据,按键事件的监听)的更新。是游戏开发中最重要的一个循环函数。Input.GetMouseButtonDown(0):监听鼠标按键按下的事件。OnMyMouseUp()当鼠标按键弹起时响应。******建议查阅Unity的官方文档,了解以上类和方法*******Manual用户手册(建议先整体浏览一遍,了解unity能提供的功能,同时最好用英文文档,练习阅读英文文档):/Manual/index.html?_ga=2.6416242.1527791948.1533267545-1582799829.1481427680脚本手册:/ScriptReference/index.html推箱子(Sokoban)Unity2017经典游戏开发教程:算法分析与实现《推箱子》游戏介绍推箱子是一个来自日本的电子游戏,其电子游戏最早于1981年由今林宏行编写,并于1982年12月由日本的ThinkingRabbit公司发行,目的是在训练玩家的逻辑思考能力。游戏规则这个游戏是在一个正方形的棋盘上进行的,每一个方块表示一个地板或一面墙。地板可以通过,墙面不可以通过。地板上放置了箱子,一些地板被标记为存储位置。玩家被限制在棋盘上,可以水平或垂直地移动到空的方块上(永远不会穿过墙或箱子)。箱子不得被推入其他箱子或墙壁,也不能被拉出。箱子的数量等于存储位置的数量。当所有的箱子都安放在储藏地点时,游戏胜利。本章内容介绍--《推箱子》游戏资源的导入、资源切割与角色动画制作。地图的生成。分析角色可移动的情况。角色位置以及移动方向与数组的对应关系。角色的移动。箱子的移动。胜利条件判断。资源的导入、资源切割与角色动画制作动画状态机帧动画图片素材程序实现要点地图的生成。角色位置以及移动方向与数组的对应关系。分析角色可移动的情况。角色的移动。箱子的移动。胜利条件判断。程序实现要点-地图的生成使用二维数组的方式来思考地图信息的存储。每个元素中用不同的数字来标记不同的对象:0表示空白1表示墙2表示角色3表示箱子9表示终点10表示箱子在目标点上(为什么要设置该状态?)11表示角色在目标点上(为什么要设置该状态?)程序实现要点-地图的生成通过遍历地图数组,读取每个元素的数值,根据数值标记生成不同的地图对象。程序实现要点-地图的生成设坐标原点在地图的左上角,向右为横向x轴正方向,向下为纵向y轴负方向。那么二维数组map[m][n]的第i行第j列的元素为map[i][j],每个方块(tile)的尺寸为1*1,则对应map[i][j]在场景中的坐标位置为:position=(j,-i)。例如map[1][4]对应的tile的位置为(4,-1)。同时,该元素的值为1,那么表示的是墙的方块。程序实现要点-地图的生成为程序实现的简便,可以把地图的二维数组数据映射到一维数组上,便于遍历。设二维数组为map[m][n],一维数组为b[m*n],则他们的对应关系为:b[i*n+j]=map[i][j]。假设tile的长宽都为1,地图二维数组大小为9*9,则二维数组中的map[2][1]对应一维数组中的b[2*9+1]=b[19],也就是说,对于数组元素b[19]对应其实际的坐标为(-1,2)。虽然一维数组对于人来说不是很直观,但把二维数组转换成一位数组更有利于程序方便的实现。因此,在设计地图时用二维数组来思考,在进行程序操作,如角色移动时,用一维数组表示。程序实现要点-地图的生成为程序实现的简便,可以把地图的二维数组数据映射到一维数组上,便于遍历。设二维数组为map[m][n],一维数组为b[m*n],则他们的对应关系为:b[i*n+j]=map[i][j]。假设tile的长宽都为1,地图二维数组大小为9*9,则二维数组中的map[2][1]对应一维数组中的b[2*9+1]=b[19],也就是说,对于数组元素b[19]对应其实际的坐标为(-1,2)。虽然一维数组对于人来说不是很直观,但把二维数组转换成一位数组更有利于程序方便的实现。因此,在设计地图时用二维数组表示,在进行程序其他操作,如角色移动时,用一维数组表示。地图数组除了用于生成地图之外,还作为游戏逻辑的判断,实时记录游戏的状态,也称为地图快照!程序实现要点-角色位置以及移动方向与数组的对应关系设地图左上角为原点,即map[0][0],对应一维数组上为b[0]。那么当角色位于map[i][j],即一维数组的b[i*9+j]。此处以map[4][4](即b[4*9+4]=b[40])为例,则:角色上方一个方格的二维表示为map[3][4],一维表示为b[3*9+4]=b[4*9+4-9]=b[31];角色下方一个方格的二维表示为map[5][4],一维表示为b[5*9+4]=b[4*9+4+9]=b[49];角色左侧一个方格的二维表示为map[4][3],一维表示为b[4*9+3]=b[4*9+4-1]=b[39];角色右侧一个方格的二维表示为map[4][5],一维表示为b[4*9+5]=b[4*9+4+1]=b[41];设地图左上角为原点,即map[0][0],对应一维数组上为b[0]。那么当角色位于map[i][j],即一维数组的b[i*9+j]时,此处以map[4][4](即b[4*9+4]=b[40])为例,则:角色上方一个方格的二维表示为map[3][4],一维表示为b[3*9+4]=b[4*9+4-9]=b[31];角色下方一个方格的二维表示为map[5][4],一维表示为b[5*9+4]=b[4*9+4+9]=b[49];角色左侧一个方格的二维表示为map[4][3],一维表示为b[4*9+3]=b[4*9+4-1]=b[39];角色右侧一个方格的二维表示为map[4][5],一维表示为b[4*9+5]=b[4*9+4+1]=b[41];从以上可以推断:角色往上移动一格,在一维数组中索引-9;角色往下移动一格,在一维数组中索引+9;角色往左移动一格,在一维数组中索引-1;角色往右移动一格,在一维数组中索引+1;程序实现要点-角色位置以及移动方向与数组的对应关系设地图左上角为原点,即map[0][0],对应一维数组上为b[0]。那么当角色位于map[i][j],即一维数组的b[i*9+j]时,此处以map[4][4](即b[4*9+4]=b[40])为例,则:角色上方一个方格的二维表示为map[3][4],一维表示为b[3*9+4]=b[4*9+4-9]=b[31];角色下方一个方格的二维表示为map[5][4],一维表示为b[5*9+4]=b[4*9+4+9]=b[49];角色左侧一个方格的二维表示为map[4][3],一维表示为b[4*9+3]=b[4*9+4-1]=b[39];角色右侧一个方格的二维表示为map[4][5],一维表示为b[4*9+5]=b[4*9+4+1]=b[41];从以上可以推断:角色往上移动一格,在一维数组中索引-9;角色往下移动一格,在一维数组中索引+9;角色往左移动一格,在一维数组中索引-1;角色往右移动一格,在一维数组中索引+1;因此,我们可以使用一个枚举类型来表示四个移动方向:publicenumDirection{Up=-9,Down=9,Left=-1,Right=1}程序实现要点-角色位置以及移动方向与数组的对应关系设地图左上角为原点,即map[0][0],对应一位数组上为b[0]。那么当角色位于map[i][j],即一维数组的b[i*9+j]时,此处以map[4][4](即b[4*9+4]=b[40])为例,则:角色上方一个方格的二维表示为map[3][4],一维表示为b[3*9+4]=b[4*9+4-9]=b[31];角色下方一个方格的二维表示为map[5][4],一维表示为b[5*9+4]=b[4*9+4+9]=b[49];角色左侧一个方格的二维表示为map[4][3],一维表示为b[4*9+3]=b[4*9+4-1]=b[39];角色右侧一个方格的二维表示为map[4][5],一维表示为b[4*9+5]=b[4*9+4+1]=b[41];从以上可以推断:角色往上移动一格,在一维数组中索引-9;角色往下移动一格,在一维数组中索引+9;角色往左移动一格,在一维数组中索引-1;角色往右移动一格,在一维数组中索引+1;因此,我们可以使用一个枚举类型来表示四个移动方向:publicenumDirection{Up=-9,Down=9,Left=-1,Right=1}程序实现要点-角色位置以及移动方向与数组的对应关系角色可移动的情况角色移动方向前方为空地角色移动方向前方为目标点角色移动方向前方为箱子,箱子前方为空地角色移动方向前方为箱子,箱子前方为目标点角色当前位置在目标点上,移动方向前方为目标点角色当前位置在目标点上,移动方向前方为空地角色移动方向前方为箱子,箱子在目标点上,前方为目标点角色移动方向前方为箱子,箱子在目标点上,前方为空地角色当前位置在目标点上,移动方向前方为箱子,箱子前方为空地角色当前位置在目标点上,移动方向前方为箱子,箱子前方为目标点角色移动方向前方为墙面,不可移动箱子移动方向前方为墙面,不可移动箱子移动方向前方为其他箱子,不可移动角色可移动的情况(部分)角色的位置状态角色位置为空地角色位置为目标点角色下一个位置为空地角色下一个位置为目标点角色下一个位置为箱子角色下一个位置为墙角色下一个位置为在目标点上的箱子箱子下一个位置为空地箱子下一个位置为目标点箱子下一个位置为墙箱子下一个位置为箱子箱子下一个位置为在目标点上的箱子省略角色可移动的情况(部分)角色的位置状态角色位置为空地角色位置为目标点角色下一个位置为空地角色下一个位置为目标点角色下一个位置为箱子角色下一个位置为墙角色下一个位置为在目标点上的箱子箱子下一个位置为空地箱子下一个位置为目标点箱子下一个位置为墙箱子下一个位置为箱子箱子下一个位置为在目标点上的箱子省略每个移动方向:总共有23种情况角色可移动的情况(部分)角色的位置状态角色位置为空地角色位置为目标点角色下一个位置为空地角色下一个位置为目标点角色下一个位置为箱子角色下一个位置为墙角色下一个位置为在目标点上的箱子箱子下一个位置为空地箱子下一个位置为目标点箱子下一个位置为墙箱子下一个位置为箱子箱子下一个位置为在目标点上的箱子省略每个移动方向:总共有23种情况代码如何实现?角色移动伪代码—采用if—else的情况角色移动伪代码—采用if—else的情况代码逻辑混乱,不易修改与调试,可读性差。角色移动伪代码—采用SwitchSwitch(角色前方位置状态){ case前方为空: break; case前方为目标点: break; case前方为箱子: switch(箱子前方状态){ case前方为空: break; case前方为目标点: break; } break; case前方为箱子在目标点上: switch(箱子前方状态): case前方为空: break; case前方为目标点: break; break; default:

不可移动; break;}????????????角色移动伪代码—采用SwitchSwitch(角色前方位置状态){ case前方为空: break; case前方为目标点: break; case前方为箱子: switch(箱子前方状态){ case前方为空: break; case前方为目标点: break; } break; case前方为箱子在目标点上: switch(箱子前方状态): case前方为空: break; case前方为目标点: break; break; default:

不可移动; break;}????????????代码较简洁,逻辑清晰,较易修改与调试,可读性较好。程序实现要点-角色的移动,地图刷新1 向右移动:获取到按键”→”,此时dir=9。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,刷新地图数组(游戏状态快照);2 向上移动:获取到按键”↑”,此时dir=-9。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,刷新地图数组(游戏状态快照);3 向下移动:获取到按键”↓”,此时dir=9。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,刷新地图数组(游戏状态快照);4 向左移动:获取到按键”←”,此时dir=-1。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,刷新地图数组(游戏状态快照); 遇到障碍物的时候:跳出遍历,返回false。111111111120010000103010111103010191111311191011000091010001001010001111011111000111111111102010000103010111103010191111311191011000091010001001010001111011111000程序实现要点-箱子的移动,地图刷新箱子的移动与角色的移动算法类似,只是除了刷新角色位置之外,还需刷新箱子的位置。移动箱子的功能:设定dir控制角色在数组内的移动距离。1向右移动:获取到按键”→”,此时dir=1。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,下二目标移动位置的数组值变为3,刷新地图数组(游戏状态快照)2 向上移动:获取到按键”↑”,此时dir=-9。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,下二目标移动位置的数组值变为3,刷新地图数组(游戏状态快照);3 向下移动:获取到按键”↓”,此时dir=9。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,下二目标移动位置的数组值变为3,刷新地图数组(游戏状态快照);4 向左移动:获取到按键”←”,此时dir=-1。将角色目前位置的数组值变为0,下一目标移动位置的数组值变为2,下二目标移动位置的数组值变为3,刷新地图数组(游戏状态快照);遇到障碍物的时候:跳出遍历,返回false。111111111100010000123010111103010191111311191011000091010001001010001111011111000111111111100010000102310111103010191111311191011000091010001001010001111011111000程序实现要点-角色和箱子的移动,地图刷新以上两种情况都是假设角色或者箱子不在目标点上,如果角色或者箱子在目标点上,应该如何刷新地图数组呢?111111111100010000100010111103010191111311191011000031010001021010001111011111000111111111100010000100010111103010191111311131011000021010001001010001111011111000111111111100010000100010111103010191111311191011000010101000102101000111101111100011111111110001000010001011110301019111131111110110000101010001001010001111011111000目标点信息被删除程序实现要点-胜利条件的判断创建一个计数变量,设置为当前关卡中的目标点的数量。只要当箱子被移动到目标点时,该变量-1。当箱子移出目标点时,该变量+1。当该变量为0时,游戏结束。《推箱子》游戏内容总结地图的生成。角色位置以及移动方向与数组的对应关系。分析角色可移动的情况。角色的移动。箱子的移动。胜利条件判断。《推箱子》游戏内容总结地图的生成。《推箱子》游戏内容总结角色位置以及移动方向与数组的对应关系。《推箱子》游戏内容总结角色可移动的情况。角色的位置状态角色位置为空地角色位置为目标点角色下一个位置为空地角色下一个位置为目标点角色下一个位置为箱子角色下一个位置为墙角色下一个位置为在目标点上的箱子箱子下一个位置为空地箱子下一个位置为目标点箱子下一个位置为墙箱子下一个位置为箱子箱子下一个位置为在目标点上的箱子省略《推箱子》游戏内容总结角色的移动。111111111120010000103010111103010191111311191011000091010001001010001111011111000111111111102010000103010111103010191111311191011000091010001001010001111011111000《推箱子》游戏内容总结箱子的移动。111111111100010000123010111103010191111311191011000091010001001010001111011111000111111111100010000102310111103010191111311191011000091010001001010001111011111000《推箱子》游戏内容总结胜利条件判断.创建一个计数变量,设置为当前关卡中的目标点的数量。只要当箱子被移动到目标点时,该变量-1。当箱子移出目标点时,该变量+1。当该变量为0时,游戏结束。作业按照书本里的步骤,实现整个游戏,并导出为可运行在PC平台的exe运行程序。30分尝试修改场景地图,增加多个关卡。30分选做:尝试修改和导出为Android或者IOS版本的触屏版本。20分选做:为游戏加入主界面。20分***地图的生成基于Tile的2D场景设计可以利用更加专业的软件如Tilemap等来制作地图数据,一般导出格式为XML等,然后再导入到各个引擎中,利用相应算法,重新生成地图。该方法可以扩展到3D的基于规则形状(如立方体,类似《我的世界》。)Unity中现在也提供了一定功能的基于2DTile场景的搭建。基于Tile场景搭建,由多种规则图形的tile组成(可以是正方形、六边形、菱形等规律tile),利用二维或者多维数组记录场景数据。基于不同形状的tile地图生成算法:/~amitp/game-programming/grids/俄罗斯方块(Tetris)Unity2017经典游戏开发教程:算法分析与实现《俄罗斯方块》游戏介绍1984年6月,在俄罗斯科学院计算机中心工作的数学家“帕基特诺夫”利用空闲时间编出一个游戏程序,用来测试当时一种计算机的性能。帕基特诺夫爱玩拼图,从拼图游戏里得到灵感,设计出了俄罗斯方块。游戏基本规则有一块用于摆放方块的平面虚拟场地,其标准大小:行宽为10,列高为20,以一个小方块为一个单位。有一组由4个方块组成的规则图形(中文通称为方块),共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。玩家可以以90度为单位旋转方块;以格子为单位左右移动方块;让方块加速下落。当区域中的某一行格子全部由方块填满,则该行方块会消失并成为玩家的得分。删除的行越多,得分越高。当方块堆到区域最上方而无法消除时,则该游戏结束。演示效果.gif基本流程初始化阶段移动旋转满行判断与消除本章内容介绍--《俄罗斯方块》游戏资源导入、方块切割与预制体制作、场景设置初始化地图方块类(Block)的编写初始化方块移动方块消除满行方块附加功能—控制方块下落速度附加功能—显示下一个方块的样式本章核心要点整个游戏的地图快照,用不同数字记录场景当前状态。本章核心思路是使用二维数组,用不同的数值表示不同的方块和状态。满行判断与消除。一、资源的导入资源导入、方块切割与预制体制作、场景设置。二、初始化地图初始化地图二维数组用二维数组生成当前地图状态负责记录游戏场景状态、绘制背景以地图的数值为依据进行边界判断每次移动方块,都要更新地图共有4种情况墙=-1空格=0固定方块=8(方块不可以再操作时)游戏中的方块=自身的形态数值(即方块的状态)三、方块类(Block)的编写初始化方块的形状用二维数组,通过数字存储方块的四种变换形态,用一个[4][16]的二维数组,4表示方块的四种不同旋转朝向,16用于记录方块的样式。根据方块类型决定方块的变换形态存储原则方块由小方块组成,数字代表一个小的组成方块用数组抽象表示方块形态,有数字表示有小方块,0表示没有小方块数字与当前方块类型有关,不同类型的方块,数值不同二维数组中每个大括号里的数组,都表示一种形态的方块获取操作获取方块状态、获取方块组当前位置变换操作旋转方块、重置方块、上下左右移动方块基本流程初始化阶段移动旋转满行判断与消除四、初始化方块—方块在地图中的随机生成把7种方块放置在一个一维数组中,然后用随机遍历的方法在场景中生成两个方块,一个用于当前方块的控制,一个用于下一个方块的控制。五、移动和旋转方块—位置坐标修改左右移动或旋转键盘响应后,移动,后判断移动左=>方块位置x-1右=>方块位置x+1旋转=>方块状态数组里取下一状态撞到左右墙壁?撞到底部?撞到固定方块?满足其一,撤销移动移动更新地图(旋转)五、移动和旋转方块—边界判断左右移动或旋转。不可可以移动的条件,遍历Block的每一个元素,如果该元素不为零,那么就要进行以下的判断。碰到左右边界。碰到底部。碰到其他方块。-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-155-1-155-1-1-1-1-1-1-1-13-1-1333-1-13383-1-1888888883-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1移动边界判定不可左右移动五、移动方块—向下移动向下移动碰撞判断撞到底部=>方块存在小方块位置<0撞到其他方块=>地图信息为8地图更新固定方块信息将当前移动的方块状态变更为8更新地图变更地图二维数组里的数值键盘响应或间隔一定时间后,先移动,后判断撞到底部?撞到其他方块?满足其一,地图更新固定方块信息移动更新地图……六、消除满行方块流程

碰撞判断撞到顶部=>地图最上面一行存在数值8方块到达底部或其他方块后撞到顶部?不满足满足,游戏结束满行?满足,删除该行数据不满足,生成方块上方固定方块数据下移-188-1-188-1-1888888888-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1遍历最上面一行,存在数值8六、消除满行方块满行判断地图一行一行遍历(除去边界)若扫描到非8,跳出此行,遍历下一行地图上一行数值全为8即为满行满行消除从满行的该行往上的所有行,固定方块数据全部下移-188-1-188-1-1888888888-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1一整行为8-188-1-188-1-1-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1消除一整行,上方残留数据全部下移一行七、游戏结束判断遍历最顶行的数值,如果有一个数值为8,则表示游戏结束。-1-1-188-1-188-1-188-1-188-1-188-1-188-1-188-1-188-1-188-1-18855-1-18855-1-188-1-188-1-188-1-188-1-18833-1-18883-1-1888888883-1-18888888-1-1-1-1-1-1-1-1-1-1-1-1八、附加功能,方块自动下落速度控制实现一个节奏计时器,按照一定时间间隔运行方块角落逻辑。八、附加功能,提示下一个方块在场景中的右侧,显示出下一个要下落的方块类型。使用一个4*4的二维数组,用于显示方块提示。八、附加功能,代码的重复代码优化作业按照书本里的步骤,实现整个游戏,并导出为可运行在PC平台的exe运行程序。30分尝试实现,随着分数的增加,方块下降的速度越快。30分尝试添加4种新的方块类型。20分华容道Unity2017经典游戏开发教程:算法分析与实现《华容道》游戏介绍华容道是古老的中国民间益智游戏.华容道取自《三国演义》中的赤壁战争:“曹瞒兵败走华容,正与关公狭路逢。只为当初恩义重,放开金锁走蛟龙”这一故事情节。其变化多端、百玩不厌的特点与魔方、独立钻石棋一起被国外智力专家并称为“智力游戏界的三个不可思议”。它与七巧板、九连环等中国传统益智玩具还有个代名词叫作“中国的难题”。华容道的现在样式是1932年JohnHaroldFleming在英国申请的专利,并且还附上横刀立马的解法。游戏规则容道的棋盘是一个带20个方块的棋盘,棋盘下方有一个两方格宽的出口,仅供曹操逃走。华容道游戏中的方块有四种:大正形(2×2);横长方形(2×1);竖长方形(1×2);小正方形(1×1)。游戏华容道有不同的开局,根据5个矩形块的放法分类,有一横式,二横式,三横式,四横式,五横式。如横刀立马近在咫尺小燕还巢比翼横空过五关水泄不通等。棋盘上仅有两个空格可供棋子移动。玩家需要通过鼠标移动棋子,让曹操从棋盘最下方的中部两个空格中逃出,则游戏胜利。2×22×11×21×1游戏规则本例子将实现“横刀立马”的样式。本章内容介绍--《华容道》游戏资源的导入、摄像机和背景设置,棋子预制体的制作。棋子类(Chess)的编写。棋盘盘面布局的生成。分析棋子可移动的情况判断选中的棋子。判断棋子移动方向。判断棋子类型。判断棋子是否可以移动。移动棋子并更新棋盘状态。游戏胜利判断。资源的导入、摄像机和背景设置,棋子预制体的制作。棋子类(Chess)的编写。使用枚举类型编写棋子的类型。初始化、生成棋子对象。根据棋子类型为棋子的宽高赋值。(后续)设置曹操目标点。(后续)曹操是否到达目标点的判断函数。棋盘盘面布局的生成

将所有棋子对象存进数组里,并用Chess类方法实例化棋子对象。设棋子的锚点在左上角。棋子位置通过硬编码方式进行设置。用二维数组初始化棋盘快照棋盘快照作用:用以记录当前盘面的状态,主要用于判断被选择的棋子是否可以被移动到下一个位置以及胜利条件的判断等。棋盘状态含义棋子已占用——1棋盘边界——1棋子未占用——0注意:增加两行两列表示棋盘边界(1,1)(1,3)(1,5)(2,5)(4,5)(2,3)(2,2)(3,2)(4,3)(4,1)移动棋子的实现

判断选中的棋子。判断棋子移动方向。判断棋子类型。判断棋子是否可以移动。移动棋子并更新棋盘状态。判断选中的棋子 获取鼠标点击坐标。

鼠标点击=>获取鼠标点击坐标(屏幕坐标)=>转换成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论