Fotic Δημοσ. 23 Νοεμβρίου 2015 Δημοσ. 23 Νοεμβρίου 2015 (επεξεργασμένο) Καλησπέρα στην κοινότητα είμαι πρωτοετής και μας έβαλαν να φτιάξουμε μια τρίλιζα στην C++, αλλά επειδή είμαι noobie να με βοηθήσει κάποιος. 1ο Πρόβλημα: δεν μπορώ να εμφανίσω όταν οι παίκτες είναι σε κατάσταση ισοπαλίας 2ο Πρόβλημα: αν υπάρχει κάποια άλλη "οικονομική" μέθοδος για να λειτουργήσει η checkWhoWins (με λιγότερες γραμμές κώδικα εννοώ) (ο περισσότερος κώδικας είναι από ένα παλιό άρθρο απλά έκανα κάπιες αλλαγές για την εργασία μου) #include <iostream> #include <string> using namespace std; int checkWhoWins(char[3][3]); void printTriliza(char[3][3]); int main(){ int i,x; //To 'x' pernei tis 8eseis, to 'i' einai o metritis string name1,name2; char Tril[3][3] = {'1','2','3','4','5','6','7','8','9'}; //Einai h arithmoi stous opoious tha mpenei to 'X' h to 'O' cout << "Exontas ton parakato sxediagramma pata to katallhlo noumero gia to pou theleis na baleis thn epilogh soy:\n\n" << "|1| |2| |3|\n" << "|4| |5| |6|\n" << "|7| |8| |9|\n\n"; cout<< "Dwse to Onoma tou 1ou Pexti: "; cin >> name1; cout<< "Dwse to Onoma tou 2ou Pexti: "; cin >> name2; for (i=0;i<9;i++){ x=-1; while ( (x<1 || x>9) || (Tril[(x-1)/3] [(x-1)%3]>'9') ){ if (i%2==0) {cout<< endl <<name1 <<" dwse arithmo (apo 1-9): "; cin>>x;} //getchar(); else {cout<< endl <<name2 <<" dwse arithmo (apo 1-9): "; cin>>x;} if ((x<1 || x>9)) //Elenxei an h kataxwrish einai anamesa sto 1 & to 9 cout<<"Lathos arithmos prepei na einai apo 1-9, Prospathise ksana!!!!"<<endl; else if (Tril[(x-1)/3] [(x-1)%3]>'9') //Elenxei an to pedio-kouti einai eidi simpliromeno cout<<"Lathos arithmos prepei to pedio na einai adeio, Prospathise ksana!!!"<<endl; } if (i%2==0) //Ypologismos tis 8eseis sto opio 8a kataxwri8ei to 'X' h to 'O' Tril[(x-1)/3] [(x-1)%3]='X'; else Tril[(x-1)/3] [(x-1)%3]='O'; printTriliza(Tril); //Ektipwnei to sxedio tis Trilizas mazi me ton char 'X' h 'O'(apo tin sin.'printTriliza') stin met.'Tril' cout<<"____________________"<<endl; int winner=checkWhoWins(Tril); //H met. 'winner' pernei tin timh tis sin.'checkWhoWins' if (winner>20){ //Emfanish tou nikhth cout<<"Nikitis einai o "<<name2<<endl; break; } else if (winner>=10){ cout<<"Nikitis einai o "<<name1<<endl; break; } } //getchar(); return 0; } int checkWhoWins(char triliza[3][3]) //16 pi8anes katastaseis gia nikh (8 gia to 'O' & 8 gia to 'X') { int i,j,result=0; for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i] [j]=='X') { if ((triliza[i+1][j]=='X') && (triliza[i+2][j]=='X')) result=10; else if ((triliza[i][j+1]=='X') && (triliza[i][j+2]=='X')) result=10; else if ((triliza[i+1][j+1]=='X') && (triliza[i+2][j+2]=='X')) result=10; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i] [j]=='O') { if ((triliza[i+1][j]=='O') && (triliza[i+2][j]=='O')) result=20; else if ((triliza[i][j+1]=='O') && (triliza[i][j+2]=='O')) result=20; else if ((triliza[i+1][j+1]=='O') && (triliza[i+2][j+2]=='O')) result=20; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i] [j+1]=='X') { if ((triliza[i+1][j+1]=='X') && (triliza[i+2][j+1]=='X')) result=10; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i] [j+1]=='O') { if ((triliza[i+1][j+1]=='O') && (triliza[i+2][j+1]=='O')) result=20; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i] [j+2]=='X') { if ((triliza[i+1][j+2]=='X') && (triliza[i+2][j+2]=='X')) result=10; else if ((triliza[i+1][j+1]=='X') && (triliza[i+2][j]=='X')) result=10; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i] [j+2]=='O') { if ((triliza[i+1][j+2]=='O') && (triliza[i+2][j+2]=='O')) result=20; else if ((triliza[i+1][j+1]=='O') && (triliza[i+2][j]=='O')) result=20; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i+1] [j+1]=='X') { if ((triliza[i+1][j]=='X') && (triliza[i+1][j+2]=='X')) result=10; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i+1] [j+1]=='O') { if ((triliza[i+1][j]=='O') && (triliza[i+1][j+2]=='O')) result=20; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i+2] [j]=='X') { if ((triliza[i+2][j+1]=='X') && (triliza[i+2][j+2]=='X')) result=10; } } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { if (triliza[i+2] [j]=='O') { if ((triliza[i+2][j+1]=='O') && (triliza[i+2][j+2]=='O')) result=20; } } } return result; //H 'result' mpenei stin met. 'Tril' otan tin kalesoume stin main } void printTriliza(char triliza[3][3]){ //Ekteiponei tin Triliza mazi mazi me ton char 'X' h 'O' for (int row=0; row<3; row++){ //kai otan kalite apo tin main mpainei stin met. 'Tril' for (int col=0; col<3; col++){ cout<<" "<<triliza[row][col]; if (col!=2) cout<<"|"; } cout<<endl<<"--+--+--"<<endl; } } Επεξ/σία 23 Νοεμβρίου 2015 από Fotic
defacer Δημοσ. 23 Νοεμβρίου 2015 Δημοσ. 23 Νοεμβρίου 2015 1ο Πρόβλημα: δεν μπορώ να εμφανίσω όταν οι παίκτες είναι σε κατάσταση ισοπαλίας 2ο Πρόβλημα: αν υπάρχει κάποια άλλη "οικονομική" μέθοδος για να λειτουργήσει η checkWhoWins (με λιγότερες γραμμές κώδικα εννοώ) (ο περισσότερος κώδικας είναι από ένα παλιό άρθρο απλά έκανα κάπιες αλλαγές για την εργασία μου) 1. Περίεργο, εμένα μου φαίνεται πως αν h checkWhoWins επιστρέψει 0 τότε έχουμε ισοπαλία. Duh, λάθος μου. Αλλά και πάλι δεν είναι προφανές ποιά είναι η συνθήκη ισοπαλίας; Η checkWhoWins επιστρέφει μηδέν την ώρα που το ταμπλό είναι γεμάτο. 2. Η αναπαράσταση του board που έχεις (3x3 πίνακας με "X" και "O") είναι άθλια και όσο κι αν το ζορίσεις η βελτίωση θα είναι μόνο μέχρι ένα σημείο. Αυτή πρέπει να είναι η απεικόνιση του board, όχι η αναπαράσταση. Με μια καλύτερη αναπαράσταση θα μπορούσες να γράψεις την checkWhoWins ως εξής: int[] winPossibilities { triliza[0] + triliza[1] + triliza[2], // 1η γραμμή triliza[3] + triliza[4] + triliza[5], // 2η γραμμή triliza[6] + triliza[7] + triliza[8], // 3η γραμμή triliza[0] + triliza[3] + triliza[6], // 1η στήλη triliza[1] + triliza[4] + triliza[7], // 2η στήλη triliza[2] + triliza[5] + triliza[8], // 3η στήλη triliza[0] + triliza[4] + triliza[8], // 1η διαγώνιος triliza[2] + triliza[4] + triliza[6], // 2η διαγώνιος }; for(auto sum : winPossibilities) { if (abs(sum) == 3) return sum / 3; } return 0; Αφήνω σαν άσκηση το ποιά είναι αυτή η αναπαράσταση και τι σημαίνει η επιστρεφόμενη τιμή. ΥΓ ο κώδικας που έχεις δεν ξέρω από που προέρχεται αλλά είναι σούπερ προβληματικός και γεμάτος σφάλματα.
V.I.Smirnov Δημοσ. 23 Νοεμβρίου 2015 Δημοσ. 23 Νοεμβρίου 2015 (επεξεργασμένο) Το "παλιό άρθρο" που αναφέρεις έχει και μια δική μου υλοποίηση όπου φαίνεται πώς μπορεί να γραφεί η checkWhoWins με πολύ κομψό και οικονομικό τρόπο. (post #7) : http://www.insomnia.gr/topic/403494-%CE%B4%CE%B7%CE%BC%CE%B9%CE%BF%CF%85%CF%81%CE%B3%CE%AF%CE%B1-%CE%B1%CF%80%CE%BB%CE%AE%CF%82-%CF%84%CF%81%CE%AF%CE%BB%CE%B9%CE%B6%CE%B1%CF%82-%CE%BC%CE%B5-c/ Eίναι λίγο διαφορετικό απ' το ζητούμενο διότι αφορά παίκτη vs υπολογιστή, αλλά θα μάθεις αρκετά αν το διαβάσεις.... - Επεξ/σία 23 Νοεμβρίου 2015 από V.I.Smirnov
groot Δημοσ. 23 Νοεμβρίου 2015 Δημοσ. 23 Νοεμβρίου 2015 Και ο κώδικας ΔΕΝ είναι C++. Πλέον η C++ έχει και την std::array με δικούς της iterators.
Fotic Δημοσ. 23 Νοεμβρίου 2015 Μέλος Δημοσ. 23 Νοεμβρίου 2015 (επεξεργασμένο) 1. Περίεργο, εμένα μου φαίνεται πως αν h checkWhoWins επιστρέψει 0 τότε έχουμε ισοπαλία. Duh, λάθος μου. Αλλά και πάλι δεν είναι προφανές ποιά είναι η συνθήκη ισοπαλίας; Η checkWhoWins επιστρέφει μηδέν την ώρα που το ταμπλό είναι γεμάτο. 2. Η αναπαράσταση του board που έχεις (3x3 πίνακας με "X" και "O") είναι άθλια και όσο κι αν το ζορίσεις η βελτίωση θα είναι μόνο μέχρι ένα σημείο. Αυτή πρέπει να είναι η απεικόνιση του board, όχι η αναπαράσταση. Με μια καλύτερη αναπαράσταση θα μπορούσες να γράψεις την checkWhoWins ως εξής: int[] winPossibilities { triliza[0] + triliza[1] + triliza[2], // 1η γραμμή triliza[3] + triliza[4] + triliza[5], // 2η γραμμή triliza[6] + triliza[7] + triliza[8], // 3η γραμμή triliza[0] + triliza[3] + triliza[6], // 1η στήλη triliza[1] + triliza[4] + triliza[7], // 2η στήλη triliza[2] + triliza[5] + triliza[8], // 3η στήλη triliza[0] + triliza[4] + triliza[8], // 1η διαγώνιος triliza[2] + triliza[4] + triliza[6], // 2η διαγώνιος }; for(auto sum : winPossibilities) { if (abs(sum) == 3) return sum / 3; } return 0; Αφήνω σαν άσκηση το ποιά είναι αυτή η αναπαράσταση και τι σημαίνει η επιστρεφόμενη τιμή. ΥΓ ο κώδικας που έχεις δεν ξέρω από που προέρχεται αλλά είναι σούπερ προβληματικός και γεμάτος σφάλματα. απότη κατάλαβα αν δεν ισχύει 1 από τις 8 καταστάσεις νίκης επιστρέφει 0 η συνάρτηση...τώρα για την αναπαρασταση της(ενας Θεος ξέρει)..... Το "παλιό άρθρο" που αναφέρεις έχει και μια δική μου υλοποίηση όπου φαίνεται πώς μπορεί να γραφεί η checkWhoWins με πολύ κομψό και οικονομικό τρόπο. (post #7) : http://www.insomnia.gr/topic/403494-%CE%B4%CE%B7%CE%BC%CE%B9%CE%BF%CF%85%CF%81%CE%B3%CE%AF%CE%B1-%CE%B1%CF%80%CE%BB%CE%AE%CF%82-%CF%84%CF%81%CE%AF%CE%BB%CE%B9%CE%B6%CE%B1%CF%82-%CE%BC%CE%B5-c/ Eίναι λίγο διαφορετικό απ' το ζητούμενο διότι αφορά παίκτη vs υπολογιστή, αλλά θα μάθεις αρκετά αν το διαβάσεις.... - συμφωνώ μαζί σου είναι ωραίο, διότι την κάθε διεργασία την έχει σε διαφορετική συνάρτηση.....αλλά όπως είπα είμαι ακόμα noobie στην C++, όποτε δεν ξέρω ακόμα να φτιάχνω τόσο καλά οργανωμένα προγράμματα Επεξ/σία 23 Νοεμβρίου 2015 από Fotic 1
defacer Δημοσ. 23 Νοεμβρίου 2015 Δημοσ. 23 Νοεμβρίου 2015 Και ο κώδικας ΔΕΝ είναι C++. Πλέον η C++ έχει και την std::arrayμε δικούς της iterators. Δεν είναι μόνο το std::array, εκείνος ο κώδικας είναι γενικότερα φανερά κατηγορίας "C με cout". Είναι γνωστό ότι η ειδικότητα του Smirnov είναι τα μαθηματικά και όχι ο προγραμματισμός και αυτό το δείχνει και το στυλ γραψίματος. That said και αφήνοντας τη C++ κατα μέρος, to give credit where it's due: η δομή εκείνου του προγράμματος είναι εντυπωσιακά καλύτερη απ' ότι θα περίμενα να δω από μη-επαγγελματία προγραμματιστή και σίγουρα από τα καλύτερα ever που θυμάμαι να έχω δει στο insomnia. απότη κατάλαβα αν δεν ισχύει 1 από τις 8 καταστάσεις νίκης επιστρέφει 0 η συνάρτηση...τώρα για την αναπαρασταση της(ενας Θεος ξέρει)..... Διάβασε τον κώδικα. for(auto sum : winPossibilities) { if (abs(sum) == 3) return sum / 3; } return 0; Και χωρίς να ξέρεις πολλά αυτό μυρίζει ότι κάνει loop πάνω στις τιμές του winPossibilities και επιστρέφει τι? όταν βρει μια τιμή που είναι ίση με τί? Τώρα, ξέροντας ποιές είναι οι τιμές που ενεργοποιούν το return και βλέποντας πώς προκύπτουν (δες τι μπαίνει μέσα στο winPossibilities), τι συμπέρασμα βγαίνει για τις τιμές του triliza?
παπι Δημοσ. 24 Νοεμβρίου 2015 Δημοσ. 24 Νοεμβρίου 2015 Και ο κώδικας ΔΕΝ είναι C++. Πλέον η C++ έχει και την std::arrayμε δικούς της iterators. Ψαξε βρες τωρα τι ειναι c++... Εχουμε ενα fact. Ο κωδικας μπορει να μεταφραστει μονο απο c++ compiler, αρα σιγουρα δεν ειναι javascript. 2
Fotic Δημοσ. 24 Νοεμβρίου 2015 Μέλος Δημοσ. 24 Νοεμβρίου 2015 Δεν είναι μόνο το std::array, εκείνος ο κώδικας είναι γενικότερα φανερά κατηγορίας "C με cout". Είναι γνωστό ότι η ειδικότητα του Smirnov είναι τα μαθηματικά και όχι ο προγραμματισμός και αυτό το δείχνει και το στυλ γραψίματος. That said και αφήνοντας τη C++ κατα μέρος, to give credit where it's due: η δομή εκείνου του προγράμματος είναι εντυπωσιακά καλύτερη απ' ότι θα περίμενα να δω από μη-επαγγελματία προγραμματιστή και σίγουρα από τα καλύτερα ever που θυμάμαι να έχω δει στο insomnia. Διάβασε τον κώδικα. for(auto sum : winPossibilities) { if (abs(sum) == 3) return sum / 3; } return 0; Και χωρίς να ξέρεις πολλά αυτό μυρίζει ότι κάνει loop πάνω στις τιμές του winPossibilities και επιστρέφει τι? όταν βρει μια τιμή που είναι ίση με τί? Τώρα, ξέροντας ποιές είναι οι τιμές που ενεργοποιούν το return και βλέποντας πώς προκύπτουν (δες τι μπαίνει μέσα στο winPossibilities), τι συμπέρασμα βγαίνει για τις τιμές του triliza? επιστρέφει 0 όταν δεν βρει αυτό που ζητάμε ή sum/3 αν η απόλυτη τιμή του sum είναι ίσο με 3....αλλά ακόμα δεν καταλαβαίνω πως λειτούργει (μάλλον είμαι πιο noob απότη περίμενα )
defacer Δημοσ. 24 Νοεμβρίου 2015 Δημοσ. 24 Νοεμβρίου 2015 επιστρέφει 0 όταν δεν βρει αυτό που ζητάμε ή sum/3 αν η απόλυτη τιμή του sum είναι ίσο με 3....αλλά ακόμα δεν καταλαβαίνω πως λειτούργει (μάλλον είμαι πιο noob απότη περίμενα ) Ίσως δεν καταλαβαίνεις επειδή δεν το προχωράς παραπέρα από αυτό που βλέπεις στον κώδικα. Αν η απόλυτη τιμή του sum είναι 3, ναι. Βλέπεις παραπάνω πώς προκύπτει το sum, από το άθροισμα κάθε φορά 3 όρων. Και στα αθροίσματα αυτά μας "ενδιαφέρουν" μόνο οι τιμές 3 και -3. Άρα τι μας λέει αυτό όσον αφορά τους όρους που προσθέτουμε δεδομένου και του τι αντιπροσωπεύουν αυτοί οι όροι;
Fotic Δημοσ. 26 Νοεμβρίου 2015 Μέλος Δημοσ. 26 Νοεμβρίου 2015 το 3 ότι έχει βρεθεί μια από τις 8 καταστάσεις όποτε υπάρχει νικητής το -3 ότι δεν έχει βρεθεί μια από τις 8 καταστάσεις όποτε δεν υπάρχει νικητής και είναι ισοπαλία και το 0 ότι συνεχίζεται μέχρι να γίνει 3 ή -3
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα