Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Tekstitiedostosta (Vb)

Sivun loppuun

Cc [09.04.2005 20:09:45]

#

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)

Antti Laaksonen [09.04.2005 20:25:54]

#

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

Cc [10.04.2005 13:52:30]

#

miten tuollaisen pystyisi toteuttamaan (en oikein ymmärtänny tuota.)? Onko binaryn teko hyvä keino?

hohoo [10.04.2005 14:19:22]

#

https://www.ohjelmointiputka.net/koodivinkit/23742-vb6-pelienkat-luokka

Antti Laaksonen [10.04.2005 14:39:03]

#

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.

hunajavohveli [10.04.2005 14:42:10]

#

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.

Heikki [10.04.2005 18:35:05]

#

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.

Cc [10.04.2005 21:41:40]

#

tuo tarkistusnumero olisi hyväkin keino mutta mitens se toimii sitten kun teksti tiedostoon tulee myös kirjaimia?

rndprogy [10.04.2005 22:00:39]

#

Voit tallentaa kirjaimien ascii arvot.
esim. Asc("A") on 64

Cc [10.04.2005 22:07:42]

#

eikö a:n Ascii arvo ole 65?

rndprogy [10.04.2005 22:08:49]

#

Juu tosiaan. Mutta a:n arvo 97 ja A:n 65 :)

hunajavohveli [10.04.2005 22:31:03]

#

Ei kirjainten ASCII-arvoja kannata tallentaa tiedostoon, ellei tee kokonaan binäärimuodossa, mutta tarkistusnumeron generointiin ASCII-arvot on hyvä ottaa.

Cc [10.04.2005 22:48:04]

#

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

Antti Laaksonen [10.04.2005 23:00:15]

#

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.php?tunnus=vbo_2

setä [11.04.2005 10:48:28]

#

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.

esakom [11.04.2005 11:03:07]

#

Itse olen selvyyden vuoksi kokenut hyväksi tavaksi tehdä merkkijonojen yhdistämiset &-merkillä, ja yhteenlaskutoimitukset +-merkillä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta