Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Σχετικά έγγραφα
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 7 Ο. Αριθμητικές πράξεις Τυχαίοι αριθμοί Εφαρμογές σε προβλήματα ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στον Προγραμματισμό

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Μεθόδων Επίλυσης Προβλημάτων

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Εισαγωγή στον Προγραμματισμό

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Διαδικασιακός Προγραμματισμός

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Μεταβλητές τύπου χαρακτήρα

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Διαδικασιακός Προγραμματισμός

Διάλεξη 5η: Εντολές Επανάληψης

Η γλώσσα προγραμματισμού C

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Προγραμματισμός Ι (ΗΥ120)

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Η γλώσσα προγραμματισμού C

Η γλώσσα προγραμματισμού C

Βασικές Αρχές Προγραμματισμού

Εισαγωγή στον Προγραμματισμό

12. Συναρτήσεις (Μέρος ΙI)

Ανάπτυξη και Σχεδίαση Λογισμικού

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

Προγραμματισμός Ι (ΗΥ120)

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Δομημένος Προγραμματισμός (ΤΛ1006)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Τύποι δεδομένων, τελεστές, μεταβλητές

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

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

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Εισαγωγή στον Προγραμματισμό

Η γλώσσα προγραμματισμού C

Προγραμματισμός Η/Υ (ΤΛ2007 )

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Η άσκηση μπορεί να γίνει με συνεργασία το πολύ δυο φοιτητών, οι οποίοι θα λάβουν τον ίδιο βαθμό στην εργασία.

Εισαγωγή στη γλώσσα προγραμματισμού C++

Δείκτες & Πίνακες Δείκτες, Πίνακες

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Προγραμματισμός Ι (HY120)

Διαδικασιακός Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ 23/04/2012. Α. Να απαντήσετε με Σ ή Λ στις παρακάτω προτάσεις:

Η γλώσσα προγραμματισμού C

Οικονόμου Βαγγέλησ Διάλεξη Νο 2. Δομημένοσ Προγραμματιςμόσ - Διάλεξη 2

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C

Διαδικασιακός Προγραμματισμός

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

ΣΥΝΟΠΤΙΚΟΣ ΟΔΗΓΟΣ ΓΛΩΣΣΑΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες.

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

ΣΤΗΛΗ Β ΑΠΟΤΕΛΕΣΜΑ 1. float(10) α pow(2,3) β abs(-10) γ int(5.6) δ. 10 ε. 5.6 Μονάδες 8 ΣΤΗΛΗ Α ΣΥΝΑΡΤΗΣΗ

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Προγραμματισμός Ι (ΗΥ120)

scanf() scanf() stdin scanf() printf() int float double %lf float

Γλώσσα Προγραμματισμού C

Transcript:

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C Φεβρουάριος/Μάρτιος 2013 v. 0.1

Master-mind: κανόνες παιχνιδιού Στο master mind χρειάζεται να παράγονται κάθε φορά 4 τυχαία σύμβολα από ένα πλήθος 6 διαφορετικών συμβόλων. Πρώτα απ'όλα χρειάζεται λοιπόν να επιλέξουμε 6 τέτοια σύμβολα από το πληκτρολόγιο του υπολογιστή: @ # * & $ % δηλαδή, όπως εμφανίζονται στην παραπάνω σειρά, τα σύμβολα αυτά αντιστοιχούν στους συνδυασμούς των πλήκτρων: shift+2, shift+3, shift+8, shift+7, shift+4 και shift+5. Το πρόγραμμα στη συνέχεια θα επιλέγει κάθε φορά μία τυχαία τετράδα από τα παραπάνω σύμβολα, την οποία εμείς θα καλούμαστε να ανακαλύψουμε. Σημειώνεται πως μέσα σε μία τέτοια τετράδα δεν αποκλείεται να επαναλαμβάνεται το ίδιο σύμβολο πάνω από μία φορά. Όλοι δηλαδή από τους παρακάτω συνδυασμούς είναι επιτρεπτοί: @ # * & & # % & * * * $ $ $ $ $ Εμείς στη συνέχεια καλούμαστε σε 7 βήματα να βρούμε τον παραπάνω συνδυασμό συμβόλων με τη σωστή τους σειρά. Δίνουμε λοιπόν κάθε φορά και μία άλλη τετράδα και το πρόγραμμα μας απαντάει κατά πόσο αυτή είναι σωστή. Εάν βρούμε κάποιο σύμβολο που χρησιμοποιείται στην τετράδα χωρίς να είναι στη σωστή θέση, η εφαρμογή μας επιστρέφει ένα αγγλικό ερωτηματικό (?), ενώ εάν το βρούμε και στη σωστή του θέση, μας επιστρέφει ένα θαυμαστικό (!). Έτσι, για παράδειγμα, εάν η εφαρμογή έχει επιλέξει την παρακάτω τετράδα: & # % & και εμείς δώσουμε: & @ & % η εφαρμογή θα επιστρέψει:!??? Προσπαθούμε λοιπόν με βάση τις απαντήσεις που λαμβάνουμε κάθε φορά να βρούμε τη σωστή τετράδα συμβόλων στη σωστή σειρά. Το πρόγραμμα τερματίζεται είτε με την ολοκλήρωση της έβδομης επανάληψης, είτε νωρίτερα, εάν βέβαια βρούμε το σωστό συνδυασμό. Ξεκινάμε λοιπόν τον προγραμματισμό της εφαρμογής, με το πρώτο βήμα, σύμφωνα με το οποίο ο υπολογιστής πρέπει να παράγει μία 4άδα συμβόλων μέσα από ένα πλήθος έξι συμβόλων.

Βήμα 1: Έξι σύμβολα αποθηκεύονται στον Η/Υ Γενικά στον προγραμματισμό, προκειμένου να χειριστούμε με ευκολία ομοειδείς ομάδες δεδομένων χρησιμοποιούμε τους πίνακες. Ένας πίνακας αφορά ένα πλήθος συνεχόμενων θέσεων στη μνήμη στις οποίες μπορούμε να αποθηκεύσουμε δεδομένα του ίδιου τύπου και να τα επεξεργαστούμε με μεγάλη ευκολία. Στη C, προκειμένου να χρησιμοποιήσουμε πίνακες χρειάζεται πρώτα απ όλα να τους δηλώσουμε στην αρχή του προγράμματος, όπως ακριβώς κάνουμε και με τις υπόλοιπες μεταβλητές. Γενικά δηλώνουμε έναν πίνακα, ως εξής: τύπος_δεδομένων όνομα_πίνακα[χ] όπου, τύπος_δεδομένων: ο τύπος των δεδομένων που θα αποθηκευθούν στον πίνακα (π.χ. int, float, char κ.ο.κ.) όνομα_πίνακα: το όνομα με το οποίο θα καλείται ο πίνακας Χ: το πλήθος των θέσεων του πίνακα που θα κρατηθούν στη μνήμη Παραδείγματα δήλωσης πινάκων: int A[100]; float Vangelis[32768]; char z34[17]; Στην πρώτη περίπτωση δηλώνουμε έναν πίνακα ο οποίος θα ονομάζεται A και θα κρατάει 100 ακέραιους αριθμούς στη μνήμη, στη δεύτερη έναν άλλον με όνομα Vangelis στις θέσεις του οποίου μπορούμε να αποθηκεύσουμε 32768 δεκαδικούς αριθμούς και στην τρίτη περίπτωση έναν πίνακα με όνομα z34 στον οποίο μπορούμε να αποθηκεύσουμε 17 χαρακτήρες. Το δεύτερο γνώρισμα σε έναν πίνακα είναι πως μπορούμε να αναφερθούμε σε μία οποιαδήποτε θέση του, δηλώνοντας τη θέση αυτή εντός των παρενθέσεων του. Σημειώνεται, δε, πως η αρίθμηση αυτή ξεκινάει από το μηδέν. Έτσι η πρώτη θέση είναι η θέση [0], η δεύτερη η θέση [1], η τεσσαρακοστή όγδοη η θέση [47] κ.ο.κ. Γράφουμε για παράδειγμα: A[28] = 32; δηλαδή, στην 29η θέση του πίνακα A βάζουμε την τιμή 32, ή: z34[0] = 'q'; δηλαδή, στην πρώτη θέση του πίνακα z34 θέτουμε το χαρακτήρα q, ή: Vangelis[1000]= Vangelis[999]+3.14; δηλαδή, στη 1001η θέση του πίνακα Vangelis, βάλε το άθροισμα της τιμής που έχει η 1000η θέση με τον αριθμό 3.14.

Στην εφαρμογή μας χρειαζόμαστε έναν πίνακα 6 θέσεων στις οποίες θα αποθηκεύσουμε τους έξι χαρακτήρες-σύμβολα, που θα χρησιμοποιήσουμε στο παιχνίδι μας. Στην αρχή του προγράμματος δηλώνουμε λοιπόν: char Set[6]; Μόλις γράψουμε μία τέτοια δήλωση στη C, αμέσως καταλαμβάνονται έξι συνεχόμενες θέσεις μνήμης οι οποίες είναι κενές. Χρειάζεται λοιπόν στη συνέχεια να γεμίσουμε τις θέσεις αυτές με τα σύμβολα που θα χρησιμοποιήσουμε: Set[0]='@'; Set[1]='#'; Set[2]='*'; Set[3]='&'; Set[4]='$'; Set[5]='%'; Ο πίνακας τώρα είναι έτοιμος για να τον χρησιμοποιήσουμε. Βήμα 2: Το πρόγραμμα επιλέγει και αποθηκεύει 4 τυχαία σύμβολα Το βήμα αυτό θα αναλυθεί σε 3 ενότητες: 2.1 Το πρόγραμμα θα παράγει 4 ψευδοτυχαίους αριθμούς από 0 έως 5 με τη χρήση των συναρτήσεων rand(), srand() 2.2 Οι τέσσερις αυτοί αριθμοί θα γίνουν δείκτες στον πίνακα Set[] προκειμένου να επιλέξουν 4 σύμβολα του πίνακα 2.3 Τα τέσσερα αυτά σύμβολα θα αποθηκευθούν στον πίνακα Game[] ο πίνακας δηλαδή στον οποίο αποθηκεύονται τα σύμβολα που πρέπει να ανακαλύψουμε 2.1. Παραγωγή 4 ψευδοτυχαίων αριθμών Όπως είδαμε και στην περιγραφή του παιχνιδιού, κάθε φορά που ξεκινάμε το παιχνίδι, χρειάζεται με τυχαίο τρόπο να παράγεται από την εφαρμογή μία διαφορετική τετράδα συμβόλων. Αυτή θα είναι η τετράδα που θα πρέπει εμείς ως παίκτες να ανακαλύψουμε. Στον προγραμματισμό, προκειμένου να παραχθεί μία τιμή με τυχαίο τρόπο, χρησιμοποιούμε κάποιες συναρτήσεις που ονομάζονται γεννήτριες ψευδοτυχαίων αριθμών. Η συνάρτηση αυτή στη γλώσσα C είναι η συνάρτηση rand(). Η rand() κάθε φορά που καλείται επιστρέφει μία επόμενη ψευδοτυχαία αριθμητική τιμή με εύρος τιμών, μεταξύ δηλαδή του 0 και του 32767. Παράδειγμα παραγωγής τεσσάρων τέτοιων τιμών: #include <stdlib.h> #include <stdio.h> int main(void){ int i, j;

j = rand(); printf("%d\n", j); return 0; Σημειώνεται πως η βιβλιοθήκη stdlib.h πρέπει να περιληφθεί στον κώδικα με τη δήλωση #include. Εάν εκτελέσουμε δεύτερη φορά τον παραπάνω κώδικα παρατηρούμε πως η σειρά των ψευδοτυχαίων αριθμών επαναλαμβάνεται. Αυτό συμβαίνει γιατί οι τιμές αυτές παράγονται από μία προκαθορισμένη συνάρτηση, η οποία κάθε φορά που καλείται επαναλαμβάνει την λειτουργία της με τον ίδιο τρόπο. Για να αποφύγουμε αυτή την ομοιομορφία, χρησιμοποιούμε μία επιπλέον συνάρτηση, τη συνάρτηση srand(). Η συνάρτηση srand() χρησιμοποιείται προκειμένου να καθορίσει το αρχικό σημείο από το οποίο θα ξεκινήσουν να παράγονται οι ψευδοτυχαίες τιμές από τη συνάρτηση rand(). Συντάσσεται ως εξής: srand(x); όπου αναλόγως την τιμή του x, μία άλλη σειρά από ψευδοτυχαίους αριθμούς θα παράγεται κάθε φορά από τη rand(). Έτσι, εάν στον κώδικα μεταβάλλουμε κάθε φορά την τιμή της x, εκτελώντας στη συνέχεια τη rand()θα έχουμε και μία άλλη σειρά από ψευδοτυχαίες τιμές. Προκειμένου λοιπόν οι ψευδοτυχαίες τιμές να είναι μοναδικά διαφορετικές, πρέπει κάθε φορά η τιμή του x να είναι μοναδικά διαφορετική. Για να το πετύχουμε αυτό θέτουμε στη μεταβλητή x μία τιμή, η οποία πρέπει να αφορά κάποια μοναδική τιμή μέτρησης, όπως για παράδειγμα η ώρα του συστήματος: ltime = time(null); stime = (unsigned) ltime/2; srand(stime); Αναλυτικότερα, η ώρα του συστήματος αποτυπώνεται σε έναν long integer αριθμό με τη συνάρτηση time(): long ltime; ltime = time(null); Στη συνέχεια μετατρέπουμε τον long integer αριθμό σε απλό integer. Αυτό γίνεται προτάσσοντας τη δήλωση unsigned εντός παρένθεσης. Τη νέα μορφή απλού integer τη θέτουμε στη μεταβλητή stime: int stime; stime = (unsigned) ltime/2; srand(stime); Συνολικά τώρα, ο κώδικας παραγωγής 4 ψευδοτυχαίων μοναδικών αριθμών έχει ως εξής:

#include <stdlib.h> #include <stdio.h> #include <time.h> int main(void){ int i, j; int stime; long ltime; ltime = time(null); stime = (unsigned) ltime/2; srand(stime); j = rand(); printf("%d\n", j); return 0; Σημειώνεται πως προκειμένου να αναγνωριστεί η συνάρτηση time() χρειάζεται να συμπεριλάβουμε τη βιβλιοθήκη <time.h> στην αρχή του κώδικα, με τη δήλωση #include. Εάν τώρα θέλουμε να επιλέξουμε τέσσερα τυχαία σύμβολα από τον πίνακα Set[], χρειάζεται να παράγουμε 4 τυχαίους αριθμούς από το 0 έως το 5, προκειμένου οι αριθμοί αυτοί να γίνουν δείκτες σε κάποια από τις έξι θέσεις του πίνακα, δηλαδή από τη θέση [0] (δείκτης: 0-1η θέση του πίνακα), έως τη θέση [5] (δείκτης: 5-6η θέση του πίνακα). Αφού λοιπόν η rand() παράγει τιμές από 0 έως 32767, διαιρούμε με την τιμή 5462, προκειμένου η rand() να επιστρέφει πλέον τιμές από 0 έως 5.999. Γράφουμε λοιπόν: j = rand()/5462; Επειδή μάλιστα η διαίρεση είναι ακέραια, επιστρέφεται το ακέραιο μόνο μέρος της πράξης, το j δηλαδή θα παίρνει τιμές από 0 έως 5. Γράφουμε λοιπόν: #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void){ int i, j; int stime; long ltime; ltime = time(null); stime = (unsigned) ltime/2; srand(stime); j = rand()/5462; printf("%d\n", j);

return 0; 2.2. Επιλογή τεσσάρων τυχαίων συμβόλων Κάθε ένας από τους τέσσερις ακέραιους αριθμούς, με τιμές από 0 έως 5, που παράγονται από τον παραπάνω κώδικα, γίνονται στη συνέχεια δείκτες στον πίνακα Set[]. Κατ'άυτον κάθε ένας από τους τέσσερις αυτούς ακέραιους, 'δειχνει' ένα διαφορετικό σύμβολο του πίνακα Set[]. Συνολικά ο κώδικας για την παραγωγή μίας τυχαίας τετράδας συμβόλων από τον πίνακα Set[], έχει ως εξής: #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void){ int i, j; int stime; long ltime; char Set[6]; Set[0]='@'; Set[1]='#'; Set[2]='*'; Set[3]='&'; Set[4]='$'; Set[5]='%'; ltime = time(null); stime = (unsigned) ltime/2; srand(stime); j = rand()/5462; printf(" %c ", Set[j]); return 0; 2.3. Αποθήκευση των τεσσάρων τυχαίων συμβόλων Το τελικό στάδιο είναι να αποθηκεύσουμε τα τέσσερα αυτά σύμβολα σε ένα ξεχωριστό πίνακα, στον πίνακα Game[], ο οποίος κρατάει τα σύμβολα του παιχνιδιού που πρέπει να ανακαλύψουμε. Ο πίνακας αυτός, χωρητικότητα 4 συμβόλων, πρέπει να οριστεί στην αρχή του προγράμματος: char Game[4];

Στη συνέχεια κάθε φορά που επιλέγεται ένα σύμβολο από τον πίνακα Set[], πρέπει να αποθηκεύεται στον πίνακα Game[]. Χρησιμοποιώντας σαν δείκτη για τον πίνακα Game[] το μετρητή i του βρόγχου for, τα σύμβολα αυτά αποθηκεύονται σε συνεχόμενες θέσεις του πίνακα με αύξουσα σειρά: ξεκινώντας δηλαδή με i=0 (Game[0] - 1η θέση του πίνακα) και καταλήγοντας με i=3 (Game[3] - 4η θέση του πίνακα): j = rand()/5462; Game[i] = Set[j]; Μπορούμε, τέλος, να προσθέσουμε ένα ξεχωριστό βρόγχο προκειμένου να εμφανίσουμε τα σύμβολα του παιχνιδιού: for(i=0; i<4; i++) printf(" %c ", Game[i]); Συνολικά, ο κώδικας: #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void){ int i, j; int stime; long ltime; char Set[6], Game[4]; Set[0]='@'; Set[1]='#'; Set[2]='*'; Set[3]='&'; Set[4]='$'; Set[5]='%'; ltime = time(null); stime = (unsigned) ltime/2; srand(stime); j = rand()/5462; Game[i] = Set[j]; for(i=0; i<4; i++) printf(" %c ", Game[i]); return 0;

Βήμα 3: Ο παίκτης δίνει 4 σύμβολα Χρειαζόμαστε και έναν τρίτο πίνακα προκειμένου να αποθηκεύουμε τις κινήσεις του παίκτη. Ας τον ονομάσουμε Player[] και ας τον δηλώσουμε στην αρχή του προγράμματος: char Player[4]; Η εφαρμογή θα διαβάζει τις επιλογές του παίκτη και θα τις αποθηκεύει στον πίνακα: printf("set symbol no: %d\n", i+1); s = getchar(); while(s!='@' s!='#' s!='*' s!='&' s!='$' s!='%'){ printf("invalid symbol!\n") printf("please try one of: {@, #, *, &, $, %\n"); s = getchar(); Player[i] = s; Βήμα 4: Η εφαρμογή συγκρίνει τα σύμβολα του παίκτη με αυτά του παιχνιδιού 4.1. Πράξεις Λογικής Για να ελέγχουμε τις απαντήσεις του παίκτη, θα χρησιμοποιήσουμε πράξεις λογικής. Η πρώτη πράξη θα είναι η πράξη AND. Ο πίνακας της πράξης αυτής έχει ως εξής: Α Β Α Β 0 0 0 0 1 0 1 0 0 1 1 1 Παρατηρούμε πως η πράξη αυτή επιστρέφει τιμή TRUE (1), μόνο εάν και οι δύο τελεστές είναι και αυτοί TRUE. Αυτό μπορεί να χρησιμοποιηθεί στο παιχνίδι μας για να ελέγξουμε εάν ένα σύμβολο που δίνει ο πάικτης είναι στην ίδια ακριβώς θέση με το σύμβολο του παιχνιδιού. Στη C η πράξη αυτή συμβολίζεται με τα σύμβολα &&. Μία άλλη πράξη που θα χρησιμοποιήσουμε είναι η πράξη XOR (Exclusive OR). Ο πίνακας της πράξης αυτής έχει ως εξής:

Α Β A XOR B 0 0 0 0 1 1 1 0 1 1 1 0 Προϋπόθεση για να επιστρέψει η πράξη αυτή TRUE, είναι μόνο ο ένας εκ των δύο τελεστών να είναι TRUE. Στη C η πράξη αυτή δεν υπάρχει σε έτοιμη βιβλιοθήκη και πρέπει να υλοποιηθεί σαν συνδυασμός άλλων λογικών πράξεων: (A OR B) AND (NOT (A AND B)) Α Β A OR B NOT (A AND B) (A OR B) AND (NOT (A AND B)) 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 Η συνάρτηση αυτή μπορεί να γραφεί στη C ως εξής: int xor(int a, int b); xor(int a, int b){ int c; c = (a b)) &&!(a && b); return c; 4.2 Περίπτωση α': Το σωστό σύμβολο στη σωστή θέση Στην περίπτωση που ο παίκτης έχει βρει το σωστό σύμβολο στη σωστή θέση, αρκεί μία πράξη AND για να πιστοποιηθεί κάτι τέτοιο: $ % $ $ AND * $ $ # =

0 0 1 0 4.3 Περίπτωση β': Το σωστό σύμβολο στη λάθος θέση Στην περίπτωση αυτή πρέπει για κάθε ένα από τα έξι σύμβολα του παιχνιδιού, να ακολουθήσουμε τα εξής βήματα: 1. Μία πράξη XOR η οποία καταλήγει με έναν πίνακα Χ ο οποίος θα εμφανίσει τις θέσεις που το σύμβολο απαντάται και στους δύο πίνακες αλλά όχι στις ίδιες θέσεις. Παράδειγμα: P 1 0 1 1 XOR G 0 1 1 0 = Χ 1 1 0 1 2. Ο πίνακας Χ που πήραμε στο προηγούμενο βήμα, γίνεται AND με κάθε έναν από τους δύο πίνακες και τους αντικαθιστά, δηλαδή: Χ 1 1 0 1 AND P 1 0 1 1 = P' 1 0 0 1 και: Χ 1 1 0 1 AND G 0 1 1 0 =

G' 0 1 0 0 Πρακτικά, οι πίνακες P' και G' με τους οποίους καταλήγουμε, περιέχουν τις θέσεις που εμφανίζεται το σύμβολο, αποκλειστικά όμως στον ένα εκ των δύο -όχι δηλαδή και στους δύο ταυτόχρονα. Μας αφορά λοιπόν το πλήθος των εμφανίσεων στον πίνακα P' (του παίκτη δηλαδή), χωρίς όμως αυτές να ξεπερνούν το πλήθος εμφανίσεων στον πίνακα G' (του παιχνιδιού). Αυτό προγραμματιστικά γίνεται με τη σύγκριση δύο μετρητών. (συνεχίζεται...)