Oon jo hetken tehny erästä omaa peliä, jonka myöhemmin pistän tänne, mutta oon jo useemman päivän vääntäny ton taistelun kanssa. En saa millään mitään järkevää kaavaa aikaan. Tässä on tietoja taistelusta:
Accuracy, määritteleet osutko
Agility, määrittelee väistätkö lyönnin
Strength, määrittelee lyönnin damagen
Vitality, määrittelee healthin
Defence, määrittelee kuinka paljon suojaat damagesta
Weapon power, aseen tekemä damage
Armor, varusteiden suojausmäärä
Vielä pitäisi joukkoon saada kriittinen osuma ja jotain pientä.
Osaatteko antaa valmista kaavaa tai jotain sivua josta voisin semmoisen löytää?
Ehdotan että teet jonkun suht yksinkertaisen systeemin ja sitten kehität sitä paremmaksi sitä mukaa kun havaitset puutteita/parannettavaa. Jos yrität tehdä heti "täydellisen kaavan" niin saat pähkäillä aika kauan.
Kriittisen iskun voisi ainakin toteuttaa siten, että iskulle olisi jokin onnistumissuhde 1:n ja ennen iskua arvottaisiin kokonaisluku väliltä 1-n ja jos se sattuu olemaan 1 niin sitten tämähtää critical hit (vaikkapa 1,5-kertainen damage).
Grez kirjoitti:
Ehdotan että teet jonkun suht yksinkertaisen systeemin ja sitten kehität sitä paremmaksi sitä mukaa kun havaitset puutteita/parannettavaa. Jos yrität tehdä heti "täydellisen kaavan" niin saat pähkäillä aika kauan.
Tosta pelistä tulee todella iso ja toivottavasti myös kaupallinen, joten se pitäisi saada heti aluksi mahdollisimman hyväksi.
En myöskään viitsi lisätä mitään varusteita peliin ennen kun saan taistelut kuntoon.
No tuskin se sun peli kuitenkaan yhdessä illassa valmistuu. Samalla kun kehität peliä eteenpäin, voit kehittää myös taistelulaskuja.
Useinhan noissa käytetään jotain arpomista, että on myös jonkin verran tuurista kiinni miten taistelussa käy (niin kuin oikeassakin taistelussa tietysti olisi).
Ei noille sun antamille systeemeille pysty täydellistä kaavaa antamaan mitenkään, kun ei edes tiedä mitkä on välit, jotka mikin arvo voi saada. Sitten taas ihan peruskaava pitäisi olla suhteellisen itsestään selvä.
Eli jotain seuraavaa skaalattuna arvoväleillesi sopivaksi
(H = lyöjä, T = kohde)
Osuus jos: H accuracy - T agility > satunnaisluku
Jolloin: T Vitality -= (H Strength + H Weapon Power - T Armor - T Defense) * satunnaisluku * (jos (satunnaisluku > critical hit raja) niin 1.5 muuten 1)
Unit Testingiä - pistät botit mäiskimään ja logittamaan debuggia tiedostoon, sitten lueskelet niitä satojen megojen logeja ja tweakkaat algoritmeja ja kertoimia. Rupesin muuten vääntää huvikseni pientä pohjaa edellisen PHP-alueelle lähetetyn kyseessä olevaan peliin ilmeisesti liittyvän kysymyksesi jälkeen, tuli samalla tutustuttua PHP > 5.3.0 uusiin ominaisuuksiin.
Pelin ekaan versioon voisi tulla raaka hyökkaysvoimien ja puolustusvoimien yhteenlasku, joka jaetaan sopivalla satunnaisluvulla. Tuloksen ollessa suurempaa kuin 0 on hyökkääjä vahvempi, muutoin puolustava voittaa taistelun. Oheisessa koodivinkissä kaikki arvot ovat satunnaislukuja, mutta ei anneta sen häiritä.
Oikeassa pelissä olisi varmaankin oliot käytössä ja laskentafunktio ottaisi kaksi oliota parametrinä ja laskisi niiden perusteella hyökkäys- ja puolustusarvot yhteen ja jakaisi erotuksen satunnisella luvulla.
#include <ctime> #include <iostream> int hyokkays(); int main(){ std::cout << hyokkays() << std::endl; return EXIT_SUCCESS; } int hyokkays(){ srand(time(NULL)); /* Taitaa suosia hiukan hyökkääjää? */ int summaHyokkays = 100 + std::rand() % 20000; int summaPuolustus = 100 + std::rand() % 18500; /* Satunnainen luku 1 ... 100, koska nollalla ei saa jakaa */ int satunnaisLuku = 1 + std::rand() % 100; return ((summaHyokkays - summaPuolustus) / satunnaisLuku); }
Tee funktio, joka ottaa tarvittavat parametrit ja laskee tuloksen. Itse tekisin ehkä erillisen funktion vielä kriittisiä iskuja varten. Funktio kannattaa tehdä sellaiseksi, että se ottaa mahdollisimman vähän tietoa (vain tarpeelliset) ja palauttaa jotakin yksiselitteistä, esimerkiksi terveyden muutoksen. Myös tarvittavat random-arvot voisi antaa funktiolle parametreina.
Tällaisen funktion toimintaa voit helposti tutkia antamalla muutaman viitearvon pelaajan ominaisuuksille ja piirtämällä sitten funktion arvojen tiheysfunktion. Saat eteesi näppäriä käyriä, joista näkyy, miten todennäköisiä eri damaget ovat eri parametreilla, ja voit muokkailla funktiotasi näiden perusteella oikeaan suuntaan.
critical change on melkein aina aseessa % mahdollisuus tyylisenä
Kyllähän mä toteutuksen hallitsen mutta niitä kaavoja tässä etsin.
Haluaisin, että pelaaja voi "specata" deffiin, strenghtiin, vitalityyn, accuracyyn tai agilityyn ja olla yhtä hyvä muiden kanssa. Eli kaikki attribuutit olisivat balanssissa toistensa kanssa.
Tässä noita kaavoja on tullut jo useampia jotka on oikeasti niin hyviä kuin noilla lähtötiedoilla ylipäätään on mahdollista tehdä.
Seuraaville suureille ei ole yleisiä mittayksiköitä, joten niiden interaktioille ei luonnollisesti voi olla yleisiä kaavojakaan: accuracy, agility, vitality defense, weapon power, armor, strength
Eli kaikki riippuu siitä minkälaisen pelin olet tekemässä. Ja koska "kaavan" viilaukset on makuasioita, niin "täydellistä" kaavaa ei sinulle kukaan pystyisi tekemään vaikka olisitkin kertonut riittävät lähtötiedot pelistä.
Mulla oli ainakin ajatuksena laskea hyökkäävän olion "hyökköyspisteet" ja puolustavan olion puolustuspisteet yhteen ja ottaa niistä erotus, joka jaetaan satunnaisluvulla.
Esimerkiksi:
*accuracy (hyökkäys)
*agility (puolustus)
*vitality (puolustus)
*defense (puolustus)
*weapon (hyökkäys)
*power (hyökkäys)
*armor (puolustus)
*strength (molempia)
Eli siis jokaisella oliolla on asetettu nämä arvot yksilöllisesti ja taistelulaskennassa lasketaan asetettujen arvojen perusteella tulos.
Pelaaja eka; Pelaaja toka; eka -> accuracy = 85; eka -> agility = 62; eka -> vitality = 53; eka -> defense = 12; eka -> weapon = 96; eka -> power = 89; eka -> armor = 36; eka -> strength = 67; toka -> accuracy = 58; toka -> agility = 89; toka -> vitality = 69; toka -> defense = 96; toka -> weapon = 5; toka -> power = 9; toka -> armor = 95; toka -> strength = 85; eka -> hyokkays = 337; toka -> puolustus = 434; //Korjataan lukuja hieman satunnaisella luvulla eka -> hyokkays = std::rand() % joku * eka -> hyokkays; toka -> puolustus = std::rand() % joku * toka -> hyokkays; tulos (eka -> hyokkays - toka -> puolustus) / (1 + std::rand() % joku);
nuo kannattaisi laittaa
class
tai
enum
tai
struct
. Selkeyttäisi huomattavasti.
Hyvin huomioitu Pollapoju, mutta tuossa on tarkoituksella jätetty struct määrittelemättä, koska mutkistaisi muutenkin asiaa. Jokainen takuulla näkee, että structista on kysymys. Luokkien kanssa (joka voisi olla seuraavassa versiossa) olisi sitten kunnon aksessorit muuttujille, sekä luultavasti muutama muukin metodi olion käsittelyyn.
Tossa on struct.
struct Pelaaja { int accuracy; int agility; int vitality; int defense; int weapon; int power; int armor; int strength; int hyokkays; int puolustus; };
Edit:typo...
vehkis91 kirjoitti:
miks noi tagit ei näy oikein? :O
asia korjattu
Mietin vaan, millä kielellä sitä peliäsi teet, kun kaikki vinkit on annettu c/c++?
mjaa esimerkit on kirjoitettu c/c++:a, mutta idean voi käisttääkseni siirtää sellaisenaan muillekin kielille.
Palautetta olisi varmaan tullut jos kieli olisi väärä.
Kielihän tulee oleen php mutta sillä ei ole mitään väliä koska osaan kyllä ohjelmoida, kysyin vain kaavoja, en syntaxeja, classeja, structeja, fiksuinta tapaa tehdä se vaan puhtaasti kaavoja.
Tässähän topikissa on niitä kaavoja jo mainittu...
En usko, että strength * joku prosentti riittää isoon peliin.
Kerrotko sitten mitä sinä haluat? Minkälainen kaavan pitäisi olla, koska prosenteilla pelattaessa tulee ainakin pientä skaalausta luvuille, jota ainakin itse kuvittelin, että olet hakemassa.
Otetaan vaikka nuo minun antamat esimerkit muuttujien arvoista. Minkä tyyppinen tulos olisi sinusta odotettu? Normaalijakauman tiheysfunktion perusteella voisi olettaa puolustavan pelaajan olevan vahvoilla, koska lähtöasetelma on vahvasti puolustavan pelaajan puolella (lähes 100 yksikköä suurempi luku).
Kysymykseni on siis lyhyesti ja ytimekkäästi - miten nuo luvut pitäisi sinusta käsitellä, jotta tulos olisi haluamasi?
Sanon nyt heti alkuu, että mitään "täydellistä" kaavaa en voi antaa(eikä varmaan kukaan muukaan), mutta koitan nyt valoittaa esimerkkien kera, miten voit itse kehittää omat kaavasi.
Aluksi tehdään sellainen oletus, että kaikki hahmon taidot(accuracy, vitality...) voivat saada arvoja väliltä 1-100.
Satunnaisluvut sisällytän esimerkkeihin tähän tyyliin rnd(pienin, isoin), eli tuo palauttaa arvon väliltä pienin - isoin.
Osuminen:
Mietitään ensiksi, kuinka lasketaan osuminen. Antamiesi tietojen perusteella osumiseen/väistöön vaikuttavat hyökkääjän accuracy, puolustajan agility ja tietenkin jokin satunnaisluku.
Esimerkissämme osumisprosentti voisi olla aina välillä 10-95.
// Lasketaan ensiksi osumisprosentti prosentti = 50 + accuracy - agility // Rajoitetaan osumisprosentti alhaalta 10:een if(prosentti < 10) prosentti = 10 // Rajoitetaan osumisprosentti ylhäältä 95:een if(prosentti > 95) prosentti = 95
Kun tutkimme, mitä tapahtuu eri accuracyn ja agilityn arvoilla saamme seuraavanlaisia tuloksia:
// accuracy = 20, agility = 20 50 + 20 - 20 -> 50% // accuracy = 35, agility = 22 50 + 35 - 22 -> 63%
Kuten huomaamme, jos lyöjän accuracy ja puolustajan agility ovat samat, osumisprosentti on 50. Huomaamme myös, että melko "suuri" ero(35 - 22 = 13) arvojen välillä ei muuta osumisprosenttia kovin kummosesti. Tästä syystä meidän on hyvä kertoa arvojen erotus sopivalla luvulla. Meidän esimerkissämme 3:lla.
// accuracy = 35, agility = 22 50 + (35 - 22)*3 -> 89% // accuracy = 13, agility = 24 50 + (13 - 24)*3 -> 17%
Nyt tulokset näyttävät näiden tarkasteluiden pohjalta kelvollisilta. Lopullinen pilkunviilaus kertoimen kohdalla tehdään sitten joskus, kun taistelua tasapainotetaan.
// Sitten otamme mukaan asiaankuuluvan satunnaisuuden ja tarkastamme, osuuko hyökkääjä, vai onko puolustaja kahdesta parempi ja onnistuu väistämään.
if( rnd( 0, 100 ) < prosentti ) // Hyökkääjä osuu
Vahinko:
Jos hyökkääjä osuu, täytyy laskea aiheutettu vahinko. Antamiesi tietojen pohjalta tähän vaikuttavat seuraavat tekijät: hyökkääjän strength ja weaponPower sekä puolustajan defence ja armor.
// Oletan, että weaponPower on jokin satunnaisluku, // joka kuvaa aseen tekemää vahinkoa(esim. väliltä 10-20). weaponPower = rnd(10, 20) // Lasketaan vahinkolisä tai -vähennys lisä = (1 + (strenght - defence) / 10) // Lasketaan aiheutettava vahinko vahinko = weaponPower * lisä - armor // Varmistetaan vielä, että höykkäys tekee vahinkoa vähintään puolet weaponPowerin arvosta if(vahinko < weaponPower / 2) vahinko = weaponPower / 2
Tutkitaan "kaavaa" hieman tarkemmin. Meillä on weaponPower, eli vahinko, jonka ase tekee ilman mitään bonuksia tai vähennyksiä. Jos hyökkääjän strength on suurempi, kuin puolustajan defence, voimme sopia hyökkääjän saavan aikaan enemmän vahinkoa. Sama toimii myös toisinpäin. Vahingosta vähennetään lopuksi se, mitä armor suojaa.
lisän laskemisessahan on ideana se, että vahinko lisääntyy 10% jokaista strength-pistettä kohden jota on enemmän, kuin defenceä.
Kun sijoitamme lisän laskennan suoraan vahingon laskuun, saamme seuraavanlaisen kaavan:
vahinko = weaponPower * (1 + (strenght - defence) / 10) - armor
Lasketaan muutama esimerkki
// weaponPower = 17, strength = 19, armor = 10, defence = 19 vahinko = 17 * (1 + (19 - 19) / 10) - 10 -> 7 // weaponPower = 17, strength = 32, armor = 10, defence = 25 vahinko = 17 * (1 + (32 - 25) / 10) - 10 -> 18.9 -> 19 // weaponPower = 17, strength = 25, armor = 10, defence = 29 vahinko = 17 * (1 + (25 - 29) / 10) - 10 -> 0.2 -> 0 // -> weaponPower/2 -> 9
Kriittinen osuma:
Lopuksi voidaan tarkistaa, jos osuma on kriittinen
// kriittisen osuman todennäköisyys on 2% todennäköisyys = 2 // Jos osuma on kriittinen if( rnd( 1, 100) <= todennäköisyys) // kerrotaan vahinko jollain sopivalla luvulla vahinko = vahinko * 1.5
Toivottavasti tämä avasi ajatteluasi. Muista, että se on sinun pelisi ja syvällisempi kaavan "suunnittelu" olisi jo pelin taistelusysteemin suunnittelua.
Tapoja on toki monia muitakin, mutta eivät ne oikeasti ole tämän monimutkaisempia. Tiedän useita isoja pelejä, jotka käyttävät vielä yksinkertaisempia kaavoja osumisen/vahingon laskemiseen.
Kannattaa pitää asiat riittävän yksinkertaisina!
PS. En nyt ehdi lukea viestiä läpi, joten toivottavasti mukaan ei lipsahtanut mitään järjettömiä ristiriitoja.
Nuo on ihan hyviä pohjia ja niitä voi kehitellä eteenpäin. Kaikista hankalinta tässä on tasapainottaa kaikki attribuutit niin, että
str 40, agi 40
vs
str 40, def 40
vs
def 40, acc 40
vs
acc 40, agi 40
pärjäävät yhtä hyvin. Pelissä ei ole max leveliä, eikä max attributea.
Kehitä sit. Tai, ehkä eka opettelet itse tekemään asioita.
Kaupallista peliä ei noin vain tehdä. Ei ei eei-i.
Wowittajana on kiinnostanut katsoa pelin kaavoja, jotta tietää minkälaisia itemeitä kannattanee käyttää.
Näitä kaavoja löytyy osoitteesta http://www.wowwiki.com/
unto kirjoitti:
Nuo on ihan hyviä pohjia ja niitä voi kehitellä eteenpäin. Kaikista hankalinta tässä on tasapainottaa kaikki attribuutit niin, että
str 40, agi 40
vs
str 40, def 40
vs
def 40, acc 40
vs
acc 40, agi 40pärjäävät yhtä hyvin. Pelissä ei ole max leveliä, eikä max attributea.
Jos kaikkien attribuuttien tulisi pärjätä yhtä hyvin, laske ne yhteen ja käytä vain sitä yhtä muuttujaa laskuissa. Heti muuttuu paljon yksinkertaisemmaksi.
Pistän tähän kaavat, joihin päädyin (toistaiseksi):
Tuho:
$rawdamage = (($damage_attribute / 2) + ($weapon_damage / 2)); $rawdamage = $rawdamage * (rand(95,100) / 100);
Suojaaminen:
$block = (($defence / 2) + ($armor / 2)); $block = $block * (rand(100,110) / 100);
Väistäminen:
$dodge = 10 + (($agility / 5) - ($own_level / 10)); if ($dodge > 90) { $dodge = 90; }
Osuminen:
$hit = 50 + (($accuracy / 7.5) - ($own_level / 10));
Kriittinen isku:
$criticalchance = 5 + (($accuracy / 10) - ($own_level / 10));
Peli kasvaa hyvää vauhtia ja siinä on jo muutamia hienoja ominaisuuksia. :)
Lebe80:n pyynnöstä lisäilen tähän sanastoa:
$damage_attribute on strength tai dexterity, riippuen aseen "painosta" kevyillä ja tarkoilla aseille tuho tehdään dexterityllä ja isoilla, painavilla se tehdään strengthillä.
$armor = hands, arms, shoulders, helmet, chest, legs, feet, shield, belt / 9
pseudona tappelu lyhyesti:
jos x osuu { .jos y ei väistä { ..rawdamage = rawdamage(x); ..block = block(y); ..damage = rawdamage - block; ..jos damage on pienempi kuin 1 { ...damage = 1; ..} ..y.health = y.health - damage; .} }
ja missäs näitä kaikkia tarvitaan? $damage_attribute on itselleni täysin mystinen muuttuja.
Voisitko kertoa mitä noissa tehdään, ja miksi olet päätynyt näihin kaavoihin?
Mitä esim. $block:lla tehdään (missä yhteydessä sitä tarvitaan), myöhemmissä laskuissahan tuota ei nimittäin näy olevan, sama muissa.
Eli mihin noita $block:a yms. verrataan?
Lisäsin vähän tietoa edelliseen viestiin.
Jos teet systeemistä sellaisen, että kaikki vaikuttavat aina täsmälleen yhtä paljon, päädyt joka tapauksessa laskemaan ne vain yhteen, jolloin lopputulos on sama kuin jos käyttäisit vain kahta ominaisuutta, hyökkäys ja puolustus. Tässä tapauksessa on siis turha kehitellä mitään kovin hienoa kaavaa, koska sellaista ei yksinkertaisesti ole. (Älä väitä vastaan, jos et pysty itse toisin todistamaan.)
Jos taas haet tilastollista tasapuolisuutta, voit palata aiemmin kuvaamaani menetelmään. Esimerkiksi hyökkäyksestä puhuttaessa lienee järkevää, että voiman kaksinkertaistuessa vahinko kaksinkertaistuu ja vastaavasti nopeuden kaksinkertaistuessa osumien määrä kaksinkertaistuu, jolloin lopputulos on tilastollisesti yhtä hyvä, vaikka taistelu näyttää jo hyvin erilaiselta.
Metabolixin systeemi tuntuu yksinkertaiselta, mutta silti järkeenkäypältä, kun taas unton kikkare kuulostaa siltä, että eri muuttujien tasapainotuksessa tulee olemaan erittäin paljon tasapainotusta ja tämän takia jossain vaiheessa se vaan ampuu itseään jalkaan.
Lähinnä veikkaisin näin testaamatta sitä, että unton järjestelmä luo "kehittymättömille" hahmoille suurta heittoa eroavaisuudessa ja taas tekee "kehittyneistä" (suuret levelit) hahmoista taas erittäin tasapaksuja.
KISS pätee tässäkin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.