Kurze Pause

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Kebap
User
Beiträge: 802
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Früher hab ich am C64 im Supermarkt immer aus Spaß einen kurzen Zweizeiler programmiert, der dann da lustige Labyrinthe auf die Bildschirme zauberte.

Wenn ich das in Python probiere, scrollt das viel zu schnell durch. Wie kann ich eine kurze Pause in die Schleife einbauen? Möglichst Hardware-agnostisch?

Also die erste Idee wäre einfach eine sinnlose Schleife hochzählen lassen, aber deren Dauer ist ja vorher gar nicht so einfach zu bemessen.

Code: Alles auswählen

import random
while True: 
  print(random.choice("/\\"), end="")
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
Kebap
User
Beiträge: 802
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ah, ich gebe mir einfach mal selbst die Antwort: Es gibt dafür time.sleep()

Code: Alles auswählen

import random
from time import sleep
while True: 
  print(random.choice("/\\"), end="")
  sleep(0.05)
OK, jetzt pausiert aber die komplette Ausgabe. Sprich, man sieht das Labyrinth erst nach Keyboard Interrupt und nicht sofort Zeichen für Zeichen aufbauen.

Warum? Wie kann ich das heilen?

Nächste Frage: Wieso kann ich Befehle nicht mehr in eine Zeile quetschen? Früher ging das doch mit Doppelpunkt? Jetzt funken Annotationen dazwischen.

Code: Alles auswählen

    while True: print(random.choice("/\\"), end="") : sleep(0.05)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: illegal target for annotation
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
noisefloor
User
Beiträge: 4327
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

zum letzten Punkt: der 2. Doppelpunkt im Einzeiler ist syntaktisch falsch bzw. da kommt der Fehler her. Schon immer, dass kann so auch früher nicht funktioniert haben. Da muss wenn ein ; hin.

Gruß, noisefloor
imonbln
User
Beiträge: 213
Registriert: Freitag 3. Dezember 2021, 17:07

Du musst statt des zweiten Doppelpunkts ein Semikolon verwenden. Zudem kennt print den Parameter flush, mit dem du dafür sorgst, dass stdout sofort dargestellt wird.

Code: Alles auswählen

while True: print(random.choice("/\\"), end='',flush=True); time.sleep(0.05)
Benutzeravatar
Kebap
User
Beiträge: 802
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Ihr habt Recht. Der Doppelpunkt stammt wohl noch aus BASIC. :mrgreen: Danke auch für den Hinweis auf Flush.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 14411
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kebap: Das Programm was Du wahrscheinlich meinst ist dieser Klassiker, zu dem es auch ein Buch gibt, das _das_ als Titel hat:

Code: Alles auswählen

10 PRINT CHR$(205.5+RND(1));:GOTO 10
Und / und \ sind da nur ein schlechter Ersatz für die Grafikzeichen im PETSCII-Zeichensatz. Das kann man heute ziemlich Originalgetreu mit Unicode-Zeichen nachstellen. Die beiden diagonalen Linien liegen als Codepoint nämlich auch genau nebeneinander, so dass man den gleichen ”Trick” im Code verwenden kann mit 9585 statt mit 205:

Code: Alles auswählen

import random, time
while True: print(chr(int(9585.5 + random.random())), end="", flush=True); time.sleep(0.02)
“The city's central computer told you? R2D2, you know better than to trust a strange computer!” — C3PO
Benutzeravatar
Kebap
User
Beiträge: 802
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Boah, danke, diese Zeichen sind VIEL besser!

Vorher:

Code: Alles auswählen

\\\//\\\\\/\\\/\\//////\/\//\\/\/\\//\/\\//\\\\\\/\////\/////\\//\\//\\\//\\/\/
\\\//////\////\\\\/\////\\//\\/\/\\\/\\\///\/\/\////\///\\\\//\\\/\//\/\\////\\
//\\/\\//\\//\/\/\\/\/\\\\/\//\//\\/\\\/\//\\\\/\\/\\//\///\////\//\/\//\\\/\//
\/\/\\\\\//\///\\\\\///\//\//\/\\\///\///\\/\\\\//\\\////\\\\\/\\\\\//\//\//\\/
/\//////\\\///\///////\/\\/\//\\//\/\\\\/////\/\\/\\\/\//\//\/\\/\\//\\//\\//\/

Dank __blackjack__ nun:

Code: Alles auswählen

╲╱╲╲╱╱╱╲╱╲╲╲╲╲╲╱╱╲╲╱╱╲╱╱╲╲╱╱╲╲╲╱╱╲╱╱╲╲╱╱╱╱╲╲╱╱╱╲╱╲╱╲╱╲╲╲╱╲╲╱╱╲╱╲╲╲╱╲╱╲╱╲╲╱╲╱╲╲╲
╱╲╱╲╲╲╲╲╲╲╱╲╲╱╱╱╱╱╲╱╱╲╲╱╲╱╱╲╲╲╱╱╲╱╲╲╱╱╱╲╱╱╱╲╲╱╱╱╲╲╱╱╲╲╱╱╲╱╱╲╱╱╲╲╱╱╲╲╲╱╲╲╲╲╱╱╲╱╲
╲╲╲╲╱╲╱╱╲╲╱╲╲╲╱╲╱╱╲╲╱╱╲╱╱╱╲╱╲╱╱╲╱╲╲╱╲╲╲╲╲╱╱╲╲╲╲╱╲╱╱╲╱╱╲╱╲╱╱╲╱╱╱╲╲╱╱╱╲╲╱╲╱╱╱╱╱╲╲
╱╲╲╱╲╲╲╱╱╲╲╱╲╲╲╲╱╲╱╱╱╲╱╲╲╱╱╱╱╱╱╲╱╲╱╱╱╱╲╱╱╱╲╲╲╱╱╱╲╲╱╲╲╱╲╲╲╲╲╱╱╲╲╲╱╲╲╱╱╲╱╲╱╲╲╱╲╲╲
╲╱╲╲╲╱╲╱╱╱╱╱╲╱╱╱╱╱╲╲╱╲╲╲╱╲╲╱╲╲╱╱╲╱╲╱╱╲╲╱╲╲╱╱╱╱╲╲╲╲╲╲╲╱╱╲╲╱╱╱╲╱╲╱╱╲╱╲╱╱╱╱╱╱╱╲╱╱╱
Danke auch für den Hinweis auf das Buch, das ich sicherlich bisher nicht kannte, aber auch sehr gut aussieht:
https://direct.mit.edu/books/oa-monograph/5343/10-PRINT-CHR-205-5-RND-1-GOTO-10
Dank Creative Commons kann man sich dort direkt eine PDF Version ziehen und selbst drin blättern. :ugeek:

Ich war dem Trugschluss aufgesessen, ich hätte mir das ganz allein ausgedacht. Vielleicht irgendwo aufgeschnappt. Spannend!

Und nein, ich hatte das damals nicht mit CHR und Kommazahlen gelöst, sondern mit den ausgeschriebenen Zeichen, die ja auf Tastendruck vorlagen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 14411
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das mit CHR$ und der Kommazahl steht im Handbuch vom C64. Dort als Dreizeiler — vor der Ausgabe von den beiden Zeichen wird noch der Bildschirm geleert:

Code: Alles auswählen

10 PRINT "{CLR}"
20 PRINT CHR$(205.5 + RND(1));
30 GOTO 20
{CLR} steht für die CLR/HOME-Taste. Wird auf dem C64 als reverses Herz dargestellt.

Eine Variante die nicht darauf angewiesen wäre, dass die beiden Zeichen in PETSCII direkt aufeinander folgen:

Code: Alles auswählen

10 A$(0)="╱":A$(1)="╲"
20 PRINT A$(2*RND(1));
30 GOTO 20
Die beiden Grafikzeichen gibt man auf dem C64 mit Shift+N und Shift+M ein.

Ich habe es mal ganz grob mit der Stoppuhr ermittelt: Der C64 gibt beim Originalprogramm so ca. 64 Zeichen pro Sekunde aus. Also ein ``time.sleep(0.015625)`` zwischen den Zeichen.
“The city's central computer told you? R2D2, you know better than to trust a strange computer!” — C3PO
Antworten