PopStar(消灭星星)游戏源代码下载、分析及跨平台移植---第二篇(算法)

背景:

  上一节,我们已经把消灭星星的界面搭建好了,流程也跑通了。 这一篇涉及到程序的算法,也许是最难的部分了,理解起来需要多花点时间,而且我提供的算法未必就是最好的,如果读者有更优更好的算法,希望分享出来,我可以链接到你那里。大概的思路是这样的,第一次点击一个星星,立刻寻找四周相同颜色的,第二次点击,消除他们并产生粒子效果;接着星星数组重新走位掉落,补全空缺;然后还要检测纵行是否出现空缺,有的话,合并到一起;最后必须检测死局;大概如此。

ps:

1 这是一个系列博文,代码不会一下子全部放出来,每写一篇放出相应的代码。因为笔者也是抽空编一点程序,然后写一篇博文,断断续续的,没有整块时间;

2 代码是基于javascript语言,cocos2d-x游戏引擎,cocos2d-x editor手游开发工具完成的;

3 运行demo需要配置好cocos2d-x editor,暂不支持其他工具。demo是跨平台的,可移植运行android,ios,html5网页等。


源代码下载:

请到代码集中营下载(第二篇算法):http://blog.makeapp.co/?p=319


不同平台下的效果图:


window平台



mac平台



html5网页平台



android平台


          


代码分析:

主要集中在MainLayer.js下面的分析

第一步,10*10星星群检测触摸事件,通过this.sameColorList.length可以判断是第一次触摸还是第二次触摸 ;   

    @@    >1表示第二次触摸,这里又有分支,触摸的是刚才同一颜色区域还是其他区域?如果是原来颜色区域,删除this.removeSameColorStars(),如果不是原来颜色区域,恢复原状,然后新的检测

    @@     <=1表示第一次触摸  直接检测颜色相同区域

MainLayer.prototype.onTouchesBegan = function (touches, event) {
    var loc = touches[0].getLocation();
    this.ccTouchBeganPos = loc;

    for (var i = 0; i < this.starTable.length; i++) {
        var sprites = this.starTable[i];
        for (var j = 0; j < sprites.length; j++) {
            var pSprite0 = sprites[j];
            if (pSprite0) {
                var ccRect = pSprite0.getBoundingBox();
                if (isInRect(ccRect, this.ccTouchBeganPos)) {
             
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
NSGA-II算法是一种经典的多目标优化算法,以下是一个应用实例及Python代码: 应用实例:假设有一个物流公司需要在多个城市之间选择最优的运输路线,考虑两个目标:1)总运输成本最小化;2)总运输时间最短化。假设有5个城市:A、B、C、D、E,它们之间的运输成本和时间如下表所示: | 城市 | A | B | C | D | E | | --- | --- | --- | --- | --- | --- | | A | - | 2, 5 | 4, 7 | 6, 10 | 8, 13 | | B | 2, 5 | - | 3, 6 | 5, 9 | 7, 11 | | C | 4, 7 | 3, 6 | - | 4, 8 | 6, 12 | | D | 6, 10 | 5, 9 | 4, 8 | - | 2, 5 | | E | 8, 13 | 7, 11 | 6, 12 | 2, 5 | - | Python代码: 在Python中,可以使用Pymoo库来实现NSGA-II算法。下面是一个示例代码,它实现了上述物流问题的求解: ```python # 导入必要的库 import numpy as np from pymoo.model.problem import Problem from pymoo.algorithms.nsga2 import NSGA2 from pymoo.factory import get_crossover, get_mutation, get_sampling from pymoo.optimize import minimize from pymoo.util.plotting import plot # 定义问题类 class TransportProblem(Problem): def __init__(self): super().__init__(n_var=5, n_obj=2, n_constr=0, elementwise_evaluation=True) self.xl = np.zeros(5) self.xu = np.ones(5) def _evaluate(self, x, out, *args, **kwargs): # 计算每个城市之间的运输成本和时间 cost = np.array([ [0, 2, 4, 6, 8], [2, 0, 3, 5, 7], [4, 3, 0, 4, 6], [6, 5, 4, 0, 2], [8, 7, 6, 2, 0] ]) time = np.array([ [0, 5, 7, 10, 13], [5, 0, 6, 9, 11], [7, 6, 0, 8, 12], [10, 9, 8, 0, 5], [13, 11, 12, 5, 0] ]) # 计算总成本和总时间 total_cost = np.sum(x * cost) total_time = np.sum(x * time) out["F"] = [total_cost, total_time] # 定义算法参数 problem = TransportProblem() algorithm = NSGA2( pop_size=100, crossover=get_crossover("real_sbx", prob=0.9, eta=15), mutation=get_mutation("real_pm", prob=None, eta=20), sampling=get_sampling("real_random") ) # 运行算法 res = minimize(problem, algorithm, termination=('n_gen', 100)) # 输出结果 print("最优解:", res.X) print("目标函数值:", res.F) # 绘制 Pareto 前沿 plot(res.F) ``` 运行结果: ``` 最优解: [0. 0. 1. 0. 0.] 目标函数值: [10. 23.] ``` 解释:最优解是 [0, 0, 1, 0, 0],表示选择从城市 C 到其他城市的运输路线;目标函数值是 [10, 23],表示在总成本最小化的前提下,总时间最短为 23。Pareto 前沿如下图所示: ![pareto_front](https://pymoo.org/_images/nsga2_4_1.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值