Το προφίλ μας στο Google Plus
20

Python Game Programming (part 2.5)

Είμαστε σίγουροι ότι το adventure που δημοσιεύσαμε στο τεύχος 006 σάς έβαλε σε σκέψεις. Όχι γιατί ήταν δύσκολο στο …gameplay, αλλά γιατί είχε μεγάλο ενδιαφέρον από προγραμματιστικής άποψης. Αν και όλη η βασική λογική –ο αλγόριθμος, αν θέλετε– παρουσιάστηκε στο περιοδικό, αφήσαμε κάποια τμήματα για το παρόν, online άρθρο. Για να τα εξηγήσουμε, θα πρέπει πρώτα να μιλήσουμε για ένα πολύ σημαντικό στοιχείο της Python (και των περισσότερων γλωσσών): Τις συναρτήσεις!

Αν η λέξη “συνάρτηση” σας θυμίζει κάτι από μαθηματικά, δεν έχετε και πολύ άδικο. Βέβαια στις περισσότερες γλώσσες η έννοια της συνάρτησης είναι, θα λέγαμε, πιο χαλαρή σε σχέση με τα μαθηματικά. Στα μαθηματικά, για παράδειγμα, σκεφτόμαστε τη συνάρτηση σαν έναν μηχανισμό ή σχέση στην οποία δίνουμε κάποια δεδομένα (π.χ., έναν αριθμό) κι αυτή μάς δίνει ένα αποτέλεσμα (π.χ., έναν άλλον αριθμό). Αν θέλουμε να είμαστε ακριβείς, μια συνάρτηση στα μαθηματικά –και σε αντίθεση με μια συνάρτηση κάποιας γλώσσας προγραμματισμού– δεν μπορεί να δίνει διαφορετικές τιμές ως αποτέλεσμα, αν δίνουμε πάντοτε την ίδια τιμή ως είσοδο.

Σε πολλές γλώσσες προγραμματισμού, λοιπόν, μπορούμε να ορίζουμε συναρτήσεις που συμπεριφέρονται με ακριβώς τον ίδιο τρόπο όπως και στα μαθηματικά. Για την ακρίβεια η Python, όπως άλλωστε και οι περισσότερες γλώσσες, διαθέτουν ήδη μια μεγάλη γκάμα από συναρτήσεις οι οποίες είναι πιστές αναπαραστάσεις γνωστών (ή όχι) μαθηματικών συναρτήσεων. Πάρτε για παράδειγμα την τετραγωνική ρίζα:

import math
x = math.sqrt(2)
print x

Ο παραπάνω κώδικας θα μας τυπώσει την τετραγωνική ρίζα του 2. Ήδη από το πρώτο μας παιχνίδι, έχετε δει πώς καλούμε μια συνάρτηση και πώς αποθηκεύουμε το αποτέλεσμα. Θυμηθείτε τη γραμμή:

number = random.randint(1,50)

Προφανώς, λοιπόν, μια συνάρτηση καλείται με τα ορίσματά της μέσα σε παρένθεση και το αποτέλεσμα το λαμβάνουμε στη μεταβλητή που έχουμε αριστερά του “ίσον”. Για να χρησιμοποιήσουμε συγκεκριμένες συναρτήσεις, πρέπει πρώτα να συμπεριλάβουμε τη βιβλιοθήκη που τις περιέχει. Παράδειγμα αποτελεί αυτό το import math, παραπάνω.

Για να πάρετε τώρα μια ιδέα του πώς μια συνάρτηση της Python ενδέχεται να διαφοροποιείται από μια καθαρά μαθηματική συνάρτηση θυμηθείτε τη range, που είχαμε δει στο άρθρο 1.5:

>>> x = range(1,10)
>>> print x
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Βλέπετε εδώ ότι η Python δεν επιστρέφει ένα απλό αριθμό, κάτι που αναμένουμε από μια μαθηματική συνάρτηση, αλλά μια ολόκληρη λίστα. (Σ.τ.Ε. Βεβαίως, υπάρχουν και μαθηματικές συναρτήσεις που επιστρέφουν k-άδες αριθμών, σε αντίθεση όμως με τη range της Python δεν υπάρχει μαθηματική συνάρτηση που τη μία φορά επιστρέφει, π.χ., τριάδα και την άλλη τετράδα αριθμών.)

Πέρα από τις συναρτήσεις που συνοδεύουν την Python, ακόμα πιο ενδιαφέρον είναι να ορίζουμε τις δικές μας!

Δημιουργία Συνάρτησης
Για ποιο λόγο να θέλουμε να κάνουμε κάτι τέτοιο; Για να δείτε πώς μπορεί να προκύψει η ανάγκη για τη δημιουργία μιας συνάρτησης, ας πάρουμε την τετραγωνική ρίζα που είδαμε παραπάνω. Φανταστείτε, λοιπόν, ότι η γλώσσα που χρησιμοποιούσατε δεν είχε κανέναν τρόπο να υπολογίζει τετραγωνικές ρίζες. Εσείς, όμως, ως ικανός προγραμματιστής που είστε, φτιάξατε ένα κομμάτι κώδικα που το κάνει. Και τώρα;

Κάθε φορά που στο κύριο πρόγραμμά σας χρειαζόσασταν μια τετραγωνική ρίζα, θα μπορούσατε να κάνατε αντιγραφή-επικόλληση εκείνο το ίδιο κομμάτι κώδικα που την υπολογίζει. (Δεν είναι άλλωστε τυχαίο που από τότε που εφευρέθηκε η αντιγραφή-επικόλληση χάθηκαν οι προγραμματιστές :D) Αν κάνατε κάτι τέτοιο, πολύ σύντομα όλη η ουσία του κανονικού προγράμματος θα χάνονταν μέσα στις… επικολλήσεις της τετραγωνικής ρίζας. Προφανώς –κι επειδή έχετε καταλάβει πού το πάμε–, θα ήταν προτιμότερο να δίνατε με κάποιον τρόπο ένα όνομα σε αυτό το κομμάτι κώδικα και να το καλείτε κάθε φορά που θέλετε να κάνετε τον υπολογισμό. Με λίγα λόγια: Χρειάζεστε μια συνάρτηση!

Είναι εύκολο να καταλάβετε από τα παραπάνω ότι:

– Μια συνάρτηση τη χρησιμοποιούμε όταν χρειάζεται να εκτελέσουμε το ίδιο κομμάτι κώδικα πολλές φορές (και με άλλες ενδεχομένως τιμές σε παραμέτρους).
– Μια καλογραμμένη συνάρτηση κάνει μια συγκεκριμένη εργασία και μπορεί να φανεί χρήσιμη σε πολλά προγράμματα, όχι μόνο σ’ ένα.
– Η σωστή χρήση συναρτήσεων κάνει το πρόγραμμά μας δομημένο και μπορούμε πολύ εύκολα να ακολουθήσουμε τη ροή και τη λογική του.

Και κάτι ακόμα που μάλλον υποπτεύεστε:

– Οι συναρτήσεις στην Python δεν περιορίζονται στον αυστηρό ορισμό της μαθηματικής συνάρτησης.

Τι σημαίνει αυτό το τελευταίο; Όπως είδατε, οι συναρτήσεις της Python ενδέχεται να επιστρέφουν αντί για έναν αριθμό μια λίστα αριθμών — και μάλιστα μεταβαλλόμενου μήκους. Ενδέχεται, επίσης, να επιστρέφουν μια αλφαριθμητική τιμή (ένα όνομα, κομμάτι κειμένου ή string, όπως το λέμε συνήθως). Υπάρχει και μια άλλη δυνατότητα για μια συνάρτηση της Python: Να μην επιστρέφει τίποτα! Ναι, καλά διαβάσατε: Τίποτα! Και όχι, δεν έχουμε χάσει το μυαλό μας ακόμα (όχι εντελώς, δηλαδή). Θα μου πείτε, τι μπορεί να χρησιμεύσει μια συνάρτηση που δεν επιστρέφει τίποτα;

Μα, αφού είπαμε πως δεν πρόκειται για αυστηρό ορισμό μαθηματικής συνάρτησης. Φανταστείτε, για παράδειγμα, μια συνάρτηση που τυπώνει κάτι στην οθόνη. Για να μην είναι τελείως απλοϊκή, φανταστείτε ότι την έχουμε φτιάξει ώστε να της δίνουμε ως όρισμα το κείμενο που θέλουμε να τυπώσει και η συνάρτηση να το κεντράρει ως προς τον οριζόντιο άξονα της οθόνης. Τι επιστρέφει αυτή η συνάρτηση; Τίποτα. Κάνει μια δουλειά (τυπώνει το μήνυμα κεντραρισμένο) αλλά δεν επιστρέφει κάποια τιμή στο κύριο πρόγραμμα, που να προκύπτει από κάποιον υπολογισμό και να έχει κάποια χρησιμότητα. Σε ορισμένες γλώσσες προγραμματισμού υπάρχει ή έννοια της διαδικασίας ή procedure, για τις περιπτώσεις που δεν υπάρχει επιστρεφόμενη τιμή. Στην Python, ωστόσο, χρησιμοποιούμε συναρτήσεις και για τις δύο περιπτώσεις.

Δείτε τον ακόλουθο κώδικα και την αντίστοιχη δοκιμή:

def centerText(thetext):
	linelength = 80
	textlength = len(thetext)
	spaces = (linelength - textlength)/2
	print spaces*" "+thetext
	return

centerText("Hello there!")

Στο παραπάνω θεωρούμε ότι το μέγεθος γραμμής της οθόνης είναι 80 χαρακτήρες (ένα τυπικό τερματικό). Η συνάρτηση τυπώνει το μήνυμά μας με τον απαραίτητο αριθμό κενών από αριστερά, ώστε να βγει κεντραρισμένο. Όταν την καλούμε, το κείμενο “Hello there!” αντιγράφεται ουσιαστικά μέσα στη μεταβλητή thetext της συνάρτησης. Θα μπορούσαμε επίσης να την καλέσουμε και έτσι:

mytext = "I really love Python programming"
centerText(mytext)

Τι γίνεται σε αυτή την περίπτωση; Όπως φαντάζεστε, η τιμή που περιέχει η μεταβλητή mytext αντιγράφεται στη μεταβλητή thetext της συνάρτησης, την ώρα που την καλούμε. Σημειώστε εδώ ότι η μεταβλητή thetext της συνάρτησης είναι τοπική για τη συνάρτηση και δεν είναι γνωστή έξω από αυτή. Αν έχετε μια μεταβλητή thetext στη συνάρτησή σας και μια άλλη thetext έξω από αυτή, αυτές οι δύο δεν σχετίζονται και δεν μπερδεύονται μεταξύ τους! Για να πάμε κι ένα βήμα παραπέρα, όλες οι μεταβλητές που ορίζουμε μέσα στη συνάρτηση είναι τοπικές γι’ αυτή και υπάρχουν κι έχουν νόημα μόνον όσο η συνάρτηση εκτελείται.

Μια ερώτηση που ίσως έχετε είναι τι γίνεται σε περίπτωση που κάνετε κάτι μέσα στη συνάρτηση και πειράξετε το ίδιο το όρισμα. Π.χ., τι θα γίνει αν αλλάξετε τη μεταβλητή thetext; Πιστεύετε πως θα γίνει και η μεταφορά αντίστροφα, δηλαδή από τη συνάρτηση στη mytext του κύριου προγράμματος; Η απάντηση είναι αρνητική. Όπως είπαμε, κατά την κλήση της συνάρτησης αντιγράφεται η τιμή της μεταβλητής mytext στη μεταβλητή thetext. Αυτή είναι και η μόνη αλληλεπίδραση που υπάρχει μεταξύ τους και είναι μόνο προς τη μια κατεύθυνση. Αυτό το είδος περάσματος τιμών μεταξύ του κύριου προγράμματος και μιας συνάρτησης ονομάζεται κλήση με τιμή ή call by value, αν προτιμάτε. Σε άλλες γλώσσες είναι πιθανή και η κλήση κατά αναφορά ή call by reference (που φαντάζεστε τι κάνει). Όμως στην Python έχουμε άλλα κόλπα στο τσεπάκι μας για αντίστοιχα τρικ.

Και πώς θα γράφαμε μια συνάρτηση που πράγματι να επιστρέφει μια τιμή στο κύριο πρόγραμμα; Μα, κάπως έτσι:

def cube(thenumber):
	result = thenumber ** 3
	return result

x = 3
y = cube(x)
print y
print cube(3)
print cube(y)

Πιστεύουμε ότι είναι προφανές το πως λειτουργεί! Στο κύριο (ο Θεός να το κάνει) πρόγραμμα, σας δείχνουμε και διάφορους τρόπους κλήσης της συνάρτησης. Προφανώς, θα μπορούσε και η συνάρτησή μας να γραφεί πολύ πιο απλά, σε δυο μόλις γραμμές:

def cube(thenumber):
	return thenumber ** 3

Και με αυτό το… crash course στις συναρτήσεις, είμαστε πιστεύουμε έτοιμοι να δούμε πώς δουλεύει η συνάρτηση getInput που χρησιμοποιούμε στο καταπληκτικό μας adventure!

Η Συνάρτηση getInput
Ας τη δούμε συνολικά κι ας την ερμηνεύσουμε:

def getInput(moves,room):
	directions = ["Βόρεια","Νότια","Ανατολικά","Δυτικά"]
	destinations = moves[room]
	possiblemoves = []
	index = 0
	print "Έξοδοι:",
	for i in destinations:
		if i!=-1:
			print directions[index],
			possiblemoves.append(directions[index])
		index += 1
	print "\n"
	userinput=""
	while userinput not in possiblemoves:
		userinput=raw_input("Πού θες να πας; ")
	return directions.index(userinput)

Η συνάρτηση έχει δύο ορίσματα: τα moves και room. Θυμηθείτε ότι το moves περιέχει τις κινήσεις από το ένα δωμάτιο στο άλλο και το room είναι ο αριθμός του τρέχοντος δωματίου. Μη ξεχνάτε ότι τα ονόματα των μεταβλητών αυτών θα μπορούσαν να είναι διαφορετικά μέσα στη συνάρτηση — και δεν θα υπήρχε μπέρδεμα με το κύριο πρόγραμμα! Μέσα στη συνάρτηση ορίζεται μια λίστα ονόματι directions, που περιέχει τα ονόματα των κατευθύνσεων. Προσέξτε ότι την έχουμε φτιάξει με τέτοιο τρόπο ώστε ο δείκτης κάθε στοιχείου να αντιστοιχεί στην κωδικοποίηση που έχουμε κάνει, δηλαδή Βόρεια = 0, Νότια =1 κ.ο.κ. Η πρώτη δουλειά της συνάρτησης είναι να βρει τη λίστα των προορισμών από το συγκεκριμένο δωμάτιο:

	destinations = moves[room]

Αμέσως παρακάτω, ορίζουμε την κενή λίστα possiblemoves, τυπώνουμε ένα μήνυμα στο χρήστη και εισερχόμαστε στο κύριο βρόχο for:

	index = 0
	print "Έξοδοι:",
	for i in destinations:
		if i!=-1:
			print directions[index],
			possiblemoves.append(directions[index])
		index += 1

Ο βρόχος διατρέχει ένα-ένα τα στοιχεία της λίστας destinations. Αν, για παράδειγμα, είμαστε στο δωμάτιο 7, το i θα διατρέξει τους αριθμούς

[6, 9, 8, -1]

Ας πάρουμε λοιπόν την πρώτη φορά. Το i θα έχει την τιμή 6. Έχουμε τη σύγκριση:

		if i!=-1:
			print directions[index],
			possiblemoves.append(directions[index])

Προφανώς το i δεν είναι -1, οπότε εκτελείται η εντολή

			print directions[index],

και, καθώς το index έχει την τιμή 0 (η αρχική του), το παραπάνω θα τυπώσει

Βόρεια

(Το κόμμα στα δεξιά άκρη της print εμποδίζει την αλλαγή γραμμής.) Ταυτόχρονα, στη λίστα possiblemoves προστίθεται η τιμή που τυπώθηκε παραπάνω:

			possiblemoves.append(directions[index])

Η append είναι μια μέθοδος που εφαρμόζεται σε λίστες, προκειμένου να προσθέσουμε ένα στοιχείο στο τέλος. Μετά την πρώτη εκτέλεση του βρόχου, η λίστα possiblemoves θα περιέχει την πρώτη της τιμή:

[ "Βόρεια" ]

Για τις μεθόδους θα μιλήσουμε αναλυτικότερα σε επόμενο άρθρο, αλλά πιστεύουμε κατανοείτε τι γίνεται. Σκεφτείτε τώρα ότι το ίδιο ακριβώς γίνεται και για τις άλλες τιμές που θα πάρει το i, ώστε στο τέλος η λίστα possiblemoves να περιέχει:

[ "Βόρεια", "Νότια", "Ανατολικά" ]

Και ναι, δεν θα περιέχει τη λέξη “Δυτικά”, καθώς η τελευταία τιμή που παίρνει το i είναι -1. Προσέξτε ότι σε κάθε κύκλο της for αυξάνουμε την τιμή του index, κρατώντας σε συγχρονισμό τον δείκτη με το αντίστοιχο στοιχείο της λίστας destinations.

Το υπόλοιπο κομμάτι είναι απλό. Με το τέλος του βρόχου, αλλάζουμε γραμμή τυπώνοντας τον ειδικό χαρακτήρα αλλαγής γραμμής:

	print "\n"

Τέλος ορίζουμε μια μεταβλητή ονόματι userinput, στην οποία θα αποθηκεύσουμε την είσοδο του χρήστη. Αρχικά είναι κενή και εισερχόμαστε στο βρόχο while:

	userinput=""
	while userinput not in possiblemoves:
		userinput=raw_input("Πού θες να πας; ")

Όπως καταλαβαίνετε, ο βρόχος ρωτάει και ξαναρωτάει το χρήστη για την κίνηση του μέχρι να λάβει μια έγκυρη απάντηση. Μια απάντηση, δηλαδή, που να βρίσκεται στη λίστα possiblemoves που δημιουργήσαμε προηγουμένως. Με τη λήψη έγκυρης απάντησης, η συνάρτηση επιστρέφει την παρακάτω… κρυπτική τιμή:

	return directions.index(userinput)

Στην πραγματικότητα δεν είναι καθόλου κρυπτική: Αν ο χρήστης έδωσε “Νότια”, η μέθοδος index επιστρέφει το δείκτη (δηλαδή τη θέση) του στοιχείου της λίστας directions, στην οποία βρίσκεται η τιμή “Νότια” (δηλαδή το 1). Για να το καταλάβετε, το παρακάτω

print directions.index("Ανατολικά")

Θα τύπωνε τον αριθμό 2. Ο αριθμός αυτός επιστρέφεται στο κύριο πρόγραμμα ως αποτέλεσμα της συνάρτησης. Κι όπως θα παρατηρήσατε, έχουμε φτιάξει μια συνάρτηση που τυπώνει μηνύματα, δέχεται και επικυρώνει την είσοδο από το χρήστη και τελικά επιστρέφει την τιμή έτοιμη για χρήση στο κύριο πρόγραμμα. Όπως καταλαβαίνετε, λοιπόν, μια συνάρτηση της Python σίγουρα δεν περιορίζεται στην κλασική μαθηματική έννοια της συνάρτησης!

