//--------------------------------------------------------------------- // Sýnislausn á Aukaverkefni hluta 1 í Tölvunarfræði 2, vor 2005 // // Hjálmtýr Hafsteinsson, febrúar 2005 //--------------------------------------------------------------------- #include #include using namespace std; struct reitur { int rod; int dalk; reitur( int r=0, int d=0 ): rod(r), dalk(d) { }; }; class VeidiBord { public: // Smiðurinn býr til borðið og setur hunda og ref á upphafsreiti VeidiBord(); ~VeidiBord() {}; // Birtir núverandi stöðu leiksins á staðalúttaki void PrentaBord(); // Framkvæmir leik með hundi, skila ósatt ef ólöglegur leikur bool FaeraHund( int nrHund, reitur til ); // Framkvæmir leik með ref, skilar ósatt ef ólöglegur leikur bool FaeraRef( reitur til ); // Skilar staðsetningu tiltekins hunds reitur StadaHunds( int nrHund ); // Skilar staðsetningu refs reitur StadaRefs(); // Skilar satt ef leiknum er lokið bool LeikLokid(); // Skilar satt ef hundarnir hafa sigrað bool HundarSigra(); // Skilar satt ef refurinn hefur sigrað bool RefurSigrar(); private: char bord[8][8]; reitur stadaHund[4]; reitur stadaRefur; bool HundarHafaSigrad; bool RefurHefurSigrad; }; VeidiBord::VeidiBord() { int i, j; for( i=0; i<8; i++ ) for( j=0; j<8; j++ ) bord[i][j] = ' '; // ' ' táknar auðan reit bord[0][4] = 'R'; // R táknar refinn bord[7][1] = '1'; // 1 táknar hund nr. 1 bord[7][3] = '2'; // 2 táknar hund nr. 2 bord[7][5] = '3'; // 3 táknar hund nr. 3 bord[7][7] = '4'; // 4 táknar hund nr. 4 stadaRefur.rod = 0; stadaRefur.dalk = 4; for( i=0; i<4; i++ ) { stadaHund[i].rod = 7; stadaHund[i].dalk = 2*i+1; } HundarHafaSigrad = false; RefurHefurSigrad = false; } void VeidiBord::PrentaBord() { int i, j; cout << endl; cout << " A B C D E F G H " << endl; cout << " +--+--+--+--+--+--+--+--+ " << endl; for( i=7; i>=0; i-- ) { cout << " " << i+1 << " |"; for( j=0; j<8; j++ ) { if( bord[i][j] == ' ' ) if( (i+j) % 2 == 0) cout << "..|"; else cout << " |"; else if( bord[i][j] == 'R' ) cout << "RR|"; else cout << "H" << bord[i][j] << "|"; } cout << " " << i+1 << endl; cout << " +--+--+--+--+--+--+--+--+ " << endl; } cout << " A B C D E F G H " << endl; cout << endl; } bool VeidiBord::FaeraHund( int nrHund, reitur til ) { // Ef reiturinn "til" er ólöglegur þá hætta... if( (til.rod < 0) || (til.rod > 7) || (til.dalk < 0) || (til.dalk > 7) ) return false; // Ef hundurinn fer ekki niður í næstu röð þá hætta... if( til.rod != stadaHund[nrHund-1].rod - 1 ) return false; // Ef hundurinn fer ekki á ská til vinstri eða hægri (á næsta svarta reit) þá hætta... if( (til.dalk != stadaHund[nrHund-1].dalk - 1) && (til.dalk != stadaHund[nrHund-1].dalk + 1) ) return false; // Ef reiturinn er upptekinn af öðrum hundi þá hætta... if( (bord[til.rod][til.dalk] != ' ') && (bord[til.rod][til.dalk] != 'R') ) return false; // Ef hundurinn nær refnum þá hafa hundarnir sigrað... if( bord[til.rod][til.dalk] == 'R' ) HundarHafaSigrad = true; // Framkvæma leik... bord[til.rod][til.dalk] = '0' + nrHund; bord[stadaHund[nrHund-1].rod][stadaHund[nrHund-1].dalk] = ' '; stadaHund[nrHund-1] = til; return true; } bool VeidiBord::FaeraRef( reitur til ) { // Ef reiturinn "til" er ólöglegur þá hætta... if( (til.rod < 0) || (til.rod > 7) || (til.dalk < 0) || (til.dalk > 7) ) return false; // Ef refurinn fer ekki á ská til vinstri eða hægri (á næsta svarta reit) þá hætta... if( (til.dalk != stadaRefur.dalk - 1) && (til.dalk != stadaRefur.dalk + 1) ) return false; // Ef refurinn fer ekki á upp eða niður um einn þá hætta... if( (til.rod != stadaRefur.rod - 1) && (til.rod != stadaRefur.rod + 1) ) return false; // Ef reiturinn er upptekinn af hundi þá hætta (leyfum refnum ekki að fremja sjálfsmorð!)... if( bord[til.rod][til.dalk] != ' ' ) return false; // Ef refurinn er kominn í efstu röð þá hefur hann sigrað... if( til.rod == 7 ) RefurHefurSigrad = true; // Framkvæma leik... bord[til.rod][til.dalk] = 'R'; bord[stadaRefur.rod][stadaRefur.dalk] = ' '; stadaRefur = til; return true; } reitur VeidiBord::StadaHunds( int nrHund ) { return stadaHund[nrHund-1]; } reitur VeidiBord::StadaRefs() { return stadaRefur; } bool VeidiBord::LeikLokid() { return ( HundarHafaSigrad || RefurHefurSigrad ); } bool VeidiBord::HundarSigra() { return HundarHafaSigrad; } bool VeidiBord::RefurSigrar() { return RefurHefurSigrad; } reitur BreytaIReit( string leikur ) { reitur r; // Breyta dálk í hástaf ef þarf if( leikur[0] >= 'a' && leikur[0] <= 'h' ) leikur[0] += ('A' - 'a'); r.dalk = leikur[0] - 'A'; r.rod = leikur[1] - '1'; return r; } int main() { VeidiBord B; string leik; int hnr; B.PrentaBord(); while( ! B.LeikLokid() ) { do { cout << "Faera ref til: "; cin >> leik; } while( ! B.FaeraRef( BreytaIReit( leik ) ) ); B.PrentaBord(); do { cout << "Hundur nr.: "; cin >> hnr; cout << "Faera hund nr " << hnr << " til: "; cin >> leik; } while( ! B.FaeraHund( hnr, BreytaIReit( leik ) ) ); B.PrentaBord(); } if( B.RefurSigrar() ) cout << "Refurinn hefur sigrad!" << endl; else cout << "Hundarnir hafa sigrad!" << endl; return 0; }