Strategiapelin suunnittelu ja toteutus

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
KankiKalle
Active Member
Posts: 170
Joined: Mon Jun 23, 2008 9:04 pm

Strategiapelin suunnittelu ja toteutus

Post by KankiKalle »

Ongelmani koskee Hearts of iron:in tapaisen strategiapelin toteutusta, alkaen jo suunnittelusta ja parhaimmista tavoista toteuttaa kyseisenlainen peli järkevästi (ja helpohkosti :) Useimmat omat räpellykseni ovat kaatuneet juuri siihen etten tiedä kuinka jatkaa tai että mistä ja miten alkaa toteuttaamaan tarvittavia kohtia pelistä. Kaipaisinkin nyt apua juuri pelin suunnitteluun ja toteutukseen.

Ainakin näihin asioihin pitäisi saada tietoa:

1. Kartan toteuttaminen. Kartta koostuu siis eri maista, jotka on jaettu moneen pieneen alueeseen. Sotajoukot (niistä lisää myöhemmin) valtaavat juuri näitä alueita tarkoituksenaan vallata koko maa. Jos maa valloittaa alueen, se on heti sen maan aluetta joka kyseisen alueen valtasi. Eli koko maata ei ole pakko vallata jos haluaa laajentaa omaa elintilaansa. Siispä, kuinka lähteä toteuttamaan tälläistä karttaa:
Joka sisältää maita jotka koostuvat monesta pienestä alueesta.
Kartan aluetta klikattaessa omat joukot siirtyvät kyseiseen alueeseen, ja tilanteesta riippuen joko vain marssivat siihen ja valtaavat sen, tai sitten alkavat taistella siitä. Maiden pinta-ala muuttuu sotimisen myötä.


2. Armeijan sotajoukkojen toteutus. Yksi joukko, jota voi käskyttää sisältää monia tuhansia sotilaita. Yksi sotajoukko sisältää tälläisiä ominaisuuksia: taistelutaito, joka tarkoittaa hyökkäys ja puolustustaito erikseen, joukkojen määrä (joka vähenee taistellessa tai sitten kasvaa jos saa täydennyksiä), moraali joka vaikuttaa jonkin verran taistelutaitoon. Joukkoja on pelin aikana aina määrätty määrä, niitä ei voi luoda itse.Mutta menettää tietysti voi. Täydennysjoukkoja voi saada pelitilanteesta riippuen, jotka joko laitetaan korvaamaan jonkin toisen joukon menetyksiä, tai sitten täydennysmiehistä tehdään oma joukko.
Mikä on järkevä tapa lähteä toteuttamaan tälläisiä joukkoja?


3. Toiset valtiot ja niiden tekoäly. Toisille valtioille voi julistaa sodan ylittämällä kyseisen maan rajan. Tällöin vastustajavaltio voi joko jatkaa sotimista tai sopia rauhasta. Maa toimii järkevästi siten, että se tarkastaa omien joukkojen taistelukyvykkyyden ja vertaa sitä hyökänneen maan taistelukyvykkyyteen, ja päättelee tuloksen perusteella onko parempi sotia vai antautua.
Jos ollaan sodassa, niin vastustaja ei aina automaattisesti rynnistä toista valtiota kohden, vaan punnitsee sen että kannattaako lähteä pienellä joukolla hyökkäämään ylivoimaista vihollista vastaan. Tässäkin tulee kysymyksenä se, että mikä on paras ja helpoin tapa toteuttaa tämä?


4. Taistelutilanne eri maiden sotajoukkojen kesken. Taistellessa verrataan aina taistelevien joukkojen taistelutaitoa, joukkojen määrää ja moraalia.
Taistelu etenee siten, että joukoista kuolee sotilaita koko ajan taistelun edetessä, riippuen taidoista, moraalista ja sotilaiden määrästä. Kaikki nämä ominaisuudet voivat muuttua taistelun edetessä. Jos tilanne on todella heikko, voi valita luovuttaako ja perääntyy, tai sitten taistelee viimeiseen mieheen asti.


Tässä on siis ongelmani. Se saattaa olla hankalasti esitetty, joten voi olla että joudut selaamaan sen läpi toisenkin kerran. Ja luulen että monet kohdat liittyvät toteutukseltaan paljon toisiinsa, joten suosittelen lukemaan kaikki kohdat läpi ja vasta sitten miettiä ratkaisua. (Vaikka vain johonkin noista kysymyksistä, joihin ajattelit vastata)

En halua vastaukseksi näihin kysymyksiin (ainakaan heti) valmista koodia, ellei se ole välttämätöntä ja suht helposti tajuttavaa. Tarkoituksenani on oppia ymmärtämään se, että miksi joku asia kannattaa totetuttaa näin onko se helpoin tai järkevin tapa miettien muitakin pelin osa-alueita.
Joku saattaa tässä vaiheessa miettiä, että tämä ei ole minulle sopivin projekti, koska en taida osata tehdä tätä neuvoista huolimatta. Olet varmaan oikessa. Mutta juuri siksi haluankin lähteä tekemään tätä, koska aikaa minulla on ja mielenkiintoa, vaan ei tarpeeksi tietoa. Että silviisi :D

Lisäkysymyksiä saa esittää jos jokin asia ei kunnolla auennut.

Kiitän jo etukäteen, sillä luotan foorumilaisten asiantuntemukseen ja siihen että kaveria ei jätetä :P
Väsyttää niin ettei jaksa edes mennä lepäämään.
otto90x
Advanced Member
Posts: 349
Joined: Mon Aug 27, 2007 9:00 pm
Location: Lapinjärvi, Finland
Contact:

Re: Strategiapelin suunnittelu ja toteutus

Post by otto90x »

Itse käyttäisin monia sisäkkäisiä muistipaloja.

1. Kartan toteuttaminen

Oletan ettei maiden alueet ole kovin palikkamaisia joten taulukon käyttö ei välttämättä ole paras vaihtoehto. Tekisin muistipalan jossa on maiden tiedot sisältävien muistipalojen osoitteet (lista maiden muistipalojen osoitteista). Maiden muistipaloissa taasen olisi mahdollisesti maan nimelle varatun muistipalan osoite (tai sitten varattuna tietty määrä tavuja kirjottamista varten) ja maassa olevien alueiden määrä ja niiden muistipalojen osoitteet. Maan alueiden muistipaloissa olisi alueen kulmapisteiden koordinaatit (mahdollisesti myös keskipisteen), alueen hallitsijan tunnus ja osoite alueella olevien joukkojen listaan (muistipalaan jossa joukkojen muistipalojen osoitteet).

2. Armeijan sotajoukkojen toteutus

Laitetaan muistipalaan kaikkien joukkojen määrä ja niiden muistipalojen osoitteet. Joukon muistipalaan tiedot kenen hallinnassa joukko on, kuinka vahva se on, mikä on sen moraali ja taistelutaito. Tähän yhteyteen olisi ehkä hyvä liittää tieto myös siitä millä alueella (osoite alueen muistipalaan) joukko majailee, jotta kaikkia alueita ei tarvitse käydä läpi joukon löytämiseksi. Ja sikäli mikäli joukkotyyppejä (jalkaväki, panssarit, ilmavoimat) on useita, on joukon muistipalaan hyvä liittää myös tieto siitä mitä tyyppiä joukko on.

Joukkojen pilkkominen pienemmiksi yksiköiksi on helppoa, lisätään vaan uusi muistipala joukkolistaan ja vaihdetaan alkuperäisin joukon kokoa pienemmäksi. Yhdistelemisessä sen sijaan ehkä tarvitaan muuttaa joukkojen moraalia ja taistelutaitoa, mikäli ne ovat erisuuret.

3. Toiset valtiot ja niiden tekoäly

Helpoin tapa olisi arpoa toiminta kahden valinnan väliltä. Hyökätä vai paeta. Mutta paras tapa luultavasti saataisiin yhdistelemällä arpomista ja järkeilyä (sota-alueella ja lähialueilla olevien joukkojen vahvuuksien vertailu). Järkeily tuo tekoälyyn älyä ja satunnaisuus ennalta-arvaamattomuutta, jotka molemmat ovat tärkeitä ominaisuuksia.

Sisäkkäisiä muistipaloja käyttäessä kannattaa muistaa sisempää poistaessa/kokoa muuttaessa voi muistipalan osoite muuttua ja tällöin tulee uusi osoite päivittää ulompaan muistipalaan. Tosin tässä ei tarvitsisi muita muistipaloja tuhota kuin joukkojen, sillä alueethan pysyvät koko pelin ajan samoina, ainoastaan omistaja vaihtuu.
Otto Martikainen a.k.a. MetalRain, otto90x, kAATOSade.
Runoblogi, vuodatusta ja sekoiluja.
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: Strategiapelin suunnittelu ja toteutus

Post by Jare »

Hyvä juttu on se, että aiot tosissasi tehdä tämän projektin, eivätkä suuret suunnitelmat tuhoa tätä aietta. Jos projekti on liian iso, on silti hyvää harjoitusta lähteä tekemään sitä. Jos ei ekalla kerralla onnistu, niin toisella kerralla kokemus auttaa paljon enemmän.

Kuten otto90x sanoi, muistipalat lienevät kaikkein paras ratkaisu suurimmalle osalle pelin tietorakenteesta niiden joustavuuden ansiosta. Mutta niiden käyttö on suunniteltava pilkulleen oikein ennen käytännön toteutusta, koska kaikkeen tietoon muistipalan sisällä viitataan sijainneilla, jotka on pakko jossain määrin käsitellä käsin. Kannattaa siis harkita tarkkaan, missä tilanteessa käyttää muistipaloja, ja mitkä tietorakenteet ovat sen verran yksinkertaisia, että taulukko tai tyyppi hoitaisi homman helpommin. Ylipäätään kaikki tietorakenteet kannattaa testata erillään projektin koodista ja liittää siihen vasta, kun rakenne on todettu toimivaksi ja mahdolliset muistivuodot on tutkittu.

Haluaisin tuoda yhden seikan esille taistelussa (huom! Oma mielipiteeni, paremmin tietävät saavat kommentoida asiaa): riippuen siitä, kenen valtaamalla alueella ollaan, hyökkääjä on usein heikommassa asemassa kuin puolustaja. Jos oletetaan, että hyökkääjä astuu vieraalle alueelle ensimmäisen kerran, se ei esimerkiksi tunne alueen maastoa, eikä tiedä ollenkaan alueen miehityksestä. (Paitsi jos pelissä on tiedustelujoukot). Puolustaja tuntee maaston ja voi ansoittaa sen. Riippuen hyökkääjän suunnasta, jompi kumpi osapuoli havaitsee toisen ensin. Todennäkköisesti puolustus havaitsee hyökkääjän ensin, mutta jos hyökkääjä kiertää puolustuksen ja iskee selkään, hyökkääjä havaitsee puolustuksen ensin. Näiden seikkojen vuoksi taistelun tulosta ei voi yksioikoisesti arvioida laskemalla pelkästään joukkojen määriä ja voimia. Esimerkiksi jos puolustuksella on 300 yksikköä ja hyökkääjällä 1000 yksikköä, ei voi vielä päätellä, etteikö taistelu olisi kannattavaa puolustautuvan valtion kannalta. Hyvänä esimerkkinä tästä käy Talvisota. Mutta projektissahan on kyse vain pelistä, joten johonkin on vedettävä raja siitä, miten peli huomioi realistiset eroavaisuudet hyökkääjän ja puolustajan välillä. Liian realistista ei kannata tehdä, koska se haaskaa liikaa resursseja - samalla todennäköisesti huonontaen jotakin toista osa-aluetta pelissä resurssivajeen vuoksi. Taas liian yksioikoista linjaa ei realistisuuden suhteen kannata vetää, koska tällöin pelistä tulee ennalta arvattava ja tylsä. Toiveeni vain on, että puolustusjoukot eivät vaikuttaisi täysin samanlaisilta kuin hyökkäysjoukot.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Strategiapelin suunnittelu ja toteutus

Post by MaGetzUb »

Itse olisin lähtenyt purkamaan ongelmaa tyypeillä dynamiikan takia. Tyypit osaa säilöä itsestänsä dataa ja lisääntyä rekursiivisesti, jos vain osaa käyttää niitä oikein. ;)
Tyypeillä voit tehdä maat helposti samoin kuin joukot ja niin edelleen. Jos et osaa käsitellä tyyppejä suosittelisin sinun katsomaan Ezben Type tutoriaali. Tyypeillehän voidaan säilöä myös dataa Muistipaloilla, ja sehän on ihan loistava ominaisuus myös. :)

esimerkiksi:

Code: Select all

Maat.Maa = New (Maa)
Maa\Data = MakeMEMBlock(12)
PokeInt Maa\Data,Väestönluku
PokeInt Maa\Data,Tiimi
PokeFloat Maa\Data,Moraali#
En osaa selittää tuon paremmin..
off: kello jo niin paljon ettei aivot toimi..
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
KankiKalle
Active Member
Posts: 170
Joined: Mon Jun 23, 2008 9:04 pm

Re: Strategiapelin suunnittelu ja toteutus

Post by KankiKalle »

Tuo muistipalahommeli on aika kiinnostava tapa, itselleni ei tullut edes mieleen että sellaisiakin voisi käyttää. Johtunee siitä etten tiedä niistä oikein mitään :? Hieman manuaalia selailtuani tajusin jotain niistä, mutta tässä kohtaa kunnon esimerkkikoodi voisi olla paikallaan :P (tyypit osaan muuten ihan hyvin, eli niitä ajattelin käyttää)

Jare: Mainitsemasi kohta puolustamisesta on huomioonotettava asia, mutta ota huomioon tälläinen asia:
http://img9.imageshack.us/img9/758/maailmansota.png
(Älkää sanoko mitään kartan todellisuudesta, tiedän että se ei aivan vastaa totuutta :D Mutta tuosta kartasta näkee hyvin nuo maiden alueet joita vallataan jne)

Nuo neliön muotoiset hymiöt ovat niitä joukkoja, (eivät todellakaan lopullisia, ovat vain esimerkin vuoksi piirretty suoraan karttaan) ja niitä sitten liikutellaan hiirellä paikasta toiseen. Aina yhdessä alueessa oleva(t) joukko taistelee vihollista vastaan siitä alueesta vain matemaattisesti, eli jos haluaa taktikoida niin selän takaa hyökkäys ei onnistu niin millään, ellei itse koko hyökkäystaito koostu monesta pienestä osasesta, (mitä taitoja sodassa nyt tarvitaankaan) joita verrataan toisen joukon puolustamiskykyyn. Hmm. Tuossa onkin ideaa, että hyökkäystaito koostuu monesta osasta, joilla on aina vastakohta puolustamistaidossa. Tosin itse taistelutilanteessa pitää sitten ottaa huomioon kaikki taidot ja vertailla niitä, ja sitten pitäisi vielä osata päätellä että vaikuttaako maastonhyväksikäyttämistaito kylliksi jos vastustaja on hyvä ampumaan jne. Mutta silloinkaan ei pääse itse taktikoimaan, eli hyökkäyksen toteutus on aika yksitoikkoista touhua. Klikkaa joukkoa, osoita se hyökkämään toista joukkoa päin, klikkaa uudestaan, odota kun tietokone raksuttaa tulosta...

Eli hankalaa on tehdä realistinen peli, jossa on mukaan luettu kaikki sotilaiden taidot :) Mutta tuotakin voisi tosin harkita...

Heittäkää nyt mukaan ihan vain ajatuksia miten kannattaa alkaa alusta asti tekemään näinkin isoa projektia, sillä yleensä se alkuvaihe määrää paljon että miten se loppuprojekti etenee 8-)
Väsyttää niin ettei jaksa edes mennä lepäämään.
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: Strategiapelin suunnittelu ja toteutus

Post by Jare »

Ensin karttamoottori kuntoon siten, että pelissä näkyy vain eri alueet, mutta ne eivät vielä kuulu kenellekään. Seuraavaksi valtioiden osittainen toteutus siten, että pelissä olisi valtioiden yleistiedot ja alueet voidaan jakaa eri valtioiden kesken. Mitään tekoälyä ei vielä valtioille tarvita. Testaile, että alueita voi siirtää valtiolta toiselle.

Tämän jälkeen sotilasosastojen ja muiden sotayksiköiden toteutus - aluksi valtioista riippumattomasti. Ihan ensimmäinen askel tässä olisi yksikön tietojen toteuttaminen (sotilaiden määrä, moraali, taistelutaito jne.) sejä joukkojen liikuttaminen. Seuraavaksi jokin yksinkertainen taistelulogiikka, jonka ei vielä tarvitse olla erityisen mielenkiintoinen. Tällä voidaan jo testata kahden yksikön välistä taistelua.

Sitten yksiköiden liittäminen eri valtioille. Valtioille tekoäly, joka päättelee sodan kannattavuutta käyttäen osin samoja algoritmeja edellä mainitun taistelulogiikan kanssa. Kun myöhemmin parantelet taistelulogiikkaa monipuolisemmaksi ja realistisemmaksi, yhteiskäytössä olevat algoritmit takaavat paremmin sen, että valtioiden tekoäly mukautuu automaattisesti uuteen taistelulogiikkaan.

Muistipalojen käyttöä lyhyesti:

Code: Select all

muistipala = MakeMEMBlock(7) 'Parametrina annetaan muistipalan koko tavuina
PokeInt muistipala, 0, 4767545 'Kirjoitetaan integer muistipalan alkuun (sijainti 0) (vie neljä tavua)
PokeShort muistipala, 4, 1024 'Kirjoitetaan short integer heti integerin jälkeen (vie kaksi tavua)
PokeByte muistipala, 6, 100 'Kirjoitetaan tavu shortin perään
kokonaisluku = PeekInt(muistipala, 0) 'Haetaan integer
shortint = PeekShort(muistipala,4) 'Haetaan short
tavu = PeekByte(muistipala,6) 'Haetaan tavu
Edit: Pari pilkkua viilattu. :roll:
Last edited by Jare on Sun Sep 20, 2009 5:50 pm, edited 1 time in total.
User avatar
kaneli2000
Guru
Posts: 1059
Joined: Mon Mar 17, 2008 2:40 pm
Location: Lempäälä

Re: Strategiapelin suunnittelu ja toteutus

Post by kaneli2000 »

Jare wrote: Muistipalojen käyttöä lyhyesti:

Code: Select all

muistipala = MakeMEMBlock(7) 'Parametrina annetaan muistipalan koko tavuina
PokeInt muistipala, 0, 4767545 'Kirjoitetaan integer muistipalan alkuun (sijainti 0) (vie neljä tavua)
PokeShort muistipala 4, 1024 'Kirjoitetaan short integer heti integerin jälkeen (vie kaksi tavua)
PokeByte muistipala 6, 100 'Kirjoitetaan tavu shortin perään
kokonaisluku = PeekInt(muistipala, 0) 'Haetaan integer
shortint = PeekShort(muistipala,4) 'Haetaan short
tavu = PeekByte(muistipala,6) 'Haetaan tavu
Ei toimi kun olet unohtanut pari pilkkua :s. Oikeammin olisi:

Code: Select all

muistipala = MakeMEMBlock(7) 'Parametrina annetaan muistipalan koko tavuina
PokeInt muistipala, 0, 4767545 'Kirjoitetaan integer muistipalan alkuun (sijainti 0) (vie neljä tavua)
PokeShort muistipala, 4, 1024 'Kirjoitetaan short integer heti integerin jälkeen (vie kaksi tavua)
PokeByte muistipala, 6, 100 'Kirjoitetaan tavu shortin perään
kokonaisluku = PeekInt(muistipala, 0) 'Haetaan integer
shortint = PeekShort(muistipala,4) 'Haetaan short
tavu = PeekByte(muistipala,6) 'Haetaan tavu
I see the rainbow rising
Post Reply