0

エイジオブエンパイアズライズオブローマの食料や木材などの収集プロセスをシミュレートすることに興味があります。このようなシミュレーターは、経済成長を達成するのに役立ち、建物を建設して資源を収集するための最適化された順序を見つけるでしょう。シミュレーターは、戦闘ではなく、経済プロセスのみを検査することに注意してください。使いやすく、そのようなシミュレーションを行うことができるフリーソフトウェアはありますか?問題は、シミュレーターを使用してプロセスをシミュレートする方法です(リアルタイムゲームを作成する方法ではありません)。

4

1 に答える 1

3

Peladao は、RTS エンジンの例を求めました。ここにサンプルコードを書いてコメントしています。

疑似コード:

    loop:        
    "decide what want to build";
    "try to build that"; (a verification is made if resources are enough)
    "generate resources";
    goto loop;

実際のコード (javascript)

1) 面白くない。後で使用する関数を定義します。

var rand = function(){
    return Math.random()*100;
};

var random = (function(){   
    return {
        betwen:function(min,max){
            return Math.random()*(max-min)+min;
        },
        element:function(datarray){ 
            var len = datarray.length;
            if(!len) return;
            var r = parseInt(this.betwen(0,len),10);
            return datarray[r];
        }   
    };
})();

var scroll = (function(){        
    var index = 0;
    var maximo = 10;

    return {
    cortarViejas:function(){
        var edadCorte = index - maximo;

        $(".logline").each(function(){
            if($(this).data("nace")<edadCorte)
                $(this).remove();           
        }); 
    },
    add:function(txt){
        var line = $("<div>");      
        line.addClass("logline");
        line.data("nace",index++);
        line.html(txt);

        $(line).insertAfter('#marca');

        this.cortarViejas();
    },
    error:function(txt){
        this.add("ERROR: "+txt);
    },
    battle:function(txt){
        this.add("Battle: "+ txt);
    },
    oceaniaDice:function(txt){
        this.add("[Oceania broadcast] "+ txt);
    },
    debugOceania:function(txt){
        this.add("[Oceania debug] "+ txt);
    }
    };

})();

2) ここが興味深いところです。オセアニアは資源を生み出す帝国であり、これらの資源を戦車や兵士に投資します

var oceania = (function(){        

    var tanks = 0;
    var soldiers = 0;
    var build = "";//build strategy 
    var dead = 0;

    var prices = {"tank":5,"soldier":1};

    var hateLines = [ "Eastasia will be destroyed","We hate Eurasia","Our troops are doing good",
        "We have always ben at war with Eastasia","Under the spreading chestnut tree.I sold you and you sold me"];

    var metal = 0;
    var powerplants = 1;
    var factory = 3;    

    return {
    info:function(){
        scroll.debugOceania("Build strategy:"+ build);      
        scroll.debugOceania("Metal:"+ metal);       
        scroll.debugOceania("Army: soldier "+soldiers + ", tanks "+tanks );     
        scroll.debugOceania("Dead:"+ dead);     
    },
    militarTick:function(stuff){

        if(tanks>10 && soldiers > 20){
            tanks -= 10;
            soldiers -= 20;
            scroll.battle("Some units losts! 10 tanks, 20 soldiers");       
            dead += 10+ 20;
        }           
    },

3) ここで、帝国は[物]を造りたいという彼の願望を実行する

    buy:function(stuff){    
        if(!prices[stuff]) {
            scroll.error("buying what?:"+stuff);
            return;
        }
        if(prices[stuff]>metal) {
            scroll.debugOceania(stuff + " is too expensive");
            return;
        }
        metal -= prices[stuff];                 

        switch(stuff){
            case "tank":                            
                tanks++;    
                //scroll.debugOceania("Oceania create tank");               
                break;
            case "soldier":         
                soldiers++; 
                //scroll.debugOceania("Oceania create soldier");                
                break;      
        }       
    },
    buildTick:function(){
        switch(build){
            case "tanks":
                this.buy("tank");
                break;
            case "soldiers":
                this.buy("soldier");
                break;
        }
    },

3) ここで、帝国は、戦車/兵士の比率、兵士の数、戦車の数、またはその他の戦略レベルの問題に基づいて、彼の望みを決定します。

    strategyTick:function(){        
        var likeSoldiers=0,likeTanks=0;

        build = "nothing";

        //You have something, build something!
        if( metal> 10) //we have metal, lets buy soldiers!
            likeSoldier = 10;   

        //minimum this  
        if ( tanks < 10)
            likeTanks += 10;
        if ( soldiers< 20)
            likeSoldiers += 10;

        //we want 5 soldiers for 1 tank
        if ( soldiers < tanks * 5)
            likeSoldiers += 10;

        //if we have at least 40 soldiers, we would love to have more tanks!
        if ( soldiers > 40) 
            likeTanks += 10;

        //if we have at least 40 tanks, we would love to have moresoldiers!
        if ( tanks > 40) 
            likeSoldiers += 10;

        //we want soldiers more than anything else, lets build soldiers!
        if(likeSoldiers > likeTanks ){      
            build = "soldiers";
        }else 
        //we want tanks more than anything else, lets build soldiers!
        if(  likeTanks > 5) {
            build = "tanks";
        }               
    },

4) この行以降はすべて無視できます。

    produccionTick:function(){
        var t;
        var energy = powerplants * 3;
        var factorycount = factory;
        var metalInitial = metal;

        for(t=0;t<energy,factorycount>0;t++,factorycount--){            
            metal = metal + 1;      
        }           
        //var produce = metal - metalInitial;
        //scroll.debugOceania("Oceania create "+ produce + " metal. Total now:"+metal);         
    },
    propagandaTick:function(){
        if(rand()<5) {
            var hate = random.element(hateLines);
            scroll.oceaniaDice(hate);
        }   
    },
    tick:function(){
        this.propagandaTick();
        this.produccionTick();
        this.strategyTick();
        this.buildTick();
        this.militarTick();
    }   
    };

})();



$(function(){
    $("#cmd").keyup(function(event){                    
        if (event.which == 13) {
            var command = $(this).val();

            $(this).val("");
            scroll.add(command);

            $("#cmd").focus();

            event.preventDefault();
        }  
    });


    $("#reload").click(function(){  
        document.location = "game.htm?r="+Math.random();
    });

    oceania.tick();

    $(document).ready(function(){
        setInterval(function(){
            oceania.tick();
        },300);
    });     
});
于 2012-05-15T13:35:04.177 に答える