Προγράμματα για παιχνίδια pascal abc. Δημιουργία ενός παιχνιδιού υπολογιστή στο Pascal

Ηλεκτρονική 19.05.2019
Επισκόπηση προγράμματος Η έκδοση υπολογιστή του Microsoft Excel Viewer θα επιτρέψει...
Σήμερα, υπάρχει μια άποψη μεταξύ των αρχαρίων κατασκευαστών παιχνιδιών ότι για να γράψετε ένα τυπικό 2D arcade παιχνίδι σε υπολογιστή, πρέπει να αποκτήσετε έναν cool κινητήρα ή σχεδιαστή και επίσης να έχετε καλή γνώση μιας τέτοιας διάσημης C++, γι' αυτό είναι σχεδόν αδύνατο να βρει κανείς ένα αξιόλογο άρθρο για τον Πασκάλ. Σήμερα όμως αποφάσισα να προσπαθήσω να σπάσω τα στάσιμα στερεότυπα γράφοντας μικρό μάθημαγια την ανάπτυξη ενός απλού platformer. Λοιπόν, βολευτείτε, η πορεία της «φώτισης» ξεκινά...

1. Τι χρειάζεται;
Διάφορα περιβάλλοντα που χρησιμοποιούνται ως γλώσσα Προγραμματισμός Pascal, πάρα πολλά. Αλλά από όλο αυτό το σωρό, αποφάσισα να χρησιμοποιήσω το PascalABC.net για το μάθημα. Γιατί; Η απάντηση είναι απλή: πρώτον δεδομένο περιβάλλονΟ προγραμματισμός δεν χρησιμοποιεί καθαρό Pascal, αλλά τον σύγχρονο και πιο βολικό απόγονό του - Object Pascal. Δεύτερον, το Pascal.Net είναι εντελώς δωρεάν, πράγμα που σημαίνει ότι δεν χρειάζεται να ανησυχείτε για ρωγμές ή να ξοδεύετε χρήματα για μια άδεια.

2. Αλγόριθμος.
Έτσι, έχουμε μια περιοχή 640x480, η οποία, σύμφωνα με την ιδέα μου, θα χωριστεί σε κελιά 8x8, τα οποία αντιπροσωπεύουν τους συνδέσμους του πίνακα s. Έτσι, αλλάζοντας την τιμή ενός κελιού, μπορούμε να το κάνουμε "ελεύθερο" ή "κατειλημμένο" (για παράδειγμα, να το χρησιμοποιήσουμε ως τοίχο).

Ως αποτέλεσμα, θα μπορέσουμε περιττούς χειρισμούςκαθορίστε πού μπορεί να κινηθεί ο παίκτης και πού όχι (βλ. εικόνα).

3. Μεταβλητές και ενότητες.
Για ολοκληρωμένη εργασίαΓια το μελλοντικό μας παιχνίδι, θα χρειαστεί να συνδέσουμε μόνο μία μονάδα GraphABC, η οποία μας επιτρέπει να εμφανίζουμε γραφικά πρωτόγονα στην οθόνη.

Καταχώριση 1:

200?"200px":""+(this.scrollHeight+5)+"px");">χρησιμοποιεί το GraphABC;

Var
s: πίνακας [,] ακέραιου αριθμού;
i,x,y,vspeed: ακέραιος;
game_end: boolean;

4. Πληκτρολογήσεις.
Έτσι, για να μην χρειάζεται να περάσετε από τα δικά σας γραπτά για να τροποποιήσετε τον κώδικα, ας δημιουργήσουμε δύο ξεχωριστές διαδικασίες υπεύθυνες για τον χειρισμό της θέσης του παίκτη.

Λίστα 2:

200?"200px":""+(this.scrollHeight+5)+"px");">//Χειρισμός πλήκτρων
διαδικασία KeyPress(key: char); αρχίζω

Αν (key="d") και (s[(x div 8)+1,(y div 8)]=0) τότε //Εάν πατηθεί το πλήκτρο D...
x:=x+8; //...Και επίσης υπάρχει ελεύθερο χώρο, μετά περνάμε στο...
//… ένα κελί προς τα εμπρός (η τιμή x αυξάνεται κατά 8)

Αν (key="a") και (s[(x div 8)-1,(y div 8)]=0) τότε //βλ. σχόλιο παραπάνω
x:=x-8;

Αν (key="w") και (vspeed=0) και (s[(x div 8),(y div 8)+1]=1) τότε //Αν υπάρχει ένα "κατειλημμένο κελί"...
vspeed:=-16; //... κάτω από τα πόδια μας, μετά κάνουμε ένα άλμα.

Διαδικασία KeyDown (κλειδί: ακέραιος); αρχίζω
αν (key=vk_enter) τότε game_end:=true; //Όταν πατάτε το ENTER...
//η τιμή της μεταβλητής game_end είναι αληθής
τέλος;

5. Βαρύτητα.
Αναπόσπαστο μέρος του platforming είναι η βαρύτητα. Επομένως, τώρα πρέπει να γράψουμε μια ξεχωριστή διαδικασία, η οποία στο μέλλον θα βοηθήσει τον παίκτη να σταθεί ξανά στα πόδια του με την κυριολεκτική έννοια.

Λίστα 3:

200?"200px":""+(this.scrollHeight+5)+"px");">//Βαρύτητα
διαδικασία Gravity(); αρχίζω

Αν vspeed=0 τότε ξεκινήστε //Αν η ταχύτητα άλματος είναι μηδέν...
αν s[(x div 8),(y div 8)+1]=0 τότε y+=8; //... κινούμαστε κάτω από ένα «κελί» (πέφτουμε)
τέλος;

Αν s[(x div 8),(y div 8)+vspeed]=0 τότε y+=vspeed; //Αν υπάρχει ένα ελεύθερο κελί από πάνω, τότε...
//… ανεβείτε με vspeed.

Αν vspeed<>0 τότε //Εάν η ταχύτητα άλματος δεν είναι μηδέν (στην περίπτωσή μας: μικρότερη από μηδέν)…
vspeed+=2; //...μετά το μειώνουμε σιγά σιγά.

6. Σχέδιο.
Νομίζω ότι αυτό είναι ξεκάθαρο χωρίς περαιτέρω καθυστέρηση, αλλά μόνο για επίδειξη, θα σημειώσω ότι το παιχνίδι χωρίζεται σε "οπτικά" και "μη οπτικά" μέρη. Το "non-visual" είναι υπεύθυνο για όλα όσα συμβαίνουν στο ίδιο το παιχνίδι και το "visual" είναι, στην πραγματικότητα, υπεύθυνο για την εμφάνιση αυτού που συμβαίνει στην οθόνη. Άρα, η διαδικασία που δίνεται παρακάτω είναι υπεύθυνη για το «οπτικό» μέρος και τίποτα περισσότερο.

Λίστα 4:

200?"200px":""+(this.scrollHeight+5)+"px");">διαδικασία Draw(); start

επανασχεδιάστε?
LockDrawing;

//Σχεδιάστε ένα λευκό ορθογώνιο...
setbrushcolor(clwhite); //... μέγεθος 640 επί 480
fillrectangle(0,0,640,480);

Setbrushcolor(clblack);//Σχεδιάστε μαύρους τοίχους...
fillrectangle(0,192,640,224);//… κατά συντεταγμένες…
//… 0 – 640 σε X; 192 – 224 στο Υ
//(ΠΡΟΣΟΧΗ! Αυτοί οι χειρισμοί δεν κάνουν τους τοίχους χειροπιαστούς, αλλά μόνο...
//... δημιουργούν τη γραφική τους εικόνα.

Setbrushcolor(clred); //Σχεδιάστε το πρόγραμμα αναπαραγωγής με συντεταγμένες...
fillrectangle(x,y,x+8,y+8);//… x και y

7. Το σώμα του προγράμματος.
Έτσι φτάσαμε στο ίδιο το πρόγραμμα. Εδώ πρέπει να γεμίσουμε τον πίνακα με τις τιμές που χρειαζόμαστε και επίσης να χρησιμοποιήσουμε προηγουμένως γραπτές διαδικασίες.

Λίστα 5:

200?"200px":""+(this.scrollHeight+5)+"px");">Έναρξη //αρχή του προγράμματος

//Καθορισμός τιμών για μεταβλητές
game_end:=false;
x:=0; //Η αρχική θέση του παίκτη κατά Χ
y:=0; //Η αρχική θέση του παίκτη στο Y

//Δημιουργία πίνακα
s:= νέος ακέραιος;

//Δημιουργήστε μια πλατφόρμα που σχεδιάστηκε στη διαδικασία Draw
για i:=0 έως 79 κάνω
s := 1;

Ενώ αρχίζει το game_end=false //Δημιουργία βρόχου...
//... το οποίο θα ματαιωθεί εάν το game_end = false

//Οθόνη σχεδίασης
Ισοπαλία();

//Βαρύτητα για τον παίκτη
Βαρύτητα();

OnKeyPress:=Πλήκτρο; //Επεξεργασία κλικ...
OnKeyDown:=KeyDown; //… πλήκτρα

Ύπνος(30); //Περιμένετε περίπου μισό δευτερόλεπτο για το παιχνίδι...
//… λειτούργησε με κανονική ταχύτητα

Τέλος;//τέλος του κύκλου.

Τέλος. //τέλος προγράμματος

8. Συμπέρασμα.
Συνολικά, πήραμε ένα απλό platformer με μια τελεία στον πρωταγωνιστικό ρόλο. Μπορούμε να κινηθούμε οριζόντια και να πηδήξουμε:

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

Το Textual (Παιχνίδι Mine Mines) χρησιμοποιεί GraphABC, ABCO αντικείμενα, ABCButtons. Const N = 10; //Πεδίο N x N sz = 40; //Μέγεθος κελιού d0 = 10; //Εσοχή από αριστερά και επάνω άκρη zz = 2; //Απόσταση μεταξύ κελιών NMines = 10; //Αριθμός ορυχείων Τύπος OneSellField = ορυχείο εγγραφής: boolean; //Υπάρχει ορυχείο fl: boolean; //Υπάρχει πλαίσιο ελέγχου γείτονες: ακέραιος; //θετικό - Πόσοι γείτονες; neg - απαιτείται για τον αλγόριθμο ανίχνευσης - άνοιγμα κενών κελιών κλικ: boolean; //Ήταν ανοιχτό; Var BtNewGame: ButtonABC;<= N) and (jj >Πώληση: συστοιχία SquareABC;<= N)) then begin c:= c + Integer(Field.mine); end; end; end; Field.neighbours:= c; end; Opened:= 0; //Кол. открытых мин Nfl:= 0; //Кол. установленных флажков end; Procedure OpenZero(fx, fy: integer); var fl:boolean; step, ii, jj: integer; begin Field.neighbours:= -1; step:= -1; repeat fl:= true; for var x:= 1 to N do begin for var y:= 1 to N do begin if Field.neighbours < 0 then begin {*** Проверка соседних клеток ***} for var dx:= -1 to 1 do begin for var dy:= -1 to 1 do if not ((dx = 0) and (dy = 0)) then begin //Центральную клетку не считаем ii:= x + dx; jj:= y + dy; //Если не выходит за границы поля if ((ii >Πεδίο: πίνακας OneSellField.<= N) and (jj >Πώληση: συστοιχία SquareABC;<= N)) then begin if Field.neighbours = 0 then begin Sleep(30); //Для анимации открывания клеток Sell.Color:= clLightYellow; Field.click:= true; Field.neighbours:= step; fl:= false; //Была открыта клетка - ищем др. end; if Field.neighbours >0 και μετά ξεκινήστε το Sell.Color:= clLightGreen; Sell.Text:= IntToStr(Field.neighbours);", clSkyBlue); btNewGame.OnClick:= NewGame; NewGame; OnMouseDown:= MouseDown; OnMouseMove:= MouseMove; ΤΕΛΟΣ.

Μια ανάρτηση νοσταλγίας για τα παιχνίδια που γράφαμε για εμάς στην παιδική ηλικία.
Αναρρίχηση στους ανοιχτούς χώρους App StoreΕνώ έψαχνα για άλλο παιχνίδι για το iPad μου, συνάντησα το παλιό παιχνίδι "Pilot Brothers". Το αγόρασα αμέσως, το εγκατέστησα και το τελείωσα με μια κίνηση (μάλλον 3 φορές ήδη). Αλλά περισσότερο από όλα έμεινα στο επεισόδιο με το ψυγείο. Αυτό το παζλ με ενοχλεί πραγματικά.

Και ξαφνικά το θυμήθηκα ξανά σχολικά χρόνια, αφού πέρασα το ψυγείο, το παζλ με κυρίευσε τόσο πολύ που έγραψα το δικό μου παιχνίδι στο Pascal - έναν εξομοιωτή παζλ. Αλλά δεν επανέλαβα απλώς πρωτότυπο παιχνίδι, αλλά σας επέτρεπε να επιλέξετε το μέγεθος του γηπέδου, είχε μια βοήθεια, τη δυνατότητα να αποθηκεύσετε και να συνεχίσετε το παιχνίδι από την προηγούμενη θέση μετά την έξοδο.

Έχοντας ανακτήσει παλιά αντίγραφα ασφαλείας, βρήκα το αρχικό παιχνίδι. Το ξεκίνησα στο dosbox και εξαφανίστηκα για έξω κόσμογια μια δυο ώρες.


Πρωτότυπο παζλ, σημειώστε την ανοιχτή αριστερή στήλη και τη θέση των πυλών

Τι νόημα έχει;

Η ουσία του παζλ είναι αρκετά απλή. Υπάρχει ένα πεδίο βαλβίδων 4 επί 4 τεμάχια είναι απαραίτητο να τοποθετήσετε όλες τις βαλβίδες στο ψυγείο σε οριζόντια θέση. "Αλλά υπάρχει μια απόχρωση"(γ): όταν περιστρέφετε μια βαλβίδα, όλες οι βαλβίδες στη στήλη και τη σειρά στην οποία βρίσκεται αυτή η βαλβίδα γυρίζουν μαζί της. Και εδώ αρχίζει η διασκέδαση!
Όταν κάθισα για πρώτη φορά να παίξω αυτό το παζλ στην αρχική αποστολή, παίζοντας το στο σχολείο, μάλλον χρειάστηκα 40 λεπτά για να το ολοκληρώσω, όχι λιγότερο. Αλλά μου άρεσε τόσο πολύ που το έπαιξα και το έπαιξα και το έπαιξα...
Αλλά ήθελα περισσότερο: την ικανότητα να αποταμιεύω παιχνίδι, δημιουργώ διαφορετικά επίπεδακαι αλλάξτε το μέγεθος του πεδίου για να κατανοήσετε τον αλγόριθμο του παιχνιδιού.
Τότε κατάλαβα ότι αν μου αρέσει το παζλ και θέλω να δοκιμάσω διαφορετικές κλίμακεςαγωνιστικό χώρο, τότε δεν πρέπει να περιμένετε τον καιρό δίπλα στη θάλασσα. Υπάρχει μόνο μία διέξοδος - να εφαρμόσετε αυτό το παιχνίδι μόνοι σας.

Λοιπόν, ας ξεκινήσουμε!

Δεν θα μπορώ να προσδιορίσω την ακριβή ημερομηνία δημιουργίας του παιχνιδιού, αλλά σίγουρα είναι το τέλος του σχολείου, η αρχή του κολεγίου. Εκείνα τα χρόνια μιλούσα άπταιστα τον Πασκάλ. Στο ινστιτούτο, έλυσα προβλήματα σε αυτό για χρήματα, βοήθησα στη συγγραφή μαθημάτων και γενικά - ήταν μια υπέροχη λογική γλώσσα. Ως εκ τούτου, αποφασίστηκε να γραφτεί το παιχνίδι σε αυτό.
Παρά το γεγονός ότι ήξερα πώς να εφαρμόσω γραφικά στο DOS, αποφάσισα να μην το κάνω γραφική εφαρμογή. Αυτό οφείλεται στο γεγονός ότι θα ήταν τρομερά λάθη και αργό, το οποίο, πρώτον, ήθελα να εφαρμόσω όσο το δυνατόν γρηγορότερα αυτή την εφαρμογή, και η υλοποίηση γραφικών θα πάρει πολύ χρόνο. και δεύτερον, προβολή κειμένουΜου αρέσει περισσότερο. Αν και, κοιτάζοντας πίσω, μου φαίνεται ότι θα τα πήγαινα καλύτερα με τα γραφικά και την πρόσθετη υποστήριξη ποντικιού.
Το έργο ήταν απλό: να φτιάξεις ένα απλό, κομψό παιχνίδι που δεν θα ήταν ντροπιαστικό να το δείξεις. Μεταξύ των χαρακτηριστικών: βοήθεια, δυνατότητα αποθήκευσης και μετά την έναρξη του παιχνιδιού να συνεχίσει από τη στιγμή που σταμάτησε, δυνατότητα αλλαγής του μεγέθους του αγωνιστικού χώρου. Συν λίγο χρώμα και χάρη.

Εκτέλεση

Δεν θα αναλύσω πλήρως τον πηγαίο κώδικα και τη λογική ολόκληρου του προγράμματος, γιατί είναι προφανείς, και αυτό που δεν είναι προφανές είναι ξεκάθαρο από τον κώδικα. Θα σταθώ όμως σε μερικά σημεία με περισσότερες λεπτομέρειες.
Η βάση του παιχνιδιού είναι ένας πίνακας κειμένου με στοιχεία NxN, όπου το N μπορεί να είναι ίσο με 2, 4, 8 και 16. Ο πίνακας είναι γεμάτος μόνο με δύο χαρακτήρες X και Y. Η θέση του δρομέα είναι η θέση του τρέχοντος στοιχείου πίνακα i και j. Κατά την αντιστροφή ενός στοιχείου πίνακα, το X αντικαθίσταται από το Y και το Y από το X στη στήλη και τη σειρά του πίνακα. Λοιπόν, και υπάρχουν πλήκτρα πρόσβασης (F1-F4, F10) που σας επιτρέπουν να καλείτε Βοήθεια, Αποθήκευση/Φόρτωση, Δημιουργία και Έξοδος. Όλα είναι ξεκάθαρα εδώ και πώς να το εφαρμόσετε είναι απλό και δεν θα σταθούμε λεπτομερώς σε αυτό.

Το μεγαλύτερο ενδιαφέρον, από εκπαιδευτική άποψη, είναι η διαδικασία WRIFT.*

* - Σημειώστε γιατί wrift

Εκείνες τις μέρες, για εξοικονόμηση χρημάτων, τα μηνύματα SMS γράφονταν σε μεταγραφή. Πώς θυμόμαστε το γράμμα" Sh" αντικαθίσταται από τον συνδυασμό " sh", αλλά για να εξοικονομήσω χώρο, το αντικατέστησα με ένα αχρησιμοποίητο γράμμα με παρόμοια ορθογραφία " W" Από εδώ προήλθε το όνομα Wrift(Γραμματοσειρά). Το ίδιο και η επιστολή " Χ” (Χ) αντικατέστησε το γράμμα « Χ(Ρωσικά) Χα”).

Εφόσον αποφάσισα να χρησιμοποιήσω τη λειτουργία κειμένου για το παιχνίδι, χρειαζόμουν ένα γράμμα για να αντικαταστήσω τη βαλβίδα. Τι σχέση έχει αυτό με ένα γράμμα που θα έδειχνε τη βαλβίδα κατακόρυφα και οριζόντια θέση. Οι μόνοι υποψήφιοι που είναι κατάλληλοι για αυτούς τους σκοπούς είναι τα λατινικά γράμματα "N" και "Z". Το γράμμα "Z" μοιάζει με το γράμμα Ν που βρίσκεται στο πλάι, μόνο τεντωμένο.
Δοκίμασα αυτήν την επιλογή και δεν ήμουν ευχαριστημένος. Και συνειδητοποίησα ότι έπρεπε να κάνω κάτι δικό μου, μερικά εναλλακτική λύση. Ήδη σκεφτόμουν να γράψω γραφική έκδοση, πώς συνάντησα το πρόγραμμα Pascal "Matrix" από τον συγγραφέα Abrarov A.M. . Το πρόγραμμα ξεκινά με τον ίδιο τρόπο όπως το πρώτο "Matrix" - εμφανίζοντας μια γραμμή στην οθόνη, αναζητώντας κώδικα. Και τότε αρχίζουν να πέφτουν βροχή τα ιερογλυφικά σύμβολα. Γιατί αυτό εφαρμόζεται μόνο σε λειτουργία κειμένου.

Ένα μικρό εκπαιδευτικό πρόγραμμα για το πρόγραμμα Matrix.pas

Το πρόγραμμα ήταν πολύ όμορφο και κομψό για την εποχή του. Και μετά μου έδωσε μεγάλη χαρά. Το πιο ενδιαφέρον είναι ότι εφαρμόζεται εκεί πλήρη γραμματοσειρά, για 208 χαρακτήρες! Υποθέτω όμως ότι ο συγγραφέας πήρε την εφαρμογή ενός προγράμματος όπως ο δικός μας «ρωσιφιστής», μόνο για ιερογλυφικά, και το ξαναέφτιαξε για τον εαυτό του.

Είναι αλήθεια ότι τώρα για να λειτουργήσει κανονικά το πρόγραμμα, ακόμα και στο dosbox, πρέπει να μειώσεις όλες τις καθυστερήσεις κατά 10 φορές (καθυστέρηση), διαφορετικά τα εγγόνια σου θα περιμένουν μέχρι το τέλος της εργασίας. Επειδή είμαι πολύ τεμπέλης για να επαναλάβω το πρόγραμμα, είναι καθαρά ακαδημαϊκού ενδιαφέροντος. Ή ίσως κάποιος θα το ξαναφτιάξει και θα το δείξει στον κόσμο, το λογισμικό είναι όμορφο (ειδικά επειδή δίνω έναν σύνδεσμο με τις πηγές). Και αν ξαφνικά ο συγγραφέας του διαβάσει αυτήν την ανάρτηση, τότε του μεταφέρω τα λόγια ευγνωμοσύνης μου.

Το πιο σημαντικό είναι ότι σε αυτό το πρόγραμμα, το "krakozyabr" έχει τη δική του γραμματοσειρά! Και είναι φορτωμένο. Δανείστηκα αυτή τη διαδικασία φόρτωσης, αλλάζοντας την βέβαια λίγο.
Λίγα λόγια για την εργασία με γραμματοσειρές.

Στο MS-DOS χρησιμοποιώντας το BIOSΥποστηρίζει εργασία με γραμματοσειρές ράστερ. Οι δυνατότητες του BIOS σάς επιτρέπουν να αποκτήσετε και να εγκαταστήσετε προσαρμοσμένες γραμματοσειρές, και επίσης λάβετε γραμματοσειρές από τη δημιουργία χαρακτήρων του προσαρμογέα βίντεο. Όλες οι εγκατεστημένες γραμματοσειρές έχουν το ίδιο πλάτος 8 σημείων και το ύψος μπορεί να έχει τρεις σταθερές τιμές - 8, 14 ή 16 πόντους. Συγκεκριμένο νόημαΤο ύψος της γραμματοσειράς καθορίζεται από τη λειτουργία βίντεο για την οποία έχει φορτωθεί η γραμματοσειρά. Ένα ύψος γραμματοσειράς 8 κουκκίδων αντιστοιχεί στη λειτουργία βίντεο 50/43 γραμμών, ένα ύψος γραμματοσειράς 14 κουκκίδων αντιστοιχεί στη λειτουργία βίντεο 25 γραμμών για το EGA και ένα ύψος γραμματοσειράς 16 κουκκίδων αντιστοιχεί στη λειτουργία βίντεο γραμμών VGA 25.

Θα χρησιμοποιήσουμε τη λειτουργία βίντεο 16 χρωμάτων 40x25 χαρακτήρων. Σε αυτήν τη λειτουργία βίντεο, κάθε χαρακτήρας είναι μια διάταξη 8x16 κουκκίδων. Με απλά λόγια, κάθε χαρακτήρας αντιπροσωπεύει 16 byte, όπου σε ένα byte το bit έχει οριστεί σε ένα σημαίνει ότι έχει μαύρο χρώμα. Εάν έχετε ένα χάος στο κεφάλι σας αυτή τη στιγμή, μην ανησυχείτε - θα γίνει πιο ξεκάθαρο αργότερα.
Για να οριστεί μια κλειστή (κάθετη) βαλβίδα, επιλέχθηκε το γράμμα "X" (Λατινικά κεφαλαίο γράμμα"X") και για ανοιχτό οριζόντιο, το γράμμα "Y" (λατινικό κεφαλαίο γράμμα "Y"). Αυτά τα γράμματα επιλέχθηκαν για διάφορους λόγους. Πρώτον, γνωρίζονται μεταξύ τους από σχολικό πρόγραμμα σπουδώνκαι με το αυτί. Δεύτερον, και πιο σημαντικό, είναι πίνακας ASCIIΟι χαρακτήρες βρίσκονται σε μια σειρά (θέσεις 88d και 89d, αντίστοιχα), γεγονός που απλοποιεί την αντικατάστασή τους. Και τα λατινικά επιλέχθηκαν για να γίνει το μενού στα ρωσικά, χωρίς να ξαναανεβάσουμε τη γραμματοσειρά.
Λοιπόν, αποφασίσαμε για τα σύμβολα, τώρα ας περάσουμε στα ρούχα τους, γνωστή και ως γραμματοσειρά. Παίρνουμε ένα φύλλο χαρτιού σε ένα κλουβί, κάνουμε ένα πεδίο 8x16 πάνω του και αρχίζουμε να σχεδιάζουμε ένα σύμβολο για μια οριζόντια και μετά μια κάθετη βαλβίδα. Δεδομένου ότι η πύλη πρέπει να είναι ίδια τόσο σε κάθετη όσο και σε οριζόντια κατάσταση, θα χρησιμοποιήσουμε μόνο τις πρώτες 8 γραμμές για να πάρουμε το τετράγωνο. Και μετά σχεδιάζουμε δύο βαλβίδες σε αυτό το πεδίο, κάθετα και οριζόντια. Κάπως έτσι πρέπει να βγει


Γραμματοσειρά δύο βαλβίδων

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


Πίνακας δυαδικών κωδικών και μετατράπηκε σε δεκαδική μορφή

Ως αποτέλεσμα, λαμβάνουμε την ακόλουθη κεφαλίδα διαδικασίας:

Διαδικασία WRIFT; (Zagruzka shrifta ("pesochnye chasy")) Const Font:array of Byte=(129,195,231,153,153,231,195,129,0,0,0,0,0,0,0,0,0, 255,102,32,36,25,24 0,0,0,0,0,0); Var SegScr:Word;

OfsScr:Word; screen1:Πίνακας Byte απόλυτης γραμματοσειράς.Η γραμματοσειρά είναι μια σειρά από δύο χαρακτήρες πύλης (κάθε χαρακτήρας στη δική του γραμμή). Η πιο ενδιαφέρουσα μεταβλητή είναι ο πίνακας screen1 - ένας πίνακας που βρίσκεται στην απόλυτη διεύθυνση της μεταβλητής Font (οδηγία

απόλυτος

). Ακολουθεί το διασκεδαστικό μέρος.

Με αυτόν τον απλό τρόπο, μπορείτε να αλλάξετε ολόκληρη τη γραμματοσειρά στο DOS στη δική σας. Για να ξεφορτώσετε μια γραμματοσειρά, χρησιμοποιήστε τη διαδικασία Επαναφοράς:

Επαναφορά διαδικασίας; (Sbros shrifta) Begin asm mov ax,3 int 10h End; Τέλος; (Επαναφορά)

Το οποίο εκτελείται όταν εμφανίζεται το μενού και βγαίνει το πρόγραμμα.

Παρεμπιπτόντως, για αναφορά, οι λεγόμενοι «Ρωσοποιητές» δούλευαν στο DOS με παρόμοιο τρόπο. Απλώς αντικατέστησαν την τρέχουσα γραμματοσειρά με μια γραμματοσειρά με ρωσικά γράμματα.

Ένα από τα αστεία

Ένας από τους φίλους μου, ειδικά όταν σπούδαζα προγραμματισμό στο Borland C++, έφτιαξε μια γραμματοσειρά σε μορφή MPH, χρησιμοποιώντας επίσης ένα παράδειγμα από το "The Matrix". Εκείνοι. Απλώς αντικατέστησα όλους τους χαρακτήρες με έναν χαρακτήρα MPH. Το Norton Commander φαινόταν τρομακτικό! Κρίμα που δεν έχουν μείνει φωτογραφίες από εκείνη την εποχή.
Εάν ένας τέτοιος σύνδεσμος προγράμματος μπορούσε να ξεκινήσει στην επιστήμη των υπολογιστών, ο δάσκαλος θα ήταν χαρούμενος.

Τροποποιήσεις σήμερα

Στην πραγματικότητα, δεν δίνω το παιχνίδι με τη μορφή που γράφτηκε πριν από πολλά χρόνια. Αποκάλυψε μερικά πολύ δυσάρεστα σφάλματα:
1. Το πρόγραμμα απλά κατέρρευσε εάν δεν εντοπίστηκε το αρχείο GAME.SAV.
2. Γεννήτρια τυχαίους αριθμούςδεν αρχικοποιήθηκε, επομένως παρήγαγε συνεχώς το ίδιο επίπεδο.
Επιπλέον, λόγω προβλημάτων με τις κωδικοποιήσεις, δημιούργησα μια δεύτερη έκδοση του παιχνιδιού, εξ ολοκλήρου αγγλικός. Και αν διαβάσεις πηγαίος κώδικαςόχι σε πρόγραμμα επεξεργασίας συμβατό με DOS, συνιστώ να χρησιμοποιήσετε τις πηγές του - δεν θα υπάρχουν προβλήματα με την κωδικοποίηση.

Είναι τόσο ευχάριστο που το DOSbox είναι παντού. Μπορείτε να φανταστείτε πόσο αστείο φαίνεται το Pepper με ένα iPad και ανοιχτό τον Borland Pascal;


Ο παλιός καλός Borland Pascal στο iPad

Οπότε τα τζάμπα διορθώθηκαν αμέσως.

Αρκετά στιγμιότυπα του προγράμματος, με σύντομη περιγραφή

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


Αρχή

Ο κέρσορας επισημαίνεται και αναβοσβήνει.

Εάν πατήσετε το F1, μπορείτε να λάβετε αυτήν την απλή βοήθεια




Βοήθεια

Για να δημιουργήσετε ένα επίπεδο, πατήστε F4 και μπείτε σε αυτό το μενού


Μενού παραγωγής επιπέδου

Λοιπόν, μετά τη νίκη το παιχνίδι θα σας συγχαρεί


Συγχαρητήρια για τη νίκη σας

Και θα περιμένει να πατηθεί οποιοδήποτε πλήκτρο. Σε αυτήν την περίπτωση, η πρόοδος του παιχνιδιού δεν αποθηκεύεται.

Πώς να εγκαταστήσετε και να παίξετε

Λόγω των ιδιαιτεροτήτων και της εφαρμογής της φόρτωσης γραμματοσειρών, το παιχνίδι λειτουργεί μόνο σε καθαρό σωλήνα DOS. Επομένως, για να λειτουργήσει πρέπει να χρησιμοποιήσετε το dosbox ή ένα παρόμοιο πρόγραμμα.
Η εγκατάσταση είναι ασήμαντη. Κατεβάστε το αρχείο με το πρόγραμμα. Εγκαθιστώ dosbox. Και, αν θέλετε, ρωσοποιήστε το, εδώ είναι η μέθοδος για το Linux: old-game.org/?p=1717.
Κατ 'αρχήν, όλα αυτά τα αρχεία μπορούν να χρησιμοποιηθούν για Windows: Για να γίνει αυτό, το αρχείο russian.txt τοποθετείται στο φάκελο με το πρόγραμμα και τις ρυθμίσεις παραμέτρων και η συντόμευση για το Dosbox επεξεργάζεται. Η διαδρομή συντόμευσης θα πρέπει να είναι κάπως έτσι: "C:\Program Files\DOSBox-0.74\DOSBox.exe" -userconf"Αφαιρούμε "-userconf"και οι ρυθμίσεις σας θα λειτουργήσουν.

Στο Ubuntu απλά κάνω κλικ δεξί κλικπεράστε το ποντίκι πάνω από το πρόγραμμα και επιλέξτε να το εκτελέσετε στο dosbox, δεν ξέρω πώς να το κάνω στα Windows, γιατί κανένας από τους μηχανισμούς δεν το έχει. Λοιπόν, ως τελευταία λύση, η διαδρομή προς το παιχνίδι προσαρτάται χρησιμοποιώντας την εντολή mount path.
Έχετε τη δυνατότητα επιλογής ρωσικών και αγγλικών εκδόσεων. Δεν χρειάζεται να χαζεύετε τη ρωσοποίηση και τις αιμορροΐδες με τις διαμορφώσεις, αλλά απλώς να πυροβολείτε την αγγλική. Δεν υπάρχει ουσιαστικά καμία διαφορά μεταξύ τους. Αν και, προσωπικά, ως συγγραφέας, προτιμώ τη ρωσική έκδοση.
Ο έλεγχος εκτελείται χρησιμοποιώντας τα βέλη του πληκτρολογίου, η επιλογή και η αντιστροφή χρησιμοποιώντας το πλήκτρο εισαγωγής ή κάνοντας διπλό κλικ στο πλήκτρο διαστήματος (ναι, υπάρχει μια εμπλοκή εδώ). Εάν η θέση κολλήσει ξαφνικά, πατήστε το πλήκτρο διαστήματος μία φορά.

Να θυμάστε ότι το τελευταίο αποθηκευμένο παιχνίδι φορτώνεται κάθε φορά. Για να δημιουργήσετε ένα νέο, πατήστε F4. Συνιστώ να ξεκινήσετε με ένα πεδίο 4x4. Αυτήν τη στιγμή παίζω 8x8 και εξακολουθώ να φοβάμαι να αλλάξω σε 16x16. Γιατί ολοκληρώνω 4x4 σε λιγότερο από ένα λεπτό, 8x8 λεπτά σε 7-10 και φοβάμαι να φανταστώ καν το 16x16.
Θυμηθείτε ότι το πεδίο φόρτωσης με την επιγραφή HABR και το ψευδώνυμό μου (εικόνα στην καταχώρηση του άρθρου) θα εξαφανιστεί μετά την αποθήκευση ή τη νόμιμη έξοδο. Αποθηκεύεται σε αρχείο ΠΑΙΧΝΙΔΙ.ΣΑΒ. Εάν θέλετε να κάνετε επαναφορά, αντικαταστήστε αυτό το αρχείο με το αρχείο από το αρχείο.

Πεδίο ειδικά για habr

Δεν ήθελα απλώς να ξεκινήσω το παιχνίδι, ακόμα κι αν είχε τελειώσει και τελειώσει για το hub. Ήθελα κάποιο κόλπο. Και αποφάσισα να κάνω μια επιγραφή στο μεγαλύτερο πεδίο 16x16.
Η μορφή του αρχείου αποθήκευσης είναι απλή: πρώτα έρχεται το μέγεθος του πεδίου, για παράδειγμα ο αριθμός 16, η επιστροφή μεταφοράς, μετά 256 (για ένα πεδίο 16x16) χαρακτήρες X και Y που συνθέτουν το μοτίβο πεδίου και στο τέλος ο αριθμός των Y σε το πεδίο (ένα είδος αθροίσματος ελέγχου).
Για να γίνει αυτό, δημιούργησα ένα τέτοιο πεδίο στο OF Calc και έκανα μια έγχρωμη επιγραφή στα κελιά. Και μετά έβαλε κάτω τα γράμματα Χ και Υ ανάλογα.

Προετοιμασία για το γήπεδο.

Μετά το αποθήκευσα ως CSV. Καταργήθηκαν όλα τα διαχωριστικά. Υπολόγισα το ποσό του Y (είναι πολύ απλό, κάνετε μια αναζήτηση στο OF Writer, αντικαθιστάτε με και αντικαθιστάτε το Y με κάτι, σας λέει τον αριθμό των αντικαταστάσεων - αυτός είναι ο αριθμός που ψάχνετε). Πρώτα βάζω τον αριθμό 16, την άμαξα επιστροφή και στο τέλος τον αριθμό των παικτών. Μπορείτε να κρίνετε μόνοι σας το αποτέλεσμα :).

Μειονεκτήματα της τρέχουσας έκδοσης του προγράμματος.

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

Ετσι:
1. Το πρώτο και πιο δυσάρεστο μειονέκτημα είναι τα κακά χειριστήρια. Πρώτον, η αντιστροφή γίνεται χρησιμοποιώντας το κλειδί Εισαγωγή ή διπλός χώρος. Επιπλέον, αν πατήσετε το πλήκτρο διαστήματος μονές φορές, το πρόγραμμα «κολλάει» μέχρι να κάνετε ζυγό αριθμό πατημάτων. Είναι ενοχλητικό.
2. Δεύτερον σημαντικό μειονέκτημα- αυτό αποδίδει ολόκληρο το παιχνίδι χρησιμοποιώντας τις συναρτήσεις εγγραφής/εγγραφής. Με κάθε συμβάν, η οθόνη σχεδιάζεται εκ νέου. Όταν παίζετε σε γήπεδο 16x16, είναι ήδη αισθητές επιβραδύνσεις και φλας στην απόδοση. Επιπλέον, αυτή η προσέγγιση έχει περιπλέξει τη λογική του προγράμματος και τώρα η επίλυσή της είναι τεράστιο πρόβλημα.
Ήταν απαραίτητο να υλοποιηθεί η απόδοση χρησιμοποιώντας τη συνάρτηση goto(x;y). Τότε θα ήταν δυνατή η αλλαγή ενός χαρακτήρα χωρίς να επανασχεδιαστεί ολόκληρη η οθόνη.
3. Το παιχνίδι ζητά απλώς υποστήριξη ποντικιού. Και πάλι, η υποστήριξη του ποντικιού πρέπει να υλοποιηθεί σε συνδυασμό με το βήμα 2, ώστε να μπορείτε να "πιάσετε" με ακρίβεια τις συντεταγμένες.
4. Ένα μικρό σφάλμα που ακολουθεί από το σημείο 2 - όταν κατεβείτε στην κάτω δεξιά γωνία, ένα σύμβολο τρέχει έξω από το πλαίσιο. Προσπάθησα να το διορθώσω και συνειδητοποίησα ότι είναι πιο εύκολο να ξαναγράψω εντελώς αυτήν την τοποθεσία απόδοσης παρά να καταλάβω πώς λειτουργεί.

Τι θα ήθελες να κάνεις

Φυσικά, θα ήθελα μια τέτοια εφαρμογή για Android ή iPad. Έτσι μπορείτε να το παίξετε με το δάχτυλό σας. Ή, αν όχι μια εφαρμογή, τότε ένα παιχνίδι που βασίζεται σε πρόγραμμα περιήγησης (αλλά ένα που λειτουργεί σε Android και iOS). Να είσαι εκεί όμορφο μενούκαι βολική πλοήγηση. Υπήρχε ένας πίνακας αρχείων. Υπήρχε ένας μετρητής χρόνου που μπορούσες να τον καμαρώσεις με τους φίλους σου. Υπήρχαν επίσης στατιστικά στοιχεία για να μπορείτε να υπολογίσετε τον μέσο χρόνο και την ταχύτητα της ικανότητας.
Γενικά, μια τεράστια πτήση για δημιουργικότητα, με πλήρης απουσίαελεύθερος χρόνος για μελέτη προγραμματισμού για αυτές τις συσκευές. Από την άλλη, το dosbox είναι παντού και μάλλον θα είναι δύσκολο να επιτευχθεί πιο καθολική φορητότητα και ίσως είναι λογικό να τελειώσει αυτό το πρόγραμμα; Πώς πιστεύετε;

Αποτελέσματα...

Ο σκοπός του άρθρου δεν είναι να δείξω πόσο σπουδαίος είμαι, αλλά απλώς να θυμηθώ πώς ήταν. Σίγουρα σχεδόν ο καθένας μας έγραψε κάτι τέτοιο στην παιδική ηλικία. Αυτό δεν είναι ω τι πολύπλοκο πρόγραμμα, και κάθε μαθητής μπορεί να το γράψει, με αρκετή επιμονή. Αυτό είναι περισσότερο μια ανάρτηση αναπόλησης.
Χρησιμοποίησα πολύ το assembler σε προγράμματα. Μου άρεσε να «μιλώ» με το υλικό απευθείας, χωρίς μεσάζοντες. Ένιωσα το αυτοκίνητο καλύτερα. Και ακόμα και τότε, για το AVR έγραψα αποκλειστικά σε assembler. Και τώρα δεν καταλαβαίνω πώς λειτουργεί ένας υπολογιστής. Φυσικά, φαντάζομαι τα βασικά μπλοκ, κλπ., αλλά δεν ξέρω τη λεπτομερή εικόνα, και το αστείο είναι ότι κανείς δεν το ξέρει!
Και τώρα... Γλώσσες υψηλών και παραπέρα υψηλό επίπεδοοι αφαιρέσεις γενικά μας αναγκάζουν να μην σκεφτόμαστε πώς και πού εκτελείται ο κώδικας. Αυτό είναι αναμφίβολα καλό, γιατί σας επιτρέπει να συγκεντρωθείτε απευθείας στην εργασία, αλλά από την άλλη, αυτή η ζεστή γοητεία που μοιάζει με λάμπα της εργασίας με το υλικό φεύγει...

Κατάλογος παραπομπών και συνδέσμων:
1. Περιγραφή του τρόπου λήψης μιας γραμματοσειράς για το DOS shackmaster.narod.ru/fonts.htm
2. Ένα εξαιρετικό βιβλίο αναφοράς για το assembler, το οποίο μου έδωσε να κατανοήσω πώς να δουλέψω Λειτουργίες BIOS, και γενικά με το υλικό υπολογιστή: "Προγραμματισμός σε επίπεδο υλικού: ένα ειδικό βιβλίο αναφοράς." Κουλάκοφ
3. Dosbox εξομοιωτής DOS www.dosbox.com/download.php?main=1
4. Πρόγραμμα και πηγές narod.ru/disk/65499856001.6f143511c7c3c2ad7866f07008d8db29/INVERTOR.zip.html
5. Πηγές του προγράμματος "Matrix" narod.ru/disk/65499898001.a6c953f20e2ee023bd00e3518e22fea8/Matrix.pas.html

P.S. Φεφ, μάλλον πέρασα μερικές μέρες θυμούμενος και γκουγκλάροντας πώς έφτιαξα αυτή τη γραμματοσειρά. Υπάρχει ένας κωδικός, λειτουργεί, αλλά δεν θυμάμαι και δεν καταλαβαίνω πώς.
Π.Π.Σ. Εάν ενδιαφέρονται οι άνθρωποι, θα προσθέσω ένα βίντεο για το πώς ολοκληρώνω ένα πεδίο 4x4 σε λιγότερο από ένα λεπτό (χρησιμοποιώντας το ψυγείο Pilot Brothers ως παράδειγμα).
Π.Π.Π.Σ. Θα εκτιμούσα οποιαδήποτε σχόλια σχετικά με την ορθογραφία και τα σημεία στίξης που αποστέλλονται με προσωπικό μήνυμα!

Μόνο εγγεγραμμένοι χρήστες μπορούν να συμμετάσχουν στην έρευνα. Παρακαλώ συνδεθείτε.

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

Οδηγίες

  • Ξεκινήστε να εργάζεστε στο πρόγραμμα με τον τίτλο και τη λίστα των πρόσθετων που χρησιμοποιούνται: το πρόγραμμα reshiprimer χρησιμοποιεί το crt.
  • Πείτε στον μεταγλωττιστή ποιες μεταβλητές θα συμπεριληφθούν στο πρόγραμμα:vara,b,c:integer;d:string;Εδώ a και b είναι όροι, c είναι το άθροισμα, d είναι η απάντηση στην ερώτηση εάν ο χρήστης θέλει να συνεχίσει παιχνίδι.
  • Σημειώστε την αρχή του προγράμματος και ατέρμων βρόχος, και επίσης αρχικοποιήστε τη γεννήτρια τυχαίων αριθμών:beginrandomize;ενώ 0=0 dobegin
  • Προγραμματίστε τη δημιουργία δύο τυχαίων αριθμών στην περιοχή από 0 έως 1000:a:=round(random(1000));b:=round(random(1000));
  • Δείξτε στον χρήστη ένα παράδειγμα που πρέπει να λύσει και μετά ζητήστε το αποτέλεσμα: writeln("Πόσο θα είναι"),a,("+"),b,("?");readln(c);
  • Πείτε στον χρήστη εάν έλυσε σωστά το παράδειγμα: αν a+b=c τότε writeln("Σωστό!") else writeln("Λάθος!);
  • Ρωτήστε τον χρήστη εάν θέλει να παίξει περισσότερο: writeln("Θα παίξουμε περαιτέρω;");
  • Εάν η απάντηση είναι αρνητική, τερματίστε το πρόγραμμα: αν upcase(d)"Y" τότε halt(0);
  • Τερματίστε πρώτα τον βρόχο και μετά το ίδιο το πρόγραμμα: τέλος Δώστε προσοχή στην περίοδο μετά τη δεύτερη δήλωση τέλους.
  • Εκκινήστε το πρόγραμμα πατώντας Ctrl+F9. Το πρώτο παράδειγμα θα εμφανιστεί στην οθόνη. Κάντε τα μαθηματικά στο μυαλό σας και πληκτρολογήστε την απάντηση. Το μηχάνημα θα σας πει αμέσως εάν έχει λυθεί σωστά. Στη συνέχεια θα ερωτηθείτε εάν θέλετε να συνεχίσετε να παίζετε. Η απάντηση Y ή y θα έχει ως αποτέλεσμα να εμφανιστεί το ακόλουθο παράδειγμα και η εισαγωγή οποιουδήποτε άλλου γράμματος θα τερματίσει το πρόγραμμα.
  • Έχοντας πετύχει σωστή λειτουργίαπαιχνίδι, αρχίστε να το βελτιώνετε. Για παράδειγμα, προσθέστε μια διαγραφή οθόνης πριν εμφανιστεί κάθε νέο παράδειγμα με την εντολή cls. Χρησιμοποιώντας τη διαδικασία χρώματος κειμένου, κάντε το κείμενο να εμφανίζεται με διαφορετικά χρώματα. Σκεφτείτε πώς μπορείτε να αναγκάσετε το πρόγραμμα να αλλάξει αυτόματα την πολυπλοκότητα των παραδειγμάτων: αν οι απαντήσεις είναι σωστές, περιπλέκετε τις και αν είναι λανθασμένες, απλοποιήστε τις. Για να διαφοροποιήσετε το παιχνίδι, προσθέστε μια συνάρτηση για τη δημιουργία παραδειγμάτων για διάφορες μαθηματικές πράξεις.


  • Συνιστούμε να διαβάσετε

    Κορυφή