2015-06-14 10 views
5

Ich arbeite ein einfaches Hangman Spiel in Python auf dem Schreiben von dem, was ich weiß, so weit (ich tue Lernen Python the Hard Way) und so weit ich habe dies:Hangman in Python: haben Linien ersetzt werden?

from sys import argv 
import random 

script_name, dict_file = argv 

hang_list = open(dict_file).read().splitlines() 
hang_list = filter(None, hang_list) 
word = random.choice(hang_list) 

guesses = '' 

def compare_words(): 
    global guesses 
    new_word = '' 
    for char in word: 
     if char in guesses: 
      new_word += char 
     else: 
      new_word += "_" 
    return new_word 

def test_letter(): 
    global guesses 
    letter = raw_input("Guess a letter: ") 
    guesses += letter 
    new_word = compare_words() 
    print "\nCurrent guesses: %s" % guesses 
    print "%s\n\n" % new_word 
    if new_word == word: 
     print "You won!" 
    else: 
     test_letter() 


test_letter() 

Ich habe noch zu implementieren Sie das Scoring-System (Stück Kuchen), aber ich habe ein Problem mit dem Layout. Wie Sie sehen können, wird dies "Aktuelle Vermutungen:" und das neue Wort jedes Mal drucken; jedoch, was ich will, ist vier Zeilen, die wie aussehen:

Guess a letter: 
Guesses: abczy 
__c__b_ 

Und haben diese drei Zeilen zu aktualisieren. Allerdings habe ich Probleme herauszufinden, wie man den Druck stdout ersetzen kann. Ich glaube, ich muss das \r Escape-Zeichen verwenden, aber ich habe versucht, das an verschiedenen Stellen, aber kann es nicht zur Arbeit bringen. Also, wie soll ich das ändern, um es zu ersetzen? Ich würde es vorziehen, nicht nur zu löschen, da es dann immer noch etwas unordentlich macht; Ich möchte nur ersetzen, was da ist. Vielen Dank!

+0

möglich duplizieren von [Python Progress Bar] (http://stackoverflow.com/questions/3160699/python-progress-bar) – tom

+0

Müssen Sie aus irgendeinem Grund stdout verwenden (einschließlich nur um es zu lernen) oder können Sie benutze einfach einen Systemaufruf zu 'os.system (" clear ")' oder 'os.system (" cls ")'? Für nur drei Zeilen und eine Benutzereingabe ist dies normalerweise einfacher als stdout – JGreenwell

+0

Ich glaube, dass Sie nicht ersetzen können, was auf dem Bildschirm mit Python ist. Sie können jedoch 'print '\ n' * 100 'drucken und dann das ganze mit den Änderungen neu drucken. [Verwandte] (http://stackoverflow.com/questions/5426546/in-python-how-to-change-text-after-its-printed) –

Antwort

0

Die \ r Zeichen ein Wagenrücklauf, das heißt, es wird der Cursor an den Anfang der aktuellen Zeile zurückzukehren. Das ist OK, wenn Sie die Zeile neu zeichnen möchten, auf der sich der Cursor befindet, aber nicht gut, wenn Sie andere Zeilen neu zeichnen möchten.

tun, was Sie wollen, müssen Sie eine Terminal-Bibliothek wie Flüche auf Linux oder der Konsole API unter Windows verwenden. Wenn Sie nur auf Linux arbeiten und wollen eine einfachere Art und Weise Farben für den Zugriff auf die Cursorbewegung und Eingabe ohne Echo, könnten Sie tun, schlimmer als gesegnet ausprobieren (https://pypi.python.org/pypi/blessed/).

Wenn Sie ein Cross-Plattform-API benötigen diese Art der Sache zu tun, gibt es keinen reinen Python Weg, um alles noch zu handhaben, aber ich arbeite an einem. Die Screen-Klasse in https://github.com/peterbrittain/asciimatics deckt alle oben genannten Funktionen plattformübergreifend ab.

2

Es wäre ein bisschen schwierig sein, diese Arbeit für alle Endgeräte zu machen, aber wenn Sie ANSI-Codes Flucht verstehen wie mein tun, könnte diese Arbeit:

... 
    if new_word == word: 
     print "You won!" 
    else: 
     print '\033[F'*7 
     print ' '*17 + '\b'*17 + '\033[F' 
     test_letter() 

Diese auf dem ANSI-Code beruht F: bewegt die Cursor eine Zeile nach oben; Backspaces (\b) alleine haben keine Wirkung, wenn der Zeilenanfang erreicht ist. Die erste print führt zurück bis zu der Eingangsleitung und der zweite löscht das Zeichen, die zuvor eingegeben wurden.

Verwandte Themen