Bir oyun için futbol simülasyonu

4 Cevap php

Ben bir futbol (futbol) maçı taklit bir simülasyon motoru oluşturmak istiyorum. Bana yardımcı olabilir eğer büyük serin olurdu. Benim için önemli olan eylemler gerçekleşmesi karar etmektir. Her eylem için olay dinleyicileri daha sonra kolayca uygulanabilir. Fonksiyon sadece oluyor eylemlere oyun sonuçları ve yorumları taklit etmesi gerekir. Gerekli hiçbir 2D/3D grafik yoktur. Biz Hattrick gibi oyunlar bahsediyoruz.


Ben ilk başta eylemleri dakikalık bir dizi var önereceğini.

$ Dakika = array (1, 3, 4, 7, 11, 13, ..., 90, 92);

Bu dakikalarda her biri için, daha sonra bir saldırı simülasyonu olabilir.

= $ Saldıran mt_rve (1, 2);: Saldıran takım daha önce zar tarafından belirlenir

Yani benim için en önemli olan kısmı saldırı fonksiyonudur.

Benim yaklaşım düzenlemek veya bir numune olarak lütfen bunu kullanın. Bu geliştirmek için bana yardımcı olabilir misiniz? Sonuçlar mümkün olduğu kadar gerçekçi böylece işlev karmaşık olmalıdır. Ama yüksek öngörülebilirlik ve çok rastgele sonuçlar arasında bir şey bulmalıyız. Ben sadece bu işlevi geliştirmek istiyorum.

My approach:

<?php
function Chance_Percent($chance, $universe = 100) {
    $chance = abs(intval($chance));
    $universe = abs(intval($universe));
    if (mt_rve(1, $universe) <= $chance) {
        return true;
    }
    return false;
}
function simulate_attack($teamname_att, $teamname_def, $strength_att, $strength_def) {
    global $minute, $goals, $_POST, $matchReport, $fouls, $yellowCards, $redCards, $offsides, $schuesse, $taktiken;
    // input values: attacker's name, defender's name, attacker's strength array, defender's strength array
    // players' strength values vary from 0.1 to 9.9
    // ADJUSTMENT START
    switch ($taktiken[$teamname_att][0]) {
        case 1: $strength_att['defenders'] *= 1.1; $strength_att['forwards'] *= 0.9; break;
        case 3: $strength_att['defenders'] *= 0.9; $strength_att['forwards'] *= 1.1; break;
    }
    switch ($taktiken[$teamname_def][0]) {
        case 1: $strength_def['defenders'] *= 1.1; $strength_def['forwards'] *= 0.9; break;
        case 3: $strength_def['defenders'] *= 0.9; $strength_def['forwards'] *= 1.1; break;
    }
    // ADJUSTMENT END
    $matchReport .= '<p>'.$minute.'\': '.comment($teamname_att, 'attack');
    $offense_strength = $strength_att['forwards']/$strength_def['defenders'];
    $defense_strength = $strength_def['defenders']/$strength_att['forwards'];
    if (Chance_Percent(50*$offense_strength*($taktiken[$teamname_att][2]/2)*($taktiken[$teamname_att][3]/2))) {
        // attacking team passes 1st third of opponent's field side
        $matchReport .= ' '.comment($teamname_def, 'attack_advance');
        if (Chance_Percent(25*($taktiken[$teamname_def][4]/2))) {
            // the defending team fouls the attacking team
            $fouls[$teamname_def]++;
            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul');
            if (Chance_Percent(43)) {
                // yellow card for the defending team
                // chance is correct for my purpose
                $yellowCards[$teamname_def]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_yellow');
            }
            elseif (Chance_Percent(3)) {
                // red card for the defending team
                // chance is correct for my purpose (only 1.43% because it's an alternative way)
                $redCards[$teamname_def]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_red');
            }
            // indirect free kick
            // only 58.23% because it's an alternative way
            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick');
            if (Chance_Percent(25)) {
                // shot at the goal
                $schuesse[$teamname_att]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot');
                if (Chance_Percent(25)) {
                    // attacking team scores (6.25% chance)
                    $goals[$teamname_att]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_score');
                }
                else {
                    // defending goalkeeper saves
                    // only 18.75% because it's an alternative way
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_save');
                }
            }
            else {
                // defending team clevardırs the ball
                // only 75% because it's an alternative way
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_clear');
            }
        }
        elseif (Chance_Percent(17)) {
            // attacking team is caught offside
            // only 4.25% because it's an alternative way
            $offsides[$teamname_att]++;
            $matchReport .= ' '.comment($teamname_def, 'attack_advance_offside');
        }
        else {
            if (Chance_Percent(25*($taktiken[$teamname_def][5]/2))) {
                // the defending team fouls the attacking team
                $fouls[$teamname_def]++;
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul');
                if (Chance_Percent(43)) {
                    // yellow card for the defending team
                    // chance is correct for my purpose
                    $yellowCards[$teamname_def]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_yellow');
                }
                elseif (Chance_Percent(3)) {
                    // red card for the defending team
                    // chance is correct for my purpose (only 1.43% because it's an alternative way)
                    $redCards[$teamname_def]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_red');
                }
                if (Chance_Percent(19)) {
                    // penalty for the attacking team
                    $schuesse[$teamname_att]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty');
                    if (Chance_Percent(77)) {
                        // attacking team scores (77% chance according to Wikipedia)
                        $goals[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty_score');
                    }
                    elseif (Chance_Percent(50)) {
                        // shot misses the goal
                        // only 11.5% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty_miss');
                    }
                    else {
                        // defending goalkeeper saves
                        // only 11.5% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_penalty_save');
                    }
                }
                elseif (Chance_Percent(28)) {
                    // direct free kick
                    // only 22.68% because it's an alternative way
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick');
                    if (Chance_Percent(33)) {
                        // shot at the goal
                        $schuesse[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_shot');
                        if (Chance_Percent(33)) {
                            // attacking team scores (10.89% chance)
                            $goals[$teamname_att]++;
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_shot_score');
                        }
                        else {
                            // defending goalkeeper saves
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_shot_save');
                        }
                    }
                    else {
                        // defending team clevardırs the ball
                        // only 77% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_dFreeKick_clear');
                    }
                }
                else {
                    // indirect free kick
                    // only 58.23% because it's an alternative way
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick');
                    if (Chance_Percent(25)) {
                        // shot at the goal
                        $schuesse[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot');
                        if (Chance_Percent(25)) {
                            // attacking team scores (6.25% chance)
                            $goals[$teamname_att]++;
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_score');
                        }
                        else {
                            // defending goalkeeper saves
                            // only 18.75% because it's an alternative way
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_shot_save');
                        }
                    }
                    else {
                        // defending team clevardırs the ball
                        // only 75% because it's an alternative way
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_foul_iFreeKick_clear');
                    }
                }
            }
            else {
                // attack passes the 2nd third of the opponent's field side - good chance
                $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance');
                if (Chance_Percent(62*($taktiken[$teamname_att][6]/2)*($taktiken[$teamname_att][7]/2)/($taktiken[$teamname_att][8]/2)*($taktiken[$teamname_att][9]/2)/($taktiken[$teamname_def][10]/2))) {
                    // shot at the goal
                    $schuesse[$teamname_att]++;
                    $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot');
                    if (Chance_Percent(30*$strength_def['goalkeeper']/7/($taktiken[$teamname_att][11]/2))) {
                        // the attacking team scores
                        // only 8.78% because it's an alternative way
                        // if goalkeeper has strenth 7 then chance is 8.78% otherwise lower/higher
                        $goals[$teamname_att]++;
                        $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot_score');
                    }
                    else {
                        if (Chance_Percent(50)) {
                            // the defending defenders block the shot
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot_block');
                        }
                        else {
                            // the defending goalkeeper saves
                            $matchReport .= ' '.comment($teamname_def, 'attack_advance_advance_shot_save');
                        }
                    }
                }
            }
        }
    }
    // attacking team doesn't pass 1st third of opponent's field side
    elseif (Chance_Percent(15*$defense_strength*($taktiken[$teamname_att][12]/2)*($taktiken[$teamname_att][13]/2))) {
        // quick counter attack - playing on the break
        // only 7.5% because it's an alternative way
        // if defense has strength 7 then chance is 7.5% otherwise lower/higher
        $strength_att['defenders'] = $strength_att['defenders']*0.8; // weaken the current attacking team's defense
        $matchReport .= ' '.comment($teamname_def, 'attack_quickCounterAttack');
        $matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
        return simulate_attack($teamname_def, $teamname_att, $strength_def, $strength_att); // new attack - this one is finished
    }
    else {
        // ball goes into touch - out of the field
        $matchReport .= ' '.comment($teamname_def, 'attack_throwIn');
        if (Chance_Percent(33)) {
            // if a new chance is created
            if (Chance_Percent(50)) {
                // throw-in for the attacking team
                $matchReport .= ' '.comment($teamname_def, 'attack_throwIn_att');
                $matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
                return simulate_attack($teamname_att, $teamname_def, $strength_att, $strength_def); // new attack - this one is finished
            }
            else {
                // throw-in for the defending team
                $matchReport .= ' '.comment($teamname_def, 'attack_throwIn_def');
                $matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
                return simulate_attack($teamname_def, $teamname_att, $strength_def, $strength_att); // new attack - this one is finished
            }
        }
    }
    $matchReport .= ' ['.$goals[$_POST['team1']].':'.$goals[$_POST['team2']].']</p>'; // close comment line
    return TRUE; // finish the attack
}
?>

Tactical settings which should have an influence on the rveomness:

  • ayarı (1 = savunma, 2 = nötr, 3 = saldırgan): yüksek değeri zayıf olan savunma ve güçlü suçtur
  • oyun (1 = Yavaş, 2 = orta, 3 = hızlı) hızı: yüksek değerini daha iyi fırsatlar vardır ama daha yüksek bir hızlı karşı atak yakalanma riski olduğunu
  • daha sık ofsayt değer olsun daha az ama daha iyi fırsatlar olduğunu yüksektir ve vardır: paso (1 = 2 = orta, 3 = uzun, kısa) mesafe
  • değişikliklerin oluşturulması (1 = 2 = orta, 3 = riskli güvenli): yüksek değeri daha iyi fırsatlar vardır ama daha yüksek bir hızlı karşı atak yakalanma riski
  • savunma basınç (1 = düşük, 2 = orta, 3 = yüksek): değer olacak daha hızlı karşı saldırıları daha yüksek
  • saldırganlık (1 = düşük, 2 = orta, 3 = yüksek): değeri daha saldırıları yüksekse faulü ile duracaktır

Integration of the tactical settings:

Bütün taktik ayarlar "1", "2" ya da "3" olarak bir değeri vardır. "2" Her zaman nötr / ortamıdır. Yani 2 ile değerleri bölmek. I 0.5 veya 1 ya da 1.5 olan bir oran olsun. Ben daha sonra kolayca taktik etkisini entegre etmek için bu ile şansını çarpın düşündüm. Ama bir sorun gelişti: Ben 2 ya da daha fazla taktik değerlere göre bir şans çarpın, o (örneğin 60 x 1.5 x 1.5) daha yüksek% 100 olabilir. Yani taktikleri bu şekilde entegre olamaz. Ben başka ne yapabilirim?


Thank you very much!

Update (2014): Bir kaç yıl sonra, ben artık açık kaynak on GitHub olarak oyunun tam kod tabanı yayımlveı. Kimse ilgi olup olmadığını, bu simülasyon in this file özel uygulama bulacaksınız.

4 Cevap

Bir 'weight'-bazlı simülasyon (Evet, ben şimdi bu terimi icat) oluşturun. (Türü ne olursa olsun) Her değişken bir 'ağırlığa sahiptir. Örneğin, oyuncu ağırlıklarına sahiptir. İyi bir oyuncu ekstra bir ağırlığa sahiptir. Bir yaralanma olan bir oyuncu daha az kilo ya da hiç hatta hiç bekleme vardır (ya da belki negatif ağırlık?).

(Bu bir futbol maçı, çünkü iki takım) birlikte tüm ağırlık ekleyin. Bu ağırlık kazanan bir şans yüzdesi andırıyor. Örneğin;

Team A = 56 ağırlığı, Team B = 120 ağırlık

Ağırlık zaten bir takım diğerinden daha (ne olursa olsun ağırlık kurulmuştur nasıl .. belki onlar kimin umurunda, çok yuvarlak topları var) çok daha iyi olduğunu göstermektedir.

Based on the weight, you could calculate a winning chance; The winning chance of Team A = 32%, The winning chance of Team B = 68%.

Şimdi galibiyet yüzdesi etkilenmiş bir maç, taklit bir algoritma yazabilirsiniz. Ben reklam çizmek için bir kez böyle bir algoritma yazdı. Benim durumumda, bir reklam vardı tıklama sayısı ağırlık oldu. Büyük ağırlığı, reklam benim algoritması tarafından seçildi şans daha.

Ben çok sayıda (gibi, 1000) alarak ve daha sonra ağırlık yüzdesine göre her reklam için bu sayı bir dizi, atanan tarafından algoritması yazdı. Bu durumda, Team A gets a range of 32% of 1000, which is 0 - 320, Team B gets a range of 68% which is 321 - 1000. Sonra benim algoritma 0 ile 1000 arasında bir sayı (rastgele) çizmek istiyorum. Bunu farklı söndürmeden olabilir ancak büyük aralığı (ve dolayısıyla büyük kazanan şans) ile reklam (veya takım), algoritması tarafından seçilmiş olmanın en şansı var .

Algoritması bu tür (Kullanıcıların kendi ekiplerini oluşturmak eğer, vb daha iyi oyuncular almak) dengeli bir sonuç için (mükemmel olmasa da) büyük. Ayrıca sadece olaya bir ağırlık ekleyerek tarafından da, bu algoritma tarafından çizilen oyun içinde herhangi bir etkinlik yapabiliriz ..

O ekip içinde diğer kilo faktörlere göre, takımın başına, bir olay (bir takım arkadaşı örneğin yaralanma) ağırlık eklemek (kaç üste oynanan maçlarda, ne kadar iyi olduğunu (ya da ne kadar ağırlığında) kendi tıpçı personel olabilir , vb.) Eğer doğru ağırlık şeyi yaparsanız, her ikisi veya tamamen şaşırtıcı (yine, sadece gerçek bir hayat maçı gibi) (sadece bazı gerçek hayatta karşılaşmaları gibi) tahmin edilebilir bir çok dengeli (ve kolayca genişletilebilir) simülasyon algoritması alabilir.

UPDATE: Tactical Influences You added tactical influences, plus the question 'how would you do it?', so I will elaborate. What you are currently doing (as I understand it) is you take a percentage (the chance something occurs) and multiply that with a ratio, so that it will occur more/less.

Birden oranı en olabilir çünkü Ancak, bir şans daha sonra% 100 ile sonuna kadar.

Her şeyden önce, bir takımın her taktik avantajı için, diğer takım (muhtemelen) bir sayaç avantajı var. A takımı gol atmakta bir ağırlığa sahiptir Örneğin, B Takımı hedefleri durdurma karşı ağırlığa sahiptir. Bu miktar evren (% 100). (Yukarıda açıklandığı gibi) şimdi her iki taktik avantajları ağırlığı bir o evrenin bir parçası, ya da toplam ağırlık yapar.

(Ağırlık sistemine göre) belirli bir dakika, bir gol gol Team A is 80%, belirli, ve bunu durdurma Team B is 20% belli olduğunu söylüyorlar. Takım B sadece çok iyi bir kaleci kazanmış çünkü Ama, Team B tarafında bir taktik etkisi var. Bu etki evrenin kendisi bir olayın şansı kayması, ama değil! (Bazı durumlarda, bu mutlaka kötü bir şey olmamasına rağmen) diğer bir deyişle, daha sonra 100 toplam% şans ile sona olmamalıdır

Yani, yeni ağırlıklar göre yeniden hesaplamak şansı ardından taktik etkisi dayalı, add weight to Team B olmalı ve.

Assigning Weight

Eğer yorumladı gibi Şimdi, ağırlık atama kolay değildir. Kesinlikle onların nitelikleri oyuncuları 'tartmak' zorunda değilse. Tartı sadece bir oyuncu 'kötü' ya da 'iyi' olduğunu söyleyerek daha sonra hakkında, sahip (lise gibi!) Aslında sınıf onları için. Büyük en yüksek dereceli, daha doğru ağırlıklandırma sistemidir.

Şimdi, taktik etkilere ağırlıkları atama biraz daha kolaydır. Eğer aşağıdaki etkiye sahip olduğunu söylüyorlar;

  • Hedefleri Durdurma
  • Gol attı
  • Savunma
  • Saldırı

Şimdi, toplam ağırlığın bir havuz oluşturmak (örneğin, 1000, ben bu numarayı gibi). Bunlar atayabilirsiniz 'taktik noktaları' vardır. Bu dört etkiler bir maç yapmak, böylece her bir etki için 250 puan atayabilirsiniz. Bu sayı (250) Her etkisi evren.

Bu noktaların atama, takımın başına, (gibi, onlar iyi bir kaleci var mı?) Takımın ağırlık faktöre bağlıdır

Bir kaleci, örneğin, rakipler kaleciyle karşı ağırlığında (ve belki de kalecinin ve rakip arasında insanlar olduklarını, ancak basit tutmak edelim). the keeper of Team A weighs 80% toplam söylüyorlar, ve the keeper of Team B 20%. Bu doğrudan aldıkları taktik noktaları ile ilgili olduğu, ne kadar iyi olduklarını oranları. Yani Team A gets 80% of 250 stopping-goals-points ve Team B gets 20% bu noktaları.

Noktalarına geri kalanı eşit atanabilir. Benim örnekte, ben bir hedef durmuş ya da değil alır wether bir evren olarak sadece iki onundur aldı. (Eğer anlamaya için) gerçekte çok daha fazla ağırlık faktörler olabilir.

Hepsi ayrılır sonra, maç çıkarmak için taktik noktalarını kullanabilirsiniz. Her dakika için kazanma şansını yeniden hesaplayabilirsiniz. Her dakika, sen de (diyelim ki bir başka oyuncu alana girer, ya da bir oyuncu sakatlanır) taktik etkileri yeniden hesaplayabilirsiniz.

Evet, değişkenlerin edineceğim. Ama daha olsun, daha iyi bir maç oynar. Daha fazla değişken (veya ağırlıkları / karşı ağırlık) daha gerçek hayatta gibi hissediyor.

Peki kompleks olacak, ama gerçekçi bir futbol maçı benzetmek istiyorsanız, oyun içine koymak çok daha fazla değişken gerekir. Takımın tüm saldıran olacak değil, siz savunucuları olacak, ve bu savunucuları rakip takımın saldırı gücünü azaltmak olacaktır.

Ben daha böyle bir akış bir şey tavsiye ederim:

1) A takımı alanının kendi tarafında topu vardır. Bu puan çalışacaktır. 1-100 (0-99) bir tablo oluşturun ve aşağıdaki faktörler ile doldurmak: Oyuncu takım A'nın beceri gelen, şut, yorgunluk miktarı (oyun süresi) den Oyuncu savunma yeteneği, mesafe Karşıt. Bu tablo böyle bir şey (1-100 değil 0-99, böylece daha basit hale getirmek için 1 hayal) görünecektir: /> br

  1. 1-50: Oyuncu başarıyla topu gelişmeler
  2. 51-60: Oyuncu topu ilerletmek için başarısız ama elinde tutar
  3. 61-73: Oyuncu topu ilerletmek için başarısız olur ve bulundurma kaybeder
  4. 74-82: Oyuncu bir başka saldırganın kadar yukarı alana top geçer
  5. 83-95: Oyuncu topa sahip kaybeder ve düşman puan çalışır
  6. 95-100: Kritik hatası: Oyuncunun topa sahip kaybeder ve anında rakip takım bir gol verir

2) 1 durumunda, tekrar rulo, ama şimdi karşı tarafta olduğu için seçenekler farklı bir dizi var. Hatta 2'de, tekrar masaya aynı rulo yapın. Üç durumunda, rakip takım için aynı rulo yapmak, ama onlar yakın hedef konum olarak farklı bir tablo kullanın. 4 durumunda, tekrar rulo yapmak ancak Team A Player 2 için oyuncunun istatistikleri değişmez ve sayılar hedefe yakın olmak varsayalım. 5 durumunda, rakip takım başarılı veya rastgele bir oyuncunun yeteneklerine göre başarısız ya bir tablo rulo. Altı durumunda, anında futbol oyununda bu kez% 5 den daha az yol olur (rakip takım için bir hedef vermek, daha fazla 0,01% gibi olmak istiyorum, ama aynı zamanda başka bir tablo üzerinde rulo olabilir yaralanma dahil kritik hataları, ya da) on saniye için aptal görünümlü.

3) sonuçlarına göre işlemi tekrarlayın.

Sana kod örnekleri verebilir, ama temel fikir olduğunu düşünüyorum.

GÜNCELLEME: Ben başkalarının sizin yöntemi kullanarak ağırlıkları faktör nasıl cevap düşünüyorum. Benim yöntem aslında farklı olurdu ve ben burada farklılıkları anlatacağım ...

1) Sizin hesaplamaları temelde hedefe bir girişimi her bunca dakikada varsayarak, ve bu noktada bir oyuncu veya skora olmaz ki şansı modellemek girişimi hesaplamalar karmaşık bir dizi var. Benim hesaplamalar top oyunda sürekli ve istatistik bir dizi dayalı sonraki olası sonuçlardan biri kümesinden hareket zannedebilir, oldukça geri ve ileri hedefi çekim bir dizi olarak kabul ediliyor daha. O top değil, oyuncular takip ediyor gibi bu kavramsal farklı olurdu ve top bu anılan faktörler tarafından ağırlıklandırılmış olasılıkların belirli sayıda atanmış olacaktır.

2) Eğer ağırlık şeyler hangi yöntem belli bir miktar üzerinden yüzde değişimleri artar diğerleri açıklandığı gibi, hangi çoklu ağırlıkları içerir. Benim senaryoda, 100 olası sonuçların mutlak maksimum sadece hiç olduğunu böylece bir tabloya şansını yıkmak ve daha sonra sık sık bir hit tablo olarak bilinen sonuçların, bu dizi içinde bir dizi vurmak için mt_rand kullanın ya da bir piyango.

Bunu yapmak için, size büyümek için oda verir, hangi taban şansı var ve bunları ağırlık olur. Örneğin, skoru bir topun taban şansı 10/100 olduğunu söylüyorlar. Birisi bir 1 ise, bu 5 olur. 2, bu 10 kalır. 3, bu 15 olur. Yani şimdi, 0-14 esnek bu değerlere atanır rulo ve isabet tablo vardiya diğer değerler karşılamak için. Eğer varsayımsal de tablo büyümek gerektiği gibi daha sonra bu olasılık sorunları getiriyor, ama bu pasif (tüm diğer olası sonuçları faktoring) 15/105 10/100 ile gitmek istiyorum gibi vurma şansını azaltır.

Eğer çoktan başladık yolda devam etmek istiyorsanız, ben sadece bir tabloya bu değerleri attı ve zaten yapmak her saldırı onları hesaplanan sürece ben burada söylüyorum ne bir çoğunluğu, işe düşünüyorum.

Eğer mevcut iç içe rastgele ifadeleri ile sopa istiyorsanız, ben başkalarının teklif var çözümlerden biri ile gitmek söyleyebilirim. İyi şanslar!

Ben yüzdelere bütün olasılıkları dönüştürmek öneririm:

function Chance($chance, $universe = 100)
{
    $chance = abs(intval($chance));
    $universe = abs(intval($universe));

    if (mt_rand(1, $universe) <= $chance)
    {
    	return true;
    }

    return false;
}

Chance(25); // 25%
Chance(5, 1000); // 0.5%

Ayrıca ben sadece başkalarının, örneğin koşulları ile bazı olasılıkları örneğini olacaktır:

if ($attack === true)
{
    if (Chance(15 * $aggressivity) === true)
    {
    	if (Chance(10 * $aggressivity) === true)
    	{
    		// red card
    	}

    	else
    	{
    		// yellow card
    	}
    }
}

EDIT: Sadece eve ben ve ben gerçekten uyku gitmek gerekir ama sizin düzenlemek hızlı bir bakışta sonra ben sadece size ilgi olabilir bir fikrim vardı. Yerine 1, 2 veya 3 takımın taktik konumunu kullanmayın bir ayar değeri kullanmanın ne varsa,? Örneğin, bir 4-4-2 ile bir takım bir 3-3-4 takımı ile daha bir 5-3-2 takımı karşı bir gol şansı daha az olurdu. , Yerleşimler her zaman savunmayı iyi performansı hangi takım karşılaştırmak oldukça kolay olurdu üçüz (XYZ) olduğunu varsayarsak geçen ve puanlama.

Basit bir formül böyle bir şey olabilir:

A: 4-4-2 (Defending Team)
B: 3-2-5 (Attacking Team)

B gol gol şansı ^ -1 = 0.2 =% 20 (4/5) olacağını ve ters (A puanlama takım) (3/2) ^ -1 = 0.5 =% 50 olacaktır. PS: Bu şimdi çok mantıklı görünmüyor, ama ben sabah ona başka bir görünüm vermek için çalışacağım.

Ve başka bir şey: Bir kırmızı karttan sonra neden faylanma ekip aynı kalır mı? Bu IMO (bir oyuncu daha az) zayıf almalısınız.

Bu gerçek hüner bu değil mi? Belki değişkenler oyuncular ve takımlar bir eylemin başarısını ve olasılık etkileyebilecek hangi hangi düşünmeye başlar.

The program flow could look like: 1. Calculate which event happens on basis of the variables and let there some randomness be there too 2. Calculate the success-rate of the event.

Bunu yapmak ve kendiniz kesinlikle programlama zorunda korkuyorum ;)