Mulla on semmone onkelma että en tiiä miten sais hidastettua mun matopeliä, hetikun painan näppäintä se on seinässä kiinni ois kiva jos joku viittis auttaa :)...
varmaan kantsis pienentää niitä arvoja joilla matoas eteenpäin liikutat.
HMM... oon varmaa tehny jotai väärin:
CLS SCREEN 13 DIM x AS INTEGER, y AS INTEGER, mato AS INTEGER, c AS INTEGER x = 100 y = 100 CLS ALKU: DO PSET (x, y), 2 A$ = INKEY$ IF A$ = "w" OR A$ = "W" THEN GOTO W ELSE IF A$ = "d" OR A$ = "D" THEN GOTO D ELSE IF A$ = "a" OR A$ = "A" THEN GOTO A ELSE IF A$ = "s" OR A$ = "S" THEN GOTO S ELSE IF A$ = CHR$(27) THEN END LOOP W: DO IF y = 0 THEN GOTO ALKU y = y - 1 PSET (x, y), 2 LOOP UNTIL INKEY$ <> "" GOTO ALKU D: DO IF x = 310 THEN GOTO ALKU x = x + 1 PSET (x, y), 2 LOOP UNTIL INKEY$ <> "" GOTO ALKU A: DO IF x = 0 THEN GOTO ALKU x = x - 1 PSET (x, y), 2 LOOP UNTIL INKEY$ <> "" GOTO ALKU S: DO IF y = 300 THEN GOTO ALKU y = y + 1 PSET (x, y), 2 LOOP UNTIL INKEY$ <> "" GOTO ALKU LOPPU: DO CLS SLEEP 1 c = INT(RND * 100) COLOR c PRINT "HÄVISIT!" SLEEP 1 LOOP UNTIL INKEY$ <> "" COLOR 0
Olisko tämä helpompi?
Cls Screen 13 Dim X As Integer, Y As Integer, mato As Integer, c As Integer X = 100 Y = 100 Cls 'ALKU: PSet (X, Y), 2 Do Do A$ = INKEY$ Loop Until A$ <> "" A$ = LCase(A$) Select Case A$ Case "w" If Y > 0 Then Y = Y - 1 Case "d" If X < 310 Then X = X + 1 Case "a" If X > 0 Then X = X - 1 Case "s" If Y < 300 Then Y = Y + 1 Case Else If A$ = Chr(27) Then End End Select PSet (X, Y), 2 loop LOPPU: Do Cls SLEEP 1 c = Int(Rnd * 100) Color c Print "HÄVISIT!" SLEEP 1 Loop Until INKEY$ <> "" Color 0
Ei se edelleenkään liiku niinkuin matopelissä, muttaa kiitos kuiteski :D:D:D
Johtunee vain tietokoneen nopeudesta, ei sille mitään voi. Täytyy hidastaa oman koneen tarpeiden mukaan. Kannattaa katsoa tuolta koodivinkeistä se Samin matopeliesimerkki, siinä on aivan sopiva hidastusmahdollisuus jota on helppo muokata.
Vaihda nuo X = X + 1 ja Y = Y + 1 esim. X = X + 0.01 ja Y = Y + 0.01. Luulis hidastuvan. Ja hmm.. paljonkos integeriin menikään desimaaleja? Kaippa niitä muutama mahtu.. No jos et saa integer muuttujalla tarpeeksi pientä arvoa, määrittele noi vaikka long tyyppisiksi. Toinen tapa vois olla tunkea sinne silmukan loppuun sleep() funktiolla pieni hidastus.
INTEGER = kokonaisluku :) LONG = pitkä kokonaisluku :D Eli eipä taida desimaaleja mahtua. Tyypiksi SINGLE ja piirtovaiheessa sitten typistetään Int(X) ja Int(Y).
Kiittos paljon :):)
Jos haluaa, että tuo toimii kunnolla millä tahansa koneella, missä tahansa tilanteessa, niin ei kannata ruveta tekemään mitään ns. "hidastusta", koska ne riippuvat aina koneen nopeudesta ja siitä, tekeekö se samaan aikaan jotain muutakin. Parempi tapa siinä tilanteessa on odottaa tietty aika, jonka voi mitata TIMER-funktiolla.
Tämä esim. odottaa sekunnin kymmenesosan.
aika = TIMER DO LOOP UNTIL TIMER - aika > 0.1
Edit: Tuossa koodissasi on muuten aika paljon kummallisuuksia. Mitä varten noissa IF-lauseissa ensinnäkin on kaikissa perässä ELSEt?
Piirtämiselle ei myöskään tarvita neljää eri koodia, vaan kaiken voi hoitaa kätevämmin muutamalla rivillä. Ks. JoreSoftin esimerkkiä. Joskin GOTOsta voi siinäkin päästä eroon.
P.S. Käytä kooditageja, kun laitat koodia viesteihisi.
Juu :)
hunajavohveli: Totta kai pitää olla ELSE perässä. Jos A$ on 'w', se ei voi olla mikään muu, joten miksi turhaan tuhlata tehoa muihin tarkistuksiin? Case-lause on tietenkin vielä parempi...
En nyt ihan ymmärtänyt, mitä hait takaa, mutta
IF A$ = "w" OR A$ = "W" THEN GOTO W ELSE
Tekee ihan saman kuin
IF A$ = "w" OR A$ = "W" THEN GOTO W
Eihän ELSEn perässä ole mitään suoritettavia lauseita, joten sillä ei ole mitään virkaa.
Asia olisi tietysti eri jos ELSEn tilalla olisi ELSEIF, tosin silloinkin pitäisi kirjoittaa ne omille riveilleen.
Ai niin, tyhmät Basicit :) Ajattele se C:nä, niin ymmärrät. Eli oletetaan, että ELSEn perässä on aina se seuraava rivi. (ELSEIF kelpaa.) Veikkaan, että juuri tähän on pyritty. (Viimeisen IF-lauseen perässä ei nimittäin näy ELSEä.)
Aivan, arvelinkin viestin lähettämisen jälkeen, että olit varmaan ajatellut sen C:n syntaksin mukaisesti. :)
Mutta Basicissa tosiaan, jos THEN-sanan jälkeiset osat eivät ole omilla riveillään, niin koko IF-lause rajoittuu tasan yhteen riviin.
Juupajuu :)
Seuraava kysymys:
Mitä ihmettä tehdään käskyllä TYPE ???
:D
Sillä määritellään rakenteita. Esim.
TYPE Rakenne foo AS INTEGER bar AS STRING * 8 END TYPE
Määrittelee rakenteen, joka sisältää kaksi elementtiä foo ja bar. Toinen on kokonaisluku ja toinen kahdeksan merkin pituinen merkkijono. Sitten voidaan määritellä tämä tyypiksi jollekin muuttujalle:
DIM muuttuja AS Rakenne
Jonka jälkeen tietoa voidaan muokata tähän tapaan:
muuttuja.foo = 439 muuttuja.bar = "abcdefgh"
Kiitos vastauksesta :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.