# -*- coding: utf-8 -*- # Μην αλλάζετε την πρώτη γραμμή. Χρησιμεύει για να μπορούμε να γράφουμε μέσα σε αυτό το αρχείο σε Ελληνικά. # Αυτό είναι ένα πρόγραμμα που παίζει "κρεμάλα" με το χρήστη του. Για να το τρέξετε και να παίξετε κρεμάλα # θα πρέπει στον ίδιο κατάλογο όπου είναι αποθηκευμένο το πρόγραμμα αυτό (με το όνομα hang.py) να είναι # αποθηκευμένο και το αρχείο words.txt που περιέχει πάνω από 100 λέξεις (στα Αγγλικά) από τις οποίες το # πρόγραμμα διαλέγει μια στην τύχη. # Η βιβλιοθήκη 'os' δίνει τη δυνατότητα στην python να τρέξει εντολές του λειτουργικού συστήματος (operating system). # Εδώ θέλουμε να τρέχουμε την εντολή "clear" η οποία καθαρίζει το τερματικό στο linux (αν είστε σε Windows αντικαταστήστε # τη λέξη clear με τη λέξη cls). Αυτό χρειάζεται ώστε το output του προγράμματος να μην βγαίνει το ένα κάτω από το άλλο # και να τυπώνεται κάθε φορά σε καθαρή οθόνη. Είναι δηλ. θέμα αισθητικό κυρίως. Για να τρέξει έτσι σωστά το πρόγραμμα # θα πρέπει να το τρέξετε από το command line στο τερματικό, αλλιώς (π.χ. όταν το τρέξετε στο idle) δε θα καθαρίζει η # οθόνη (αλλά το πρόγραμμα θα λειτουργήσει κανονικά κατά τα άλλα). import os # Η βιβλιοθήκη 'random' περιέχει συναρτήσεις που μας βοηθάνε να επιλέξουμε τυχαία αντικείμενα. Εδώ θα χρησιμοποιήσουμε # μια από αυτές τις συναρτήσεις (τη random.choice) για να επιλέξουμε στην τύχη τη λέξη της κρεμάλας από μια λίστα. import random # Η επόμενη εντολή 'ανοίγει' το αρχείο 'words.txt' για διάβασμα (εξ ου και το "r"). Η μεταβλητή f είναι τώρα # αυτό που ονομάζουμε ανοιχτό αρχείο. f = open("words.txt", "r") # Από το ανοιχτό αρχείο f διαβάζουμε όλα τα περιεχόμενά του με τη μεθοδο read(). Τα περιεχόμενα μπαίνουν όλα στο # string ftext ftext = f.read() # Από το string ftext που περιέχει όλες τις γραμμές και όλες τις λέξεις που είχε μέσα του το αρχείο words.txt # παίρνουμε με τη μέθοδο split() τη λίστα wordlist που περιέχει ως στοιχεία της όλες τις λέξεις του string ftext. # Έτσι τώρα έχουμε μια λίστα με πολλές λέξεις τις οποίες μπορούμε να χρησιμοποιήσουμε για να παίξουμε κρεμάλα. wordlist = ftext.split() # Με τη συνάρτηση random.choice επιλέγουμε από τη λίστα wordlist μια από τις λέξεις που περιέχονται εκεί και # την αναθέτουμε στη μεταβλητή w. Όλες οι λέξεις τις λίστας είναι εξίσου πιθανό να επιλεγούν. Σε κάθε τρέξιμο # του προγράμματος επιλέγεται και (κατά πάσα πιθανότητα) διαφορετική λέξη. w = random.choice(wordlist) # Με τη μέθοδο lower() παίρνουμε από το string w τη μορφή του όπου όλα τα γράμματα έχουν μετατραπεί σε μικρά. # Μετά από αυτό η λέξη w αποτελείται μόνο από μικρά γράμματα. w = w.lower() # Στη λίστα lettersgiven, που είναι αρχικά κενή, θα θυμόμαστε τα γράμματα που έχει δώσει ο χρήστης # κατά τη διάρκεια του παιχνιδιού. Αν ο χρήστης, κατά λάθος, ξαναεπιλέξει ένα γράμμα που έχει ήδη δώσει, # αφενός θα του αναφέρουμε το γεγονός και, αφετέρου, δε θα τον χρεώσουμε με ένα πόντο ποινής. lettersgiven=[] # Μετά από τόσους πόντους ποινής ο χρήστης έχει χάσει. Ο αριθμός που μπαίνει εδώ πρέπει να είναι # ίδιος με τα στάδια στα οποία ζωγραφίζουμε το σώμα παρακάτω ώστε ολόκληρο το σώμα να κρέμεται # στην κρεμάλα μετά από ακριβώς maxpoints στάδια. maxpoints = 6 # Παρακάτω φαίνονται τα κομμάτια του σώματος που ζωγραφίζουμε. Το πρώτο string της λίστας είναι # διαφορετικό από τα άλλα γιατί δεν περιέχει κομμάτι του σώματος αλλά μόνο το οριζόντιο ξύλο της κρεμάλας. # Έτσι το πρώτο string της λίστας το ζωγραφίζουμε πάντα. Τα επόμενα strings της λίστας όμως (που # είναι maxpoints σε αριθμό) ζωγραφίζονται μόνο αν ο χρήστης έχει αρκετά μεγάλη ποινή (μεταβλητή points). # Έτσι αν points=3 θα ζωγραφιστούν τα 4 πρώτα strings της λίστας αυτής (μέχρι και τα χέρια του # παίχτη δηλαδή). parts = [ '-----|', '| o', '| i', '| / \\', '| |', '| / \\', '| d b' ] # Η λέξη ww που έχει ίδιο μήκος με τη λέξη w είναι ό,τι έχει βρει ο χρήστης μέχρι στιγμής. # Έτσι αρχικά είναι μια λέξη που έχει τόσες παύλες όσο και το μήκος της w. # Όσο προχωράει το παιχνίδι η λέξη ww θα περιέχει όλο και περισσότερα γράμματα από τη λέξη # w (όσα έχει βρει ο παίχτης). ww="-"*len(w) # Βαθμοί ποινής του χρήστη. Αρχικά 0. points = 0 warnings = "" # Κείμενο με παρατηρήσεις για το χρήστη. Αρχικά κενό. # Αυτή η ανακύκλωση while εκτελείται συνεχώς, μέχρι να εκτελεστεί κάποιο break μέσα σε αυτή # οπότε σταματάει. Μέσα στην ανακύκλωση αυτή τυπώνουμε την πληροφορία που αφορά την κατάσταση του # προγράμματος (ποια είναι η μέχρι στιγμής ποινή του χρήστη, ποια είναι η λέξη που έχει βρεθεί # μέχρι τώρα και τυχόν άλλα μηνύματα που έχουν προκύψει (δείτε string warnings παρακάτω). while True: os.system('clear') # Καθαρίζουμε την οθόνη. Σε Windows αντικαταστείστε το clear με cls # Αυτό το string τυπώνεται στην πάνω μεριά της οθόνης σε κάθε κύκλο του παιχνιδιού # και καταλαμβάνει τρεις γραμμές ακριβώς. Τα newlines (\n) μέσα στο string # χρησιμεύουν ώστε να αλλάζουμε γραμμή και να τυπώνουμε με ένα print # αντί για με τρία. # Το μήνυμα αυτό φτιάχνεται κανονικά μέσα στην ανακύκλωση while παρακάτω αλλά το δίνουμε # και εδώ ώστε να έχει αρχική τιμή όταν μπούμε για πρώτη φορά στο while. message = "Number of penalty points: %d/%d\n%s\nWord: [%s]\n" % (points, maxpoints, warnings, ww) print message # Τυπώνουμε όλα μας τα μηνύματα. Η μεταβλητή message φτιάχνεται σιγά-σιγά # μέσα στην ανακύκλωση while. Εδώ τυπώνουμε τη μεταβλητή που φτιάχτηκε στην # προηγούμενη ανακύκλωση. warnings = "" # Τυχόν μηνύματα που προκύπτουν για το χρήστη. Αριχκά κενό. for i in range(maxpoints+1): # Ζωγραφίζουμε τον κρεμασμένο if i<=points: # Αναλογα με το πόσους βαθμούς ποινής έχει ο παίχτης τυπώνουμε print parts[i] # και μακρύτερο κομμάτι του σώματος. Όταν το i ξεπεράσει το points else: # τότε τυπώνουμε μόνο τον πρώτο χαρακτήρα του parts[i], που είναι το print parts[i][0] # όρθιο ξύλο της κρεμάλας. print # Αφήνουμε και μια κενή γραμμή στο τέλος. if points == maxpoints: #Έλεγχος αν τέλειωσε το πρόγραμμα print "**********************************" print "You lost." print "The word was [%s]." % w break if ww == w: print "**********************************" print "You won." break c = raw_input("Give a letter: ") # Διαβάζουμε ένα γράμμα από τον παίχτη. if len(c)==0: warnings += "Empty response. Repeat please." # Αν κενή απάντηση τότε ξαναξεκινάμε το loop. continue # με την εντολή continue else: c = c[0] # Αν δώσει παραπάνω γράμματα κρατάμε μόνο το πρώτο γράμμα. c = c.lower() # Το κάνουμε μικρό γιατί μπορεί να έχει δώσει κεφαλαίο. itsok = False # Αν η μεταβλητή αυτή είναι True τότε δε χρεώνουμε πόντους παρακάτω. # Το χρησιμοποιούμε στην περίπτωση που ο χρήστης δώσει ξαναχρησιμοποιημένο γράμμα. if c in lettersgiven: # Έλεγχος αν έχει ξαναδοθεί το γράμμα warnings += "You already tried %s." % c itsok = True # Για να μη χρεωθεί ποινή παρακάτω else: lettersgiven.append(c) # Το προσθέτουμε στα γράμματα που έχει δώσει ο παίχτης. if c in w: # Αν το γράμμα c είναι στη λέξη, τότε αντικαθιστούμε τις κατάλληλες w1 = "" # παύλες στη μεταβλητή ww. Η μεταβλητή w1 είναι η νέα τιμή της ww. for i in range(len(w)): if w[i] == c: # Όπου στην w υπάρχει το c τοποθετούμε αυτό στην w1 αλλιώς ότι είχε εκεί w1 = w1 + c # η ww (παύλα ή προηγούμενο επιτυχημένο γράμμα). else: w1 = w1 + ww[i] ww = w1 else: # Αν το γράμμα c δεν είναι στη λέξη τότε χρεώνουμε ένα ακόμη βαθμό ποινής if not itsok: # εκτός αν itsok==True (τον έχουμε ξαναχρεώσει για το ίδιο γράμμα, οπότε τώρα points += 1 # του τη χαρίζουμε). line = raw_input("Hit enter to finish.") # Πρόσθεσα αυτή τη γραμμή ώστε να μπορείτε να το τρέξετε στη γραμμή εντολών των Windows # χωρίς το παράθυρο να κλείνει πριν δείτε το μήνυμα που σας βγάζει. # Θυμηθείτε ότι για να τρέξει σε Windows θα πρέπει να αντικαταστήσετε την εντολή # os.system("clear") με την os.system("cls").