自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 一、Swift 语法概述

Swift是Apple最新推出的语言,用于编写iOS和OS X程序,与C语言和Objective-C兼容。本系列的文章中的一些例子,都来自于苹果官方的GUIDE: The Swift Programming Language,有兴趣的同学可以去苹果的官网下载英文原版的iBook。一、Hello world  Swift中不需要main函数,也不需要用;分开每一行的语句,一个简单的Hel

2014-07-25 15:08:31 1387

原创 二、C++迭代器的两种实现方式 (Range for和C#、Java中的foreach)

一、迭代器概述  这个标题其实有点“标题党”的含义,因为C++在标准库中的实现迭代器的方式只有一种,也就是为类定义begin()和end()函数,C++11增加了range for语句,可以用来遍历迭代器中的元素。实现迭代器的第二种方式,就是用C++模拟C#和Java中的迭代器模式,并且我们可以定义出自己的foreach语句。除此之外,迭代器可能还有很多种实现的方法,各个库也会多自己的迭代器的

2014-06-27 17:36:37 2170

原创 一、从Java、C#到C++ (为什么C++比较难)

由于C++已经遗忘得差不多了,我翻起了最新初版的C++ Primer,打算深入了解一下C++这一门语言。C++ Primer第五版可谓是“重构”过的,融合了C++11的标准,并将它们全部在书中列举了出来。  在学习的过程中,我会把C++与Java、C#等纯面向对象的语言进行对比,中间的一些感悟,仅仅代表个人的意见,其中有对有错,也可能会存在一些争议。  差不多翻完了整本Primer C++

2014-06-26 21:41:17 3013

原创 Java设计模式之从[欢迎界面]分析模板方法(Template Method)模式

模板方法是在抽象类中最常用的模式了(应该没有之一),它定义一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些步骤。  例如我们要编写一个欢迎界面,如果用户是第一次打开本软件,则弹出一个欢迎的提示。为了能够实现复用,将这个机制当成一个基类,Java代码如下:abstract class FirstLogin{ abstract

2014-04-20 22:18:11 1447

原创 Java设计模式之从[游戏中的兵种状态转换]分析状态(State)模式

假设我们正在做一个即时战略游戏,我们设计一个兵种,他在刚刚生产出来的时候是步兵,但是他可以切换武器,第一次切换会变成弓箭手,第二次切换会变成举着盾牌的装甲兵,第三次切换则又变成了步兵……如何实现这个切换的机制?我们一开始会想到,在步兵这个类中加入switch语句,然而这样的话,代码不利于扩展,不利于修改,这时我们就可以使用状态模式了。  状态模式允许一个对象在其内部状态改变时改变它的行为。对象

2014-04-19 00:28:23 1979

原创 Java设计模式之从[剪刀石头布AI策略]分析策略(Strategy)模式

策略模式是一个非常简单的模式。它定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。  考虑到我在做一个剪刀石头布的游戏,可以和计算机对战。计算机的难度等级分为2个等级:普通难度和无法战胜难度。普通难度是指电脑会随机出石头、剪刀、布,而无法战胜难度是指电脑会“作弊”,电脑会事先知道玩家出的是什么手势。如果玩家出的是剪刀,那么电脑会出石头,玩家永远的无法取胜。  那么,这两个难度

2014-04-18 15:30:03 2480

原创 Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

观察者模式定义对象的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。  一个简单的例子是,在星际争霸的虫族中有一个初级单位叫做跳狗(Zergling),玩家可以在研究中心为它升级“肾上腺素”,升级之后,跳狗的攻击速度会翻倍。在这个模型中,我们可以看出,所有的跳狗都依赖于研究中心,当研究中心研究出肾上腺素后,通知每一个跳狗单位,它们被迫进行自我更新—

2014-04-18 14:16:41 1764 1

原创 Java设计模式之从[暗黑破坏神存档点]分析备忘录(Memento)模式

在大部分游戏中,都有一个“存档点”的概念。例如,在挑战boss前,游戏会在某个地方存档,如果玩家挑战boss失败,则会从这个存档点开始重新游戏。因此,我们可以将这个“存档点”当成是一个备忘录,我们将此时玩家所有的状态保存下来,以便之后的读取。  备忘录模式正是如此,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先的保存状态了。

2014-04-17 21:00:35 1659

原创 Java设计模式之从[游戏中开启宝箱]分析中介者(Mediator)模式

假设我们正在设计一个游戏房间,房间里有两个按钮和一个宝箱,如果我们按下了按钮1,则按钮2和宝箱均不可使用;如果我们按下了按钮2,则按钮1和宝箱均不可使用;如果我们打开宝箱,则按钮1不可按下。  在上面的例子中,我们可以看到两个按钮和一个宝箱之间存在着依赖关系,它们之间的状态是有关联的。假设按钮类叫做Button,宝箱类叫做Chest,我们需要避免Button、Chest之间相互连接,我们应当建

2014-04-16 21:55:49 1349

原创 Java设计模式之从[魔兽争霸、星际争霸、DOTA编队]分析迭代器(Iterator)模式

在即时战略游戏、DOTA中,我们可以多选我们部队,让他们组成一个队伍。在星际1、魔兽3中,一支队伍的最大单位数量为12个,当我们选中一支队伍后,可以命令他们集体朝着哪个方向移动或者进攻,而不用一个一个控制我们的单位。在程序中,我们是如何实现向这支队伍“群发”命令的呢?最开始想到的就是循环——把队伍中的每一个单位加入一个列表中,写一个for循环,依次访问这个列表中的每一个成员,让它们接收命令。

2014-04-15 20:40:11 1555

原创 Java设计模式之从[计算器]分析解释器(Interpreter)模式

解释器模式是一种广泛运用于编译器的设计模式。它的意图是给定一个语言,定义它的文法的一种表示,并定义一个解释器来解释语言中的句子。  本篇的内容和“游戏”无关,是从编译原理的角度来对这个模式进行解释,因为它几乎只出现在编译器中。  下面简单介绍一下编译原理中的文法定义。文法定义可以理解为用类似正则表达式来定义一个文法,它由终结符、非终结符组成。简单来说,终结符是指的具体的符号,非终结符是指的

2014-04-15 18:10:03 2568

原创 Java设计模式之从[打飞机游戏中的控制器]分析命令(Command)模式

首先请允许我啰嗦几句。为什么我们在软件设计过程中强调设计模式?为软件增加设计模式确实会增加一定的代码复杂程度,但是它的好处是无穷的。它可以使得软件更加易于扩展而无需改变源代码。“解耦”是设计模式中的一个关键词。例如,对于某个对象obj,在调用obj.method()时,我们希望obj是一个基类或者是一个接口,而不是一个具体的实现类,用这种方式来实现解耦。  下面进入正题。  假设我正在做一

2014-04-15 00:06:39 2621

原创 Java设计模式之从[使命召唤等游戏的任务提示]分析职责链(Chain Of Responsibility)模式

我们在使命召唤、暗黑破坏神等游戏时,总会接到各种各样的游戏任务,如到某某地方解救某人,或者消灭某某地方的敌人等。当玩家进入到某一个地图(以下称之为游戏场景)时,我们就可以查看它的任务提示。在这个机制下,我们认为,所有的游戏场景都继承于一个类(如HelpHandler),这个类包含一个显示任务提示的方法(如showHelp)。问题在于,任务的提示是有“上下文联系的”,任务的提示是和你的“场景是如何移

2014-04-14 11:59:14 1631

原创 Java设计模式之从[游戏场景读取]分析代理(Proxy)模式

在大型游戏中(如刺客信条、使命召唤等),我们需要读取的地图往往是很大的。如果我们在进入游戏时,把所有的地图信息都读出来,会花费很多的时间。那么,为了提高效率,我们采取的措施是,我们并不需要真正把这些元素读取出来,可以先用一些“不怎么需要时间开销的替代品”(也就是我们谈到的代理)来代替这些需要花一定时间读取的实例,等到我们真正需要这些实例的时候,再将这些“替代品”换成实例即可。例如,在一个射击游戏中

2014-04-13 18:39:17 1750

原创 Java设计模式之从[Dota地图]分析享元(Flyweight)模式

在Dota游戏的地图中有几百棵树,现在假设这些树木无非是这两种:白杨、枫树,数量一共为400棵,那么,在装载这个地图场景的时候,我们是不是应该给这400课树一一建立对象呢?(如:MapItem tree1 = new MapItem("白杨");MapItem tree2 = new MapItem("枫树");MapItem tree3 = new MapItem("白杨");……)哪怕这些语句

2014-04-12 08:16:12 1937 2

原创 Java设计模式之从"我想请个秘书!"分析外观(Facade)模式

在银行办业务的时候,经常会碰到如下情况:先填写一张表A,再填写一张表B,然后根据表A和表B的内容填写表C……各种各样的流程绕得人头昏眼花,最后我实在受不了了,问银行:你们这里有没有一条龙服务?!我好想请个秘书!把这些乱七八糟的工作丢给他做啊!  上述的例子和外观模式有些像。例如,我们有很多子系统,它们之前的调用十分复杂,为了降低它的复杂程度,我们引入一个外观对象(Facade,就像上面例子

2014-04-09 22:15:58 2233

原创 Java设计模式之再从[暗黑破坏神"装备镶嵌宝石系统"]分析装饰(Decorator)模式

在暗黑破坏神等RPG游戏中,会遇到如下的一些场景:我有一把很普通的武器,我通过给它“注入魔法力量”、“镶嵌宝石”,来使得它拥有一些攻击特效:例如,一把普通长剑,镶嵌红宝石后,可以附带火焰伤害,镶嵌了一个蓝宝石后,可以使得长剑攻击带有冰冻伤害。  如何实现上述的机制呢?首先我们想到的是继承,因为,一个镶嵌了红宝石、蓝宝石的长剑,一定是一个镶嵌了宝石的长剑,并且一定一把长剑。如此下来,程序的结构会

2014-04-08 22:05:24 3238

原创 Java设计模式之从[魔兽世界包裹系统]分析组合(Composite)模式

RPG游戏中的包裹(或者称为背包)是玩家携带物品的地方,它的大小决定着玩家能够携带物品数量。如在魔兽世界中,玩家起初的物品栏(将物品栏视为玩家的唯一一个包裹)的格子很少,但是玩家可以将新的包裹放在物品栏中,达到扩充物品栏的效果。也就是说,物品栏可以放消耗品、武器等零散的物品,当然也可以放包裹。  假定魔兽世界有如下设定:玩家一开始拥有一个默认的包裹(物品栏),玩家可以获得新的包裹放在物品栏上。

2014-04-08 21:18:51 2524 1

原创 Java设计模式之从[暗黑破坏神"装备镶嵌宝石系统"]分析桥接(Bridge)模式

暴雪公司著名的游戏暗黑破坏神中,有一个经典的"镶嵌系统",例如,可以为武器镶嵌红宝石、蓝宝石来得到攻击特效或攻击力加成,为防具镶嵌红宝石、蓝宝石来得到攻击特效或者防御力的加成。不同的宝石加在不同的装备上会有不同效果,如宝石加在武器上则提升武器攻击力,加在防具上则提升防御力。  假设我们建立了一个剑类(Sword)和一个盾类(Shield),建立了一个红宝石类(Ruby)和一个蓝宝石类(Sapp

2014-04-07 15:09:27 2593

原创 Java设计模式之从[鼠标接口][星际争霸中的兵种行为]分析适配器(Adapter)模式

适配器将一个类的接口转换成客户希望的另外一个接口。下面用三个例子来反映适配器的不同用途:  情况一:  我买了一个PS2接口的鼠标,但是我的电脑没有PS2的接口,仅有USB的接口。为了不浪费这个鼠标,我跑到商店买了一个PS2到USB的转接头,这样我就用上了PS2的鼠标。USB转接头就是一个典型的适配器。interface USBPort { void connect();}

2014-04-07 00:11:46 2244 6

原创 Java设计模式之从[反恐精英控制台]分析单例(Singleton)模式

所谓单例模式(Singleton),就是保证一个类仅有一个实例,并提供一个访问它的全局访问点的模式。  玩过反恐精英的同学应该都知道,游戏当中是有个控制台的,我们可以通过按`键(波浪线键)调出这个控制台。控制台的目的是为了方便开发人员开发,当然我们也可以在里面来修改一些游戏参数,如输入SV_GRAVITY 100可以把重力调整到100,那么我们跳跃的高度就是原来的8倍了。  由于控制台的游

2014-04-06 20:27:23 1849 2

原创 Java设计模式之从[魔兽世界副本]分析原型(Prototype)模式

“副本”是网络游戏任务的一种形式,它最初出现于无尽的任务,现在运用得最有名的就是魔兽世界的副本了,我们将它称为副本任务。副本任务一般是一个队伍的人一起闯关的,假设有队伍A、队伍B、队伍C,分别对同一个副本任务发出挑战,他们在副本任务中的行为是不相干的。也就是说,A队伍在副本任务中消灭boss、开启宝箱,不会对B、C两支队伍造成任何影响,B、C同理。因此,“副本”可以理解成,从任务的原型中拷贝,然后

2014-04-06 12:07:06 1944

原创 Java设计模式之从[Dota的武器创建]分析生成器(Builder)模式

Dota可谓是当下最流行的游戏之一,玩家分为两队,分别是天辉(近卫)和夜魇(天灾),每队5个人,通过补刀、杀敌获取经验和金钱,金钱可用来购买强大的武器。我们现在考虑一个最简单的武器组成元素:武器是由武器名、攻击力、武器颜色组成,我们要想办法实现能够新建各种各样武器的一个模式。假设我们预设了两种武器,分别是圣剑(攻击力300,黄色)、圣者遗物(攻击力60,蓝色),我将试着用生成器模式来做一个武器的生

2014-04-06 00:34:13 3549 6

原创 Java设计模式之从[星际争霸1]分析抽象工厂模式

抽象工厂模式是创建型模式之一。创建型模式有工厂模式(抽象工厂、工厂方法)、生成器模式、单体模式、原型模式四种。下面我来简单分析一下抽象工厂模式。  抽象工厂模式的定义是创建一个提供一系列相关或相互依赖对象的接口,而无需指定它们具体的类。所有的创建型模式有一个特点,我们不关心工厂生产出来的具体对象的类型,我们会将其具体的类与工厂分离开来。这么说的话,很抽象难懂,下面是一个关于星际争霸的例子。

2014-04-05 22:09:15 2096 2

原创 C# 之泛型

C# 之泛型一、何为泛型  C#泛型的说明抄自MSDN: 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能。泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候。例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入

2014-04-02 20:08:28 870

原创 C# Java 内部类之间的比较

C# Java 内部类之间的比较  一、引言  严格来说,C#并没有“内部类”这个概念,它应该叫做“嵌套类” (Nested Class)。下面先看一段C#:C#:class Outer{ void Print() { Console.WriteLine("Hello World!"); } class Inner {

2014-03-29 16:56:46 1557

原创 C# 用回溯递归解决“八皇后”问题

C# 用回溯递归解决“八皇后”问题  在很早以前,我曾经用C++写过一篇使用回溯法来生成随机数独的博客。这一次,考虑到这是一系列关于C#的博客,所以利用C#的一些特点,来解决著名的“八皇后”问题。  一、问题概述  问题概述搬自百度百科。八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋棋盘上摆放八个皇后

2014-03-27 16:34:08 1573

原创 C# 继承、接口与多态

C# 继承、接口与多态  我在这里想谈一谈在C#中的继承(继承于基类或接口)和多态(如方法的覆写)。继承和多态是面向对象编程中两个重要的特性,这种特性和编程语言本身是没多大关系的,因此我先会用非编程的思维来谈一谈我对它们的认识,然后再谈一谈它们在C#中的实现方法。  1、继承的含义  所谓继承,就是“站在巨人的肩膀上”进行扩展。例如,最开始的铅笔尾端是没有橡皮擦的,后来有个男孩在尾端装

2014-03-26 18:27:31 1907 3

原创 C# 类、结构与扩展方法

C# 类、结构与扩展方法我并非C#大神,只是用了这么久C#,会对这门语言有着一些自己的简介。为了总结一下自己对C#的认识,也为了能够和大家一起分享学习C#的过程,我打算把我的各种各样的理解写出来。在今后这一系列博客中,我主要总结的是一些关于C#、.NET应用方面的经验,并不会对C#的历史、设计模式、算法、.NET的原理等作说明。由于是自己的感悟,因此难免会有错误的地方,所以欢迎大家来指正。

2014-03-26 16:55:57 3094 1

原创 VB.NET 构造矩阵类

本类我是用VB.NET编写的类,不管用什么语言,算法都类似,注释写得都挺详尽的了,而且我也通过了调试。Public Class Matrix    Private matrix(,) As Double '定义矩阵变量    Private rowbound As I

2011-10-12 13:25:10 3176

原创 C++使用回溯法生成数独

数独,应该不用我说明吧,是一个9*9的矩阵,矩阵里的每一个数字都是1~9中的一个。在每一行、每一列每个数字只能出现一次,另外,在每一个九宫格里每个数字也只能出现一次。我曾经在网上看过一种“假”的数独生成法,生成的数独其实是有规律的,只要把中间的九宫生成好,那么周围的8个九宫就可以按照规律自动生成,但是这样的话便达不到“随机”的效果,于是经过苦想我想出了下面的方法:按行生成数

2010-02-04 22:04:00 3887 13

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除