Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Taistelukaava

Sivun loppuun

unto [31.07.2008 21:59:00]

#

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ää?

Grez [31.07.2008 22:06:47]

#

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.

TsaTsaTsaa [31.07.2008 22:09:51]

#

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).

unto [31.07.2008 22:29:04]

#

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.

Grez [31.07.2008 23:45:59]

#

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)

tsuriga [01.08.2008 02:02:22]

#

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.

Teuro [01.08.2008 08:54:34]

#

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);
}

Metabolix [01.08.2008 10:17:42]

#

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.

Pollapoju [01.08.2008 10:49:47]

#

critical change on melkein aina aseessa % mahdollisuus tyylisenä

unto [01.08.2008 17:16:56]

#

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.

Grez [01.08.2008 17:50:14]

#

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ä.

Teuro [01.08.2008 19:24:37]

#

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);

Pollapoju [01.08.2008 21:53:20]

#

nuo kannattaisi laittaa

class

tai

enum

tai

struct

. Selkeyttäisi huomattavasti.

Teuro [01.08.2008 22:02:35]

#

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.

vehkis91 [01.08.2008 22:05:15]

#

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...

Pollapoju [01.08.2008 22:06:37]

#

vehkis91 kirjoitti:

miks noi tagit ei näy oikein? :O

asia korjattu

vehkis91 [01.08.2008 22:30:31]

#

Mietin vaan, millä kielellä sitä peliäsi teet, kun kaikki vinkit on annettu c/c++?

Teuro [01.08.2008 22:33:35]

#

mjaa esimerkit on kirjoitettu c/c++:a, mutta idean voi käisttääkseni siirtää sellaisenaan muillekin kielille.

Pollapoju [01.08.2008 22:34:16]

#

Palautetta olisi varmaan tullut jos kieli olisi väärä.

unto [02.08.2008 00:40:10]

#

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.

vehkis91 [02.08.2008 00:51:00]

#

Tässähän topikissa on niitä kaavoja jo mainittu...

unto [02.08.2008 01:49:23]

#

En usko, että strength * joku prosentti riittää isoon peliin.

Teuro [02.08.2008 08:01:28]

#

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?

Gaxx [02.08.2008 11:18:52]

#

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.

unto [02.08.2008 13:57:41]

#

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.

Tzaeru [02.08.2008 14:53:34]

#

Kehitä sit. Tai, ehkä eka opettelet itse tekemään asioita.

Kaupallista peliä ei noin vain tehdä. Ei ei eei-i.

punppis [08.08.2008 01:17:38]

#

Wowittajana on kiinnostanut katsoa pelin kaavoja, jotta tietää minkälaisia itemeitä kannattanee käyttää.

Näitä kaavoja löytyy osoitteesta http://www.wowwiki.com/Formulas_and_Game_Mechanics , ehkä voit sieltä käydä ottamassa oppia.

ville-v [13.08.2008 18:13:51]

#

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 40

pä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.

unto [17.08.2008 23:33:57]

#

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;
.}
}

Lebe80 [18.08.2008 00:09:35]

#

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?

unto [18.08.2008 00:17:17]

#

Lisäsin vähän tietoa edelliseen viestiin.

Metabolix [18.08.2008 16:02:06]

#

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.

Lebe80 [19.08.2008 12:23:17]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta