Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <iomanip>
- using namespace std;
- // alustetaan taulukkojen kokoa määrittelevät vakiot
- const unsigned short int LEVEYS = 7;
- const unsigned short int KORKEUS = 7;
- const unsigned short int OSUMAKOKO = 6;
- // luodaan funktioiden headerit
- void paavalikko(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
- unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
- unsigned short int osuikoPituus[2]);
- void tulostaValikkotekstit();
- char lueValinta();
- void syotaLaivat(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys, unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO],
- unsigned short int osumakoko);
- void alkupisteIndekseiksi(string alkupiste, int &x, int &y);
- void asetaLaiva(unsigned short int pelialue[][KORKEUS], unsigned short int pituus, unsigned short int rivi,
- unsigned short int sarake, char suunta);
- void printTitle(unsigned short int LEVEYS);
- void printUnderline(unsigned short int LEVEYS);
- void printShips(unsigned short int pelialue[][KORKEUS], unsigned short int LEVEYS, unsigned short int KORKEUS);
- bool pelaa(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
- unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
- unsigned short int osuikoPituus[2]);
- void printShots(char ammunnat[][KORKEUS], unsigned short int korkeus, unsigned short int leveys, unsigned short int osumat[OSUMAKOKO],
- unsigned short int osumakoko);
- string ammunta(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
- unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko, unsigned short int osuikoPituus[2]);
- string uppoamisenTarkastus(unsigned short int laivaTaulukko[][KORKEUS], char ammunnat[][KORKEUS],
- unsigned short int osumat[OSUMAKOKO], unsigned short int leveys, unsigned short int korkeus, unsigned short int osumakoko,
- unsigned short int osuikoPituus[2]);
- int main()
- {
- // luodaan taulukot
- char ammunnat[LEVEYS][KORKEUS];
- unsigned short int laivaTaulukko[LEVEYS][KORKEUS] = { 0 };
- unsigned short int osumat[OSUMAKOKO] = { 0 };
- unsigned short int osuikoPituus[2] = { 0 };
- // Alustetaan ampumistaulukko tayteen valilyonteja:
- memset(ammunnat, ' ', sizeof(ammunnat));
- // Kutsutaan paavalikko-aliohjelmaa
- paavalikko(ammunnat, laivaTaulukko, LEVEYS, KORKEUS, osumat, OSUMAKOKO, osuikoPituus);
- return 0;
- }
- /*------------------------------------
- *nimi: paavalikko
- *
- *toiminta: Valikkorakenne, jossa
- *kayttaja valitsee, minka toiminnon
- *han haluaa tehda
- *
- *parametrit: ammunnat, laivaTaulukko,
- *leveys korkeus, osumat
- *
- *paluuarvo: ei ole
- -----------------------------------*/
- void paavalikko(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS],
- unsigned short int leveys, unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO],
- unsigned short int osumakoko, unsigned short int osuikoPituus[2])
- {
- char valinta;
- bool laivatAlustettu = false;
- bool peliLoppunut = false;
- do {
- tulostaValikkotekstit();
- valinta = lueValinta();
- switch (valinta)
- {
- case '1':
- syotaLaivat(ammunnat, laivaTaulukko, LEVEYS, KORKEUS, osumat, OSUMAKOKO);
- laivatAlustettu = true;
- peliLoppunut = false;
- break;
- case '2':
- if (laivatAlustettu && !peliLoppunut)
- {
- peliLoppunut = pelaa(ammunnat, laivaTaulukko, LEVEYS, KORKEUS, osumat, OSUMAKOKO, osuikoPituus);
- }
- else
- {
- cout << endl << "Et voi siirtya pelaamaan ennen kuin olet syottanyt laivat. Valitse 1" << endl << endl;
- system("pause");
- }
- break;
- case 'l':
- case 'L': exit(0);
- break;
- default: cerr << "\nLaiton valinta, syota uudelleen!\n\n";
- system("pause");
- break;
- }
- } while ('L' != toupper(valinta));
- }
- /*---------------------------
- *nimi: tulostaValikkotekstit
- *
- *toiminta: Tulostaa valikon
- *tekstit kayttajalle
- *
- *parametrit: ei ole
- *
- *paluuarvo: ei ole
- ---------------------------*/
- void tulostaValikkotekstit()
- {
- system("cls");
- cout <<
- "\n\
- Laivanupotuspeli\n\
- ================\n\
- \n\
- Valinnat:\n\
- \n\
- 1) Syota laivat\n\
- 2) Pelaa\n\
- L) Lopeta\n\
- \n\
- Valintasi : ";
- }
- /*---------------------------
- *nimi: lueValinta
- *
- *toiminta: Lukee kayttajan
- *syottaman valinnan valikossa
- *
- *parametrit: ei ole
- *
- *paluuarvo: char valinta
- ---------------------------*/
- char lueValinta()
- {
- char valinta;
- cin >> valinta;
- return valinta;
- }
- /*----------------------------------
- *nimi: syotaLaivat
- *
- *toiminta: nollaa taulukoiden
- *solujen arvot ja asettaa kayttajan
- *antaman alkupisteen perusteella
- *laivan alkupisteen indeksin
- *
- *parametrit: ammunnat, laivaTaulukko,
- *LEVEYS, KORKEUS, osumat, osumakoko
- *
- *paluuarvo: ei ole
- ----------------------------------*/
- void syotaLaivat(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int LEVEYS, unsigned short int KORKEUS,
- unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko)
- {
- for (int i = 0; i < KORKEUS; i++)
- {
- for (int j = 0; j < LEVEYS; j++)
- laivaTaulukko[j][i] = NULL;
- }
- for (int i = 0; i < KORKEUS; i++)
- {
- for (int j = 0; j < LEVEYS; j++)
- ammunnat[j][i] = NULL;
- }
- string alkupiste_5, alkupiste_4, alkupiste_3, alkupiste_2;
- char suunta;
- int x, y;
- system("cls");
- printShips(laivaTaulukko, LEVEYS, KORKEUS);
- cout << "Syota laivat antamalla alkupiste perakkaisina merkkeina, joista ensimmainen on kirjain ja toinen numero, esim A1"
- << endl << endl;
- cout << "Anna viiden pituisen laivan alkupiste: ";
- cin >> alkupiste_5;
- cout << "Anna suunta: ";
- cin >> suunta;
- alkupisteIndekseiksi(alkupiste_5, x, y);
- asetaLaiva(laivaTaulukko, 5, y, x, suunta);
- cout << "Anna neljan pituisen laivan alkupiste: ";
- cin >> alkupiste_4;
- cout << "Anna suunta: ";
- cin >> suunta;
- alkupisteIndekseiksi(alkupiste_4, x, y);
- asetaLaiva(laivaTaulukko, 4, y, x, suunta);
- cout << "Anna kolmen pituisen laivan alkupiste: ";
- cin >> alkupiste_3;
- cout << "Anna suunta: ";
- cin >> suunta;
- alkupisteIndekseiksi(alkupiste_3, x, y);
- asetaLaiva(laivaTaulukko, 3, y, x, suunta);
- cout << "Anna kahden pituisen laivan alkupiste: ";
- cin >> alkupiste_2;
- cout << "Anna suunta: ";
- cin >> suunta;
- alkupisteIndekseiksi(alkupiste_2, x, y);
- asetaLaiva(laivaTaulukko, 2, y, x, suunta);
- system("pause");
- }
- int x, y;
- /*--------------------------------
- *nimi: printTitle
- *
- *toiminta: Tulostaa laiva- ja
- *ammuntataulukoiden sarakeotsikot
- *
- *parametrit: LEVEYS
- *
- *paluuarvo: ei ole
- --------------------------------*/
- void printTitle(unsigned short int LEVEYS)
- {
- cout << " ";
- for (int i = 0; i < LEVEYS; i++)
- cout << setw(2) << (char)('1' + i);
- cout << endl;
- }
- /*-----------------------------
- *nimi: printUnderline
- *
- *toiminta: Tulostaa laiva- ja
- *ammuntataulukoiden reunaviivat
- *
- *parametrit: ei ole
- *
- *paluuarvo: ei ole
- -----------------------------*/
- void printUnderline(unsigned short int KORKEUS)
- {
- cout << setw(3) << '-';
- for (int i = 0; i < KORKEUS; i++)
- cout << "--";
- cout << "--\n";
- }
- /*-------------------------------
- *nimi: printShips
- *
- *toiminta: Tulostaa laivataulukon
- *
- *parametrit:
- *
- *paluuarvo: ei ole
- -------------------------------*/
- void printShips(unsigned short int laivaTaulukko[][KORKEUS], unsigned short int LEVEYS, unsigned short int KORKEUS)
- {
- cout << endl;
- // Tulosta 1. sarakeotsikko
- printTitle(LEVEYS);
- // Tulosta 1. alleviivaus
- printUnderline(LEVEYS);
- // Tulosta kaikki rivit:
- for (int i = 0; i < KORKEUS; i++) {
- cout << setw(1) << (char)('A' + i) << setw(2) << '|';
- for (int j = 0; j < LEVEYS; j++)
- if (laivaTaulukko[i][j] > 0)
- cout << setw(2) << laivaTaulukko[i][j];
- else
- cout << setw(2) << ' ';
- cout << setw(2) << '|';
- cout << setw(2) << (char)('A' + i) << endl;
- }
- // Tulosta 2. alleviivaus
- printUnderline(LEVEYS);
- // Tulosta 2. sarakeotsikko
- printTitle(LEVEYS);
- cout << endl;
- }
- void alkupisteIndekseiksi(string alkupiste, int &x, int &y)
- {
- y = toupper(alkupiste.at(0)) - 'A';
- x = alkupiste[1] - '1';
- }
- void asetaLaiva(unsigned short int laivaTaulukko[][KORKEUS], unsigned short int pituus, unsigned short int rivi,
- unsigned short int sarake, char suunta)
- {
- unsigned short int riviSijainti = rivi;
- unsigned short int sarakeSijainti = sarake;
- if (suunta == 'i')
- {
- for (unsigned short int i = 0; i < pituus; i++)
- {
- laivaTaulukko[riviSijainti][sarakeSijainti + i] = pituus;
- }
- }
- else if (suunta == 'l')
- {
- for (unsigned short int i = 0; i < pituus; i++)
- {
- laivaTaulukko[riviSijainti][sarakeSijainti - i] = pituus;
- }
- }
- else if (suunta == 'e')
- {
- for (unsigned short int i = 0; i < pituus; i++)
- laivaTaulukko[riviSijainti + i][sarakeSijainti] = pituus;
- }
- else if (suunta == 'p')
- {
- for (unsigned short int i = 0; i < pituus; i++)
- {
- laivaTaulukko[riviSijainti - i][sarakeSijainti] = pituus;
- }
- }
- }
- bool pelaa(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
- unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
- unsigned short int osuikoPituus[2])
- {
- system("cls");
- string battleLog = "";
- string sinkLog = "";
- do {
- system("cls");
- printShots(ammunnat, KORKEUS, LEVEYS, osumat, OSUMAKOKO);
- cout << endl << battleLog << endl << endl << sinkLog << endl << endl;
- battleLog = ammunta(ammunnat, laivaTaulukko, KORKEUS, LEVEYS, osumat, OSUMAKOKO, osuikoPituus);
- if (battleLog == "quit")
- {
- return false;
- }
- sinkLog = uppoamisenTarkastus(laivaTaulukko, ammunnat, osumat, LEVEYS, KORKEUS, OSUMAKOKO, osuikoPituus);
- } while (osumat[2] < 2 || osumat[3] < 3 || osumat[4] < 4 || osumat[5] < 5);
- system("cls");
- printShots(ammunnat, KORKEUS, LEVEYS, osumat, OSUMAKOKO);
- cout << endl << battleLog << endl << endl << sinkLog << endl;
- cout << "Kaikki laivat upposivat. Peli paattyi." << endl << endl;
- system("pause");
- return true;
- }
- string ammunta(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int korkeus,
- unsigned short int leveys, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
- unsigned short int osuikoPituus[2])
- {
- int x, y;
- string laukaus;
- cout << "Syota ampumiskoordinaatti ruutuun, johon haluat ampua." << endl << "Syottamalla 'P' paaset takaisin paavalikkoon." << endl
- << endl << "Ampumiskoordinaatti: ";
- cin >> laukaus;
- if (laukaus.length() == 1 && toupper(laukaus.at(0) == 'p'))
- {
- return "quit";
- }
- string log = "";
- cout << endl;
- unsigned short int laivanPituus;
- alkupisteIndekseiksi(laukaus, x, y);
- if ((laivanPituus = laivaTaulukko[y][x]) == 2 || laivaTaulukko[y][x] == 3 || laivaTaulukko[y][x] == 4 || laivaTaulukko[y][x] == 5)
- {
- osuikoPituus[1] = laivanPituus;
- osuikoPituus[0] = 1;
- log = "Laukaus kohtaan " + laukaus + " osui";
- osumat[laivanPituus] = osumat[laivanPituus] + 1;
- ammunnat[y][x] = '*';
- }
- else if (laivaTaulukko[x][y] == 0)
- {
- log = "Laukaus kohtaan " + laukaus + " ei osunut";
- ammunnat[y][x] = 'X';
- osuikoPituus[0] = 0;
- }
- return log;
- }
- string uppoamisenTarkastus(unsigned short int laivaTaulukko[][KORKEUS], char ammunnat[][KORKEUS],
- unsigned short int osumat[OSUMAKOKO], unsigned short int leveys, unsigned short int korkeus, unsigned short int osumakoko,
- unsigned short int osuikoPituus[2])
- {
- string log = "";
- if ((osuikoPituus[0] == 1) && (osuikoPituus[1] == osumat[2] || osuikoPituus[1] == osumat[3] || osuikoPituus[1] == osumat[4] || osuikoPituus[1] == osumat[5]))
- {
- for (int i = 0; i < LEVEYS; i++)
- {
- for (int j = 0; j < KORKEUS; j++)
- {
- if (laivaTaulukko[i][j] == osuikoPituus[1])
- {
- ammunnat[i][j] = '#';
- }
- }
- }
- log = "Osuma upotti laivan";
- }
- else
- {
- log = "";
- }
- return log;
- }
- void printShots(char ammunnat[][KORKEUS], unsigned short int korkeus, unsigned short int leveys, unsigned short int osumat[OSUMAKOKO],
- unsigned short int osumakoko)
- {
- cout << endl;
- cout << "Pelitilanne on seuraava:" << endl << endl;
- // Tulosta 1. sarakeotsikko
- printTitle(LEVEYS);
- // Tulosta 1. alleviivaus
- printUnderline(KORKEUS);
- // Tulosta kaikki rivit:
- for (int i = 0; i < KORKEUS; i++) {
- cout << setw(1) << (char)('A' + i) << setw(2) << '|';
- for (int j = 0; j < LEVEYS; j++)
- cout << setw(2) << ammunnat[i][j];
- cout << setw(2) << '|';
- cout << setw(2) << (char)('A' + i) << endl;
- }
- // Tulosta 2. alleviivaus
- printUnderline(LEVEYS);
- // Tulosta 2. sarakeotsikko
- printTitle(LEVEYS);
- cout << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement