Autor Zpráva
Lukáš944
Profil *
Zdravím, potreboval by som pomoc, programujem jeden algorytmus na výpočet futbalových výsledkov, a neviem si poradiť, ako to urobiť.

Takže mám zadané výkony tímov v tom zápase, nejak takto:
$vykon_tim_domaci = 770;
$vykon_tim_hostia = 650;


to je príklad, jasneže sa budú dynamicky meniť podla dát ktoré si načítajú z DB, takže raz môžu byť väčší hostia, a inokedy domáci.

A teraz k veci, predstavujem si to nejako tak, že si vygenerujem počet šancí (aby výsledky nekončili stále napr. 1:1, 0:0, ale aby občas skončili aj 4:4), a vynásobím tisícnou výkonu toho ktorého tímu, +aby tam bol aj faktor náhody (že niektoré šance ten tím nepremenil/premenil naviac). A aby to vo výsledku záležalo podla: 80% výkon tímu, 20% náhoda.

$pocet_sanci = rand(1,15); //vygenerujem si pocet sanci na strelenie golu

$stastie_domaci = rand(3,5) / 10; //určím či bude mať daný tím šťastie a vsieti nejaké goly naviac
$goly_domaci = round(($pocet_sanci * ($vykon_tim_domaci/1000)) * $stastie_domaci);

$stastie_hostia = rand(3,5) / 10; //určím či bude mať daný tím šťastie a vsieti nejaké goly naviac
$goly_hostia = round(($pocet_sanci * ($vykon_tim_hostia/1000)) * $stastie_hostia);


echo "Vysledok je domaci".$goly_domaci.":".$goly_hostia."hostia";


toto funguje, ale problém nastáva taký, že rozdiel týchto výkonov, teda 770 vs 650 je velký (teda v podmienkach hry bude veľký), a potrebujem aby výsledky končili zdrcujúcou výhrou 1. mužstva, napr. 8:2, 7:0, 5:0, ... proste toto je prípad ked bude hrať najlepší v lige s najhorším v lige, a šance, aby to v 95% prípadoch aby to končilo výhrou 1. tímu, a 4% remízou, 1% výhrou 2. tímu (to len zhruba percentá)...a tento vzorec vyššie funguje tak, že to väčšinou končí tesne, napr 3:2, 2:1, 4:3 atd., ale aby takto končili zápasy potrebujem keď bude pomer výkonov napr 770 vs 750... viem že to nebude asi nič zložité, ale za boha ma to logicky nemôže napadnúť ako to urobiť. A tá náhoda tam má byť zakomponovaná nejak tak, že napríklad keď sa bude hrať spomínaných 770 vs 750 tak to skončí napr. 55% krát víťazstvom domácich, a 45% víťazstvom hostí, alebo tak zhruba. Tie percentá uvádzam len pre lepšiu predstavu čo od toho očakávam.

Ďakujem za každú pomoc!!!
Darker
Profil
Změň poměr náhody a výkonu.
Lukáš944
Profil *
Nechápem ako to môže vyriešiť ten problém, môžeš prosím ťa skúsiť uviesť konkrétne zmenený kus kódu?
Darker
Profil
Pokud jsem dobře pochopil tvůj problém, zjistil jsi, že i když má jeden tým převahu, stačí druhému trochu štěstí aby ho porazil. T znamená, že štěstí má v rovnici moc velký efekt. Stačí zvýšit efekt síly týmu, a bude se to chovat inteligentněji.
Lukáš944
Profil *
Nie, konkrétne to mi nevadí, keď tak to si neskôr doladím, ide o to, že sa to chová zle, v prípade velkého rozdielu 770 vs 600 (rozdiel to pre ten skript velký neni, či sa dá *0,77 alebo *0,6, ale v hre to bude rozdiel triedy, najlepší v lige proti najslabšiemu), takže výsledok by mal byť velkým rozdielom, aspon tých 5:0 alebo tak proste velký rozdiel, anežto v tomto skripte to končí tak vyrovnane, o 1 gol, alebo o 2 maximálne, a na to vplyv náhoda velký nemá, lebo aj tak to končí 2:1, 1:0 alebo tak, proste ten 1. tím neni schopný dať viacej golov, čo potrebujem aby dal, kedže je to medzi mužstvami rozdiel triedy, takéto vyrovnané zápasy 1:0, 2:1 atd. potrebujem ked budú výkony napr 770 vs 750...rozumieš potrebujem aby aj ten skript, bral rozdiel medzi 770 a 600 ako rozdiel triedy, len neviem ako logicky to tam dosadiť do toho vzorca. Proste čím bude väčší rozdiel medzi tímami výkonom tak tým musí viac padnúť gólov tomu slabšiemu mužstvu, a náhoda 1 gol hore dole nič na tom nezmení.
swetko
Profil
Takže potrebuješ aby 770 / 600 = 1,28 -> tento pomer bol väčší, napríklad (770-550) / (600-550) = 4,4 ?
Lukáš944
Profil *
Presne tak. Akurát potrebujem na to nájsť nejaké elegantnejšie riešenie, aby to nenarobilo zlobu keď sa napr. 1 tím dostane do mínusu, teda podá výkon dajme tomu 500. Alebo občas sa môže stať že by vyšli obidva tímy v mínuse.
Spectator
Profil
to už je jen na fantazii.


  a=770.0
  b=500

  k=(a-b)*2
    
  if k>=a:
    k=1.0
    
  if k>=b:
    k=1.0
    
  pomer=abs((a-k)/(b-k))


dá se to dělat fakt všelijak. různě násobit apod.

hlavně jsem se s tim moc nebabral a tak jsou tam chybky
Lukáš944
Profil *
Tak to už je vyriešené.

Ale mám ešte jeden drobný problém, a nechcem kôli nemu zakladať nový topic, kde môže byť chyba v tomto?

require "/db.php";

//timy - id_timu, nazov, manazer, liga, stat, stadion, body, vstrelene_goly, obdrzane_goly
$sql_bot=mysql_query("SELECT id_timu FROM timy WHERE manazer = 0");
$bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM);

while($bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM)) {

//hraci - id_hraca, meno, priezvisko, hodnotenie, potencial, pozicia, vek, narodnost, agresivita, tim, status, taktika 
$bot_sql=mysql_query("SELECT id_hraca FROM hraci WHERE tim = $bot_timy[0]");
$bot = mysql_fetch_array($bot_sql, MYSQL_NUM);

//1=GK,2=LB,3=CB,4=SW,5=RB,6=LM,7=CM,8=RM,9=ST
$gk=0;
while ($gk<1) { $sql=mysql_query("UPDATE hraci SET taktika = 1 WHERE id_hraca = $bot[0]"); $gk++; }
$lb=0;
while ($lb<1) { $sql=mysql_query("UPDATE hraci SET taktika = 2 WHERE id_hraca = ??????"); $lb++; }


}


Ten prvý select by mal vrátiť asi 10 rozdielnych IDčiek tímov, potom cyklus ktorý sa vykoná pokial ostalo ešte nejaké IDčko tímu, potom sa znova podla IDčka tímu vyberie zoznam hráčov, a ich IDčka, a potom by sa malo z každého tímu 1nému hráčovi prideliť do stlpčeka taktika 1. Problém je že absolutne nechápem ako mám listovať tým poľom, ktoré sa mi v DB vráti, teda napr. zoznam tých IDčiek tímov. A v tom druhom while kde je ???? tak tam neviem čo napísať, potrebujem aby tam bolo idčko dalšieho hráča ktorého v predchádzajúcom SELECTE vybralo (z toho selectu by mal vyjsť zoznam IDčiek hráčov). Som začiatočník, googlil som aj som čítal php.net ale nejako som na nič neprišiel, tak prosím o pomoc :) Ďakujem.
Lukáš944
Profil *
Chcem vlastne 11tim hráčom z každého z tých tímov čo vráti v prvom kroku, pripísať nejaké číslo do "taktika"(podla toho aký post hrá). (v každom tíme je 20 hráčov, takže hociako náhodne, alebo podla poradia čo to vráti z DB).
Spectator
Profil
Lukáš944:
$bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM);
>
while($bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM)) {

1) proč 2x fetch array? a¨stačí až ve while
2) WHERE - takhle se do této podmínky proměnné neposílají (jiná syntax)

Oprav toto všude a pak budem pokračovat =) =)
Lukáš944
Profil *
require "/db.php";

//timy - id_timu, nazov, manazer, liga, stat, stadion, body, vstrelene_goly, obdrzane_goly
$sql_bot=mysql_query("SELECT id_timu FROM timy WHERE manazer = 0");

while($bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM)) {

//hraci - id_hraca, meno, priezvisko, hodnotenie, potencial, pozicia, vek, narodnost, agresivita, tim, status, taktika 
$bot_sql=mysql_query("SELECT id_hraca FROM hraci WHERE tim = $bot_timy[0]");
$bot = mysql_fetch_array($bot_sql, MYSQL_NUM);

//1=GK,2=LB,3=CB,4=SW,5=RB,6=LM,7=CM,8=RM,9=ST
$gk=0;
while ($gk<1) { $sql=mysql_query("UPDATE hraci SET taktika = 1 WHERE id_hraca = $bot[0]"); $gk++; }
$lb=0;
while ($lb<1) { $sql=mysql_query("UPDATE hraci SET taktika = 2 WHERE id_hraca = ??????"); $lb++; }

}


1) som opravil, to som len testoval predtým či to nebude mať nejaký vplyv a zabudol som to vrátiť
2) nechápem? poznám len túto syntax, doteraz mi to fungovalo dobre
Spectator
Profil
WHERE id='$id'
WHERE id='$_SESSION[id]'
WHERE id = ".$_GET[id]."
Lukáš944
Profil *
require "/db.php";

//timy - id_timu, nazov, manazer, liga, stat, stadion, body, vstrelene_goly, obdrzane_goly
$sql_bot=mysql_query("SELECT id_timu FROM timy WHERE manazer='0'");

while($bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM)) {

//hraci - id_hraca, meno, priezvisko, hodnotenie, potencial, pozicia, vek, narodnost, agresivita, tim, status, taktika 
$bot_sql=mysql_query("SELECT id_hraca FROM hraci WHERE tim='$bot_timy[0]'");
$bot = mysql_fetch_array($bot_sql, MYSQL_NUM);

//1=GK,2=LB,3=CB,4=SW,5=RB,6=LM,7=CM,8=RM,9=ST
$gk=0;
while ($gk<1) { $sql=mysql_query("UPDATE hraci SET taktika = 1 WHERE id_hraca='$bot[0]'"); $gk++; }
$lb=0;
while ($lb<1) { $sql=mysql_query("UPDATE hraci SET taktika = 2 WHERE id_hraca='??????'"); $lb++; }

}


dobre už som to upravil :) A teraz k tej funkčnosti... čo namiesto tých otáznikov, lebo teraz ten druhý UPDATE zmení to čo ten prvý, keď tam nechám $bot[0] ,potreboval by som to nejako posunúť v tom poli na dalšieho hráča ktorého vybralo podla toho selectu vyššie..
Spectator
Profil
jestli dobře chápu, tak si udělej někde mimo ten cyklus počítadlo $counter a v prvním updatu daj $bot[$counter] a v druhém $bot[$counter+1]

něco podobnýho:
$pole = array('a','b','c');
$counter = 0;
while ($counter<2){
    echo $pole[$counter].$pole[$counter+1];
    $counter++;
}

pozor na překročení okraje pole (offset)
Lukáš944
Profil *
Díky tak nakoniec som to vyriešil takto
require "/db.php";


//timy - id_timu, nazov, manazer, liga, stat, stadion, body, vstrelene_goly, obdrzane_goly
$sql_bot=mysql_query("SELECT id_timu FROM timy WHERE manazer='0'"); //vybereme z DB timy ktoré manažuje počítač (id=0)

$x=1;
while ($bot_timy = mysql_fetch_array($sql_bot, MYSQL_NUM)) {
$tim[$x] = $bot_timy[0]; //naplnime premennu $tim[] timami ktore manazuje pocitac
$x++;
}

/***********************GK************************/
$x=1;
$y=1;
while ($tim[$x]) {
$bot_sql=mysql_query("SELECT id_hraca FROM hraci WHERE tim='$tim[$x]'");
 while ($bot = mysql_fetch_array($bot_sql, MYSQL_NUM)){
 $hrac[$y]=$bot[0];
 $y++;
 }
//1=GK,2=LB,3=CBL,4=CBR,5=RB,6=LM,7=CML,8=CMR,9=RM,10=STL,11=STR
$sql=mysql_query("UPDATE hraci SET taktika = 1 WHERE id_hraca='$hrac[1]'"); //GK
$y=1;
$x++;
}

/***********************LB************************/
$x=1;
$y=1;
while ($tim[$x]) {
$bot_sql=mysql_query("SELECT id_hraca FROM hraci WHERE tim='$tim[$x]'");
 while ($bot = mysql_fetch_array($bot_sql, MYSQL_NUM)){
 $hrac[$y]=$bot[0];
 $y++;
 }
//1=GK,2=LB,3=CBL,4=CBR,5=RB,6=LM,7=CML,8=CMR,9=RM,10=STL,11=STR
$sql=mysql_query("UPDATE hraci SET taktika = 2 WHERE id_hraca='$hrac[2]'"); //LB
$y=1;
$x++;
}


ešte by som sa chcel spýtať, ako formátovať kód? Existuje nejaký plugin do PSPadu, ktorý sformatuje kód, a tým ho sprehladní? myslím tie také medzery v obsahu while atd.
Spectator
Profil
Lukáš944:
formátovať kód
Já se snažím (naučil jsem se to v Pythonu) psát kód rovnou čistě a pokaždé stejně odsazený.

V PSPadu se to dělá myslim Skripty/format code, ale asi to bude chtít nějaký plugin pro daný jazyk možná Odkaz

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0