Πώς να προγραμματίσετε παιχνίδια σε C. Tutorial One

01

του 05

Εισαγωγή στα Εκπαιδευτικά Προγράμματα Προγραμματισμού Παιχνιδιών

Αυτό είναι το πρώτο από τα πολλά παιχνίδια προγραμματισμού Tutorials στο C για τους αρχάριους. Αντί να επικεντρωθούμε στη διδασκαλία C, δείχνοντας τότε παραδείγματα προγραμμάτων, διδάσκουμε το C παρέχοντας ολοκληρωμένα προγράμματα (π.χ. παιχνίδια) στο C

Κρατώντας το απλό

Το πρώτο παιχνίδι της σειράς είναι μια κονσόλα (δηλ. Παιχνίδι με βάση το κείμενο που ονομάζεται Star Empires). Το Star Empires είναι ένα απλό παιχνίδι όπου πρέπει να συλλάβετε και τα 10 συστήματα του Γαλαξία, ενώ σταματάτε τον αντίπαλό σας στο AI να κάνει το ίδιο.

Αρχίζετε να κατέχετε το Σύστημα 0, ενώ το δικό σας σύστημα εχθρού 9. Τα υπόλοιπα οκτώ συστήματα (1-8) αρχίζουν όλα ουδέτερα. Όλα τα συστήματα ξεκινούν μέσα σε ένα 5 parsec x 5 parsec τετράγωνο έτσι κανένα σύστημα δεν είναι περισσότερο από 6 parsecs μεταξύ τους. Τα πλέον απομακρυσμένα δύο σημεία είναι (0,0) και (4,4). Από το θεώρημα του Πυθαγόρα, η πιο μακρινή απόσταση από οποιοδήποτε σύστημα είναι η τετραγωνική ρίζα ((4)

instagram viewer
2 + (4)2) που είναι η τετραγωνική ρίζα του 32 που είναι περίπου 5.657.

Σημειώστε ότι αυτή δεν είναι η τελική έκδοση και θα τροποποιηθεί. Τελευταία αλλαγή: 21 Αυγούστου 2011.

Turn Based & σε πραγματικό χρόνο

Το παιχνίδι είναι βασισμένο σε σειρά και σε κάθε στροφή δίνει εντολές για να μεταφέρετε οποιοδήποτε αριθμό στόλων από οποιοδήποτε σύστημα που έχετε σε οποιοδήποτε άλλο σύστημα. Εάν έχετε περισσότερα από ένα συστήματα, μπορείτε να παραγγείλετε τους στόλους για να μετακινηθείτε από όλα τα συστήματά σας στο σύστημα προορισμού. Αυτό γίνεται κατ 'αναλογία στρογγυλοποιημένο έτσι αν έχετε στην κατοχή σας τρία συστήματα (1,2,3) με 20, 10 και 5 στόλους παρόντες και παραγγέλλετε 10 στόλους για να μεταβείτε στο σύστημα 4, τότε 6 θα πάει από το σύστημα 1, 3 από το σύστημα 2 και 1 από το σύστημα 3. Κάθε στόλος μετακινεί 1 parsec ανά στροφή.

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

onesec = ρολόι () + (5 * CLOCKS_PER_SEC);

C Tutorial Προγραμματισμού

Αυτό το παιχνίδι έχει προγραμματιστεί και υποθέτει ότι δεν γνωρίζετε κανένα προγραμματισμό C. Θα παρουσιάσω χαρακτηριστικά προγραμματισμού C σε αυτό και στα επόμενα δύο ή τρία μαθήματα καθώς προχωρούν. Πρώτα όμως θα χρειαστείτε ένα compiler για τα Windows. Εδώ είναι δύο δωρεάν:

  • Δοκιμάστε CC386
  • Ή Visual C ++ 2010 Express

Το άρθρο CC386 σας καθοδηγεί στη δημιουργία ενός έργου. Αν εγκαταστήσετε αυτόν τον μεταγλωττιστή τότε το μόνο που έχετε να κάνετε είναι να φορτώσετε το πρόγραμμα Hello World όπως περιγράφεται, να αντιγράψετε και να επικολλήσετε τον πηγαίο κώδικα πάνω από το παράδειγμα, να το αποθηκεύσετε και στη συνέχεια να πατήσετε το F7 για να το μεταγλωττίσετε και να τον εκτελέσετε. Ομοίως, το άρθρο Visual C ++ 2010 δημιουργεί ένα hello world program. Αντικαταστήστε το και πατήστε F7 για να δημιουργήσετε Star Empires., F5 για να το εκτελέσετε.

Στην επόμενη σελίδα - Να λειτουργούν οι Star Empires

02

του 05

Δημιουργία Star Empires

Δημιουργία Star Empires

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

  • Συστήματος προέλευσης (1-10).
  • Σύστημα προορισμού (1-10)
  • Πόσα πλοία (1-πολλά)
  • Στρίβει για να φτάσει
  • Ποιος είναι ο στόλος; 0 = Παίκτης, 9 = Εχθρός

Θα χρησιμοποιήσουμε ένα struct στο C για να το κρατήσουμε αυτό:

struct στόλος {
int fromsystem;
int tosystem;
int turns;
int fleetsize;
ιδιοκτήτης int;
};

Μια δομή είναι μια συλλογή δεδομένων, στην περίπτωση αυτή 5 αριθμοί που χειριζόμαστε ως ένα. Κάθε αριθμός έχει ένα όνομα, π.χ. από το σύστημα, στο σύστημα. Αυτά τα ονόματα είναι ονόματα μεταβλητών στο C και μπορούν να έχουν υπογράμμιση όπως like this but not spaces. Στο C, οι αριθμοί είναι είτε ακέραιοι. ολόκληροι αριθμοί όπως 2 ή 7 αυτοί ονομάζονται ints ή αριθμοί με δεκαδικά μέρη όπως 2.5 ή 7.3333 και αυτοί καλούνται πλωτήρες. Σε ολόκληρη την Star Empires, χρησιμοποιούμε μόνο πλωτήρες μία φορά. Σε ένα κομμάτι κώδικα που υπολογίζει την απόσταση μεταξύ δύο θέσεων. Κάθε άλλος αριθμός είναι ένα int.

Επομένως, ο στόλος είναι το όνομα μιας δομής δεδομένων που περιέχει πέντε μεταβλητές int. Τώρα αυτό είναι για ένα Στόλο. Δεν γνωρίζουμε πόσους στόλους θα χρειαστεί να κρατήσουμε, έτσι θα διαθέσουμε γενναιόδωρο χώρο για 100 με τη χρήση ενός πίνακα. Σκεφτείτε μια δομή σαν ένα τραπέζι με χώρο για πέντε άτομα (ints). Μια σειρά είναι σαν μια μακρά σειρά τραπεζιών δείπνου. 100 πίνακες σημαίνει ότι μπορεί να χωρέσει 100 x 5 άτομα.

Αν εξυπηρετούσαμε πραγματικά αυτά τα 100 τραπέζια δείπνου, θα έπρεπε να μάθουμε ποιο τραπέζι ήταν αυτό και το κάνουμε αυτό με αρίθμηση. Στο C, πάντα αριθμούμε στοιχεία συστοιχιών που ξεκινούν από το 0. Ο πρώτος πίνακας δείπνου (στόλος) είναι αριθμός 0, ο επόμενος είναι 1 και ο τελευταίος είναι 99. Θυμάμαι πάντα ότι είναι πόσα τραπέζια δείπνου είναι αυτός ο πίνακας από την αρχή; Η πρώτη είναι στην αρχή έτσι είναι 0 κατά μήκος.

Έτσι δηλώνουμε τους στόλους (δηλ. Πίνακες δείπνου).

στόλων στόλου [100] ·

Διαβάστε αυτό από αριστερά προς τα δεξιά. Ο στόλος Struct αναφέρεται στη δομή μας για τη διατήρηση ενός στόλου. Οι στόλοι των ονομάτων είναι το όνομα που δίνουμε σε όλους τους στόλους και [100] μας λέει ότι υπάρχει στόχος 100 x struct στη μεταβλητή στόλων. Κάθε int καταλαμβάνει 4 θέσεις στη μνήμη (που ονομάζονται bytes) έτσι ένα στόλο καταλαμβάνει 20 bytes και 100 στόλοι είναι 2000 bytes. Είναι πάντα μια καλή ιδέα να γνωρίζουμε πόση μνήμη το πρόγραμμα μας χρειάζεται να κρατήσει τα δεδομένα του.

Στο στόλο struct, κάθε ένα από τα ints κατέχει έναν ακέραιο αριθμό. Αυτός ο αριθμός αποθηκεύεται σε 4 bytes και το εύρος αυτού είναι από -2.147.483.647 έως 2.147.483.648. Τις περισσότερες φορές θα χρησιμοποιούμε μικρότερες τιμές. Υπάρχουν δέκα συστήματα έτσι ώστε τόσο το σύστημα όσο και το σύστημα θα κρατούν τιμές 0 έως 9.

Στην επόμενη σελίδα: Συστήματα και τυχαίοι αριθμοί

03

του 05

Σχετικά με συστήματα και τυχαίους αριθμούς

Κάθε ένα από τα ουδέτερα συστήματα (1-8) αρχίζει με 15 πλοία (έναν αριθμό που πήρα από τον αέρα!) Για να ξεκινήσω με τα άλλα δύο (δικός σας: το σύστημα 0 και ο αντίπαλός σας στο σύστημα 9) έχουν 50 σκάφη το καθένα. Κάθε στροφή, ο αριθμός των πλοίων σε ένα σύστημα αυξάνεται κατά 10% στρογγυλευμένο προς τα κάτω. Έτσι μετά από μια στροφή, αν δεν τα μετακινήσετε, τα 50 σας θα γίνουν 55 και κάθε ένα από τα ουδέτερα συστήματα θα έχει 16 (15 + 1,5 στρογγυλεμένες κάτω). Σημειώστε ότι οι στόλοι που μετακινούνται σε άλλο σύστημα δεν αυξάνονται σε αριθμούς.

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

Συστήματα εφαρμογής

Στην αρχή πρέπει να δημιουργήσουμε όλα τα συστήματα και να τα βάλουμε στο χάρτη, με ένα σύστημα το πολύ ένα κάθε θέση, καθώς υπάρχουν 25 θέσεις στο πλέγμα μας 5 x 5, θα έχουμε δέκα συστήματα και 15 κενά τοποθεσίες. Τα δημιουργούμε χρησιμοποιώντας τη λειτουργία GenMapSystems () την οποία θα δούμε στην επόμενη σελίδα.

Ένα σύστημα αποθηκεύεται σε μια δομή, με τα ακόλουθα 4 πεδία που είναι όλα int.

struct σύστημα {
int x, y;
int numfleets;
ιδιοκτήτης int;
};

Ο γαλαξίας (και τα 10 συστήματα) αποθηκεύεται σε μια άλλη σειρά όπως και με τους στόλους, εκτός από 10 συστήματα.

δορυφορικός γαλαξίας [10].

Τυχαί αριθμοί

Όλα τα παιχνίδια χρειάζονται τυχαίους αριθμούς. Το C έχει μια ενσωματωμένη συνάρτηση rand () που επιστρέφει ένα τυχαίο int. Μπορούμε να αναγκάσουμε αυτό σε μια περιοχή περνώντας τον μέγιστο αριθμό και χρησιμοποιώντας τον χειριστή%. (Modulus). Αυτό είναι σαν το ρολόι arithemetic εκτός από αντί για 12 ή 24 περνάμε σε έναν int αριθμό που ονομάζεται max.

/ * επιστρέφει έναν αριθμό μεταξύ 1 και max * /
int Τυχαία (int max) {
επιστροφή (rand ()% max) +1;
}

Αυτό είναι ένα παράδειγμα μιας λειτουργίας που είναι ένα κομμάτι κώδικα τυλιγμένο μέσα σε ένα δοχείο. Η πρώτη γραμμή εδώ που αρχίζει / * και τέλος * / είναι ένα σχόλιο. Λέει τι κάνει ο κώδικας αλλά αγνοείται από τον μεταγλωττιστή ο οποίος διαβάζει τις οδηγίες C και τις μετατρέπει σε οδηγίες που ο υπολογιστής καταλαβαίνει και μπορεί να εκτελέσει πολύ γρήγορα.

  • Αναρωτιέστε τι είναι ο μεταγλωττιστής; Ανάγνωση Τι είναι ένας μεταγλωττιστής; (Αρθρο)

Μια συνάρτηση είναι σαν μια μαθηματική συνάρτηση όπως Sin (x). Υπάρχουν τρία μέρη αυτής της λειτουργίας:

int Τυχαία (int max)

Το int λέει τον τύπο του αριθμού που επιστρέφει (συνήθως int ή float). Τυχαία είναι το όνομα της συνάρτησης και (int max) λέει ότι διαβιβάζουμε έναν int αριθμό. Μπορούμε να το χρησιμοποιήσουμε ως εξής:

int dice;
ζάρια = τυχαία (6); / * επιστρέφει έναν τυχαίο αριθμό μεταξύ 1 και 6 * /

Η γραμμή:

επιστροφή (rand ()% max) +1;

Στην επόμενη σελίδα: Δημιουργία χάρτη τυχαίας εκκίνησης

04

του 05

Δημιουργία χάρτη τυχαίας εκκίνησης

Χάρτης Star Empires

Ο παρακάτω κώδικας δημιουργεί το χάρτη εκκίνησης. Αυτό φαίνεται παραπάνω.

άκυρη GenMapSystems () {
int i, χ, γ;
για (x = 0, x για (y = 0, y διάταξης [x] [y] = ';
}
InitSystem (0,0,0,50,0);
InitSystem (9,4,4,50,1);
/ * Βρείτε έναν κενό χώρο για τα υπόλοιπα 8 συστήματα * /
για (i = 1, εγώ {
x = Τυχαία (5) -1.
y = τυχαία (5) -1;
}
ενώ (διάταξη [x] [y]! = '');
InitSystem (i, χ, γ, 15, -1).
}
}

Τα Συστήματα Παραγωγής είναι θέμα προσθήκης του συστήματος αναπαραγωγής και των αντιπάλων (στα 0,0) και (4,4) και στη συνέχεια τυχαία προσθήκη 8 συστημάτων στις υπόλοιπες 23 κενές θέσεις.

Ο κώδικας χρησιμοποιεί τρεις μεταβλητές int που ορίζονται από τη γραμμή

int i, χ, γ;

Μια μεταβλητή είναι μια θέση στη μνήμη που κατέχει μια τιμή int. Οι μεταβλητές x και y διατηρούν τις συντεταγμένες των συστημάτων και θα διατηρούν μια τιμή στην περιοχή 0-4. Η μεταβλητή i χρησιμοποιείται για την καταμέτρηση σε βρόχους.

Για να τοποθετήσουμε τα 8 τυχαία συστήματα στο πλέγμα 5x5 πρέπει να γνωρίζουμε αν μια τοποθεσία έχει ήδη ένα σύστημα και να εμποδίσει την τοποθέτηση ενός άλλου στην ίδια θέση. Γι 'αυτό χρησιμοποιούμε μια απλή δισδιάστατη σειρά χαρακτήρων. Ο τύπος char είναι ένας άλλος τύπος μεταβλητής στο C και περιέχει έναν μόνο χαρακτήρα όπως 'B' ή 'x'.

Αστάρι σε τύπους δεδομένων σε C

Ο θεμελιώδης τύπος των μεταβλητών στο C είναι int (ακέραιοι όπως 46), char (ένας χαρακτήρας όπως 'Α') και float (για τη διατήρηση αριθμών με πλωτό σημείο όπως 3.567). Οι πίνακες [] είναι για τη διατήρηση λίστας με το ίδιο στοιχείο. Έτσι char [5] [5] ορίζει μια λίστα των λιστών. μια δισδιάστατη σειρά χαρακτήρων. Σκεφτείτε το σαν 25 κομμάτια Scrabble τοποθετημένα σε ένα πλέγμα 5 x 5.

Τώρα βγάζουμε!

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

για (x = 0, x για (y = 0, y διάταξης [x] [y] = ';
}

  • x = 0; Αυτό είναι το μέρος προετοιμασίας.
  • Χ
  • x ++. Αυτό είναι το τμήμα αλλαγής. Προσθέτει 1 έως x.

Έτσι (για (x = 0, x

Στο εσωτερικό του για το (ο βρόχος x είναι ένας βρόχος y που κάνει το ίδιο για το y. Αυτός ο βρόχος y συμβαίνει για κάθε τιμή του X. Όταν το Χ είναι 0, το Y θα βγάλει από το 0 έως το 4, όταν το Χ είναι 1, το Υ θα βγάλει βρόχο και ούτω καθεξής. Αυτό σημαίνει ότι κάθε μία από τις 25 θέσεις στη διάταξη διάταξης αρχικοποιείται σε ένα χώρο.

Μετά το for loop, η λειτουργία InitSystem ονομάζεται με πέντε παραμέτρους int. Μια λειτουργία πρέπει να οριστεί πριν καλείται ή ο μεταγλωττιστής δεν θα γνωρίζει πόσες παράμετροι θα έπρεπε να έχει. Το InitSystem έχει αυτές τις πέντε παραμέτρους.

Στην επόμενη σελίδα: Δημιουργία χάρτη τυχαίας έναρξης συνεχίζεται ...

05

του 05

Η δημιουργία ενός χάρτη τυχαίας εκκίνησης συνεχίζεται

Αυτές είναι οι παράμετροι για το InitSystem.

  • systemindex - μια τιμή από 0 -9.
  • x και y - συντεταγμένες του συστήματος (0-4).
  • numships - πόσα πλοία υπάρχουν σε αυτό το σύστημα.
  • ιδιοκτήτης. Ποιος κατέχει ένα σύστημα. 0 σημαίνει ο παίκτης, 9 σημαίνει ο εχθρός.

Έτσι, η γραμμή InitSystem (0,0,0,50,0) αρχικοποιεί το σύστημα 0 σε θέσεις x = -0, y = 0 με 50 πλοία στον ιδιοκτήτη 0.

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

για (i = 1, εγώ {
x = Τυχαία (5) -1.
y = τυχαία (5) -1;
}
ενώ (διάταξη [x] [y]! = '');
InitSystem (i, χ, γ, 15,0).
}

Υπάρχουν δύο ενσωματωμένοι βρόχοι σε αυτόν τον κώδικα. Ο εξωτερικός βρόχος είναι μια δήλωση που υπολογίζει τη μεταβλητή i από μια αρχική τιμή 1 έως μια τελική τιμή 8. Θα χρησιμοποιήσουμε το i για να αναφερθώ στο σύστημα. Θυμηθείτε ότι έχουμε ήδη αρχίσει το σύστημα 0 και 9, οπότε τώρα αρχικοποιούμε τα συστήματα 1-8.

Όλα από το do {while. (Layout [x] [y] είναι ο δεύτερος βρόχος. Η σύνταξη είναι do {κάτι} ενώ (η προϋπόθεση είναι αληθής). Έτσι, εκχωρούμε τυχαίες τιμές στα x και y, κάθε τιμή στην περιοχή 0-4. Τυχαία (5) επιστρέφει μια τιμή στην περιοχή 1 έως 5, αφαιρώντας το 1 παίρνει το εύρος 0-4.

Δεν θέλουμε να βάλουμε δύο συστήματα στις ίδιες συντεταγμένες έτσι ώστε αυτός ο βρόχος να ψάχνει για μια τυχαία θέση που να έχει χώρο μέσα του. Εάν υπάρχει σύστημα εκεί, η διάταξη [x] [y] δεν θα είναι κενό. Όταν καλούμε το InitSystem, υπάρχει μια διαφορετική τιμή. BTW! = Μέσο που δεν ισούται με και == σημαίνει ίσο με.

Όταν ο κώδικας φτάσει στο InitSystem μετά από το (layout [x] [y]! = ''), Τα x και y σίγουρα αναφέρονται σε μια θέση στη διάταξη που έχει ένα κενό σε αυτό. Έτσι, μπορούμε να καλέσουμε το InitSystem και στη συνέχεια να γυρίσουμε τον βρόχο για να βρούμε μια τυχαία θέση για το επόμενο σύστημα έως ότου έχουν τοποθετηθεί και τα 8 συστήματα.

Η πρώτη κλήση προς το InitSystem θέτει το σύστημα 0 στη θέση 0,0 (το επάνω αριστερό μέρος του πλέγματος) με 50 στόλους και κερδίζεται από εμένα. Η δεύτερη κλήση αρχικοποιεί το σύστημα 9 στην τοποθεσία 4,4 (κάτω δεξιά) με 50 στόλους και ανήκει στον παίκτη 1. Θα εξετάσουμε προσεκτικά τι κάνει πραγματικά το InitSystem στο επόμενο σεμινάριο.

#καθορίζω

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

  • #define WIDTH 80
  • #define HEIGHT 50
  • #define MAXLEN 4
  • #define MAXFLEETS 100
  • #define MAXSYSTEMS 10
  • #define FIGHTMARKER 999

συμπέρασμα

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

  • για (i = 0, i
  • για (i = 0, i

Tutorial Twowill εξετάστε τις πτυχές του C που αναφέρονται σε αυτό το σεμινάριο.

instagram story viewer