- #include <iostream>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <windows.h>
- #include <ctime>
- using namespace std;
- const int MAX_MAP_LENGTH = 13; // Długość planszy
- enum block_type {
- NORMAL,
- EXTRA_POINT,
- DELETE_ROW,
- EMPTY
- };
- class block {
- private:
- block_type type_;
- public:
- explicit block(block_type type = NORMAL) : type_(type) {}
- string display()
- {
- switch (type_)
- {
- case NORMAL: return " #### ";
- case EXTRA_POINT: return " #+1# ";
- case DELETE_ROW: return " #--# ";
- case EMPTY: return " ";
- default: throw ("Nie ma takiego bloczka");
- }
- }
- };
- // Losowanie rodzaju bloczka
- block generate_random_block()
- {
- int rand_ = rand() % 100;
- if (rand_ < 15) return block(EXTRA_POINT);
- else if (rand_ < 25) return block(DELETE_ROW);
- else return block(NORMAL);
- }
- // Generowanie mapy
- void generate_map(vector<queue<block>>& map, int& k, int& b)
- {
- for (int i = 0; i < k; i++)
- {
- map.push_back(queue<block>());
- for (int j = 0; j < b; j++)
- map[i].push(generate_random_block());
- }
- }
- void delete_map(vector<queue<block>>& map, int& k, int& b)
- {
- for (int i = 0; i < k; i++)
- {
- map.pop_back();
- for (int l = 0; l < map.size(); l++)
- {
- while (!map[l].empty())
- {
- map[l].pop();
- }
- }
- }
- }
- void getData(vector<queue<block>>& map ,int& k, int& b, int& n, int& r)
- {
- system("CLS");
- delete_map(map, k, b);
- cout << endl << "Podaj liczbe kolumn: ";
- cin >> k;
- cout << endl << "Podaj liczbe bloczkow w kolumnie: ";
- cin >> b;
- cout << endl << "Podaj zakres randomowej szybkosci posuwania planszy: ";
- cin >> n;
- cout << endl << "Podaj wartosc startowa posuwania plaszy: ";
- cin >> r;
- cout << endl;
- generate_map(map, k, b);
- }
- void show_map(vector<queue<block>> b)
- {
- stack<block> swaped;
- for (int k = 0; k < b.size(); k++)
- {
- while (!b[k].empty())
- {
- swaped.push(b[k].front());
- b[k].pop();
- }
- while (!swaped.empty())
- {
- b[k].push(swaped.top());
- swaped.pop();
- }
- }
- for (int i = 0; i < MAX_MAP_LENGTH; i++)
- {
- for (int j = 0; j < b.size(); j++)
- if (!b[j].empty())
- {
- cout << b[j].front().display();
- b[j].pop();
- }
- else cout << " ";
- cout << endl;
- }
- }
- void instrukcja() {
- cout << "#### Blok za 1pkt" << endl;
- cout << "#+1# Blok za 2pkt" << endl;
- cout << "#--# Blok usuwajacy caly wiersz" << endl;
- system("pause");
- }
- // Dodanie wiersza
- void add_row(vector<queue<block>>& blocks_)
- {
- for (int i = 0; i < blocks_.size(); i++)
- {
- blocks_[i].push(generate_random_block());
- }
- }
- // Usunięcie wiersza (BONUS)
- void delete_row(vector<queue<block>>& map)
- {
- for (int i = 0; i < map.size(); i++)
- if (!map[i].empty())
- map[i].pop();
- }
- // Usunięcie wybranego bloku
- void remove_block(vector<queue<block>>& map, int& points, int column, int k)
- {
- if (!map[column].empty() and column < k)
- {
- string removed_block = map[column].front().display();
- if (removed_block == " #--# ")
- {
- delete_row(map); // Usunięcie wiersza (BONUS)
- ++points;
- }
- else if (removed_block == " #+1# ")
- {
- map[column].pop();
- points += 2; // Dodatkowy punkt (BONUS)
- }
- else
- {
- map[column].pop(); // Usunięcie wybranego bloczku
- ++points;
- }
- }
- }
- // Sprawdzenie przegrania
- bool check_end(vector<queue<block>> map, int points)
- {
- for (int i = 0; i < map.size(); i++)
- {
- if (map[i].size() > MAX_MAP_LENGTH)
- {
- cout << "Ups! Przegrales :( Zdobyles " << points << " punktow." << endl;
- system("pause");
- return true;
- }
- }
- return false;
- }
- // Sprawdzenie wygrania
- bool check_win(vector<queue<block>> map, int points)
- {
- bool win;
- win = false;
- for (int i = 0; i < map.size(); i++)
- {
- if (map[i].empty()) win = true;
- else
- {
- win = false;
- break;
- };
- }
- if (win)
- {
- system("CLS");
- show_map(map);
- cout << "Brawo! Wygrales :) Zdobyles " << points << " punktow." << endl;
- system("pause");
- return true;
- }
- else return false;
- }
- void game_loop(vector<queue<block>> map, int k, int b, int n, int r)
- {
- int points = 0; // Zdobyte punkty
- int new_row = r + rand() % n;
- int column;
- do
- {
- system("CLS");
- show_map(map);
- cout << "Zdobyte punkty: " << points << endl;
- cin >> column;
- remove_block(map, points, column - 1, k);
- new_row--;
- Sleep(50);
- if (new_row == 0)
- {
- new_row = r + rand() % n;
- add_row(map);
- }
- } while ((!check_win(map, points)) and (!check_end(map,points)));
- }
- void pisz_menu(int nr)
- {
- system("CLS");
- switch (nr)
- {
- case 1: {
- cout << endl;
- cout << "MENU glowne" << endl;
- cout << "----------------------" << endl;
- cout << "1 - Start Gry " << endl;
- cout << "2 - Ustawienia" << endl;
- cout << "3 - Instrukcja" << endl;
- cout << "0 - koniec pracy" << endl;
- cout << "> ";
- break;
- }
- }
- }
- void menu_main(vector<queue<block>> map, int& k, int& b, int& n, int& r)
- {
- int wybor;
- do {
- pisz_menu(1);
- cin >> wybor;
- switch (wybor)
- {
- case 1: game_loop(map, k, b, n, r);
- break;
- case 2: getData(map,k, b, n, r);
- break;
- case 3: instrukcja();
- break;
- }
- } while (wybor != 0);
- }
- int main()
- {
- srand(time(NULL));
- int k = 7; // kolumny
- int b = 5; // liczba bloczków w kolumnie
- int n = 5; // zakres szybkości dodawania bloczków
- int r = 10; // zmienna do dodawania bloczków
- vector< queue<block> > map;
- generate_map(map, k, b);
- menu_main(map, k, b, n, r);
- }