Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. // alustetaan taulukkojen kokoa määrittelevät vakiot
  8. const unsigned short int LEVEYS = 7;
  9. const unsigned short int KORKEUS = 7;
  10. const unsigned short int OSUMAKOKO = 6;
  11.  
  12. // luodaan funktioiden headerit
  13. void paavalikko(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
  14. unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
  15. unsigned short int osuikoPituus[2]);
  16. void tulostaValikkotekstit();
  17. char lueValinta();
  18. void syotaLaivat(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys, unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO],
  19. unsigned short int osumakoko);
  20. void alkupisteIndekseiksi(string alkupiste, int &x, int &y);
  21. void asetaLaiva(unsigned short int pelialue[][KORKEUS], unsigned short int pituus, unsigned short int rivi,
  22. unsigned short int sarake, char suunta);
  23. void printTitle(unsigned short int LEVEYS);
  24. void printUnderline(unsigned short int LEVEYS);
  25. void printShips(unsigned short int pelialue[][KORKEUS], unsigned short int LEVEYS, unsigned short int KORKEUS);
  26. bool pelaa(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
  27. unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
  28. unsigned short int osuikoPituus[2]);
  29. void printShots(char ammunnat[][KORKEUS], unsigned short int korkeus, unsigned short int leveys, unsigned short int osumat[OSUMAKOKO],
  30. unsigned short int osumakoko);
  31. string ammunta(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
  32. unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko, unsigned short int osuikoPituus[2]);
  33. string uppoamisenTarkastus(unsigned short int laivaTaulukko[][KORKEUS], char ammunnat[][KORKEUS],
  34. unsigned short int osumat[OSUMAKOKO], unsigned short int leveys, unsigned short int korkeus, unsigned short int osumakoko,
  35. unsigned short int osuikoPituus[2]);
  36.  
  37. int main()
  38. {
  39. // luodaan taulukot
  40. char ammunnat[LEVEYS][KORKEUS];
  41. unsigned short int laivaTaulukko[LEVEYS][KORKEUS] = { 0 };
  42. unsigned short int osumat[OSUMAKOKO] = { 0 };
  43. unsigned short int osuikoPituus[2] = { 0 };
  44.  
  45. // Alustetaan ampumistaulukko tayteen valilyonteja:
  46. memset(ammunnat, ' ', sizeof(ammunnat));
  47. // Kutsutaan paavalikko-aliohjelmaa
  48. paavalikko(ammunnat, laivaTaulukko, LEVEYS, KORKEUS, osumat, OSUMAKOKO, osuikoPituus);
  49.  
  50. return 0;
  51. }
  52.  
  53. /*------------------------------------
  54. *nimi: paavalikko
  55. *
  56. *toiminta: Valikkorakenne, jossa
  57. *kayttaja valitsee, minka toiminnon
  58. *han haluaa tehda
  59. *
  60. *parametrit: ammunnat, laivaTaulukko,
  61. *leveys korkeus, osumat
  62. *
  63. *paluuarvo: ei ole
  64. -----------------------------------*/
  65.  
  66. void paavalikko(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS],
  67. unsigned short int leveys, unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO],
  68. unsigned short int osumakoko, unsigned short int osuikoPituus[2])
  69. {
  70. char valinta;
  71.  
  72. bool laivatAlustettu = false;
  73. bool peliLoppunut = false;
  74.  
  75. do {
  76. tulostaValikkotekstit();
  77. valinta = lueValinta();
  78.  
  79. switch (valinta)
  80. {
  81. case '1':
  82. syotaLaivat(ammunnat, laivaTaulukko, LEVEYS, KORKEUS, osumat, OSUMAKOKO);
  83. laivatAlustettu = true;
  84. peliLoppunut = false;
  85. break;
  86. case '2':
  87. if (laivatAlustettu && !peliLoppunut)
  88. {
  89. peliLoppunut = pelaa(ammunnat, laivaTaulukko, LEVEYS, KORKEUS, osumat, OSUMAKOKO, osuikoPituus);
  90. }
  91. else
  92. {
  93. cout << endl << "Et voi siirtya pelaamaan ennen kuin olet syottanyt laivat. Valitse 1" << endl << endl;
  94. system("pause");
  95. }
  96. break;
  97. case 'l':
  98. case 'L': exit(0);
  99. break;
  100. default: cerr << "\nLaiton valinta, syota uudelleen!\n\n";
  101. system("pause");
  102. break;
  103. }
  104. } while ('L' != toupper(valinta));
  105. }
  106.  
  107. /*---------------------------
  108. *nimi: tulostaValikkotekstit
  109. *
  110. *toiminta: Tulostaa valikon
  111. *tekstit kayttajalle
  112. *
  113. *parametrit: ei ole
  114. *
  115. *paluuarvo: ei ole
  116. ---------------------------*/
  117.  
  118. void tulostaValikkotekstit()
  119. {
  120. system("cls");
  121.  
  122. cout <<
  123. "\n\
  124. Laivanupotuspeli\n\
  125. ================\n\
  126. \n\
  127. Valinnat:\n\
  128. \n\
  129. 1) Syota laivat\n\
  130. 2) Pelaa\n\
  131. L) Lopeta\n\
  132. \n\
  133. Valintasi : ";
  134. }
  135.  
  136. /*---------------------------
  137. *nimi: lueValinta
  138. *
  139. *toiminta: Lukee kayttajan
  140. *syottaman valinnan valikossa
  141. *
  142. *parametrit: ei ole
  143. *
  144. *paluuarvo: char valinta
  145. ---------------------------*/
  146.  
  147. char lueValinta()
  148. {
  149. char valinta;
  150.  
  151. cin >> valinta;
  152.  
  153. return valinta;
  154. }
  155.  
  156. /*----------------------------------
  157. *nimi: syotaLaivat
  158. *
  159. *toiminta: nollaa taulukoiden
  160. *solujen arvot ja asettaa kayttajan
  161. *antaman alkupisteen perusteella
  162. *laivan alkupisteen indeksin
  163. *
  164. *parametrit: ammunnat, laivaTaulukko,
  165. *LEVEYS, KORKEUS, osumat, osumakoko
  166. *
  167. *paluuarvo: ei ole
  168. ----------------------------------*/
  169.  
  170. void syotaLaivat(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int LEVEYS, unsigned short int KORKEUS,
  171. unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko)
  172. {
  173. for (int i = 0; i < KORKEUS; i++)
  174. {
  175. for (int j = 0; j < LEVEYS; j++)
  176. laivaTaulukko[j][i] = NULL;
  177. }
  178. for (int i = 0; i < KORKEUS; i++)
  179. {
  180. for (int j = 0; j < LEVEYS; j++)
  181. ammunnat[j][i] = NULL;
  182. }
  183. string alkupiste_5, alkupiste_4, alkupiste_3, alkupiste_2;
  184. char suunta;
  185. int x, y;
  186.  
  187. system("cls");
  188.  
  189. printShips(laivaTaulukko, LEVEYS, KORKEUS);
  190.  
  191. cout << "Syota laivat antamalla alkupiste perakkaisina merkkeina, joista ensimmainen on kirjain ja toinen numero, esim A1"
  192. << endl << endl;
  193. cout << "Anna viiden pituisen laivan alkupiste: ";
  194. cin >> alkupiste_5;
  195. cout << "Anna suunta: ";
  196. cin >> suunta;
  197. alkupisteIndekseiksi(alkupiste_5, x, y);
  198. asetaLaiva(laivaTaulukko, 5, y, x, suunta);
  199. cout << "Anna neljan pituisen laivan alkupiste: ";
  200. cin >> alkupiste_4;
  201. cout << "Anna suunta: ";
  202. cin >> suunta;
  203. alkupisteIndekseiksi(alkupiste_4, x, y);
  204. asetaLaiva(laivaTaulukko, 4, y, x, suunta);
  205. cout << "Anna kolmen pituisen laivan alkupiste: ";
  206. cin >> alkupiste_3;
  207. cout << "Anna suunta: ";
  208. cin >> suunta;
  209. alkupisteIndekseiksi(alkupiste_3, x, y);
  210. asetaLaiva(laivaTaulukko, 3, y, x, suunta);
  211. cout << "Anna kahden pituisen laivan alkupiste: ";
  212. cin >> alkupiste_2;
  213. cout << "Anna suunta: ";
  214. cin >> suunta;
  215. alkupisteIndekseiksi(alkupiste_2, x, y);
  216. asetaLaiva(laivaTaulukko, 2, y, x, suunta);
  217.  
  218. system("pause");
  219. }
  220.  
  221. int x, y;
  222.  
  223. /*--------------------------------
  224. *nimi: printTitle
  225. *
  226. *toiminta: Tulostaa laiva- ja
  227. *ammuntataulukoiden sarakeotsikot
  228. *
  229. *parametrit: LEVEYS
  230. *
  231. *paluuarvo: ei ole
  232. --------------------------------*/
  233.  
  234. void printTitle(unsigned short int LEVEYS)
  235. {
  236. cout << " ";
  237. for (int i = 0; i < LEVEYS; i++)
  238. cout << setw(2) << (char)('1' + i);
  239. cout << endl;
  240. }
  241.  
  242. /*-----------------------------
  243. *nimi: printUnderline
  244. *
  245. *toiminta: Tulostaa laiva- ja
  246. *ammuntataulukoiden reunaviivat
  247. *
  248. *parametrit: ei ole
  249. *
  250. *paluuarvo: ei ole
  251. -----------------------------*/
  252.  
  253. void printUnderline(unsigned short int KORKEUS)
  254. {
  255. cout << setw(3) << '-';
  256. for (int i = 0; i < KORKEUS; i++)
  257. cout << "--";
  258. cout << "--\n";
  259. }
  260.  
  261. /*-------------------------------
  262. *nimi: printShips
  263. *
  264. *toiminta: Tulostaa laivataulukon
  265. *
  266. *parametrit:
  267. *
  268. *paluuarvo: ei ole
  269. -------------------------------*/
  270.  
  271. void printShips(unsigned short int laivaTaulukko[][KORKEUS], unsigned short int LEVEYS, unsigned short int KORKEUS)
  272.  
  273. {
  274. cout << endl;
  275.  
  276. // Tulosta 1. sarakeotsikko
  277. printTitle(LEVEYS);
  278.  
  279. // Tulosta 1. alleviivaus
  280. printUnderline(LEVEYS);
  281.  
  282. // Tulosta kaikki rivit:
  283. for (int i = 0; i < KORKEUS; i++) {
  284. cout << setw(1) << (char)('A' + i) << setw(2) << '|';
  285.  
  286. for (int j = 0; j < LEVEYS; j++)
  287. if (laivaTaulukko[i][j] > 0)
  288. cout << setw(2) << laivaTaulukko[i][j];
  289. else
  290. cout << setw(2) << ' ';
  291.  
  292. cout << setw(2) << '|';
  293. cout << setw(2) << (char)('A' + i) << endl;
  294. }
  295.  
  296. // Tulosta 2. alleviivaus
  297. printUnderline(LEVEYS);
  298.  
  299. // Tulosta 2. sarakeotsikko
  300. printTitle(LEVEYS);
  301.  
  302. cout << endl;
  303. }
  304.  
  305. void alkupisteIndekseiksi(string alkupiste, int &x, int &y)
  306. {
  307. y = toupper(alkupiste.at(0)) - 'A';
  308. x = alkupiste[1] - '1';
  309. }
  310.  
  311. void asetaLaiva(unsigned short int laivaTaulukko[][KORKEUS], unsigned short int pituus, unsigned short int rivi,
  312. unsigned short int sarake, char suunta)
  313. {
  314. unsigned short int riviSijainti = rivi;
  315. unsigned short int sarakeSijainti = sarake;
  316.  
  317. if (suunta == 'i')
  318. {
  319. for (unsigned short int i = 0; i < pituus; i++)
  320. {
  321. laivaTaulukko[riviSijainti][sarakeSijainti + i] = pituus;
  322. }
  323. }
  324. else if (suunta == 'l')
  325. {
  326. for (unsigned short int i = 0; i < pituus; i++)
  327. {
  328. laivaTaulukko[riviSijainti][sarakeSijainti - i] = pituus;
  329. }
  330. }
  331. else if (suunta == 'e')
  332. {
  333. for (unsigned short int i = 0; i < pituus; i++)
  334. laivaTaulukko[riviSijainti + i][sarakeSijainti] = pituus;
  335. }
  336. else if (suunta == 'p')
  337. {
  338. for (unsigned short int i = 0; i < pituus; i++)
  339. {
  340. laivaTaulukko[riviSijainti - i][sarakeSijainti] = pituus;
  341. }
  342. }
  343. }
  344.  
  345. bool pelaa(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int leveys,
  346. unsigned short int korkeus, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
  347. unsigned short int osuikoPituus[2])
  348. {
  349. system("cls");
  350.  
  351. string battleLog = "";
  352. string sinkLog = "";
  353.  
  354. do {
  355. system("cls");
  356. printShots(ammunnat, KORKEUS, LEVEYS, osumat, OSUMAKOKO);
  357. cout << endl << battleLog << endl << endl << sinkLog << endl << endl;
  358. battleLog = ammunta(ammunnat, laivaTaulukko, KORKEUS, LEVEYS, osumat, OSUMAKOKO, osuikoPituus);
  359. if (battleLog == "quit")
  360. {
  361. return false;
  362. }
  363. sinkLog = uppoamisenTarkastus(laivaTaulukko, ammunnat, osumat, LEVEYS, KORKEUS, OSUMAKOKO, osuikoPituus);
  364. } while (osumat[2] < 2 || osumat[3] < 3 || osumat[4] < 4 || osumat[5] < 5);
  365.  
  366. system("cls");
  367. printShots(ammunnat, KORKEUS, LEVEYS, osumat, OSUMAKOKO);
  368. cout << endl << battleLog << endl << endl << sinkLog << endl;
  369.  
  370. cout << "Kaikki laivat upposivat. Peli paattyi." << endl << endl;
  371.  
  372. system("pause");
  373. return true;
  374. }
  375.  
  376. string ammunta(char ammunnat[][KORKEUS], unsigned short int laivaTaulukko[][KORKEUS], unsigned short int korkeus,
  377. unsigned short int leveys, unsigned short int osumat[OSUMAKOKO], unsigned short int osumakoko,
  378. unsigned short int osuikoPituus[2])
  379. {
  380. int x, y;
  381. string laukaus;
  382. cout << "Syota ampumiskoordinaatti ruutuun, johon haluat ampua." << endl << "Syottamalla 'P' paaset takaisin paavalikkoon." << endl
  383. << endl << "Ampumiskoordinaatti: ";
  384. cin >> laukaus;
  385.  
  386. if (laukaus.length() == 1 && toupper(laukaus.at(0) == 'p'))
  387. {
  388. return "quit";
  389. }
  390. string log = "";
  391. cout << endl;
  392. unsigned short int laivanPituus;
  393. alkupisteIndekseiksi(laukaus, x, y);
  394. if ((laivanPituus = laivaTaulukko[y][x]) == 2 || laivaTaulukko[y][x] == 3 || laivaTaulukko[y][x] == 4 || laivaTaulukko[y][x] == 5)
  395. {
  396. osuikoPituus[1] = laivanPituus;
  397. osuikoPituus[0] = 1;
  398. log = "Laukaus kohtaan " + laukaus + " osui";
  399. osumat[laivanPituus] = osumat[laivanPituus] + 1;
  400. ammunnat[y][x] = '*';
  401.  
  402. }
  403. else if (laivaTaulukko[x][y] == 0)
  404. {
  405. log = "Laukaus kohtaan " + laukaus + " ei osunut";
  406. ammunnat[y][x] = 'X';
  407. osuikoPituus[0] = 0;
  408. }
  409.  
  410. return log;
  411. }
  412.  
  413. string uppoamisenTarkastus(unsigned short int laivaTaulukko[][KORKEUS], char ammunnat[][KORKEUS],
  414. unsigned short int osumat[OSUMAKOKO], unsigned short int leveys, unsigned short int korkeus, unsigned short int osumakoko,
  415. unsigned short int osuikoPituus[2])
  416. {
  417. string log = "";
  418. if ((osuikoPituus[0] == 1) && (osuikoPituus[1] == osumat[2] || osuikoPituus[1] == osumat[3] || osuikoPituus[1] == osumat[4] || osuikoPituus[1] == osumat[5]))
  419. {
  420. for (int i = 0; i < LEVEYS; i++)
  421. {
  422. for (int j = 0; j < KORKEUS; j++)
  423. {
  424. if (laivaTaulukko[i][j] == osuikoPituus[1])
  425. {
  426. ammunnat[i][j] = '#';
  427. }
  428. }
  429. }
  430. log = "Osuma upotti laivan";
  431. }
  432. else
  433. {
  434. log = "";
  435. }
  436. return log;
  437. }
  438.  
  439. void printShots(char ammunnat[][KORKEUS], unsigned short int korkeus, unsigned short int leveys, unsigned short int osumat[OSUMAKOKO],
  440. unsigned short int osumakoko)
  441. {
  442. cout << endl;
  443.  
  444. cout << "Pelitilanne on seuraava:" << endl << endl;
  445.  
  446. // Tulosta 1. sarakeotsikko
  447. printTitle(LEVEYS);
  448.  
  449. // Tulosta 1. alleviivaus
  450. printUnderline(KORKEUS);
  451.  
  452. // Tulosta kaikki rivit:
  453. for (int i = 0; i < KORKEUS; i++) {
  454. cout << setw(1) << (char)('A' + i) << setw(2) << '|';
  455.  
  456. for (int j = 0; j < LEVEYS; j++)
  457. cout << setw(2) << ammunnat[i][j];
  458.  
  459. cout << setw(2) << '|';
  460. cout << setw(2) << (char)('A' + i) << endl;
  461. }
  462.  
  463. // Tulosta 2. alleviivaus
  464. printUnderline(LEVEYS);
  465.  
  466. // Tulosta 2. sarakeotsikko
  467. printTitle(LEVEYS);
  468.  
  469. cout << endl;
  470. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement