Eli siis, minulla on eräässä koodausprojektissani pienoinen ongelma. Kyseessä on peli, johon olen rakentanut mainejärjestelmän, eli systeemin joka nousee ja laskee sen mukaan mitä pelaaja tekee. Ongelma on tullut sopivan kaavan keksimisissä, joka sopeutuisi mm. pelaajan nykyisen maineen mukaan.
Elikä jos pelaaja päättää mätkiä jotakin jolla on hyvä maine, menettää pelaaja mainetta enemmän mitä on sillä toisella maine. Tämän lisäksi jos pelaajan maine on hyvä, hän menettää omaa mainettaan vielä enemmän. Maineen ollessa negatiivinen menetys laantuu. Toisin päin iskettäessä negatiivisen maineen omaavaa, saa siitä mainetta. Näin päin tosin asian täytyy mennä paljon hitaammin. Eritoten jos pelaajalla on jo negatiivinen maine, se kasvaisi todella hitaasti. Nollamaineen omaava ei muuta mainetta mihinkään suuntaan.
Toivottavasti selityksestäni saanee jotain selvää. Jos ei saa, yritän selittää yksinkertaisemmin. Haen vain kaavaa, jolla saada asia toimimaan kunnolla. Niin, ja kielellä lienee aika vähän väliä, kun vain kaavoja kysellään, mutta se on Qb..
-Grey-
Itse en ainakaan rupeaisi pähkäilemään tuota kaikkea yhteen ja samaan kaavaan, vaan jakaisin sen muutamaan osaan — osittain määritelty funktio.
Tekisin siis aliohjelman, joka ehtolauseilla(tai vaikka casella) tarkistaa pelaajan maineen(ja tarvittaessa mätkittävän) ja sen perusteella valitsee käytettävän kaavan(ompas typerä nimi tuo kaava, tulee ihan ompeluhommat mieleen).
Huppista, korjataan vielä nimitys. Eli ei "osittain määritelty funktio", vaan "paloittain määritelty funktio" :)
Nykyinen raakileeni on paloittain määritelty näköjään. Se vain käyttäytyy hieman, eh, omituisesti. Eli nyt pitäisi keksiä jotain jolla saisi järkevästi muutettua lukemia, eli niin että mistään ei mene tiettyä summaa, vaan kaavan mukaan laskettu vaihteleva summa. Matematiikka kun ei tuppaa olemaan vahvin osa-alue minua (ja silti koodaan? Tai, noh, yhteenlaskut nyt sujuvat)..
-Grey-
Voisitko selittää haluttua maineen muutosta vielä tarkemmin? Esim. eri tapausten esimerkkien avulla (alkumaineet, tapahtuma, loppumaineet).
Noh, oletetaan että on hahmo, jonka maine on nolla. Jos tälläinen hahmo nyökkää huonomaineisen hahmon kimppuun, hän saa siitä mainetta. Se miten paljon saa mainetta, riippuu näiden kummankin maineesta. Jos oikein pahamaineisen hahmon kimpussa on, niin saa enemmän hyvää mainetta. Sen sijaan jos oman hahmon maine on alhainen, se vaikeuttaa maineen saamista alussa.
Sitten toisinpäin jos alkaa saamaan negatiivista mainetta itse, asia on taas erilainen. Korkean maineen omaava menettää helpommin mainetta, kuin pienemmän maineen omaava. Hyvämaineisen hahmon tappaminen laskee mainetta vielä enemmän kuin vähän pienemmän hyvän maineen omaavan. Negatiivisen maineen omaava ei saa enää parempaa mainetta tapoista.
Eli hyvämainen saa parhaiten mainetta urotöistään, mutta menettää myös helpoiten mainetta. Vähäisen maineen omaavalla on työn takana saada lisää mainetta, mutta moinen myös menettää huonoiten mainetta. Nollamaineen omaava saa kaikkein huonoiten mainetta, suuntaan tai toiseen. Negatiivinen maine vaikeuttaa positiivisen maineen saamista mahdottomuuteen asti, mutta negatiivista mainetta kertyy helpolla lisää..
-Grey-
Hm, enpähän ole vieläkään onnistunut ratkaisemaan tätä ongelmaa. Sitä kun ei selviä enää millään peruslaskutoimituksella, koska aikaansaatu tulos on aivan vääränläinen. Joko se on liian suuri tai liian pieni, tai muuten vain ei tapahdu oikeanlaista tulosta.
Käyrä jonka mukaan pitäisi maineen muutoksen tapahtua, ei mene ikinä tyyliin 1+1+1+1+1+1, vaan pikemminkin esim. 1+1+2+3+5+8+12+18. Tätähän ei myöskään millään suurella if-lausekasalla hoidetaan, kun käytössä oleva skaalakin on -10000 - 9999. Eli, aika riittävä, mutta täytyisi tosiaan saada se kaava, että maineen muuttaminen ei tapahdukaan ihan mahdottoman helpolla..
-Grey-
Luulen, että jotenkin tähän tyyliin:
If Oma_Maine > 0 Then
If Vihollisen_Maine > 0 Then
Muutos = Sqr(Oma_Maine * Vihollisen_Maine)
Else
Muutos = -Sqr(Abs(Oma_Maine * Vihollisen_Maine))
End If
Else
If Vihollisen_Maine > 0 Then
Muutos = -0.5 * Sqr(Abs(Oma_Maine * Vihollisen_Maine))
Else
Muutos = 0.5 * Sqr(Oma_Maine * Vihollisen_Maine)
End If
End IfTämä nyt tuoli suoraan omasta päästä tähän viestilaatikkoon, mutta ideana on, että neliöjuurella hieman hidastetaan kasvua suurissa arvoissa ja kertoimilla etenemistä negatiivisesta ylös. Logaritmi voisi myös olla varsin nerokas ajatus ensimmäiseen.
Tee vaikka pieni taulukko siitä, mistä pitäisi päästä minnekin, ja kokeile sitten niillä tai laita esille, jotta joku muu voi kokeilla. On hyvin vaikea arvioida, miten paljon muutosta pitäisi saada aikaan.
Huh, sain vihdoinkin muuttumisen toimimaan oikein. Kiitoksia!
-Grey-
Aihe on jo aika vanha, joten et voi enää vastata siihen.