clear cmd

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
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

hi, ich hab ein problem, bin grad dabei mit spiele programmierung anzufangen und hab mir gedacht das erste machste mit python, weils ja hier sehr leicht ist, aber ich weiß nicht, wie ich den inhalt der cmd lösche ... ich habe mir dafür zwar etwas ausgedacht, was theoretisch funktionieren müsste, aber python weigert sich den Befehl "print chr( 8 )" auszuführen ...

hier mal mein code:

Code: Alles auswählen

import msvcrt as n
import random as rand
import time as t

def render (poss,posz,length,width,first=0):
    if not first:
#hier soll der untere inhalt der cmd (also das spielfeld) gelöscht werden, damit man es dann neu gezeichnet werden kann, aber das funzt einfach nicht ....
        print chr(8)*((length+2)*(width+3)-1)#<-- das hier war meine idee für eine lösung, aber das funzt leider nicht
    text=chr(201)+chr(205)*width+chr(187)+"\n"
    text+=(chr(186)+"-"*width+chr(186)+"\n")*length
    text+=chr(200)+chr(205)*width+chr(188)
    for x,y,z in [posz,poss]:
        text=text[0:(y+1)*(width+3)+x+1]+z+text[(y+1)*(width+3)+x+2:]
    print text

def move (poss,posz,length,width,randmove):
    if poss==posz:
        return ['won']
    if n.kbhit():
        eingabe=ord(n.getch())
        if eingabe==224:
            eingabe=ord(n.getch())
            if eingabe==77:#rechts
                if poss[0]!=width-1:
                    poss[0]+=1
            elif eingabe==72:#oben
                if poss[1]!=0:
                    poss[1]-=1
            elif eingabe==75:#links
                if poss[0]!=0:
                    poss[0]-=1
            elif eingabe==80:#unten
                if poss[1]!=length-1:
                    poss[1]+=1
        elif eingabe==27:
            return [0]
    while randmove:
        erg=rand.random()
        if erg<=0.25:#rechts
            if posz[0]!=width-1:
                posz[0]+=1
                randmove=0
        elif erg<=0.5:#oben
            if posz[1]!=0:
                posz[1]-=1
                randmove=0
        elif erg<=0.75:#links
            if posz[0]!=0:
                posz[0]-=1
                randmove=0
        else:#unten
            if posz[1]!=length-1:
                posz[1]+=1
                randmove=0
    return [poss,posz]
    
def get_start_point(length,width):
    return [[width/3,length/3],[(width*2)/3,(length*2)/3]]

speed=1.0/input('Speed (zw. 1 und 10):')
width=input('Breite (zw. 1 und 20):')
length=input('Laenge (zw. 1 und 20):')
pos=get_start_point(length,width)
render(pos[0]+['S'],pos[1]+['X'],length,width,first=1)
start=t.time()
randmove=0
while len(pos)>1:
    if start+speed<t.time():
        start=t.time()
        randmove=1
    render(pos[0]+['S'],pos[1]+['X'],length,width)
    pos=move(pos[0],pos[1],length,width,randmove)
    randmove=0
if pos[0]=='won':
    print 'Sie haben das Ziel erwischt! Glueckwunsch!'
    n.getch()
(vielleicht gibt es so etwas wie cout oder stdout wie bei C++)

mfg und thx im voraus

Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sowas geht mit WConio.clrscr(). Habe ich getestet, war überhaupt kein Problem.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

:D thx :D

jetzt siehts so aus ... (aber bitte nur in der cmd abspielen *g*):

Code: Alles auswählen

import msvcrt as n
import random as rand
import time as t
import sys
import WConio

def render (poss,posz,length,width):
    text=chr(201)+chr(205)*width+chr(187)+"\n"
    text+=(chr(186)+"-"*width+chr(186)+"\n")*length
    text+=chr(200)+chr(205)*width+chr(188)
    for x,y,z in [posz,poss]:
        text=text[0:(y+1)*(width+3)+x+1]+z+text[(y+1)*(width+3)+x+2:]
    WConio.clrscr()
    sys.stdout.write(text)

def move (poss,posz,length,width,randmove):
    if poss==posz:
        return ['won']
    if n.kbhit():
        eingabe=ord(n.getch())
        if eingabe==224:
            eingabe=ord(n.getch())
            if eingabe==77:#rechts
                if poss[0]!=width-1:
                    poss[0]+=1
            elif eingabe==72:#oben
                if poss[1]!=0:
                    poss[1]-=1
            elif eingabe==75:#links
                if poss[0]!=0:
                    poss[0]-=1
            elif eingabe==80:#unten
                if poss[1]!=length-1:
                    poss[1]+=1
        elif eingabe==27:
            return [0]
    while randmove:
        erg=rand.random()
        if erg<=0.25:#rechts
            if posz[0]!=width-1:
                posz[0]+=1
                randmove=0
        elif erg<=0.5:#oben
            if posz[1]!=0:
                posz[1]-=1
                randmove=0
        elif erg<=0.75:#links
            if posz[0]!=0:
                posz[0]-=1
                randmove=0
        else:#unten
            if posz[1]!=length-1:
                posz[1]+=1
                randmove=0
    return [poss,posz]
    
def get_start_point(length,width):
    return [[width/3,length/3],[(width*2)/3,(length*2)/3]]

speed=1.0/input('Speed (zw. 1 und 10):')
width=input('Breite (zw. 1 und 20):')
length=input('Laenge (zw. 1 und 20):')
pos=get_start_point(length,width)
render(pos[0]+['S'],pos[1]+['X'],length,width)
start=t.time()
randmove=0
while len(pos)>1:
    if start+speed<t.time():
        start=t.time()
        randmove=1
    render(pos[0]+['S'],pos[1]+['X'],length,width)
    pos=move(pos[0],pos[1],length,width,randmove)
    randmove=0
if pos[0]=='won':
    print '\nSie haben das Ziel erwischt! Glueckwunsch!'
    n.getch()
aber jetzt flimmert das spiel natürlich, geht das irgenwie wegzumachen ... also das alles schneller ausgegeben wird oder so ...

*/edit\* und wie bekomm ich den quelltext hier so schön farbig ???

Edit (Leonidas): Aus Code Tags einfach Python Tags machen:

Code: Alles auswählen

 zu [python].[/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Seltsames Spiel.. :? Bei mir geht es in cmd und zsh genauso gut.. oder eher mittelmäsig, weil es ziemlich filmmert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

es geht ja eigentlich au7ch erstma nur ums spiele programmier-prinzip mit move, render und mit Inbetrachtnahme der Zeit .... ich werde das ganze bald ma C++ schreiben (aber da fang ich grad erst an ... kann deshalb nochn ein wenig dauern ...) da müsste das dann besser aussehen ... weil es da nicht so flimmern dürfte, weil C++ ja viel schneller ist ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das Problem mit solchen Spielen ist nicht die Geschwindigkeit von Python oder eben der Programmiersprache, sondern die Geschwindigkeit der Konsole, die ja eigentlich nicht für sowas gedacht ist, alle paar Milisekunden sich neu zu zeichnen. Deswegen vermute ich sogar, dass das in C++ auch flimmern würde. Effizienter wäre es, nur die Teile neu zu zeichnen, die auch wirklich geändert wurden.

Edit (ich): Paar böse Typos rausgenommen, die mich beim Lesen angesprungen haben..
Zuletzt geändert von Leonidas am Montag 20. Juni 2005, 13:15, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

hast natürlich recht damit, aber dann würde dieses spieleprinzip den bach runterlaufen ... habs deshalb mal so gemacht:

Code: Alles auswählen

# erstellt mit Python 2.3.4 (#53, May 25 2004, 21:17:02) [MSC v.1200 32 bit (Intel)] on win32
import msvcrt as n
import whrandom as rand
import time as t

try:
    import WConio
except ImportError:
    print "Eigentlich sollte man eine README-Datei vor dem oeffnen eines Programms durchlesen, aber da Sie dazu offensichtlich viel zu faul sind, koennen/muessen Sie sich es hier durchlesen:\n"
    f=open("README.txt","r")
    print f.read()
    f.close()
    
else:

    def render (poss,posz,length,width,first=0):
        WConio.gotoxy(0,0)
        text=chr(201)+chr(205)*width+chr(187)+"\n"
        text+=(chr(186)+"-"*width+chr(186)+"\n")*length
        text+=chr(200)+chr(205)*width+chr(188)
        for x,y,z in [posz,poss]:
            text=text[0:(y+1)*(width+3)+x+1]+z+text[(y+1)*(width+3)+x+2:]
        print text

    def move (poss,posz,length,width,randmove,f):
        if poss==posz:
            return ['won']
        if n.kbhit():
            eingabe=ord(n.getch())
            if eingabe==224:
                eingabe=ord(n.getch())
                if eingabe==77:#rechts
                    if poss[0]!=width-1:
                        poss[0]+=1
                elif eingabe==72:#oben
                    if poss[1]!=0:
                        poss[1]-=1
                elif eingabe==75:#links
                    if poss[0]!=0:
                        poss[0]-=1
                elif eingabe==80:#unten
                    if poss[1]!=length-1:
                        poss[1]+=1
            elif eingabe==27:
                return [0]
        if randmove:
            f.write("\n"+"-"*20)
            r=l=o=u=0.1
            if posz[0]>poss[0]:
                r+=0.3
            elif posz[0]==poss[0]:
                r+=0.15
                l+=0.15
            else:
                l+=0.3
            if posz[1]>poss[1]:
                u+=0.3
            elif posz[1]==poss[1]:
                u+=0.15
                r+=0.15
            else:
                o+=0.3
            if posz[0]==width-1:
                l+=r/3.0
                o+=r/3.0
                u+=r/3.0
                r=0.0
            elif posz[0]==0:
                r+=l/3.0
                o+=l/3.0
                u+=l/3.0
                l=0.0
            if posz[1]==0:
                if not l:
                    u+=o/2.0
                    r+=o/2.0
                elif not r:
                    u+=o/2.0
                    l+=o/2.0
                else:
                    r+=o/3.0
                    l+=o/3.0
                    u+=o/3.0
                o=0.0
            elif posz[1]==width-1:
                if not l:
                    o+=u/2.0
                    r+=u/2.0
                elif not r:
                    o+=u/2.0
                    l+=u/2.0
                else:
                    r+=u/3.0
                    l+=u/3.0
                    o+=u/3.0
                u=0.0
            f.write("\nX="+str(posz)+"\nS="+str(poss))
            f.write("\nr="+str(r)+"\nl="+str(l)+"\nu="+str(u)+"\no="+str(o))
        while randmove:
            erg=rand.random()
            if erg<=r:#rechts
                f.write("\ngoto: r with "+str(r))
                posz[0]+=1
                if posz==poss:
                    posz[0]-=1
                else:
                    randmove=0
            elif erg<=r+o:#oben
                f.write("\ngoto: o with "+str(o))
                posz[1]-=1
                if posz==poss:
                    posz[1]+=1
                else:
                    randmove=0
            elif erg<=r+o+l:#links
                f.write("\ngoto: l with "+str(l))
                posz[0]-=1
                if posz==poss:
                    posz[0]+=1
                else:
                    randmove=0
            else:#unten
                f.write("\ngoto: u with "+str(u))
                posz[1]+=1
                if posz==poss:
                    posz[1]-=1
                else:
                    randmove=0
        return [poss,posz]
        
    def get_start_point(length,width):
        return [[width/3,length/3],[(width*2)/3,(length*2)/3]]

    try:
        WConio.highvideo()
    except:
        pass
    else:
        WConio.textcolor(10)
        WConio.setcursortype(0)
        WConio.settitle("cimes ultrageniales Game zum im Unterricht zocken")
        speed=0.01*(101-input('Speed (zw. 1 und 100):'))
        width=input('Breite (zw. 2 und 20):')
        length=input('Laenge (zw. 2 und 20):')
        WConio.textcolor(0)
        WConio.clrscr()
        WConio.textbackground(15)
        pos=get_start_point(length,width)
        render(pos[0]+['S'],pos[1]+['X'],length,width,first=1)
        start=t.time()
        randmove=0
        f=open("game.log","w")
        f.write("Neustart\n")
        while len(pos)>1:
            if start+speed<t.time():
                start=t.time()
                randmove=1
            render(pos[0]+['S'],pos[1]+['X'],length,width)
            pos=move(pos[0],pos[1],length,width,randmove,f)
            randmove=0
        WConio.textcolor(10)
        WConio.textbackground(0)
        f.close()
        if pos[0]=='won':
            print 'Sie haben das Ziel erwischt! Glueckwunsch!'

        print "Vergessen Sie nicht, mein ultrageniales Game weiterzuempfehlen *g* !"
#dies hier kommt auch, wenn es den ImportError gab
print "\nEnter zum beenden"
x=0
while x!=13:
    x=ord(n.getch())
    if x==255:
        print "\n(Diese Programm laeuft nur mit der Konsole, weshalb es sinnlos ist, es mit der Python Shell auszufuehren!)"
        break
hatte mich noch ein wenig mit WConio beschäftigt und das ist halt herausgekommen ... würd mich über ein paar verbesserungsvorschläge freuen ... mfg cime
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Statt whrandom solltest du random benutzen (oder wenn es wirkich sicher sein soll auch crnd *g*).

Aber sonst läuft es schon viel flüssiger :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Leonidas hat geschrieben:Statt whrandom solltest du random benutzen
bin ich eigentlich nich der meinung ... whrandom ist um einiges "zufälliger" als random, das hab ich schon ma mit einem pi-berechnnungsprogramm (, das ich nur zum testen von diesen beiden zufallsgeneratoren geschrieben habe,) und da gabs mit whrandom eindeutig bessere ergebnisse ...
(oder wenn es wirkich sicher sein soll auch crnd *g*).
crnd kenn ich nich, werd mich aber gleich ma informieren ....
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cime hat geschrieben:bin ich eigentlich nich der meinung ... whrandom ist um einiges "zufälliger" als random, das hab ich schon ma mit einem pi-berechnnungsprogramm (, das ich nur zum testen von diesen beiden zufallsgeneratoren geschrieben habe,) und da gabs mit whrandom eindeutig bessere ergebnisse ...
whrandom benutzt Wichmann-Hill, random ist dagegen eine Implementation des Mersenne Twisters. Davon mal abgesehen, dass du wunderschöne DeprectionWarnings beim Starten bekommst.
cime hat geschrieben:crnd kenn ich nich, werd mich aber gleich ma informieren ....
Sorry, habe mich verschrieben, meinte eigentlich crng.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Leonidas hat geschrieben:
cime hat geschrieben:bin ich eigentlich nich der meinung ... whrandom ist um einiges "zufälliger" als random, das hab ich schon ma mit einem pi-berechnnungsprogramm (, das ich nur zum testen von diesen beiden zufallsgeneratoren geschrieben habe,) und da gabs mit whrandom eindeutig bessere ergebnisse ...
whrandom benutzt Wichmann-Hill, random ist dagegen eine Implementation des Mersenne Twisters. Davon mal abgesehen, dass du wunderschöne DeprectionWarnings beim Starten bekommst.
ich weiß, aber da ich noch mit python 2.3.2 arbeiten muss (internetzugang hab ich (fast) nur in der schule ...) gibts diese warnung nicht, und die wär eigentlich auch kein prob, man müsste ja nur vor die inputs einfach noch eine WConio.clrscr() setzen ...
cime hat geschrieben:crnd kenn ich nich, werd mich aber gleich ma informieren ....
Sorry, habe mich verschrieben, meinte eigentlich crng.
daran könnte es liegen, dass ich nichts sinnvolles gefunden hatt *g*

*/edit\*
kanns sein, dass crng für windows nur bis vers 2.2 vorhanden is, oder bin ich blind???
Gast

mir fällt grad noch was ein, dass würd ich gern mit einbauen, hab aber gar keinen plan wie ... :

wenn ich in einem richtigen spiel auf nach vorne drücke, dann läuft er sofort solange nach vorne, bis ich aufhöre zu drücken, aber wenn ich das hier in diesem programm mache, dann muss man immer erst noch kurz warten, weil die tastatur immer kurz wartet, bis sie dann den Befehl "pfeil nach vorne" dauewrhaft sendet ... wie kann man diese wartezeit eliminieren ????

außerdem : wenn ich in einem richtigen spiel (die formulierung ´gefällt mir langsam *g* ) zwei pfeil tasten gleichzeitig drücke, dann läuft mein figur (oder was auch immer) halt schräg, aber wenn ich das so austeste, dann werden nur am anfang die befehle von beiden pfeiltasten gesendet, und danach nur der von einem ... wei kann man das ändern ????

mfg und schonma danke im voraus, cime
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cime hat geschrieben:ich weiß, aber da ich noch mit python 2.3.2 arbeiten muss (internetzugang hab ich (fast) nur in der schule ...) gibts diese warnung nicht, und die wär eigentlich auch kein prob, man müsste ja nur vor die inputs einfach noch eine WConio.clrscr() setzen ...
Was ist denn das für eine Mentalität? Fehlermeldungen einfach plätten? Die haben vielleicht auch irgendeinen Sinn?
cime hat geschrieben:*/edit\*
kanns sein, dass crng für windows nur bis vers 2.2 vorhanden is, oder bin ich blind???
Deswegen habe ich auch noch eins für Python 2.4 erstellt.

Und wie misst man bitte Pseudo-Zufälligkeit?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Leonidas hat geschrieben:Und wie misst man bitte Pseudo-Zufälligkeit?
hab einfach so ungefähr 10000 proben durchgeführt und sie danach nach ihrer ersten kommastelle (0.1; 0.2; 0.3; etc.) einordnen lassen ... bei whrandom waren die ergebnisse für die jeweilige erste kommastelle alle um einiges näher bei 1000 als bei random ...
is einfach meine möglichkeit *g* --> ich find whrandom besser ...

PS: der gast-text da oben is auch von mir, hatte mich nur nich eingeloggt (sry, vergessen), hast du eine ahnung wie man so etwas realisieren kann??? ....
Zuletzt geändert von cime am Dienstag 21. Juni 2005, 13:11, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ne, ich habe auch die Vermutung, dass die Konsole sowas nicht kann, bin mir da aber nicht sicher.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Leonidas hat geschrieben:Ne, ich habe auch die Vermutung, dass die Konsole sowas nicht kann, bin mir da aber nicht sicher.
hab ioch auch schon überlegt, aber die konsole wird ja eigentlich nur für die ausgabe und direkte eingabe (bsp durch input) verwendet, aber nicht für msvcrt.getch oder ???? hab ich mir zumindest so gedacht ...
Antworten