Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.94 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <ctime>
  4. #include <iomanip>
  5.  
  6.  
  7. struct square
  8. {
  9.     int value; //every square has a value from 0 to 8 so mines can be 9
  10.     bool is_covered; //every square is covered or uncovered
  11. };
  12.  
  13. square board[10][10];
  14.  
  15. void clear_board(int &min_column_or_row_numb, int &max_column_or_row_numb)
  16. {
  17.  
  18.     for (int i = min_column_or_row_numb; i <= max_column_or_row_numb; i++)
  19.     {
  20.             for (int j = min_column_or_row_numb; j <= max_column_or_row_numb; j++)
  21.             {
  22.                 board[i][j].value = 0;
  23.                 board[i][j].is_covered = false;
  24.             }
  25.     }
  26. }
  27.  
  28. void place_bombs(int *bombs, int &min_column_or_row_numb, int &max_column_or_row_numb) //places as many bombs as user wants randomly
  29. {
  30.     using namespace std;
  31.  
  32.     int max_bombs_number = 99;
  33.     int min_bombs_number = 0;
  34.  
  35.     if (*bombs < min_bombs_number || *bombs > max_bombs_number)
  36.     {
  37.         cout << "Podales zla ilosc bomb zagraj ponownie" << endl;
  38.         return;
  39.     }
  40.  
  41.     clear_board(min_column_or_row_numb, max_column_or_row_numb);//fills the board with zeros
  42.     srand(time(NULL));
  43.     int bomb_count = 0;
  44.     while (bomb_count < *bombs) //to eliminate the repeating values
  45.     for (int i = 0; i < *bombs; i++)
  46.     {
  47.             int a = rand() % (max_column_or_row_numb+1);
  48.             int b = rand() % (max_column_or_row_numb + 1);
  49.            
  50.             if (board[a][b].value == 9) continue; //if the bomb already was here - skip the loop
  51.             else
  52.             {
  53.                 bomb_count++;
  54.                 board[a][b].value = 9;
  55.  
  56.                 int record_on_the_left = -1;
  57.                 int record_on_the_right = 1;
  58.                 int mine_value = 9;
  59.  
  60.                 for (int j = record_on_the_left; j <= record_on_the_right; j++)
  61.                     for (int k = record_on_the_left; k <= record_on_the_right; k++)
  62.                     {
  63.                         if ((a + k) >= min_column_or_row_numb && (b + j) >= min_column_or_row_numb)  //not to exceed the board
  64.                             if ((a + k) <= max_column_or_row_numb && (b + j) <= max_column_or_row_numb)  //nnot to exceed the board
  65.  
  66.                                 if (board[a + k][b + j].value != mine_value)  //it cant be a mine in this square
  67.                                     board[a + k][b + j].value += 1;//increase the walue of the square
  68.                     }
  69.             }
  70.     }          
  71.     }
  72.  
  73. void show_board(int &min_column_or_row_numb, int &max_column_or_row_numb)
  74. {
  75.     using namespace std;
  76.     int mine_value = 9;
  77.  
  78.     for (int i = min_column_or_row_numb; i <= max_column_or_row_numb; i++) //displays board filled wth zeros and bombs
  79.     {
  80.         if (i == 0)   //shows column number
  81.         {
  82.             cout << "    ";
  83.             for (int k = 0; k < 10; k++)
  84.                 cout << k + 1;
  85.             cout << endl;
  86.             cout << "-----------------" << endl;
  87.  
  88.         }
  89.         cout << setw(2) << i + 1 << "| ";
  90.         for (int j = min_column_or_row_numb; j <= max_column_or_row_numb; j++)
  91.         {
  92.             if (board[i][j].value == mine_value) cout << "*";
  93.             if (board[i][j].value == 0) cout << " ";
  94.             if (board[i][j].value != 0 && board[i][j].value != mine_value)
  95.                 cout << board[i][j].value;
  96.         }
  97.         cout << endl;
  98.     }
  99. }
  100.  
  101. void show_part_of_board(int &min_column_or_row_numb, int &max_column_or_row_numb)
  102. {
  103.     using namespace std;
  104.     int mine_value = 9;
  105.  
  106.     for (int i = min_column_or_row_numb; i <= max_column_or_row_numb; i++)
  107.     {
  108.         if (i == 0)   //shows column number
  109.         {
  110.             cout << "    ";
  111.             for (int k = min_column_or_row_numb; k <= max_column_or_row_numb;k++)
  112.                 cout << k+1;
  113.             cout << endl;
  114.             cout << "-----------------" << endl;
  115.            
  116.         }
  117.         cout << setw(2)<< i + 1 << "| ";
  118.  
  119.         for (int j = min_column_or_row_numb; j <= max_column_or_row_numb; j++)
  120.         {
  121.  
  122.             if (board[i][j].is_covered == true) // the square is uncovered
  123.             {
  124.                 if (board[i][j].value == 0) //if value is  0 show blank space
  125.                     cout << " ";
  126.                 else
  127.                     cout << board[i][j].value; //show the value from 1-8
  128.             }
  129.             if (board[i][j].is_covered == false) //square is covered
  130.                 cout << "#"; //show #
  131.         }
  132.         cout << endl;
  133.     }
  134. }
  135.  
  136. void show_squares(int x, int y, int &min_column_or_row_numb, int &max_column_or_row_numb)
  137. {
  138.     using namespace std;
  139.  
  140.     if (x<min_column_or_row_numb || x>max_column_or_row_numb) return; // out of range
  141.     if (y<min_column_or_row_numb || y>max_column_or_row_numb) return; // out of range
  142.     if (board[x][y].is_covered == true) return; // it is already discovered
  143.  
  144.     if (board[x][y].value != 9 && board[x][y].is_covered == false)
  145.         board[x][y].is_covered = true; //show the square
  146.    
  147.     if (board[x][y].value != 0) return; // u need to uncover the whole sequence of zeros
  148.                                            //u need to show contour of the zeros
  149.    
  150.     for (int j = -1; j < 2; j++)
  151.         for (int k = -1; k < 2; k++)
  152.         {
  153.             show_squares(x+k, y+j, min_column_or_row_numb, max_column_or_row_numb);
  154.         }
  155. }
  156.  
  157. bool win(int *bombs,int &min_column_or_row_numb, int &max_column_or_row_numb) //checking if u won
  158. {
  159.     using namespace std;
  160.     int mines =0;
  161.     for (int i = min_column_or_row_numb; i<max_column_or_row_numb; i++)
  162.     {
  163.         for (int j = min_column_or_row_numb; j<max_column_or_row_numb; j++)
  164.         {
  165.             if (board[j][i].is_covered == false)
  166.                 mines++;
  167.         }
  168.     }
  169.     if (mines == *bombs)
  170.     {
  171.         cout << endl<< "WYGRANA :)" << endl << endl;
  172.         return true;
  173.     }
  174.     return false;
  175. }
  176. bool game_over_menu()
  177. {
  178.     using namespace std;
  179.     enum choices { Exit = 1, PlayAgain };
  180.     int choice;
  181. restart:
  182.     cout << "Koniec gry, co chesz dalej zrobic : " << endl;
  183.     cout << Exit << " - Wyjscie " << endl;
  184.     cout << PlayAgain << " - Zagraj ponownie :) " << endl;
  185.     cin >> choice;
  186.  
  187.     if (choice == PlayAgain)
  188.         return true;
  189.  
  190.     else if (choice == Exit)
  191.         return false;
  192.     else
  193.     {
  194.         cout << "Niepoprawne dane, wprowadź ponownie " << endl;
  195.         system("cls");
  196.         goto restart;
  197.     }
  198. }
  199.  
  200. void play(int *bombs, int &min_column_or_row_numb, int &max_column_or_row_numb)
  201. {
  202.     using namespace std;
  203.    
  204.     int a, b;
  205.     do
  206.     {
  207.         restart:
  208.         cout << "Podaj wspolrzedne tablicy (od 1 do 10) (najpierw numer kolumny potem wiersza): " << endl;
  209.         cin >> a >> b;
  210.         int y = a - 1;
  211.         int x = b - 1;
  212.  
  213.         if (y < min_column_or_row_numb || x < min_column_or_row_numb || y > max_column_or_row_numb || x > max_column_or_row_numb)
  214.         {
  215.             cout << "Podales wartosci spoza zakresu, sprobuj jeszcze raz" << endl;
  216.             goto restart;
  217.         }
  218.         system("cls");
  219.        
  220.         if (board[x][y].value == 9)
  221.         {
  222.             cout << "Przegrales :(" << endl << endl;
  223.             show_board(min_column_or_row_numb, max_column_or_row_numb);//if u lose it shows you the whole board
  224.             break;
  225.         }
  226.         else {
  227.             show_squares(x, y,min_column_or_row_numb, max_column_or_row_numb);
  228.             show_part_of_board(min_column_or_row_numb, max_column_or_row_numb);
  229.         }//it uncoveres the squares according to the rules
  230.    
  231.     } while (win(bombs, min_column_or_row_numb, max_column_or_row_numb)==false);
  232. }
  233.  
  234. int main()
  235. {
  236.     using namespace std;
  237.     restart:
  238.     int board_size = 10;
  239.     int min_column_or_row_numb = 0;
  240.     int max_column_or_row_numb = 9;
  241.    
  242.     int *bombs;
  243.     bombs = new int;
  244.     char again;
  245.     cout << "Podaj ilosc bomb od 0 do 99" << endl;
  246.     cin >> *bombs;
  247.  
  248.     place_bombs(bombs, min_column_or_row_numb, max_column_or_row_numb);
  249.  
  250.     if (*bombs >= 0 && *bombs <= 99)
  251.     {
  252.         play(bombs, min_column_or_row_numb, max_column_or_row_numb);
  253.     }
  254.    
  255.     if (game_over_menu() == true)
  256.     {
  257.         system("cls");
  258.         goto restart;
  259.     }
  260.     else
  261.     return 0;
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement