Wally είπε:
Thanks, και τα καλύτερα δεν ήρθαν ακόμα μάλλον!
Ζητώ προκαταβολικά συγγνώμη ειδικά για αυτό το μακροσκελές ποστ, αλλά είναι από τα προγράμματα μου που το θυμάμαι ιδιαίτερα καθώς έχει μια μοναδική ιστορία.
Είμαστε στο 1986, τότε που τα παιδιά δεν ξενυχτούσαν ακόμα κάθε βράδυ έξω και οι γονείς είχαν ακόμα το ρόλο των... γονέων. Είστε ένας μαθητής, μέλος μιας οικογένειας αυστηρών αρχών. Έχετε βγει κρυφά τη νύχτα και ήρθε η στιγμή που θα επιστρέψετε. Πρέπει όμως να πάτε στο δωμάτιο σας χωρίς κανείς να σας αντιληφθεί, περνώντας μέσα από άλλα δωμάτια. Στη διαδρομή σας πρέπει να αποφύγετε τον πατέρα σας, τη μητέρα σας αλλά και τον αδερφό σας που θα σας μαρτυρήσει! Σας θυμίζει κάτι;
Πρόκειται για το σενάρο του παιχνιδιού στο άρθρο του
Pixel Ιανουαρίου 1986 με τίτλο "Παιχνίδια Περιπέτειας" το οποίο ουσιαστικά περιγράφει πως θα δημιουργούσαμε ένα τέτοιο παιχνιδι κειμενου. Το άρθρο προχωράει δίνοντας την περιγραφή για το κάθε δωμάτιο, το χάρτη του παιχνιδιού καθώς και ένα listing για το Spectrum. Εγώ όμως δεν είχα Spectrum...
Μελετώντας το listing μπορούσα να πάρω τις περιγραφές και μαζί με το χάρτη, μπορούσα να ξαναφτιάξω το παιχνίδι στον TI-99. Το θέμα είναι ότι δεν θα μπορούσε - από προγραμματιστικής άποψης να μοιάζει καθόλου στο πρόγραμμα του Spectrum. Γιατί όμως; Το παιχνίδι στο Spectrum ενσωματώνει τα δεδομένα (πιθανές κινήσεις - περιγραφές) σε μια σειρά από εντολές DATA. Αυτό δεν είναι παράξενο και θα λέγαμε στανταρ τακτική για τη BASIC της εποχής. Ομως έχει κάπου μια επίμαχη γραμμή:
RESTORE (310+(room-1)*40)
Με λίγα λόγια καθορίζει τη γραμμή DATA από την οποία θα διαβάζονται τα δεδομένα κάνοντας... πράξεις με αριθμούς γραμμών. Κάτι τέτοιο δεν επιτρέπεται στη BASIC του TI-99 (και μεταξύ μας, δεν ειναι και όμορφο προγραμματιστικά). Έσπαγα το κεφάλι μου για το πως θα γράψω "όμορφα" αυτό το πρόγραμμα στον TI. Ένα βράδυ, πετάχτηκα κυριολεκτικά από το κρεββάτι, έχοντας βρει τη λύση στον... ύπνο μου. Χρειαζόμουν δισδιάστατο πίνακα!
Μέχρι εκείνη τη μέρα στα προγράμματα μου χρησιμοποιούσα όταν χρειαζόμουν μονοδιάστατους πίνακες. Μπορούσα να καταλάβω επίσης τη πιθανότητα να χρησιμοποιήσω ένα δισδιάστατο πίνακα για να κρατήσω τα δεδομένα της οθόνης. Π.χ. θα είχα ένα πίνακα S(24,32), ο πρώτος δείκτης απεικονιζει τη γραμμή, ο δεύτερος τη στήλη, το αποτέλεσμα του πίνακα να είναι ο χαρακτήρας, π.χ.
S(12,15)=128 σημαίνει ότι έχω το χαρακτήρα 128 στη γραμμή 12, στήλη 15.
Αυτό που δεν είχα καταλάβει ήταν πως θα μπορούσε να χρησιμοποιηθεί ο δισδιάστατος πίνακας για να κωδικοποιηθεί κάτι άλλο εκτός από την οθόνη. Ε λοιπόν, αυτό έγινε στην περιπέτεια. Για να το καταλάβετε ας δουμε το χάρτη του παιχνιδιού:
Παρατηρήστε ότι κάθε δωμάτιο έχει ένα αριθμό. Έχουμε κωδικοποιήσει επίσης τις πιθανές κινήσεις με Βόρεια, Νότια, Ανατολικά, Δυτικά με τους αριθμους 0,1,2,3 (η κωδικοποίηση είναι ελαφρά διαφορετική στο πρόγραμμα του ΤΙ καθώς όλα ξεκινάνε από το ένα).
Ας υποθέσουμε ότι το τρέχον δωμάτιο που είμαστε είναι το 2, το χώλ. Έχουμε ένα ακόμα πίνακα S$ που περιέχει τις περιγραφές των δωματίων.
Έτσι το πρώτο που θα κάνουμε είναι να εκτυπώσουμε το S$(2) και να ρωτήσουμε το χρήστη που θέλει να πάει.
- Αν πάει βόρεια (0), θα βρεθεί στο δωμάτιο 0 (κήπος)
- Αν πάει νότια (1), θα βρεθεί στο δωμάτιο 5 (σαλόνι)
- Αν πάει ανατολικά (2) θα βρεθεί στο δωμάτιο 3 (αποθήκη)
- Αν πάει δυτικά (3) θα βρεθεί στο δωμάτιο 1 (μπάνιο).
Θεωρείστε τώρα ότι έχουμε ένα δισδιάστατο πίνακα P όπου ο πρώτος δείκτης δείχνει το δωμάτιο που βρισκόμαστε, ο δεύτερος δείχνει την κατεύθυνση προορισμού και το αποτέλεσμα σε ποιο δωμάτιο θα βρεθούμε.
Π.χ. είμαστε στο δωμάτιο 2 και έχουμε τις παρακάτω καταχωρίσεις:
P(2,0)=0
P(2,1)=5
P(2,2)=3
P(2,3)=1
Δηλ. P(ΤρέχονΔωμάτιο, Κατεύθυνση)=ΔωμάτιοΠροορισμού
Αν δεν υπάρχει έξοδος προς την αντίστοιχη κατευθυνση, το αποτέλεσμα του πίνακα είναι μηδέν (όπως είπα στον ΤΙ η αρίθμηση ξεκινα από το 1) και έτσι απλά δεν επιτρέπουμε αυτή την κίνηση!
Δεν σταματάει εδώ η πρωτοτυπία του προγράμματος. Αυτό που περιέγραψα ουσιαστικά εδώ είναι μια μίνι μηχανή δημιουργίας text adventure. Φορτώνοντας διαφορετικές περιγραφές στον πίνακα S$ και διαφορετικές τιμές στον πίνακα P μπορούσαμε να έχουμε διαφορετικά adventures χωρίς να γράψουμε ούτε μια γραμμή άλλο κώδικα! Αυτό το κατάλαβα πολύ γρήγορα και το πρόγραμμα γράφτηκε ώστε τα δεδομένα αυτών των πινάκων να διαβάζονται από αρχεία στην κασέτα. Έτσι, μεταξύ άλλων το φοβερό αυτό πρόγραμμα διέθετε και οθόνη φορτώματος καθώς διάβαζε τους πίνακες του adventure:
Και εδώ και το αντίστοιχο κομμάτι του κώδικα:
Για πρώτη φορά σήμερα μετέτρεψα το αρχείο ώστε να φορτώνεται από virtual disk, καθώς ο Classic 99 δεν τα πάει καλά με αρχεία... κασέτας. Έτσι θα έχετε την
ευκαιρία να κατεβάσετε και να παίξετε το συναρπαστικό (θεός να το κάνει) αυτό παιχνίδι όπως το έγραψα σχεδόν 30 χρόνια πριν.
Γράψτε OLD DSK1.ADVEN και RUN στην TI BASIC. Το πρόγραμμα φορτώνει και τα δύο αρχεία δεδομένων που θα χρειαστεί.
Οι κινήσεις με τις οποίες θα κερδίσετε είναι 4,4,4,3,3,2...
Αν επισκεφτείτε το
http://pygamegr.wordpress.com θα μπορέσετε να κατεβάσετε και την Python εκδοχή αυτού του προγράμματος με το ίδιο ακριβώς σενάριο!