Habe gestern erfolglos probiert, am Cevi einen Countdown zu programmieren. Ich würde sowas gerne in ein Spiel einbauen, damit man eine bestimmte Zeitvorgabe zur Lösung einer Aufgabe realisieren kann. Daher nehme ich an, man sollte sich auf TI beziehen. Ich dachte, man könnte einfach von einem Anfangswert jeweils TI abziehen, aber da kommt man ja nie genau bei 0 raus.
Habe ich das richtig verstanden, dass man TI nur auf 0 setzen kann, wenn man TI$="000000" setzt? Stehe ein Bißchen auf dem Schlauch, wer mag mir ein paar Tips geben?
Hallo Besucher, der Thread wurde 7,3k mal aufgerufen und enthält 50 Antworten
letzter Beitrag von Mac Bacon am
Countdown?
- Telespielator
- Erledigt
-
-
Gehts um BASIC?
Weil in nem ASM-Projekt hab ich so was bis jetzt immer durch hochzählen einer eigenen Variable in einer Rasterzeilenroutine gemacht. -
Ja, es geht um BASIC. Dachte, das muss ich nicht extra erwähnen, wenn ich in der BASIC-Rubrik einen Thread aufmache...
-
Huch...sorry.
Da hätte ich mal drauf schaun können. -
Jupp, man kann nur eine der beiden Variablen schreiben, um die Uhr zu setzen. Welche das ist, weiß ich auch immer nie auswendig, kann man aber ziemlich leicht prüfen.
Wenn Du nicht genau auf dem Zielwert landest, testest Du halt auf größer/kleiner.
-
Rein theoretisch muß man den Sekundentakt holen und dann eine Variable runterzählen.
z.B:
10 :s=10
11 :a=val(ti$):ifa=val(ti$)goto11
11 :s=s-1:prints:goto11Schönen Gruß.
-
Die Variable TI kann man nur auslesen, aber nicht selber setzen.
Eine Anweisung wie TI=0 produziert einen ?Syntax Error.Zum Setzen der Zeit muss man stattdessen TI$ benutzen:
TI$="000000"Dann klappt es.
Allerdings wird TI sehr schnell hochgezählt.Eine Basic-Anweisung in der Art
IF TI=123 THEN ....
macht keinen Sinn. Der Zähler ist schneller als das BasicKann man ja selber mal ausprobieren:
10 TI$="000000"
20 PRINT TI
30 GOTO 20Das Ergebnis wird nicht in Einser-Schritten hochgezählt, sondern der Countdown ist schneller.
Da werden in der Ausgabe also Werte übersprungen.Du musst es anders abfragen. Mit einer "größer als" oder "kleiner als"-Bedingung:
IF TI > 123 THEN ....
Sonst ist es vom Zufall abhängig, ob man den gesuchten TI-Wert in Basic überhaupt trifft. Weil der Zähler schon weiter ist.
-
Wäre das nicht eine tolle Anwendung für USR()??
-
Wenn eine normale "for... next" Schleife zu schnell ist, würde ich 2 davon ineinander verschachteln. Dann ist eine für den Counter selber und die andere für die Zählgeschwindigkeit.
-
Mit ti und TI$ sollte man das schon machen können.
z.B:
10 :s=10:
11 :ifa=val(ti$)goto11
12 :a=val(ti$):s=s-1::prints:ifs>.goto11Schönen Gruß.
-
Eine Lösung mit usr wäre natürlich theoretisch möglich.
Ebenso eine Zeitverzögerung mit for.
z.B: fori=1to1000:next:
Schönen Gruß.
-
10 sw=ti+10
20 ?chr$(147);:?(sw-ti)
30 if ti<sw goto 20Am Smartphone hingesaut, daher ungetestet, aber das Prinzip sollte klar sein.
Zeile zehn setzt den Countdown auf 10 Sekunden, Zeile dreissig checkt ob die schon rum sind.
Edit: sw muss natürlich mit dem 60 fachen der Sekunden aufaddiert werden, man verzeihe:
5 se=10
10 sw=ti+(se*60)
Edit2:
Print int((sw-ti)/60) -
Oder einfach:
So hast du einen Countdown, der im Sekundentakt annähernd korrekt runterzählt.
Variablen:
t = Countdown
a = temporäre Variable für das Zwischenspeichern von ti
i = Zähler für FOR...NEXT -
Zeitverzögerung mit for.
z.B: fori=1to1000:next:
Das kann man zwar machen, sollte es aber tunlichst vermeiden. Genau solche BASIC-ismen verhindern den Übergang von "mit Basic rumspielen" zu "programmieren".
-
FOR...NEXT ist in diesem Zusammenhang fehl am Platze, weil ich ja nicht nur den Countdown anzeigen lassen will, sondern da soll ja auch noch ein Spiel stattfinden. Der Countdown soll währenddessen z.B. oben links in der Ecke ablaufen...
-
Dann benutz einfach den Sprungbefehl deiner Wahl; GOTO funktioniert hier auch.
Nachtrag:
Für dich sind nur 2 Dinge wichtig, um sie einzubauenti$="000000": timer=0: tempvar=0
if tempvar < ti - 60 then tempvar = ti: timer = timer -1 -
Mit ti und TI$ sollte man das schon machen können.
z.B:
10 :s=10:
11 :ifa=val(ti$)goto11
12 :a=val(ti$):s=s-1::prints:ifs>.goto11Schönen Gruß.
Was ich mich schon öfters gefragt habe: Die Doppelpunkte am Zeilenanfang bei dir, haben die irgendeinen Sinn oder ist das reiner Manierismus?
-
Die sind ein Markenzeichen und müssen da stehen...
-
Nachtrag:
Für dich sind nur 2 Dinge wichtig, um sie einzubauen
ti$="000000": timer=0: tempvar=0
if tempvar < ti - 60 then tempvar = ti: timer = timer -1Die Variable timer dürfte beim C64 nicht funktionieren, weil sie als die Systemvariable ti interpretiert wird.
-
Code: countdown.bas
- 5 print chr$(147);
- 10 se=10
- 20 sw=ti+(60*se)
- 25 if int(ti/60)=int(sw/60) then goto 40
- 28 print"s";
- 30 printint((sw-ti)/60);:print "seconds
- left..."
- 31 gosub 100
- 35 goto 25
- 40 print"ende"
- 45 end
- 100 rem doing stuff
- 110 x=rnd(1)*30
- 120 y=rnd(i)*23:y=y+1
- 130 poke 1024+(y*40)+x,0
- 131 poke55296+(y*40)+x,rnd(1)*15
- 136 poke53280,rnd(1)*15
- 137 poke646,rnd(1)*15
- 140 return
So, mal ein kleines Beispiel hingesaut.
Wichtig: Zeile 25: Der Vergleich muss auch mit auf Sekunden gerundeten Werten erfolgen, sonst bleibt die Schleife manchmal hängen.
Zeile 28: Da ist das Einfügen in die Hose gegangen, es soll ein "Home" geprintet werden.
Have Fun.