Teen peliäni ja nytten minun pitäisi kirjoittaa txt tiedostoon sellaista dataa mitä ei voisi muuttaa (ainankaan helposti) miten tämä voisi onnistua (esim datana: rahamäärä, sijainti, lvl)
Kirjoita tiedot tavalliseen tapaan, mutta lisää tiedoston loppuun tarkistusnumero. Jos tarkistusnumero on väärin (eli joku on muuttanut tiedostoa jälkikäteen), peli ei suostu lataamaan tiedostoa. Tarkistusnumeron laskemiseen voi keksiä mitä erilaisimpia kaavoja. Voit vaikkapa laskea kaikki luvut yhteen ja ottaa tuloksesta jakojäännöksen jollain luvulla. Tarkistusnumeron on parasta olla kokonaisluku, jotta pyöristysepätarkkuus ei aiheuta ongelmia. Tämä suojaus tepsii 99 prosenttiin tiedoston peukaloijista. :)
miten tuollaisen pystyisi toteuttamaan (en oikein ymmärtänny tuota.)? Onko binaryn teko hyvä keino?
Tiedostomuodolla ei sinänsä ole merkitystä. Jos tiedostoon tallennetaan vaikka luvut 1, 2 ja 3, niiden tarkistusnumero voidaan laskea esim. kaavalla (1 + 2 + 3) Mod 5 eli 6 Mod 5 eli 1. Tämä kirjoitetaan viimeiseksi luvuksi, jolloin tiedostoon tulee:
1 2 3 1
Sitten ohjelma lukee tiedostosta luvut, laskee tarkistusnumeron (jälleen 1) ja vertaa sitä tiedoston viimeiseen lukuun. Jos luvut ovat samat, tiedosto on varmaankin muuttamaton. Jos luvut eivät ole samat, joku on käpälöinyt tiedostoa. Esimerkiksi jos tiedostoa onkin muutettu näin:
3 3 3 1
Tarkistusnumeroksi tulee (3 + 3 + 3) Mod 5 eli 9 Mod 5 eli 4, vaikka tiedoston lopussa lukee 1. Näin paljastuu muokkausyritys.
Kaavan pitää olla vain riittävän mutkikas, jottei sitä pysty arvaamaan. Muuten käpälöijä voi sen perusteella generoida omia muutoksiaan vastaavan tarkistusluvun.
Tavalliselle peruspelaajalle jo jakojäännös lukujen summasta on lähes ylitsepääsemätön este. Toki hankaloitusta voi tehdä vaikkapa käyttämällä kahta eri algoritmilla generoitavaa tarkistusnumeroa, esim. (1+2+3) mod n ja (1*2*3) mod k.
tuo tarkistusnumero olisi hyväkin keino mutta mitens se toimii sitten kun teksti tiedostoon tulee myös kirjaimia?
Voit tallentaa kirjaimien ascii arvot.
esim. Asc("A") on 64
eikö a:n Ascii arvo ole 65?
Juu tosiaan. Mutta a:n arvo 97 ja A:n 65 :)
Ei kirjainten ASCII-arvoja kannata tallentaa tiedostoon, ellei tee kokonaan binäärimuodossa, mutta tarkistusnumeron generointiin ASCII-arvot on hyvä ottaa.
Minä yritän tehdä jotain nytten kyllä mutta törmäsin jonkin asteiseen ongelmaan (ai tyhmään ja helposti ratkaistavaan luulen, mutta en keksi ite mikä vialla) koodini on tälläinen.
SijaintiX = "124" SijaintiY = "60" rahat = "12000" helat = "78" tapot = "13" hakkeroinnit = "42" leveli = "24" tarkistusnumero = SijaintiX + SijaintiY + rahat + helat + tapot + hakkeroinnit + leveli Open "C:\testi.txt" For Output As #1 Print #1, SijaintiX Print #1, SijaintiY Print #1, rahat Print #1, helat Print #1, tapot Print #1, hakkeroinnit Print #1, leveli Print #1, tarkistusnumero Close #1
kun tarkastan tuota teksti tiedostoa niin sen tarkistus numeron kohdalla on 124601200078134224 arvo (eli nuo kaikki numerot peräkkäin) eikä arvo 12341 jota yritän hakea. mikä vialla?
EDIT: Keksin ratkaisun :) aika noobster ongelma ;)
Kun käsittelet lukuja, älä kirjoita niiden ympärille lainausmerkkejä. Muuten VB erehtyy luulemaan, että ne ovat merkkijonoja. Järkevintä on lisäksi määritellä kaikki muuttujat oikeantyyppisiksi, mikä estää tällaiset ongelmat. Kirjoita siis ohjelman alkuun:
Dim SijaintiX As Integer, SijaintiY As Integer Dim rahat As Long, helat As Integer, tapot As Integer Dim hakkeroinnit As Integer, leveli As Integer Dim tarkistusnumero As Long
Muuttujan tyyppi valitaan mahdollisimman pieneksi. Tässä kaikki muuttujat ovat kokonaislukuja. Integer on sopiva, jos muuttujaan laitettavat luvut liikkuvat korkeintaan muutamissa sadoissa tai tuhansissa. Muuten valitaan Long, johon mahtuu suurempi luku.
Voit lukea lisää muuttujista VB-oppaasta:
https://www.ohjelmointiputka.net/oppaat/opas.
Merkkijonot todella liitetään toistensa jatkoksi plus-merkillä. Jos merkkijonot ovat lukuja, ne voi summata kirjoittamalla plus-merkin tilalle 2 miinus-merkkiä. Jos summattavat luvut mahtuvat Integerin lukualueelle, mutta summa ylittää sen, täytyy ainkin yksi summattavista olla Long-tyyppiä tai jotain muuta kuin Integer, kuten tuossa Antin esimerkissä on.
Itse olen selvyyden vuoksi kokenut hyväksi tavaksi tehdä merkkijonojen yhdistämiset &-merkillä, ja yhteenlaskutoimitukset +-merkillä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.