// Voorbeeldprogramma boter.cc in C++ dat Boter, Kaas // en Eieren speelt (vrij slecht, overigens) // Walter Kosters, kosters@liacs.nl, 19 oktober 2007 #include #include using namespace std; class bke { public: char bord[4][4]; // we gebruiken bord[0][.] en bord[.][0] niet char beurt; // wie is aan de beurt: 'O' of 'X' bke ( ); bool gewonnen (char & wie); bool vol ( ); void drukaf ( ); void randomzet ( ); bool magzet (int i, int j); void doezet (int i, int j); char wiemoet ( ); void menszet ( ); };//bke // default constructor bke::bke ( ) { int i, j; beurt = 'X'; // 'X' begint for ( i = 0; i < 4; i++ ) for ( j = 0; j < 4; j++ ) bord[i][j] = ' '; // maak bord leeg }//bke::bke // heeft er iemand gewonnen, en zo ja: wie? // als niemand gewonnen heeft (false) is wie gelijk aan ' ', bool bke::gewonnen (char & wie) { int i, j; wie = ' '; for ( i = 1; i < 4; i++ ) // rijen if ( bord[i][1] == bord[i][2] && bord[i][2] == bord[i][3] ) { wie = bord[i][1]; if ( wie != ' ' ) return true; }//if for ( j = 1; j < 4; j++ ) // kolommen if ( bord[1][j] == bord[2][j] && bord[2][j] == bord[3][j] ) { wie = bord[1][j]; if ( wie != ' ' ) return true; }//if // en de twee diagonalen if ( bord[1][1] == bord[2][2] && bord[2][2] == bord[3][3] ) { wie = bord[1][1]; if ( wie != ' ' ) return true; }//if if ( bord[1][3] == bord[2][2] && bord[2][2] == bord[3][1] ) { wie = bord[1][3]; if ( wie != ' ' ) return true; }//if return false; }//bke::gewonnen // is het bord vol? // als hier niemand gewonnen heeft, is het remise bool bke::vol ( ) { int i, j; for ( i = 1; i < 4; i++ ) for ( j = 1; j < 4; j++ ) if ( bord[i][j] == ' ' ) return false; return true; }//bke::vol // druk bord af op beeldscherm void bke::drukaf ( ) { int i, j; for ( i = 1; i < 4; i++ ) { for ( j = 1; j < 4; j++ ) cout << "." << bord[i][j]; cout << endl; }//for cout << "Aan de beurt: " << beurt << endl << endl; }//bke::drukaf // doe randomzet (aanname: dit kan) void bke::randomzet ( ) { int i, j; int tel, getal; while ( true ) { tel = 1; getal = 1 + rand ( ) % 9; for ( i = 1; i < 4; i++ ) for ( j = 1; j < 4; j++ ) { if ( tel == getal && magzet (i,j) ) { doezet (i,j); return; }//if tel++; }//for }//while }//bke::randomzet // mag een zet op (i,j)? bool bke::magzet (int i, int j) { return ( bord[i][j] == ' '); }//bke::magzet // doe een zet op (i,j) - ook als het misschien niet mag void bke::doezet (int i, int j) { bord[i][j] = beurt; if ( beurt == 'X' ) beurt = 'O'; else beurt = 'X'; }//bke::doezet // wie is er aan de beurt? char bke::wiemoet ( ) { return beurt; }//bke::wiemoet // mens moet zetten; aanname: er is nog een zet mogelijk void bke::menszet ( ) { char keus; int i = 2, j = 2; do { cout << "Geef een zet voor " << beurt << " (1/2/.../9) "; keus = cin.get ( ); if ( '1' <= keus && keus <= '9' ) { i = 1 + ( keus - '0' - 1 ) / 3; j = ( keus - '0' ) % 3; if ( j == 0 ) j = 3; }//if keus = cin.get ( ); // verwijder Enter } while ( ! magzet (i,j) ); doezet (i,j); cout << endl; }//bke::menszet int main ( ) { bke B; // ons speelbord char wie; // wie wint er? srand (42); // initialiseer randomgenerator cout << ".1.2.3 We spelen Boter, Kaas en Eieren ..." << endl << ".4.5.6" << endl << ".7.8.9" << endl << endl; while ( ! B.vol ( ) && ! B.gewonnen (wie) ) { if ( B.wiemoet ( ) == 'X' ) B.menszet ( ); else B.randomzet ( ); B.drukaf ( ); }//while if ( B.gewonnen (wie) ) cout << wie << " heeft gewonnen!" << endl; else cout << "Remise!" << endl; return 0; }//main