 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 02.09.2006, 14:13 Titel: Schachuhr |
|
|
Hallo!
Hier ein alter Quellcode und mein Problem von mir:
Dies soll eine Schachuhr darstellen und auch wie eine Schachuhr funktionieren, doch leider läuft diese Schachuhr nicht mit der echten Uhr synchron. Diese Uhr läuft langsamer als die echte Uhr!
1 Minute ist nicht gleich 1 Minute!
Und bei 1 Sekunde kann läuft die Uhr auf Null auch wenn ich noch draufdrücke. Bei einer echten Schachuhr kann ich noch bei 0.5 Sekunden nur 0.1 Sekunden an Zeit verbrauchen hier bei meinem Programm leider nicht!
Wie programmiere ich es so das diese Uhr wie eine echte digitale Schachuhr funktioniert und somit für den Tunierbetrieb einsetzbar ist?
Ich danke im Vorraus!
PS. Wer dieses Programm umprogrammieren will oder irgendwo in sein Programm einbauen will darf das gerne tun!!!
Mit freundlichen Grüßen
ALWIM
Zitat: |
DEFINT I
DEFSTR C
C1$ = CHR$(202)
C2$ = CHR$(203)
C3$ = CHR$(204)
C4$ = CHR$(205)
C5$ = CHR$(206)
C6$ = CHR$(185)
C7$ = CHR$(186)
C8$ = CHR$(255)
CST4$ = STRING$(5, C4$)
CST5$ = STRING$(5, C4$)
CST7$ = STRING$(1, C7$)
ZUEGE = 0
ZZUEGE = 0
NM = 0
COLOR 15, 7
0 CLS
LOCATE 12, 1
PRINT "Weiß drückt eine der Tasten Q, A, Y, W, S, X, E, D, C"
LOCATE 14, 1
PRINT "Schwarz drückt eine der Tasten U, J, M, Z, H, N, T, G, B"
LOCATE 16, 1
PRINT "Zum stoppen der Uhr die Taste L drücken!"
LOCATE 18, 1
PRINT "Beenden des Programms funktioniert mit Pfeil-Nach-Oben Taste und š"
LOCATE 2, 1
PRINT "Geben sie bitte die gewünschte Tunierzeit ein!"
LOCATE 4, 1
PRINT "Wieviele Stunden?"
INPUT STUNDEN
LOCATE 6, 1
PRINT "Wieviele Minuten?"
INPUT MINUTEN
LOCATE 8, 1
PRINT "Wieviele Sekunden?"
INPUT SEKUNDEN
CLS
LOCATE 10, 1
PRINT "Wo sitzt Weiß?"
PRINT "Sitzt Weiß bei Nummer 1 oder bei Nummer 2?"
COLOR 5, 7
LOCATE 4, 14
PRINT "1"
LOCATE 4, 65
PRINT "2"
COLOR 15, 15
LOCATE 5, 4
PRINT " "
LOCATE 5, 4
PRINT " WEIß "
COLOR 0, 15
LOCATE 5, 55
PRINT " "
LOCATE 5, 55
PRINT " Schwarz "
COLOR 15, 15
LOCATE 6, 55
PRINT " "
LOCATE 6, 55
PRINT " WEIß "
COLOR 0, 15
LOCATE 6, 4
PRINT " "
LOCATE 6, 4
PRINT " Schwarz "
LOCATE 12, 1
COLOR 15, 15
INPUT "Geben sie bitte die entsprechende Nummer ein!"; NUMMER
ZENTELSEKUNDEN = 0
IF STUNDEN = 0 AND MINUTEN = 0 AND SEKUNDEN = 0 THEN 0
2 CLS
LOCATE 2, 1
COLOR 15, 15
PRINT "Tunierzeit: "; STUNDEN; "h"; " "; MINUTEN; "min"; " "; SEKUNDEN; "sek"
IF NUMMER = 1 THEN 3 ELSE 4
3 COLOR 15, 15
LOCATE 5, 4
PRINT " "
LOCATE 5, 4
PRINT " WEIß "
COLOR 0, 15
LOCATE 5, 55
PRINT " "
LOCATE 5, 55
PRINT " Schwarz "
GOTO 5
4
COLOR 12, 7
LOCATE 20, 30
PRINT "Züge: "; ZUEGE
COLOR 15, 15
LOCATE 5, 55
PRINT " "
LOCATE 5, 55
PRINT " WEIß "
COLOR 0, 15
LOCATE 5, 4
PRINT " "
LOCATE 5, 4
PRINT " Schwarz "
5
COLOR 2, 0
LOCATE 6, 55
STUNDENS = STUNDEN
MINUTENS = MINUTEN
SEKUNDENS = SEKUNDEN
ZENTELSEKUNDENS = ZENTELSEKUNDEN
PRINT STUNDENS; "h"; " "; MINUTENS; "min"; " "; SEKUNDENS; "sek ";
IF SEKUNDEN > 1 THEN SEKUNDEN = SEKUNDEN + 1
IF NUMMER = 1 THEN 20 ELSE 6
6
COLOR 7, 7
LOCATE 10, 4
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
GOTO 30
9
LOCATE 10, 55
PRINT " "
LOCATE 11, 55
PRINT " "
LOCATE 12, 55
PRINT " "
LOCATE 13, 55
PRINT " "
LOCATE 14, 55
PRINT " "
LOCATE 15, 55
PRINT " "
LOCATE 16, 55
PRINT " "
LOCATE 17, 55
PRINT " "
COLOR 2, 0
LOCATE 6, 55
PRINT STUNDENS; "h"; " "; MINUTENS; "min"; " "; SEKUNDENS; "sek "
20
REM Spielbeginn und Tastaturabfrage
IF NUMMER = 1 THEN ZUEGE = ZUEGE + 1
COLOR 12, 7
IF NUMMER = 1 THEN LOCATE 20, 30
IF NUMMER = 1 THEN PRINT "Züge: "; ZUEGE
IC1 = -1
WHILE IC1
CC$ = INKEY$
IF CC$ = "" THEN 21
ICI = ASC(CC$)
ICI = ICI AND &HDF: REM Kleine = große Buchstaben
CC$ = CHR$(ICI)
21 IF CC$ = "š" THEN COLOR 1, 15: LOCATE 20, 12: PRINT "E N D E": END: REM Spielende Abbruchbedingung
COLOR 14, 0
LOCATE 6, 4
PRINT STUNDEN; "h"; " "; MINUTEN; "min"; " "; SEKUNDEN; "sek "
COLOR 12, 7
FOR IY = 1 TO 2
IY1 = IY + 9
LOCATE IY1, 9
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 9
LOCATE IY1, 15
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 12
LOCATE IY1, 15
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 12
LOCATE IY1, 9
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 15
LOCATE IY1, 9
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 15
LOCATE IY1, 15
PRINT CST7$
NEXT IY
LOCATE 12, 16
PRINT CST4$
LOCATE 15, 16
PRINT CST4$
LOCATE 12, 4
PRINT CST4$
LOCATE 12, 10
PRINT CST4$
LOCATE 15, 4
PRINT CST4$
LOCATE 15, 10
PRINT CST4$
LOCATE 15, 9
PRINT C5$
LOCATE 12, 9
PRINT C5$
LOCATE 12, 15
PRINT C5$
LOCATE 15, 15
PRINT C5$
LOCATE 9.5, 6.5
PRINT "Q"
LOCATE 10, 12.5
PRINT "W"
LOCATE 10, 18.5
PRINT "E"
LOCATE 13, 6.5
PRINT "A"
LOCATE 13, 12.5
PRINT "S"
LOCATE 13, 18.5
PRINT "D"
LOCATE 16, 6.5
PRINT "Y"
LOCATE 16, 12.5
PRINT "X"
LOCATE 16, 18.5
PRINT "C"
IF CC$ = "Q" THEN 30: NM = 2
IF CC$ = "A" THEN 30: NM = 2
IF CC$ = "Y" THEN 30: NM = 2
IF CC$ = "W" THEN 30: NM = 2
IF CC$ = "S" THEN 30: NM = 2
IF CC$ = "X" THEN 30: NM = 2
IF CC$ = "E" THEN 30: NM = 2
IF CC$ = "D" THEN 30: NM = 2
IF CC$ = "C" THEN 30: NM = 2
ZENTELSEKUNDEN = ZENTELSEKUNDEN - 1
SOUND 32000, 1.82
IF ZENTELSEKUNDEN < 0 THEN 22 ELSE 23
22
ZENTELSEKUNDEN = 9
SEKUNDEN = SEKUNDEN - 1
23 IF SEKUNDEN < 0 THEN 25 ELSE 26
25
SEKUNDEN = 59
MINUTEN = MINUTEN - 1
26 IF MINUTEN < 0 THEN 27 ELSE 28
27
MINUTEN = 59
STUNDEN = STUNDEN - 1
28 IF STUNDEN = 0 THEN STUNDEN = 0
IF STUNDEN = 0 AND MINUTEN = 0 AND SEKUNDEN = 0 THEN 29
IF CC$ = "L" THEN SLEEP
WEND
GOTO 20
29
COLOR 14, 0
LOCATE 6, 4
PRINT STUNDEN; "h"; " "; MINUTEN; "min"; " "; SEKUNDEN; "sek "
SLEEP 1
LOCATE 6, 4
PRINT " "
COLOR 4, 0
LOCATE 6, 12
PRINT "ZEIT"
FOR i% = 440 TO 750 STEP 5
SOUND i%, i% / 1000
NEXT i%
COLOR 15, 7
LOCATE 20, 30
PRINT "!!!DIE ZEIT IST AUS!!!"
LOCATE 22, 1
PRINT "Neustart des SCHACHUHRPROGRAMMS jJ/nN ?"
INPUT OK$
IF OK$ = "j" OR OK$ = "J" THEN 0 ELSE END
30
LOCATE 10, 4
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
PRINT " "
IF NUMMER = 2 THEN ZZUEGE = ZZUEGE + 1
IF NUMMER = 2 THEN LOCATE 20, 30
IF NUMMER = 2 THEN PRINT "Züge: "; ZZUEGE
COLOR 2, 0
LOCATE 6, 4
PRINT STUNDEN; "h"; " "; MINUTEN; "min"; " "; SEKUNDEN; "sek "
31
REM Spielbeginn und Tastaturabfrage
COLOR 12, 7
IF NUMMER = 2 THEN LOCATE 20, 30
IF NUMMER = 2 THEN PRINT "Züge: "; ZZUEGE
IC1 = -1
WHILE IC1
CC$ = INKEY$
IF CC$ = "" THEN 32
ICI = ASC(CC$)
ICI = ICI AND &HDF: REM Kleine = große Buchstaben
CC$ = CHR$(ICI)
32 IF CC$ = "š" THEN COLOR 1, 15: LOCATE 20, 12: PRINT "E N D E": END: REM Spielende Abbruchbedingung
COLOR 14, 0
LOCATE 6, 55
PRINT STUNDENS; "h"; " "; MINUTENS; "min"; " "; SEKUNDENS; "sek "
COLOR 12, 7
FOR IY = 1 TO 2
IY1 = IY + 9
LOCATE IY1, 60
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 9
LOCATE IY1, 66
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 12
LOCATE IY1, 60
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 12
LOCATE IY1, 66
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 15
LOCATE IY1, 60
PRINT CST7$
NEXT IY
FOR IY = 1 TO 2
IY1 = IY + 15
LOCATE IY1, 66
PRINT CST7$
NEXT IY
LOCATE 12, 55
PRINT CST4$
LOCATE 15, 55
PRINT CST4$
LOCATE 12, 61
PRINT CST4$
LOCATE 12, 67
PRINT CST4$
LOCATE 15, 61
PRINT CST4$
LOCATE 15, 67
PRINT CST4$
LOCATE 15, 60
PRINT C5$
LOCATE 12, 60
PRINT C5$
LOCATE 12, 66
PRINT C5$
LOCATE 15, 66
PRINT C5$
LOCATE 9.5, 57
PRINT "T"
LOCATE 10, 63
PRINT "Z"
LOCATE 10, 69
PRINT "U"
LOCATE 13, 57
PRINT "G"
LOCATE 13, 63
PRINT "H"
LOCATE 13, 69
PRINT "J"
LOCATE 16, 57
PRINT "B"
LOCATE 16, 63
PRINT "N"
LOCATE 16, 69
PRINT "M"
IF CC$ = "U" THEN 9: NM = 1
IF CC$ = "J" THEN 9: NM = 1
IF CC$ = "M" THEN 9: NM = 1
IF CC$ = "Z" THEN 9: NM = 1
IF CC$ = "H" THEN 9: NM = 1
IF CC$ = "N" THEN 9: NM = 1
IF CC$ = "T" THEN 9: NM = 1
IF CC$ = "G" THEN 9: NM = 1
IF CC$ = "B" THEN 9: NM = 1
ZENTELSEKUNDENS = ZENTELSEKUNDENS - 1
SOUND 32000, 1.82
IF ZENTELSEKUNDENS < 0 THEN 35 ELSE 36
35
ZENTELSEKUNDENS = 9
SEKUNDENS = SEKUNDENS - 1
36
IF SEKUNDENS < 0 THEN 37 ELSE 38
37
SEKUNDENS = 59
MINUTENS = MINUTENS - 1
38 IF MINUTENS < 0 THEN 39 ELSE 40
39
MINUTENS = 59
STUNDENS = STUNDENS - 1
40 IF STUNDENS = 0 THEN STUNDENS = 0
IF STUNDENS = 0 AND MINUTENS = 0 AND SEKUNDENS = 0 THEN 44
IF CC$ = "L" THEN SLEEP
WEND
GOTO 31
44 COLOR 14, 0
LOCATE 6, 55
PRINT STUNDENS; "h"; " "; MINUTENS; "min"; " "; SEKUNDENS; "sek "
SLEEP 1
LOCATE 6, 55
PRINT " "
COLOR 4, 0
LOCATE 6, 63
PRINT "ZEIT"
COLOR 15, 7
LOCATE 20, 30
FOR i% = 440 TO 750 STEP 5
SOUND i%, i% / 1000
NEXT i%
PRINT "!!!DIE ZEIT IST AUS!!!"
LOCATE 22, 1
PRINT "Neustart des SCHACHUHRPROGRAMMS jJ/nN ?"
INPUT OK$
IF OK$ = "j" OR OK$ = "J" THEN 0 ELSE END
|
_________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.09.2006, 21:32 Titel: |
|
|
ich hab den source nicht angeschaut, aber vlt hilft dir meine denkweise:
Code: |
dim zeit as double
WievielSekunden! = 2
zeit=timer
do
[Deine Spielschleife]
if timer > Zeit + WievielSekunden! then
zeit=timer
DeineSekunde = DeineSekunde + 1
end if
locate 1: print es sind schon"; DeineSekunde; "Sekunden vergangen."
loop until [....]
|
in meinem beispiel wäre eine sekunde im spiel also erst nach 2 echten sekunden rum... anhalten kannst du auch, indem du z.B in der if-anfrage noch eine variable einbaust. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 03.09.2006, 20:10 Titel: |
|
|
Hallo
Wie Jojo schon geschrieben hat, kannst du mit TIMER arbeiten, dann geht deine Uhr einerseits richtig, andererseits kannst du so auch auf Zehntelsekunden genau messen. Aber mal was anderes - hast du schon überlegt, anstelle der Tastatur richtige Taster zu benutzen, die du an den COM-Port anschliessen könntest? Das wäre relativ einfach zu machen und du bräuchtest dazu auch keine Elektronik oder zusätzliche Stromversorgung.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 06.09.2006, 16:32 Titel: |
|
|
Nochmal eine Frage!
Welche Taster würdet ihr dazu nehmen?
Wie programmiert man dann so etwas dass man mit den Tastern die Zeit steuert?
Gibt es noch eine Alternative zu Comport?
Ich glaube mein Laptop hat keinen Comport mehr?
Wenn aber erst nach 2 echten Sekunden bei meinem Programm 1 Sekunde vorrüber ist läuft das Programm ja wieder oder immer noch nicht mit der echten Uhr synchron oder?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 06.09.2006, 16:54 Titel: |
|
|
Vielleicht hilft es dir weiter wenn du die Future Lib verwendest???
Die verwendet nämlich einen ziemlich genauen Timer. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 07.09.2006, 00:16 Titel: |
|
|
Hallo
Dafür eine lib zu verwenden ist meiner Meinung nach mit Kanonen auf Spatzen geschossen. Ich stelle mir das so vor:
Code: | CLS
KEY(1) ON
ON KEY(1) GOSUB abbruch
PRINT "Start und Wechsel mit einer beliebigen Taste, Abbruch mit F1"
gesamt = 20 'Bedenkzeit je Spieler in Sekunden
zw = gesamt 'zw = Zeit Weiss
zs = gesamt 'zs = Zeit Schwrz
LOCATE 5, 5
PRINT "Weiss :";
PRINT USING "####.#"; zw
LOCATE 7, 5
PRINT "Schwarz:";
PRINT USING "####.#"; zs
DO: LOOP WHILE INKEY$ = ""
DO
sz = TIMER
DO
dt = TIMER - sz
IF dt < 0 THEN dt = dt + 86400
LOCATE 5, 13: PRINT USING "####.#"; ABS(zw - dt)
LOOP UNTIL INKEY$ <> "" OR dt + .05 > zw
IF dt + .05 > zw THEN EXIT DO
zw = zw - dt
sz = TIMER
DO
dt = TIMER - sz
IF dt < 0 THEN dt = dt + 86400
LOCATE 7, 13: PRINT USING "####.#"; ABS(zs - dt)
LOOP UNTIL INKEY$ <> "" OR dt + .05 > zs
zs = zs - dt
LOOP WHILE zw > .05 AND zs > .05
abbruch:
END |
Ist natürlich nur das Grundgerüst. Eine schöne grafische Umsetzung etc. ist Fleissarbeit, die ich dir gerne überlasse...
Als Taster kannst du alles nehmen, was irgendwie Kontakt gibt, also auch was selbstgebasteltes oder einen beliebigen Taster von einem Elektronikhandel oder -versand. Anstelle des COM-Ports ginge auch die Druckerschnittstelle. Ins Programm einbinden kannst du so einen Taster genauso als "Ereignis" wie einen Knopfdruck auf der Tastatur. Wenn es dich interessiert, kann ich dir noch genauer sagen wie.
Gruss
Skilltronic
EDIT: Ich habe noch eine kleine Macke in meinem Programm entdeckt. Manchmal läuft die Uhr um mehr als eine halbe Zehntelsekunde über die Null hinaus. Das Runden durch PRINT USING in Verbindung mit dem ABS (das soll nur die Anzeige von -0.0 verhindern) führt dazu, dass ab und zu am Ende 0.1 Sekunden angezeigt werden. Das müsste man noch irgendwie zurechtbiegen.
EDIT2: Ich hab's mittlerweile zurechtgebogen, jetzt endet es immer bei Null. _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|