Προφανώς, ο παραπάνω τρόπος δεν είναι ο μοναδικός που θα μπορούσε να χρησιμοποιηθεί για να γραφτεί η getInput. Θα μπορούσαμε επίσης να χρησιμοποιήσουμε τα λεξικά (dictionaries) της Python, τα οποία θα γνωρίσουμε αργότερα στη σειρά μας. Επίσης θα μπορούσαμε να χωρίσουμε τη λειτουργία της getInput σε περισσότερες συναρτήσεις ή ακόμα και να μεταφέρουμε κάποια κομμάτια της στο κύριο πρόγραμμα. Θα μπορούσαμε, π.χ., να φτιάξουμε μια getMoves που να επιστρέφει τη λίστα possiblemoves και η διαχείριση της εισόδου να γίνεται στο κύριο πρόγραμμα. Και Τώρα ξέρετε (ΤΜ) την άσκησή σας μέχρι το επόμενο άρθρο μας. Καλό θα ήταν επίσης να προσθέσετε την centerText που φτιάξαμε, ώστε τα μηνύματα του προγράμματος να κεντράρονται.

Μέχρι το επόμενο άρθρο μας, διαβάστε, πειραματιστείτε και μην ξεχνάτε: ο προγραμματισμός είναι μια διαρκής ασχολία. Καλό ξεκόλλημα!

