Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: hidastaminen (QB)

Sivun loppuun

crafn [15.06.2005 11:38:18]

#

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

tuomas [15.06.2005 11:45:35]

#

varmaan kantsis pienentää niitä arvoja joilla matoas eteenpäin liikutat.

crafn [15.06.2005 13:57:31]

#

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

JoreSoft [15.06.2005 14:12:10]

#

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

crafn [15.06.2005 14:18:54]

#

Ei se edelleenkään liiku niinkuin matopelissä, muttaa kiitos kuiteski :D:D:D

tgunner [15.06.2005 14:36:16]

#

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.

tuomas [15.06.2005 15:18:22]

#

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.

Metabolix [15.06.2005 15:27:12]

#

INTEGER = kokonaisluku :) LONG = pitkä kokonaisluku :D Eli eipä taida desimaaleja mahtua. Tyypiksi SINGLE ja piirtovaiheessa sitten typistetään Int(X) ja Int(Y).

crafn [15.06.2005 17:52:40]

#

Kiittos paljon :):)

hunajavohveli [16.06.2005 00:14:39]

#

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.

crafn [16.06.2005 22:01:31]

#

Juu :)

Metabolix [16.06.2005 22:42:09]

#

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

hunajavohveli [17.06.2005 00:11:40]

#

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.

Metabolix [17.06.2005 00:18:11]

#

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

hunajavohveli [17.06.2005 10:12:34]

#

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.

crafn [17.06.2005 16:17:00]

#

Juupajuu :)

crafn [17.06.2005 18:01:41]

#

Seuraava kysymys:
Mitä ihmettä tehdään käskyllä TYPE ???
:D

hunajavohveli [17.06.2005 18:06:26]

#

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"

crafn [17.06.2005 18:38:52]

#

Kiitos vastauksesta :D


Sivun alkuun

Vastaus

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

Tietoa sivustosta