Timonkaipumpa Δημοσ. 1 Απριλίου 2011 Δημοσ. 1 Απριλίου 2011 Μην ανοίγεις πόλεμο πάλι, απλά εννοεί ότι το είχε γράψει πιο παλιά για εκείνον (υποθέτω τουλάχιστον) και το παραθέτει τώρα εδώ. Δεν βλέπω κανένα πόλεμο... In either case... το "δώρο από μένα για εμένα" βλέπω ότι ισχύει.
mezger Δημοσ. 1 Απριλίου 2011 Δημοσ. 1 Απριλίου 2011 Τελικά την έκανα έτσι και την τέλειωσα. Άμα έχει κάνεις κάτι πιο οικονομικό ας το πει: Η τρίλιζα έχει 8 τρόπους νίκης ανά σύμβολο, και έχεις βάλει 10 for που διατρέχουν όλο τον πίνακα. Αν το σκεφτείς είναι 1ον τρελλό overkill, και 2ον εντελώς λάθος γιατί ελέγχεις θέσεις του πίνακα που δεν υπάρχουν** (όταν το i είναι 2 και διαβάζεις το i+1 π.χ.). Ειδικά το δεύτερο πρέπει να το αποφύγεις γιατί θα το βρεις μπροστά σου. Επίσης δες αυτά τα 2: > 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=1; [...] 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=1; Πάρε χαρτί και μολύβι και γράψε τους ελέγχους που θα κάνει το πρώτο for για όλες τις τιμές του i και j, κάνε το ίδιο και για το 2ο for και θα δεις ότι ελέγχεις το ίδιο πράγμα 2 φορές. Αφού το καταλάβεις σβήσε όλα τα for και κάντο μόνο με if/else, για να δεις ακριβώς τους ελέγχους που πρέπει να γίνουν, και μετά αν θες και μπορείς συνένωσε κάποια με loops. Επίσης μια ιδέα που πρέπει να δεις αν σε συμφέρει είναι αντί να ελέγχεις συγκεκριμένα για Χ και Ο, να ελέγχεις αν τρεις θέσεις του πίνακα έχουν το ίδιο σύμβολο, και αν το έχουν να διαβάζεις ποιο είναι αυτό και ανάλογα να ανακοινώνεις νικητή. Έχε επίσης στο μυαλό σου ότι πολλά for ή πολλά if ανεξάρτητα μεταξύ τους σημαίνει ότι θα γίνουν όλοι οι έλεγχοι, ανεξάρτητα από το αν έχει βρεθεί νικητής. Χρησιμοποιόντας το else if γενναιόδωρα το προγραμμά σου μπορεί να σταματάει τους ελέγχους με το που βρει αυτό που ψάχνει. **δοκίμασε να παίξεις Χ στις θέσεις 3,4,5 ή στις 7,2,5 λογικά θα έχει ενδιαφέρον
παπι Δημοσ. 1 Απριλίου 2011 Δημοσ. 1 Απριλίου 2011 To οικονομικό και κομψό είναι αυτό που έκανα εγώ στην ρουτίνα checkForWinner Ναι αλλα ειναι copyrighted ( © V.I.Smirnov )
virxen75 Δημοσ. 2 Απριλίου 2011 Δημοσ. 2 Απριλίου 2011 μία απλή λύση(όχι βέλτιστη) θα μπορούσε να είναι > #include <iostream> using namespace std; int checkWhoWins(char[3][3]); void printTriliza(char[3][3]); int main(){ int i,x; char Tril[3][3] = {'1','2','3','4','5','6','7','8','9'}; cout << "Exontas ton parakato sxediagramma pata to katallhlo noymero gia to poy theleis na baleis thn epilogh soy"<<endl << "|1| |2| |3|"<<endl<<"|4| |5| |6|"<<endl<<"|7| |8| |9|"<< endl; for (i=0;i<9;i++){ x=-1; while ( (x<1 || x>9) || (Tril[(x-1)/3] [(x-1)%3]>'9') ){ cout<<"Dose arithmo "<<endl; cin>>x;getchar(); if ( (x<1 || x>9) ) cout<<"la8os ari8mos prepei na einai apo 1-9 , prospa8ise ksana!"<<endl; else if (Tril[(x-1)/3] [(x-1)%3]>'9') cout<<"la8os ari8mos prepei to tetragono na einai adeio , prospa8ise ksana!"<<endl; } if (i%2==0) Tril[(x-1)/3] [(x-1)%3]='X'; else Tril[(x-1)/3] [(x-1)%3]='O'; printTriliza(Tril); cout<<"____________________"<<endl; int winner=checkWhoWins(Tril); if (winner>0){ cout<<"nikitis einai o paiktis "<<winner<<endl; break; } } getchar(); return 0; } //για να νικήσει κάποιος θέλει 3 όμοια σύμβολα(ΧΧΧ ή ΟΟΟ) στην ίδια γραμμή ,στήλη ή διαγώνιο του πίνακα int checkWhoWins(char triliza[3][3]){ char checkRows[3][4]; char checkCols[3][4]; char diagonios[2][4]; for (int j=0;j<3;j++){//βρίσκω τις 2 συμβολοσειρές που αντιστοιχούν στις 2 διαγωνίους του πίνακα της τρίλιζας diagonios[0][j]=triliza[j][j]; diagonios[1][j]=triliza[j][2-j]; } diagonios[1][3]='\0'; diagonios[0][3]='\0'; for (int i=0;i<2;i++){//ελέγχω αν υπάρχει νικητής συγκρίνοντας τις συμβολοσειρές των διαγωνίων με τις συμβολοσειρές νίκης if (strcmp("XXX",diagonios[i])==0) return 1; if (strcmp("OOO",diagonios[i])==0) return 2; } for (int i=0;i<3;i++){//βρίσκω τις συμβολοσειρές για τις 3 γραμμές του πίνακα και τις 3 στήλες του πίνακα της τρίλιζας for (int j=0;j<3;j++){ checkRows[i][j]=triliza[i][j]; checkCols[i][j]=triliza[j][i]; } checkRows[i][3]='\0'; checkCols[i][3]='\0'; //ελέγχω με τις συμβολοσειρές νίκης ,αν βρω νικητή επιστρέφω το κατάλληλο νούμερο παίκτη if (strcmp("XXX",checkRows[i])==0 || strcmp("XXX",checkCols[i])==0) return 1; if (strcmp("OOO",checkRows[i])==0 || strcmp("OOO",checkCols[i])==0) return 2; } return 0;//αν δεν βρω νικητή επιστρέφω 0 } void printTriliza(char triliza[3][3]){ for (int row=0;row<3;row++){ for (int col=0;col<3;col++){ cout<<" "<<triliza[row][col]; if (col!=2) cout<<"|"; } cout<<endl<<"---------"<<endl; } }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.