游戏开发:每个人都应该懂点函数式编程

游戏开发:每个人都应该懂点函数式编程

ID:34781248

大小:56.50 KB

页数:6页

时间:2019-03-10

游戏开发:每个人都应该懂点函数式编程_第1页
游戏开发:每个人都应该懂点函数式编程_第2页
游戏开发:每个人都应该懂点函数式编程_第3页
游戏开发:每个人都应该懂点函数式编程_第4页
游戏开发:每个人都应该懂点函数式编程_第5页
资源描述:

《游戏开发:每个人都应该懂点函数式编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、一个问题  假设现在我们需要开发一个绘制数学函数平面图像(一元)的工具库,可以提供绘制各种函数图形的功能,比如直线f(x)=ax+b、抛物线f(x)=ax²+bx+c或者三角函数f(x)=asinx+b等等。那么怎么设计公开接口呢?由于每种行数的系数(a、b、c等)不同,并且函数构造也不同。正常情况下我们很难提供一个统一的接口。所以会出现类似下面这样的公开方法://绘制直线函数图像publicvoidDrawLine(doublea,doubleb){Listpoints=newList();for(doublex=-10;x<=10;x=x+0.1

2、){PointFp=newPointF(x,a*x+b);points.Add(p);}//将points点连接起来}//绘制抛物线图像publicvoidDrawParabola(doublea,doubleb,doublec){Listpoints=newList();for(doublex=-10;x<=10;x=x+0.1){PointFp=newPointF(x,a*Math.Pow(x,2)+b*x+c);points.Add(p);}//将points点连接起来}...DrawLine(3,4);//绘制直线DrawParabola(1

3、,2,3);//绘制抛物线  如果像上面这种方式着手的话,绘制N种不同函数就需要定义N个接口。很明显不可能这样去做。  (注,如果采用虚方法的方式,要绘制N种不同函数图像就需要定义N个类,每个类中都需要重写生成points的算法)  如果我们换一种方式去思考,既然是给函数绘制图像,为什么要将它们的系数作为参数传递而不直接将函数作为参数传给接口呢?是的,没错,要绘制什么函数图像,那么我们直接将该函数作为参数传递给接口。由于C#中委托就是对方法(函数,这里姑且不讨论两者的区别)的一个封装,那么C#中使用委托实现如下:publicdelegatedoubleFunction2BeDraw

4、ed(doublex);//绘制函数图像publicvoidDrawFunction(Function2BeDrawedfunc){Listpoints=newList();for(doublex=-10;x<=10;x=x+0.1){PointFp=newPointF(x,func(x));points.Add(p);}//将points点连接起来}...Function2BeDrawedfunc=(Function2BeDrawed)((x)=>{return3*x+4;});//创建直线函数DrawFunction(func);//绘制系数为3

5、、4的直线Function2BeDrawedfunc2=(Function2BeDrawed)((x)=>{return1*Math.Pow(x,2)+2*x+3;});//创建抛物线函数DrawFunction(func2);//绘制系数为1、2、3的抛物线Function2BeDrawedfunc3=(Function2BeDrawed)((x)=>{return3*Math.Sin(x)+4;});//创建正弦函数DrawFunction(func3);//绘制系数为3、4的正弦函数图像  如上。将函数(委托封装)作为参数直接传递给接口,那么接口就可以统一。至于到底绘制的是什

6、么函数,完全由我们在接口外部自己确定。  将函数看作和普通类型一样,可以对它赋值、存储、作为参数传递甚至作为返回值返回,这种思想是函数式编程中最重要的宗旨之一。  注:上面代码中,如果觉得创建委托对象的代码比较繁杂,我们可以自己再定义一个函数接收a、b两个参数,返回一个直线函数,这样一来,创建委托的代码就不用重复编写。  函数式编程中的函数  在函数式编程中,我们将函数也当作一种类型,和其他普通类型(int,string)一样,函数类型可以赋值、存储、作为参数传递甚至可以作为另外一个函数的返回值。下面分别以C#和F#为例简要说明:  注:F#是.NET平台中的一种以函数式编程范式为

7、侧重点的编程语言。举例中的代码非常简单,没学过F#的人也能轻松看懂。F#入门看这里:  定义:  在C#中,我们定义一个整型变量如下:  intx=1;  在F#中,我们定义一个函数如下:  letfuncxy=x+y  赋值:  在C#中,我们将一个整型变量赋值给另外一个变量:  intx=1;  inty=x;  在F#中,我们照样可以将函数赋值给一个变量:  letfunc=funxy->x+y//lambda表达式  letfunc2=func  存储:  在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。