login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Berekening attack

Offline Wijnand - 28/01/2015 13:23
Avatar van WijnandModerator Ik was aan het nadenken over een aanvalsscript. Ik heb niet de intentie om een game te maken ofzo, maar was benieuwd hoe de berekening zou moeten om een game leuk te maken qua aanvalssysteem.

Bijvoorbeeld dat je deze 3 units hebt:

Ground Unit 1:
attack: 40 tegen grond, 80 tegen air
defence: 30 tegen grond, 40 tegen air

Ground Unit 2:
attack: 70 tegen grond, 10 tegen air
defence: 60 tegen grond, 50 tegen air

Air Unit 1:
attack: 80 tegen grond, 10 tegen air
defence: 50 tegen grond, 40 tegen air



Ik heb bv:
500 ground unit 1
500 ground unit 2
0 air unit 1

De vijand heeft bv:
300 ground unit 1
300 ground unit 2
300 air unit 1


Hoe bereken je wie er wint, hoeveel units gaan er vanaf, waar doe je de 'kansberekening' en hoeveel % is dat (zodat het een beetje spannend blijft), etc.

Hoe zouden jullie dat doen?

5 antwoorden

Gesponsorde links
Offline Thomas - 28/01/2015 14:38
Avatar van Thomas Moderator Je bent vast niet de eerste die hier tegenaan loopt, en er zijn ongetwijfeld artikelen / algoritmes waarbij je dit soort parameters maar hoeft in te vullen, en zij doen de rest.

Waar ik denk dat je mee moet beginnen is het vastleggen van alle "variabelen" in deze rekensom. Die zet je vervolgens om in allerlei "weegfactoren" die je vervolgens meeneemt in je uiteindelijke formule.

Wat je bijvoorbeeld ook mee kunt nemen (als weegfactor):
- terrein (bonus/penalty voor aanval/verdediging - bijvoorbeeld, jouw pantserdivisie staat op een verhoogd plateau, en de vijand komt aanrollen door de vallei )
- unit level (bijvoorbeeld is deze geupgrade, heeft deze meerdere veldslagen overleefd)
- wie wat aanvalt (kies je dit zelf?)
- moraal (als je aan het winnen/verliezen bent, kan dit extra positief/negatief effect hebben)
- "durability", in hoeverre zijn de units toe aan onderhoud (hoe lang zijn ze bijvoorbeeld al onderweg en door wat voor terrein)
- uitrusting / munitie (maakt voertuigen meer/minder geschikt tegen een bepaald type vijand, maar komt al min of meer tot uiting in attack/defense I spose)
- verhouding van de omvang van het aantal units (en de kwaliteit) ten opzichte van die van je tegenstander (voor een mug maakt het niet zoveel uit hoeveel attack / defense deze heeft tegen een olifant)
- "luck-of-the-draw", een soort van X-factor

Bekijk anders eens wat AD&D (Advanced Dungeons & Dragons) speelregels, ik denk dat je hier een heleboel overeenkomsten vindt.
Offline Wijnand - 28/01/2015 14:50
Avatar van Wijnand Moderator Ja, maar buiten die dingen... hoe zou je letterlijk (in bv PHP) deze dingen die ik hierboven schreef regelen. Zonder verdere uitbreidingen, gewoon de meest 'basic' shape zeg maar.


$ground_unit_1['attack'] * $ground_unit_1['defence'] * (iets) etc.
Offline Thomas - 28/01/2015 15:43 (laatste wijziging 28/01/2015 15:48)
Avatar van Thomas Moderator Ook daar lijkt het mij om eerst een aantal zaken uit te denken. Het gaat hier om "turn based combat" lijkt mij en niet een "real time strategy" spel?

Bijvoorbeeld:
Je kunt het in het eerste geval opdelen in beurten. Hierbij hebben al je units een gelimiteerde resource ("tijd") die je kunt gebruiken om:
- van positie te verplaatsen binnen het slagveld
- indien mogelijk (vijand is zichtbaar en binnen het bereik van je geschut)
- niets te doen (skip) / of misschien herladen / reparatie whatever

Als al je tijd is opgebruikt of als je aangeeft dat je klaar bent vindt de "gevechtsfase" plaats waarbij jij de aanvallende partij bent.

Daarna schakelt de beurt om naar de tegenstander. Is dit een menselijke speler? Een AI? Heeft iemand sowieso een beperkte tijd om je (tegen)aanval te plannen waarna de "gevechtsfase" start?

In die gevechtsfase worden de uiteindelijke berekeningen uitgevoerd, maar hoe deze er uitzien hangt van al deze andere factoren af.

Om nu te zeggen "geef mij de formule"... die heb ik niet.

Hier zal een stuk kansrekening in zitten die uiteindelijk in een "hit" of "miss" zal uitmonden. En die "hit" kan bijvoorbeeld inhouden dat je een bepaald percentage verslaat en/of daarbij een bepaald percentage verliest. Ook hier zal een heleboel afhangen van hoe alles is opgezet. De uiteindelijke berekeningen zijn daar slechts het resultaat van... Die eerder genoemde "weegfactoren" bepalen hoe je formules er uitzien, nog een reden om daar mee te beginnen .

Je moet een soort van idee hebben hoe de berekening plaatsvindt... maar jij vraagt juist "ik heb geen idee van hoe zo'n berekening wordt uitgevoerd", ik ook niet als je er niet bijvertelt hoe de dimensies ongeveer zijn opgespannen. Ik denk dat het een beetje hand-in-hand gaat niet?

EDIT: Daarnaast is het bijna een wetenschap om allerlei vermenigvuldigingsfactoren en waarden te "tweaken" om ervoor te zorgen dan het een "evenwichtig" geheel wordt en de speelervaring als "reëel" (of ten minste "leuk" of "uitdagend", of wellicht zelfs "hardcore" - heb je meerdere moeilijkheidsniveaus?) overkomt. Het moet niet te makkelijk zijn om te winnen, maar ook niet onmogelijk.
Offline Wijnand - 28/01/2015 16:05
Avatar van Wijnand Moderator Het gaat echt om simpel...

Dus bv:

Je hebt legers aan de ene kant bestaand uit "50 x unit 1, 50 x unit 2 en 10 x unit 3" tegenover iemand die "40 x unit 1 en 100 x unit 3".

Dan vind het gevecht plaats waarbij dus op de een of andere manier wordt berekend wie er wint en wat de verliezen zijn (de berekening, het probleem).


Dan later kun je het uitbreiden met kans en andere 'tweaks'.

Maar deze bovenstaande berekening is al een uitdaging genoeg. De dimensies zijn dus klein...

Ik weet niet of je het spel nukezone.nu kent (is nu gesloten), die had ook zo'n aanvalstype.

Het is turnbased iid.. je klikt op een persoon, geeft aan waarmee je aanvalt en hij valt gelijk aan. Dan win of verlies je en krijg je de resultaten zien. Eventueel kun je nog een keer aanvallen.. maximaal 3/5 keer kun je aanvallen. Geen fancy gedoe dus.
Offline Thomas - 28/01/2015 16:32
Avatar van Thomas Moderator Zucht, vooruit dan:

  1. <?php
  2. // voor nu alleen grondaanvallen
  3. $unitTypes = array(
  4. 1 => array('a' => 40, 'd' => 30), // light infantry
  5. 2 => array('a' => 70, 'd' => 60), // heavy infantry
  6. );
  7.  
  8. // leger aanvallende partij
  9. $teamA = array(
  10. 'units' => array(
  11. array('type' => 1, 'amount' => 500),
  12. ),
  13. );
  14.  
  15.  
  16. // leger verdedigende partij
  17. $teamB = array(
  18. 'units' => array(
  19. array('type' => 2, 'amount' => 300),
  20. ),
  21. );
  22.  
  23. // team A lichte infantry valt team B zware infantry aan - BAD MOVE, maar ze zijn met meer
  24. // (hier is dus vastgesteld wie wat aanvalt)
  25. $units = $teamA['units'][0];
  26. $attack = array(
  27. 'units' => $units['amount'],
  28. 'type' => $units['type'],
  29. 'attack' => $unitTypes[$units['type']]['a'],
  30. 'defense' => $unitTypes[$units['type']]['d'] * 0.9, // penalty omdat je aanvalt
  31. );
  32.  
  33. $units = $teamB['units'][0];
  34. $defense = array(
  35. 'units' => $units['amount'],
  36. 'type' => $units['type'],
  37. 'attack' => $unitTypes[$units['type']]['a'] * 0.7, // penalty omdat je verdedigt
  38. 'defense' => $unitTypes[$units['type']]['d'] * 1.25, // bonus omdat je verdedigt
  39. );
  40.  
  41. // berekening aanval
  42. $attackAttackPower = $attack['units'] * $attack['attack'];
  43. $attackDefensePower = $attack['units'] * $attack['defense'];
  44.  
  45. $defenseAttackPower = $defense['units'] * $defense['attack'];
  46. $defenseDefensePower = $defense['units'] * $defense['defense'];
  47.  
  48. // je kunt niet meer units verliezen dan dat je hebt
  49. $lossesA = min($attack['units'], round(($defenseAttackPower / $attackDefensePower) * $attack['units']));
  50. $lossesB = min($defense['units'], round(($attackAttackPower / $defenseDefensePower) * $defense['units']));
  51.  
  52. // variatie:
  53. // - verschillende bonus wegingsfactoren voor attack / defense bij verschillende units
  54. // - "random component" bij aanval, bijvoorbeeld kleine kans op extra schade
  55.  
  56. echo 'A attack: '.$attack['units'].' of type '.$attack['type'].'<br />';
  57. echo 'B defense: '.$defense['units'].' of type '.$defense['type'].'<br />';
  58. echo 'A loses '.$lossesA.' unit(s)<br />';
  59. echo 'B loses '.$lossesB.' unit(s)<br />';
  60. ?>


Was dat nou zo lastig? 
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2022 Sitemasters.be - Regels - Laadtijd: 0.109s