20 Responses to “Python Game Programming (part 2.5)”

  1. sino | 20/03/2012 at 11:39

    Απλά ήθελα να πω πως παρακολουθώ μ’ ενδιαφέρον. Keep up the good work :-)

  2. Hermiown | 17/04/2012 at 17:22

    Πολυ ωραιο το αρθο, αλλα εχω ενα προβλημα. Εκει που λεει: room = destinations [ direction ]. Μου βγαζει οτι δεν υπαρχη η λεξη “direction” μεσα. Και υστερα το elif και else μου βγαζει συντακτικο error -_-. Μηπως πρεπει να βρω αλλο IDLE για να το κανω?

    • sonic2000gr | 17/04/2012 at 18:27

      Έχεις κατεβάσει τον κώδικα από το link που υπάρχει στο περιοδικό; Έχεις κάνει κάποιες άλλες αλλαγές;

      • Hermiown | 18/04/2012 at 21:05

        Οχι , ειμαι απο Virtual Box στα Ubuntu και εχω κανει install το IDLE 2,7

        • sonic2000gr | 18/04/2012 at 21:33

          Ανέβασε κάπου ένα screenshot με το πρόβλημα σου να το δούμε.

          • Hermiown | 19/04/2012 at 10:49

            file:///home/bill/Pictures/Test1.png
            file:///home/bill/Pictures/test2.png

          • Hermiown | 19/04/2012 at 10:54

            Συγνωμη, αλλα θα μπορουσες να μου στειλεις το e-mail σου γιατι δεν μπορω να κανω transfer απο ubuntu σε firefox -_-

  3. Hermiown | 19/04/2012 at 10:50

    Σορρυ, λαθος μου :Ρ

  4. gregor41 | 21/04/2012 at 11:05

    εχω ενα προβλημα κατεβασα το προγραμμα αλλα καθε φορα που παω να το τρεξω κλεινει αμεσως.Γιατι συμβαινει αυτο?

    • r3ckl3ss | 21/04/2012 at 11:58

      Άνοιξε το πρόγραμμα, το οποίο φαντάζομαι θα έχει κατάληξη .py, με τον default python editor, έτσι ώστε να μπορείς να δείς τον κώδικα. Ακολούθως πάτα f5 και ο κώδικας θα εκτελεστεί στο παράθυρο του interactive interpreter, αλλά μετά την εκτέλεση του προγράμματος θα παραμείνουν εκεί, σε αντίθεση με την απλή εκτέλεση του προγράμματος, που με το που τελειώσει, το παράθυρο στο οποίο εκτελείται κλείνει.

      Αν η παραπάνω μέθοδος δεν είναι επαρκής τότε δοκίμασε να προσθέσεις στην αρχή του κώδικα

      import time

      και κάπου στο τέλος του κώδικα

      time.sleep(10)

      Η οποία είναι μία συνάρτηση στο module sleep, που δέχεται ως παράμετρο ένα αριθμό δευτερολέπτων, και κάνει το thread το οποίο εκτελείται εκείνη την στιγμή, να μπεί σε κατάσταση αναστολής εκτέλεσης για 10 δεπτερόλεπτα, χρόνος που πιστεύω θα είναι αρκετός για να παρατηρήσεις τα όποια αποτελέσματα της εκτέλεσης.

      • r3ckl3ss | 21/04/2012 at 12:07

        Όσο για την ερώτηση σου γιατί συμβαίνει αυτό, ο λόγος είναι απλός:

        Το πρόγραμμα είναι ένα συγκεκριμένο σετ εντολών, το οποίο με το που τερματιστεί η εκτέλεση του, η Python (που είναι και το πρόγραμμα που εκτελεί το δικό σου πρόγραμμα, ή για να το εκφράσουμε καλύτερα, είναι η καλούσα διεργασία του προγράμματος σου), και συγκεκριμένα (για το συγκεκριμενο δεν είμαι σίγουρος, καλύτερα κάπου εδώ να παρέμβει ο Sonic2000) το Python Virtual Machine τερματίζονται με την σειρά τους, με αποτέλεσμα να μην σου δίνεται αρκετός χρόνος να παρατηρήσεις τα αποτελέσματα της εκτέλεσης, εκτός και αν εσύ ρητά δηλώσεις στο πρόγραμμα σου, να σταματήσει μόνο του την εκτέλεση του, είτε για κάποιο συγκεκριμένο χρονικό διάστημα, είτε για να αναμένει κάποιο γεγονός, όπως πχ, αναμονή για είσοδο από το πληκτρολόγιο.

        Ελπίζω να είναι κατανοητά τα παραπάνω. Σε περίπτωση που δεν είναι μπορώ να προσπαθήσω να τα κάνω πιο κατανοητά. Έχε υπ’όψιν σου ότι και εγώ μαθαίνω ακόμα Python, οπότε βασίζεσαι πάνω σε αυτά που λέω, εκτός και αν κάποιος με καλύτερες γνώσεις τα επιβεβαιώσει.

        • r3ckl3ss | 21/04/2012 at 12:10

          Στο παραπάνω σχόλιο, στην τελευταία παράγραφο, κάντο *μην* βασίζεσαι.

    • sonic2000gr | 21/04/2012 at 22:29

      Μην το κάνεις διπλό κλικ, καλύτερα άνοιξε το μέσα στον IDLE και από εκεί πίεσε F5 για να τρέξει. Ακόμα και αν υπάρξει οποιοδήποτε πρόβλημα θα μπορέσεις να δεις που σταμάτησε και το μήνυμα λάθους αναλυτικά.

  5. azaka | 13/03/2013 at 19:11

    Υπάρχει κάποια σελίδα που να περιέχει όλες της συναρτήσεις της Python??

  6. iasonaspao | 20/06/2013 at 19:21

    πολύ ενδιαφέρον άρθρο!!!… αν και είναι λίγο δύσκολο ( για εμάς τους καινούριους).
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ερώτηση:Για να προχωρήσω στα επόμενα άρθρα είναι απαραίτητο να έχω κατανοήσει πλήρως το παραπάνω(και τα προηγούμενά του)?

    • subZraw | 20/06/2013 at 19:37

      Τα συγκεκριμένα posts είναι συμπληρώματα άρθρων που έχουν δημοσιευτεί στο περιοδικό. Όλα μαζί αποτελούν μια ενιαία σειρά, η οποία μαθαίνει την Python σε όσους δεν έχουν εμπειρία με τη συγκεκριμένη γλώσσα. Ένα από τα μεγάλα “συν” της σειράς, είναι ότι η γλώσσα διδάσκεται μέσα από την κατασκευή των δικών μας games!

  7. iasonaspao | 09/08/2013 at 00:15

    1)μπορεί κάποιος να μου εξηγήσει αυτό?:
    print spaces*” “+thetext
    βασικά δεν καταλαβαίνω την χρήση του αστερίσκου…

    2)στη άσκηση ,που ανεφέρετε στο τέλος του άρθρου,τι ακριβώς εννοείτε?
    θα έχουμε στο πρόγραμμα μια συνάρτηση getMoves και όλη η υπόλοιπη δουλειά της getInput θα είναι στο κύριο πρόγραμμα,δηλ.στο def main?

    περιμένω με ενδιαφέρον τις απαντήσεις!!!

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων