Vahinko kartta

Vahinkokartta

> Ohjelmointi

Liikkeiden arvioinnin ja hyökkäysyhdistelmien hallinnan myötä vahinkokartta on erittäin tärkeä LeekWarsissa. Päätavoitteena on kyetä arvioimaan, vastustajasta riippuen, kunkin laatikon vaarataso, jotta voidaan vetäytyä vähemmän vaaralliseen laatikkoon käännöksen lopussa. Helpoin tapa on luoda assosiatiivinen matriisi: vaaraMap=[ solu1:vaara1 , solu2:vaara2 , ... ], mahdollisesti rajoitettuihin soluihin. Tätä tarkoitusta varten on mahdollista käyttää useita algoritmeja

"Naiivi" algoritmi

Tämä on yleensä ensimmäinen ajatus, joka tulee mieleen vaaranarviointialgoritmia luotaessa. Idea on seuraava:

/*

-jokaiselle vastustajan aseelle -jos hän voi ampua sellini sellistään lisää "vaarapisteet" soluun */

Pisteiden valinta on olennainen osa algoritmiasi: voit laittaa siihen "+1" tai laskea mahdollisesti aiheutetun vahingon, ... Tätä arviointia on yhtä monta tapaa tarkentaa kuin on pelaajia 😉

Tämän algoritmin suurin ongelma on, että se on erittäin ahne toiminnassa! Siksi se on yleensä tarpeen optimoida hyvin nopeasti.

Optimointiraidat

Ensimmäinen asia on estää purjoa "kaatumasta"... Joten sinun täytyy jossain koodissa tehdä testi getOperations():lle ja poistua silmukaista, jos toimintojen määrä on liian lähellä raja: sinulla on vain osittainen arvio vaarasta, mutta purjo liikkuu silti minimissä 😉

Itse optimoinnin kannalta yksi ensimmäisistä periaatteista, jonka tulisi ohjata lähestymistapaa, on ennen kaikkea välttää samoja operaatioita toistamasta useita kertoja silmukoissa: tässä tapauksessa on parempi valmistaa asiat taulukoihin ja sitten muistaa. Joten esimerkiksi sisimmässä silmukassa, joka laskee "vaarapisteen", jos kutsut siihen getStrength(Enemy), kutsut funktion takaisin tuhansia kertoja. Ajatuksena on sitten laskea vihollisen vahvuus vain kerran ja tallentaa se muuttujaan ennen sisäisten silmukoiden tekemistä. Alat jo ansaita muutama sata tuhatta kauppaa! Joten etsi "sisäisten" silmukoiden elementtejä, jotka eivät riipu silmukkamuuttujasta, vaan vain "ulkoisesta" silmukasta: voit jäljittää nämä elementit takaisin silmukkaan.

Jos algoritmisi pysyy kalliina, toinen melko esteettinen tapa optimoida on pienentää tämän arvioinnin resoluutiota. Et voi esimerkiksi testata kaikkia käytettävissä olevia ruutuja (omasi ja/tai vastustajasi), vaan esimerkiksi vain niitä, jotka vaativat parillisen määrän liikepisteitä. Sen jälkeen "riittää" täyttää aukot, jotka on saatu interpoloimalla viereisten neliöiden arvot (naapureiden keskiarvo, naapureiden maksimi, kahden rivin välisen keskiarvon maksimi jne.). Tämä lähestymistapa on vähemmän tarkka, mutta esimerkiksi parillisten PM:ien kanssa kuluttaa noin 4x vähemmän kuin ensimmäinen algoritmi.

Optimoinnin jatkamiseksi joudut miettimään asioiden esilaskentaa, yleensä ensimmäisellä kierroksella, tallentamalla suuriin (tai useisiin) taulukoihin tiettyjä asioita, jotka sinun on laskettava uudelleen ja jotka eivät koskaan muutu, tai jopa päivittää tiettyjä arvoja. jokainen vuoro (esimerkissämme vihollisen purjojen vahvuus).

"Kerran ja ikuisesti"-algoritmi

Tämä algoritmi laskee ennalta vaarakartan kerran taistelun alussa. Edullinen, se on paljon epätarkempi, mutta sen avulla voit nopeasti saada luettelon taistelukartan alueista, jotka ovat yleensä vaarallisia. Siinä arvioidaan vuoron alussa jokaiselle taistelukartan solulle kaikki solut, joiden avulla voit ampua sitä vihollisella (vihollisilla) olevilla aseilla: neliö, johon pääsee vain 5. muiden ruutujen pisteet ovat tällöin paljon alhaisemmat kuin 200 muun ruudun saavuttaman neliön! Saattaa olla viisasta yrittää vetäytyä "vähävaarallisille" alueille ja saada vihollinen pysymään "suuren vaaran" alueilla.