Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <list>
- #include <iterator>
- using namespace std;
- class polk {
- public:
- polk (int spd, int max_orgg, int max_colwoo, double dmg_distt, double dmg_blizhh, char typee) {
- speed = spd;
- org = max_org = max_orgg;
- colwo = max_colwo = max_colwoo;
- dmg_dist = dmg_distt;
- dmg_blizh = dmg_blizhh;
- type = type;
- }
- int get_dmg_dist() {
- return dmg_dist*colwo*org;
- }
- int get_dmg_blizh() {
- return dmg_blizh*colwo*org;
- }
- bool add_kills(int chisl) {
- if (org > max_org/2) {
- colwo -= chisl*0.25;
- org -= chisl*0.75;
- } else if (org > 0) {
- colwo -= chisl*0.75;
- org -= chisl*0.25;
- } else {
- colwo -= chisl;
- }
- if (colwo <0) colwo = 0;
- if (org < 0) org = 0;
- if (colwo == 0 || org == 0) return 0;
- return 1;
- }
- void regen_org(int chisl) {
- org += chisl;
- if(org > max_org) org = max_org;
- return;
- }
- void regen_units(int chisl) {
- colwo += chisl;
- return;
- }
- int needed_units () {
- return max_colwo - colwo;
- }
- int get_speed () {
- return speed;
- }
- int get_org () {
- return org;
- }
- int get_max_org () {
- return max_org;
- }
- int get_colwo () {
- return colwo;
- }
- int get_max_colwo () {
- return max_colwo;
- }
- double get_dist () {
- return dmg_dist;
- }
- double get_blizh () {
- return dmg_blizh;
- }
- int get_type () {
- return type;
- }
- bool storona;
- private:
- char type;
- int speed;
- int max_org;
- int org;
- int max_colwo;
- int colwo;
- double dmg_dist;
- double dmg_blizh;
- };
- class leader {
- public:
- private:
- };
- class army {
- public:
- army (polk* first_polk) {
- speed = first_polk->get_speed();
- colwo_arm = first_polk->get_colwo();
- army_needed = first_polk->needed_units();
- number_of_polks = 1;
- all_polks.push_front(first_polk);
- }
- void merge_polks () {
- }
- void add_polk (polk* new_polk) {
- if (new_polk->get_blizh() > new_polk->get_dist()) {
- all_polks.push_front(new_polk);
- } else {
- all_polks.push_back(new_polk);
- }
- number_of_polks++;
- colwo_arm += new_polk->get_colwo();
- army_needed += new_polk->needed_units();
- if (speed > new_polk->get_speed()) speed = new_polk->get_speed();
- }
- list <polk*> get_polks () {
- return all_polks;
- }
- private:
- leader* general;
- list <polk*> all_polks;
- int speed;
- int colwo_arm;
- int number_of_polks;
- int army_needed;
- };
- class battle {
- public:
- battle (int heightt, int widthh, army* army1, army* army2) {
- height = heightt;
- width = widthh;
- field = new polk**[height];
- for(int i = 0; i < height; i++) {
- field[i] = new polk*[width];
- for(int j = 0; j < width; j++) {
- field[i][j] = NULL;
- }
- }
- field_dmg = new int*[height];
- for(int i = 0; i < height; i++) {
- field_dmg[i] = new int[width];
- for(int j = 0; j < width; j++) {
- field_dmg[i][j] = 0;
- }
- }
- cout << "sasa";
- copy((army1->get_polks()).begin(), (army1->get_polks()).end(), inserter(reserve_a1, reserve_a1.end()));
- cout << "sasa";
- copy((army2->get_polks()).begin(), (army2->get_polks()).end(), inserter(reserve_a2, reserve_a2.end()));
- cout << "sasa";
- it_a1 = reserve_a1.begin();
- it_a2 = reserve_a2.begin();
- have_ended = false;
- }
- ~battle () {
- for(int i = 0; i < height; i++) {
- delete[] field[i];
- }
- delete[] field;
- for(int i = 0; i < height; i++) {
- delete[] field_dmg[i];
- }
- delete[] field_dmg;
- }
- void end_battle (bool win_storona) {
- std::cout << "ASASSSSSAASSASAASSA " << win_storona << " AAAA";
- have_ended = true;
- }
- void test_to_flank () {
- for (int j = 0; j < width; j++) {
- if (field[0][j]) {
- if (!(field[0][j]->storona)) {
- end_battle (false);
- }
- }
- if (field[0][j]) {
- if (field[height-1][j]->storona) {
- end_battle (true);
- }
- }
- }
- }
- void add_daln_dmg_local (int dmg, int j, bool storona) {
- if (storona)
- for (int i = 1; i < height; i++) {
- if (field[i][j]) {
- if (!(field[i][j]->storona)) {
- field_dmg[i][j] += dmg;
- break;
- }
- }
- }
- else
- for (int i = height - 2; i > 0; i--) {
- if (field[i][j]) {
- if (field[i][j]->storona) {
- field_dmg[i][j] += dmg;
- break;
- }
- }
- }
- }
- void move_and_add_blizh_dmg () {
- for (int j = 0; j < width; j++) {
- for (int i = 1; i < height - 1; i++) {
- if (field[i][j] != NULL) {
- if ((field[i][j]->storona) && (field[i+1][j] == NULL)) {
- swap(field[i][j], field[i+1][j]);
- } else if ((field[i][j]->storona) && (!(field[i+1][j]->storona))) {
- field_dmg[i+1][j] += (field[i][j]->get_dmg_blizh());
- }
- }
- }
- for (int i = height - 2; i > 0; i--) {
- if (field[i][j] != NULL) {
- if ((!(field[i][j]->storona)) && (field[i-1][j] == NULL)) {
- swap(field[i][j], field[i-1][j]);
- } else if ((!(field[i][j]->storona)) && (field[i-1][j]->storona)) {
- field_dmg[i-1][j] += (field[i][j]->get_dmg_blizh());
- }
- }
- }
- }
- }
- void razmescheniye_voysk () {
- for (int i = 0; (i < width) && (reserve_a1.end() != it_a1); i++) {
- if(field[1][i] == NULL)
- for (;(reserve_a1.end() != it_a1);it_a1++)
- if((*it_a1)->get_blizh() > (*it_a1)->get_dist()) {
- (*it_a1)->storona = true;
- field[1][i] = (*it_a1);
- reserve_a1.erase(it_a1);
- it_a1 = reserve_a1.begin();
- break;
- }
- if(field[0][i] == NULL)
- for (;(reserve_a1.end() != it_a1);it_a1++)
- if((*it_a1)->get_blizh() < (*it_a1)->get_dist()) {
- (*it_a1)->storona = true;
- field[0][i] = (*it_a1);
- reserve_a1.erase(it_a1);
- it_a1 = reserve_a1.begin();
- break;
- }
- }
- for (int i = 0; (i < width) && (reserve_a2.end() != it_a2); i++) {
- if(field[height - 2][i] == NULL)
- for (; (reserve_a2.end() != it_a2); it_a2++)
- if((*it_a2)->get_blizh() > (*it_a2)->get_dist()) {
- (*it_a2)->storona = false;
- field[height - 2][i] = (*it_a2);
- reserve_a2.erase(it_a2);
- it_a2 = reserve_a2.begin();
- break;
- }
- if(field[height - 1][i] == NULL)
- for (;(reserve_a2.end() != it_a2); it_a2++)
- if((*it_a2)->get_blizh() < (*it_a2)->get_dist()) {
- (*it_a2)->storona = false;
- field[height - 1][i] = (*it_a2);
- reserve_a2.erase(it_a2);
- it_a2 = reserve_a2.begin();
- break;
- }
- }
- }
- void add_daln_dmg () {
- for (int j = 0; j < width; j++) {
- if (field[0][j]) {
- add_daln_dmg_local ((field[0][j]->get_dmg_dist()), j, true);
- }
- if (field[height-1][j]) {
- add_daln_dmg_local ((field[height - 1][j]->get_dmg_dist()), j, false);
- }
- }
- }
- void add_all_dmg_from_matrix () {
- for (int i = 0; i < height; i++) {
- for (int j = 0; j < width; j++) {
- if(field[i][j])
- if(!(field[i][j]->add_kills(field_dmg[i][j]))) field[i][j] = NULL;
- field_dmg = 0;
- }
- }
- }
- void test_to_end () {
- bool a_zasch = true, a_atak = true;
- for (int i = 0; i < height; i++) {
- for (int j = 0; j < width; j++) {
- if (field[i][j]) {
- if (field[i][j]->storona) a_zasch = false;
- else a_atak = false;
- }
- }
- }
- if (a_atak) {
- end_battle (true);
- }
- if (a_zasch) {
- end_battle (false);
- }
- }
- void tick () {
- razmescheniye_voysk();
- move_and_add_blizh_dmg();
- test_to_flank();
- add_daln_dmg();
- add_all_dmg_from_matrix();
- test_to_end();
- }
- void add_to_battle (army* army_new) {
- }
- polk*** get_field () {
- return field;
- }
- bool have_ended;
- private:
- list <polk*> reserve_a1;
- list <polk*> reserve_a2;
- list <polk*> :: iterator it_a1;
- list <polk*> :: iterator it_a2;
- leader* leader_a1;
- leader* leader_a2;
- polk*** field;
- int** field_dmg;
- int width;
- int height;
- };
- void temp_create_army(army* kek) {
- polk* asssas = new polk(7, 1000, 1000, 0.2, 0.1, 'i');
- army* ass = new army(asssas);
- for(int i = 0; i < 10; i++) {
- asssas = new polk(7, 1000, 1000, 0.2, 0.1, 'i');
- ass->add_polk(asssas);
- }
- kek = ass;
- }
- int main() {
- //testing of battles
- army* army1;
- army* army2;
- temp_create_army(army1);
- temp_create_army(army2);
- battle ass_god(4, 20, army1, army2);
- polk*** fie_ld;
- int chisl;
- int orga;
- for (;;) {
- ass_god.tick();
- fie_ld = ass_god.get_field();
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 20; j++) {
- if (fie_ld[i][j])
- std::cout << 'i';
- else
- std::cout << 'o';
- }
- std::cout << endl;
- }
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 20; j++) {
- if (fie_ld[i][j]) {
- chisl = fie_ld[i][j]->get_colwo();
- orga = fie_ld[i][j]->get_org();
- std::cout << "Org: " << orga << " Chisl: " << chisl << " j: " << j;
- std::cout << endl;
- }
- }
- std::cout << endl;
- }
- cin >> orga;
- if(orga) break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement