From b85e8c2cab7317d39c733e59458c50c0b0c92a2e Mon Sep 17 00:00:00 2001 From: Stas Date: Mon, 8 Jun 2020 12:06:50 +0300 Subject: [PATCH] All done --- 8382/Kuzina Anastasiya/Base.cpp | 360 +++++++ 8382/Kuzina Anastasiya/Base.h | 54 ++ 8382/Kuzina Anastasiya/Exept.cpp | 5 + 8382/Kuzina Anastasiya/Exept.h | 11 + 8382/Kuzina Anastasiya/Feature.cpp | 71 ++ 8382/Kuzina Anastasiya/Feature.h | 27 + 8382/Kuzina Anastasiya/Field.cpp | 343 +++++++ 8382/Kuzina Anastasiya/Field.h | 76 ++ 8382/Kuzina Anastasiya/Graphic.cpp | 147 +++ 8382/Kuzina Anastasiya/Graphic.h | 40 + 8382/Kuzina Anastasiya/Item.cpp | 35 + 8382/Kuzina Anastasiya/Item.h | 39 + 8382/Kuzina Anastasiya/Land.cpp | 77 ++ 8382/Kuzina Anastasiya/Land.h | 48 + 8382/Kuzina Anastasiya/Logger.cpp | 53 ++ 8382/Kuzina Anastasiya/Logger.h | 18 + .../Loggs/Mon Jun 8 11-59-20 2020.txt | Bin 0 -> 2318 bytes 8382/Kuzina Anastasiya/OOP.cpp | 894 ++++++++++++++++++ 8382/Kuzina Anastasiya/OOP.exe | Bin 0 -> 286720 bytes 8382/Kuzina Anastasiya/Player.cpp | 31 + 8382/Kuzina Anastasiya/Player.h | 18 + 8382/Kuzina Anastasiya/Rules.cpp | 74 ++ 8382/Kuzina Anastasiya/Rules.h | 28 + 8382/Kuzina Anastasiya/SaveFiles/Mon.txt | 27 + 8382/Kuzina Anastasiya/Unit.cpp | 205 ++++ 8382/Kuzina Anastasiya/Unit.h | 94 ++ 26 files changed, 2775 insertions(+) create mode 100644 8382/Kuzina Anastasiya/Base.cpp create mode 100644 8382/Kuzina Anastasiya/Base.h create mode 100644 8382/Kuzina Anastasiya/Exept.cpp create mode 100644 8382/Kuzina Anastasiya/Exept.h create mode 100644 8382/Kuzina Anastasiya/Feature.cpp create mode 100644 8382/Kuzina Anastasiya/Feature.h create mode 100644 8382/Kuzina Anastasiya/Field.cpp create mode 100644 8382/Kuzina Anastasiya/Field.h create mode 100644 8382/Kuzina Anastasiya/Graphic.cpp create mode 100644 8382/Kuzina Anastasiya/Graphic.h create mode 100644 8382/Kuzina Anastasiya/Item.cpp create mode 100644 8382/Kuzina Anastasiya/Item.h create mode 100644 8382/Kuzina Anastasiya/Land.cpp create mode 100644 8382/Kuzina Anastasiya/Land.h create mode 100644 8382/Kuzina Anastasiya/Logger.cpp create mode 100644 8382/Kuzina Anastasiya/Logger.h create mode 100644 8382/Kuzina Anastasiya/Loggs/Mon Jun 8 11-59-20 2020.txt create mode 100644 8382/Kuzina Anastasiya/OOP.cpp create mode 100644 8382/Kuzina Anastasiya/OOP.exe create mode 100644 8382/Kuzina Anastasiya/Player.cpp create mode 100644 8382/Kuzina Anastasiya/Player.h create mode 100644 8382/Kuzina Anastasiya/Rules.cpp create mode 100644 8382/Kuzina Anastasiya/Rules.h create mode 100644 8382/Kuzina Anastasiya/SaveFiles/Mon.txt create mode 100644 8382/Kuzina Anastasiya/Unit.cpp create mode 100644 8382/Kuzina Anastasiya/Unit.h diff --git a/8382/Kuzina Anastasiya/Base.cpp b/8382/Kuzina Anastasiya/Base.cpp new file mode 100644 index 000000000..d697caa35 --- /dev/null +++ b/8382/Kuzina Anastasiya/Base.cpp @@ -0,0 +1,360 @@ +#include "Base.h" + +base::base(int num) { + number = num; + hp = feature(200); + max_units = 3; + tmp_unit = 0; + count_units = 0; + x = 0; + is_alive = true; + y = 0; + name = 30; + owner = NULL; + for (int i = 0; i < 3; i++) { + units[i] = create_unit(get_creature()); + is_unit[i] = true; + } + +} + +base::~base() { + for (int i = 0; i < 3; i++) { + if(is_unit[i]) + delete(units[i]); + } + +} + +void* base::get_owner() { return owner; } + +void base::set_owner(void* own) { owner = own; } + +void base::set_coords(int xx, int yy) { + if (xx < 0 || yy < 0) throw except("(base::set_coords) Trying to set base negative coords: ("+to_string(xx)+","+to_string(yy)+")\n"); + x = xx; + y = yy; +} + +int base::set_hp(int new_hp) { + if (new_hp <= 0) { + new_hp = 0; + is_alive = false; + name = 'X'; + } + hp.set_tmp(new_hp); + if (hp.get_tmp() <= 0) return 1; +} + +int base::sub_hp(int sub) { + if(sub > 0) hp.add( -1*sub); + if (hp.get_tmp() <= 0) { + set_hp(0); + return 1; + } +} + +bool base::is_base_alive(){ + return is_alive; +} + +int base::get_hp() { + return hp.get_tmp(); +} + +unit* base::get_unit(int i) { + int f = is_any_alive(); + if (f == -1) return NULL; + if (i < 0 || i > 2) return units[f]; + if (is_unit[i]) return units[i]; + else return NULL; +} + +bool base::is_unit_alive(int i) { + if (i < 0 || i > 2) return is_unit[0]; //ERROR + return is_unit[i]; + +} + +int base::get_number() { + return number; +} + +unit* base::get_tmp_unit() { + if(!is_unit[tmp_unit]) return NULL; + return units[tmp_unit]; +} + +bool base::set_tmp_unit(int i) { + if (i < 0 || i > 2) return false; + if (!is_unit[i]) return false; + tmp_unit = i; + return true; +} + +int base::is_any_alive() { + for (int i = 0; i < 3; i++) { + if (is_unit[i]) return i; + } + logger::add("Base number " + to_string(number) + " has no more units alive!\n"); + return -1; +} + +int base::how_many_alive() { + int i = 0; + for (int j = 0; j < 3; j++) { + if (is_unit[i])i++; + } + return i; + +} + +int base::get_x() { + return x; +} + +int base::get_y() { + return y; +} + +char base::get_name() { + return name; +} + +void base::set_unit(int x, int y, char name, int hdp, int hp_max, int armor, int attack, int xp, int xp_level, int level, int i) { + if (is_unit[i]) delete_unit(i); + if (x < 0 || y < 0 || hdp <= 0 || i < 0 || i > 2) throw except("(base::set_unit)Something goes wrong with creating unit!\n\tStats: (" + to_string(x)+"," +to_string(y) + ") hp: " + to_string(hdp) +" at " + to_string(i) +" position in base number "+ to_string(number) + "\n"); + + + + is_unit[i] = true; + switch (name) { + case 'c': { + crow* unit_crow = new crow; + unit_crow->set_base_nubmer(number); + unit_crow->set_base(this); + count_units++; + unit_crow->set_coords(x, y); + unit_crow->set_all(hdp, hp_max, armor, attack, xp, xp_level, level); + + + units[i] = unit_crow; + return; + } + case 'w': { + wolf* unit_wolf = new wolf; + unit_wolf->set_base_nubmer(number); + unit_wolf->set_base(this); + count_units++; + unit_wolf->set_coords(x, y); + unit_wolf->set_all(hdp, hp_max, armor, attack, xp, xp_level, level); + + + units[i] = unit_wolf; + + return; + } + case 'h': { + hyena* unit_hyena = new hyena; + unit_hyena->set_base_nubmer(number); + unit_hyena->set_base(this); + unit_hyena->set_coords(x, y); + unit_hyena->set_all(hdp, hp_max, armor, attack, xp, xp_level, level); + + + units[i] = unit_hyena; + count_units++; + + return; + } + case 'l': { + lizard* unit_lizard = new lizard; + unit_lizard->set_base_nubmer(number); + unit_lizard->set_base(this); + count_units++; + unit_lizard->set_coords(x, y); + unit_lizard->set_all(hdp, hp_max, armor, attack, xp, xp_level, level); + + + units[i] = unit_lizard; + return; + } + case 'd': { + duck* unit_duck = new duck; + unit_duck->set_base_nubmer(number); + unit_duck->set_base(this); + count_units++; + unit_duck->set_coords(x, y); + unit_duck->set_all(hdp, hp_max, armor, attack, xp, xp_level, level); + + + units[i] = unit_duck; + return; + } + case 'f': { + frog* unit_frog = new frog; + unit_frog->set_base_nubmer(number); + unit_frog->set_base(this); + count_units++; + unit_frog->set_coords(x, y); + unit_frog->set_all(hdp, hp_max, armor, attack, xp, xp_level, level); + + + units[i] = unit_frog; + + return; + } + + + } + is_unit[i] = false; + throw except("(base::set_unit) Can't create unit with this name: "+to_string(name)+"\n\tit's dosn't match any type-name\n"); +} + +creature base::get_creature() { + //srand(time(0)); + int c = rand() % 6; + switch (c) { + case 0: return Duck; + case 1: return Crow; + case 2: return Wolf; + case 3: return Hyena; + case 4: return Frog; + case 5: return Lizard; + } + +} + +unit* base::create_unit(creature type = Crow) { + if (count_units >= max_units) { + cout << "There is maximum count of units alredy!\n"; + return NULL; + } + if (type == None) { + logger::add("Can't create None unit\n"); + throw exception("(base::create_unit) Can't create None-type unit!\n"); + return NULL; + } // ERROR + if (!is_alive) return NULL; + + logger::add("Base number "+to_string(number) +" just make new unit-"); + switch (type) { + case Crow: { + crow* unit_crow = new crow; + unit_crow->set_base_nubmer(number); + unit_crow->set_base(this); + count_units++; + logger::add("crow\n"); + return unit_crow; + break; + } + case Wolf: { + wolf* unit_wolf = new wolf; + unit_wolf->set_base_nubmer(number); + unit_wolf->set_base(this); + count_units++; + logger::add("wolf\n"); + return unit_wolf; + break; + } + case Hyena: { + hyena* unit_hyena = new hyena; + unit_hyena->set_base_nubmer(number); + unit_hyena->set_base(this); + count_units++; + logger::add("hyena\n"); + return unit_hyena; + break; + } + case Lizard: { + lizard* unit_lizard = new lizard; + unit_lizard->set_base_nubmer(number); + unit_lizard->set_base(this); + count_units++; + logger::add("lizard\n"); + return unit_lizard; + break; + } + case Duck: { + duck* unit_duck = new duck; + unit_duck->set_base_nubmer(number); + unit_duck->set_base(this); + count_units++; + logger::add("duck\n"); + return unit_duck; + break; + } + case Frog: { + frog* unit_frog = new frog; + unit_frog->set_base_nubmer(number); + unit_frog->set_base(this); + logger::add("frog\n"); + count_units++; + return unit_frog; + + break; + } + + } + +} + +int base::create_unit() { + if (count_units >= max_units) { + cout << "There is maximum count of units alredy!\n"; + return -1; + } + if (!is_alive) return -1; + + for (int i = 0; i < 3; i++) { + if (!is_unit[i]) { + units[i] = create_unit(get_creature()); + is_unit[i] = true; + return i; + } + + } + return -1; + +} + +int base::delete_unit() { + for (int i = 0; i < max_units; i++) { + if (is_unit[i] && (units[i])->get_hp() <= 0 ) { + delete(units[i]); + logger::add("Base number " + to_string(number) + " just delete unit\n"); + is_unit[i] = false; + count_units--; + } + + } + return -1; +} + +int base::delete_unit(int i) { + if (is_unit[i]) { + delete units[i]; + is_unit[i] = false; + count_units--; + } + return i; +} + +void base::get_info() { + + std::cout << " \t Your base at (" << x << " ; " << y << ") \n"; + std::cout << " \t with " << hp.get_tmp() << "\\200 hp\n"; +} + +bool operator-(base& un, unit* it) { + if (un.is_alive) logger::add("\tBase number " + to_string(un.number) + " get hit; now it has " + to_string(un.get_hp()) + " hp\n"); + + un.sub_hp(it->get_attack() / 2); + if (un.get_hp() > 0) return false; + if (!un.is_alive) return true; + logger::add("Base number " + to_string(un.number) + " is dead!\n"); + un.set_hp(0); + un.is_alive = false; + un.name = 'X'; + return true; +} diff --git a/8382/Kuzina Anastasiya/Base.h b/8382/Kuzina Anastasiya/Base.h new file mode 100644 index 000000000..c2ab97745 --- /dev/null +++ b/8382/Kuzina Anastasiya/Base.h @@ -0,0 +1,54 @@ +#pragma once +#include +#include +#include "Unit.h" +#include "Logger.h" +#include "Exept.h" +//#include "Field.h" + +class base { + int x; + int y; + int tmp_unit; + feature hp; + char name; + int number; + bool is_alive; + int max_units; + int count_units; + unit* units[3]; + bool is_unit[3]; + void* owner; + unit* create_unit(creature type); + creature get_creature(); + + +public: + base(int num); + ~base(); + int how_many_alive(); + int create_unit(); + void set_unit(int x, int y, char name, int hdp, int hp_max, int armor, int attack, int xp, int xp_level, int level, int i); + + int get_hp(); + void* get_owner(); + void set_owner(void* own); + void get_info(); + unit* get_tmp_unit(); + bool set_tmp_unit(int i); + int get_number(); + bool is_base_alive(); + bool is_unit_alive(int i); + int is_any_alive(); + + char get_name(); + int get_x(); + int get_y(); + friend bool operator-(base& un, unit* it); + void set_coords(int xx, int yy); + int set_hp(int new_hp); + int sub_hp(int sub); + unit* get_unit(int i); + int delete_unit(); + int delete_unit(int i); +}; diff --git a/8382/Kuzina Anastasiya/Exept.cpp b/8382/Kuzina Anastasiya/Exept.cpp new file mode 100644 index 000000000..648e2c7e1 --- /dev/null +++ b/8382/Kuzina Anastasiya/Exept.cpp @@ -0,0 +1,5 @@ +#include "Exept.h" + + +except::except(std::string e): std::exception(e.c_str()){ +} diff --git a/8382/Kuzina Anastasiya/Exept.h b/8382/Kuzina Anastasiya/Exept.h new file mode 100644 index 000000000..344da4552 --- /dev/null +++ b/8382/Kuzina Anastasiya/Exept.h @@ -0,0 +1,11 @@ +#pragma once +#include +#include + + + +class except : public std::exception { +public: + except(std::string e); + +}; diff --git a/8382/Kuzina Anastasiya/Feature.cpp b/8382/Kuzina Anastasiya/Feature.cpp new file mode 100644 index 000000000..3f4b4da32 --- /dev/null +++ b/8382/Kuzina Anastasiya/Feature.cpp @@ -0,0 +1,71 @@ +#include "Feature.h" + +feature::feature() { + max = 1; + tmp = 1; +} + +feature::feature(int n_max) { + max = n_max; + tmp = n_max; +} + +int feature::get_tmp() { + return tmp; +} + +int feature::get_max() { + return max; +} + +void feature::set_tmp(int n_tmp) { + if (n_tmp < 0) n_tmp = 0; + tmp = n_tmp; +} + +void feature::set_max(int n_max) { + if (n_max <= 0) n_max = 1; + max = n_max; +} + +bool feature::add(int num) { //num < 0 + tmp += num; + if (tmp > max) tmp = max; + if (tmp <= 0) return 1; // 1, + return 0; +} + + +ulevel::ulevel() { + tmp_xp = 0; + tmp_level = 1; + xp_for_next_level = 20; +} + +void ulevel::new_level() { + tmp_xp = 0; + tmp_level++; + xp_for_next_level = xp_for_next_level*2; + +} + +bool ulevel::plus_xp(int xp) { + tmp_xp += xp; + if (tmp_xp >= xp_for_next_level) { + new_level(); + return 1; + } + return 0; +} + +int ulevel::get_tmp_xp() { + return tmp_xp; +} + +int ulevel::get_tmp_level() { + return tmp_level; +} + +int ulevel::get_xp_for_next_level() { + return xp_for_next_level; +} \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Feature.h b/8382/Kuzina Anastasiya/Feature.h new file mode 100644 index 000000000..19b95b3c7 --- /dev/null +++ b/8382/Kuzina Anastasiya/Feature.h @@ -0,0 +1,27 @@ +#pragma once + +class feature { + int tmp; + int max; +public: + feature(); + feature(int n_max); + int get_tmp(); + int get_max(); + void set_tmp(int n_tmp); + void set_max(int n_max); + bool add(int num); +}; + +class ulevel { + int tmp_xp; + int tmp_level; + int xp_for_next_level; + void new_level(); +public: + ulevel(); + bool plus_xp(int xp); + int get_tmp_level(); + int get_xp_for_next_level(); + int get_tmp_xp(); +}; diff --git a/8382/Kuzina Anastasiya/Field.cpp b/8382/Kuzina Anastasiya/Field.cpp new file mode 100644 index 000000000..09c43eeca --- /dev/null +++ b/8382/Kuzina Anastasiya/Field.cpp @@ -0,0 +1,343 @@ +#pragma once +#include +using namespace std; +#include +#include +#include +#include "Base.h" +#include "Field.h" + + field_cell::field_cell(int new_y, int new_x, int new_land) { + is_bas = false; + tmp_base = NULL; + if (new_x < 0 || new_y < 0) throw except("(field_cell::fild_cell) Trying to create cell with negative coords: ("+to_string(new_x)+","+to_string(new_y)+")\n"); + x = new_x; + y = new_y; + type_unit = None; + int c = rand() % 50; + if (c <= 5 || c > 12) { + type_item = Non; + tmp_item = NULL; + } + else if (c > 5 && c < 8) { + type_item = Exp; + tmp_item = new exp_bottle(); + } + else if(c > 7 && c < 10){ + type_item = Pill; + tmp_item = new hp_pill(); + } + else if (c > 9 && c < 12) { + type_item = Zatochka; + tmp_item = new zatochka(); + } + else if (c > 11 && c < 13) { + type_item = Rand; + tmp_item = new rpill(); + } + switch (new_land) { + case 0: { + land = sunflower(); + break; + } + case 1:{ + land = lake(); + break; + } + case 2: { + land = mountain(); + break; + } + case 3: { + land = forest(); + break; + } + default: + throw except("(filed_cell::field_cell) Cell("+to_string(x)+","+to_string(y)+") Wrong landscape number! Expected for 0 to 3, get: "+to_string(new_land)+"\n"); + } + } + void field_cell::set_unit(unit* new_unit) { + tmp_unit = new_unit; + type_unit = new_unit->get_type(); + new_unit->set_coords(x, y); + } + int field_cell::set_item(int c) { + if (c == 1) { + type_item = Exp; + tmp_item = new exp_bottle(); + } + else if (c == 2) { + type_item = Pill; + tmp_item = new hp_pill(); + } + else if (c == 3) { + type_item = Zatochka; + tmp_item = new zatochka(); + } + else if (c == 4) { + type_item = Rand; + tmp_item = new rpill(); + } + else throw except("(field_cell::set_item) Cell(" + to_string(x) + "," + to_string(y) + ") Incorrect item number, expected from 1 to 4, get: "+to_string(c)+"\n"); + return c; + } + bool field_cell::is_empty() { + int tes = 1; + if (type_unit != None) tes = 0; + if (type_item != Non) tes = 0; + if (is_bas) tes = 0; + + return tes; + } + void field_cell::set_unit_type(creature new_type) { + type_unit = new_type; + } + int field_cell::get_x() { + return x; + } + int field_cell::get_y() { + return y; + } + bool field_cell::is_base() { return is_bas;} + Item field_cell::get_item_type() { + return type_item; + } + item* field_cell::get_item() { + if (type_item == Non) throw except("(field_cell::get_item) Cell(" + to_string(x) + "," + to_string(y) + ") Trying to get item, but item-type is None\n"); + return tmp_item; + } + void field_cell::delete_item() { + if (type_item != Non) { + delete(tmp_item); + type_item = Non; + } + } + void field_cell::set_base(base* b) { + if (is_bas) throw except("(field_cell::set_base) Cell(" + to_string(x) + "," + to_string(y) + ") There is alredy base! Can't rewrite\n"); + tmp_base = b; + is_bas = true; + //ERROR + } + base* field_cell::get_base() { return tmp_base; } + + char field_cell::get_land_icon() { + return land.get_icon(); + } + int field_cell::get_color() { + return land.get_color(); + } + int field_cell::get_land_number() { + if (get_land_icon() == 126) return 1; + if (get_land_icon() == 15) return 0; + if (get_land_icon() == 6) return 3; + if (get_land_icon() == 94)return 2; + } + biome field_cell::get_land() { + return land; + } + int field_cell::get_background() { + return land.get_background(); + } + + creature field_cell::get_unit_type() { + return type_unit; + } + unit* field_cell::get_unit() { + + return tmp_unit; + } + void field_cell::delete_unit() { + tmp_unit = NULL; + set_unit_type(None); + return; + } + + + + field::field(int x, int y) { + if (x <= 0 || y <= 0) throw except("(field::field)Field can't be created with this parameters: ("+to_string(x)+","+to_string(y)+")\n"); + logger::add("Field (" +to_string(x) + "," +to_string(y)+") was created\n"); + max_unit = y * x / 3; + count_units = 0; + x_size = x; + y_size = y; + map = (field_cell**)malloc(sizeof(field_cell*) * y_size); + + for (int i = 0; i < y_size; i++) { + map[i] = (field_cell*)malloc(sizeof(field_cell) * x_size); + + for (int j = 0; j < x_size; j++) + map[i][j] = field_cell(i, j, random_land(i, j)); + + } + return; + } + int field::random_land(int y, int x) { + if(x < 0 || y < 0) throw except("(field::random_land) Can't return random land with this coords (" + to_string(x) + "," + to_string(y) + ")\n"); + int r = 1; + if (x == 0) { + if (y == 0) { + return rand() % 4; + } + else { + r = rand() % 3; + if (r) return rand() % 4; + else return map[y - 1][x].get_land_number(); + } + } + else { + r = rand() % 2; + if (r) return rand() % 4; + else return map[y][x-1].get_land_number(); + } + return 0; + } + field_cell* field::get_cell(int x, int y) { + if (x < 0 || y < 0 || x>=x_size ||y >= y_size) throw except("(field::get_cell)Can't return field cell["+to_string(x)+","+to_string(y)+"]\n"); + else return &(map[y][x]); + } + + void field::set_base(int x, int y, base* b) { + if (x < 0 || y < 0) throw except("(field::set_base)Can't set base at cell[" + to_string(x) + "," + to_string(y) + "]\n"); + map[y][x].set_base(b); + } + field_cell* field::find_empty(int x, int y) { + int s = 50000; + int m = 0; + field_cell* tsmp; + int xx = -1, yy = -1; + for (int i = 0; i < y_size; i++) { + for (int j = 0; j < x_size; j++) { + if (map[i][j].is_empty()) { + m = (x - j)* (x - j) + (y- i)* (y - i); + if (m < s) { + s = m; + xx = j; + yy = i; + } + } + } + } + if (xx < 0 || yy < 0) throw except("(field::find_empty) Field has no empty cells!\n"); + return &(map[yy][xx]); + } + void field::move_unit(int x1, int y1, int x2, int y2) { + + if (y1 < 0 || y2 < 0 || x1 < 0 || x2 < 0) return; + if (y1 >= y_size || y2 >= y_size || x1 >= x_size || x2 >= x_size) return; + + if (map[y1][x1].get_unit_type() == None) { + logger::add("No unit at (" + to_string(x1) + "," + to_string(y1) + "), move denyed\n"); + cout << "There is no unit!\n"; + throw except("(field::move_unit) Can't move unit from (" + to_string(x1) + "," + to_string(y1) + ") There is no unit!\n"); + return; + } + base* bb; + logger::add("unit"+ map[y1][x1].get_unit()->get_u_info() +"trying to move to (" + to_string(x2) + "," + to_string(y2)+")\n"); + if (map[y2][x2].get_unit_type() != None) { + bb = (static_cast(map[y2][x2].get_unit()->get_base())); + logger::add(" but can't: there is unit already:" + map[y2][x2].get_unit()->get_u_info() + "\n"); + if (map[y1][x1].get_unit()->get_base_number() == map[y2][x2].get_unit()->get_base_number()) { + logger::add("\t and it's his bro!"); + } + else + *(map[y2][x2].get_unit()) - map[y1][x1].get_unit(); + + if (map[y2][x2].get_unit()->get_hp() <= 0) { + int i = (bb)->delete_unit(); + map[y2][x2].delete_unit(); + if (i != -1) { + find_empty(bb->get_x(), bb->get_y())->set_unit(bb->get_unit(i)); + } + + + } + } + if (map[y2][x2].is_base()) { + logger::add(" but can't: there base"); + if (map[y1][x1].get_unit()->get_base_number() == map[y2][x2].get_base()->get_number()) { + logger::add(" and it's unit's home-base\n"); + return; + } + else { + logger::add(" and unit attack it\n"); + *(map[y2][x2].get_base()) - map[y1][x1].get_unit(); + return; + } + } + bb = (static_cast(map[y1][x1].get_unit()->get_base())); + if (map[y1][x1].get_unit()->get_hp() <= 0) { + int i = (bb)->delete_unit(); + map[y1][x1].delete_unit(); + + } + + + if (!map[y2][x2].is_empty() && map[y2][x2].get_item_type() == Non) return; + (static_cast((map[y1][x1].get_unit()))->set_coords(x2, y2)); + map[y2][x2].set_unit_type(map[y1][x1].get_unit_type()); + map[y2][x2].set_unit(map[y1][x1].get_unit()); + map[y1][x1].set_unit_type(None); + map[y2][x2].get_unit()->add_hp(map[y2][x2].get_land().get_effect((map[y2][x2].get_unit()))); + + bb = (static_cast(map[y2][x2].get_unit()->get_base())); + + if (map[y2][x2].get_item_type() != Non) { + *(map[y2][x2].get_unit()) + map[y2][x2].get_item(); + map[y2][x2].delete_item(); + + } + if (map[y2][x2].get_unit()->get_hp() <= 0) { + int i = (bb)->delete_unit(); + map[y2][x2].delete_unit(); + return; + } + logger::add("\t unit moves! " + map[y2][x2].get_unit()->get_u_info() +"\n"); + } + + + + + field::field() {} + int field::get_item_count() { + int g = 0; + for (int i = 0; i < y_size; i++) { + for (int j = 0; j < x_size; j++) { + if (map[i][j].get_item_type() != Non) + g++; + } + + } + return g; + } + field::field(int x, int y, int **lands) { + if (x <= 0 || y <= 0) throw exception("Field can't be created, y or x is < 0\n"); + max_unit = y * x / 3; + count_units = 0; + x_size = x; + y_size = y; + map = (field_cell**)malloc(sizeof(field_cell*) * y_size); + + for (int i = 0; i < y_size; i++) { + map[i] = (field_cell*)malloc(sizeof(field_cell) * x_size); + + for (int j = 0; j < x_size; j++) { + if (lands[i][j] < 0 || lands[i][j] > 3) throw except("(field::field(**lands)) Wrong land number:" + to_string(lands[i][j])+" for cell ("+to_string(x)+","+to_string(y)+")\n"); + map[i][j] = field_cell(i, j, lands[i][j]); + if (map[i][j].get_item_type() != Non) + map[i][j].delete_item(); + } + + } + return; + + + } + int field::get_x_size() { return x_size; } + int field::get_y_size() { return y_size; } + field::~field() { + for (int i = 0; i < y_size; i++) { + delete(map[i]); + } + delete map; + } \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Field.h b/8382/Kuzina Anastasiya/Field.h new file mode 100644 index 000000000..2a63b89b0 --- /dev/null +++ b/8382/Kuzina Anastasiya/Field.h @@ -0,0 +1,76 @@ +#pragma once +#include +#include "Unit.h" +#include "Base.h" +#include "Land.h" +#include "Item.h" +#include "Logger.h" + +class field_cell { +private: + int x; + int y; + creature type_unit; + unit* tmp_unit; + biome land; + bool is_bas; + Item type_item; + item* tmp_item; + base* tmp_base; + + +public: + field_cell(int new_y, int new_x, int new_land); + void set_unit(unit* new_unit); + void set_unit_type(creature new_type); + Item get_item_type(); + int set_item(int c); + base* get_base(); + item* get_item(); + void delete_item(); + bool is_empty(); + void set_base(base* b); + int get_x(); + int get_y(); + + char get_land_icon(); + int get_land_number(); + biome get_land(); + bool is_base(); + int get_color(); + int get_background(); + creature get_unit_type(); + unit* get_unit(); + void delete_unit(); + +}; + +class field { +private: + int x_size; + int y_size; + field_cell** map; + int max_unit; + int count_units; + + int random_land(int y, int x); +public: + field(int x, int y); + field(); + field(int x, int y, int** lands); + + ~field(); + field_cell* get_cell(int x, int y); + field_cell* find_empty(int x, int y); + int get_item_count(); + void move_unit(int x1, int y1, int x2, int y2); + + + void set_base(int x, int y, base* b); + + int get_x_size(); + int get_y_size(); + + +}; + diff --git a/8382/Kuzina Anastasiya/Graphic.cpp b/8382/Kuzina Anastasiya/Graphic.cpp new file mode 100644 index 000000000..f240c5fa0 --- /dev/null +++ b/8382/Kuzina Anastasiya/Graphic.cpp @@ -0,0 +1,147 @@ +#include "Graphic.h" + +graphic::graphic() { + hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + +} + +void graphic::setTextColor(int text, int background) { + SetConsoleTextAttribute(hConsole, (WORD)((background << 4) | text)); + +} + +void graphic::setTitle() { + SetConsoleTitle(L"Very good game!\0"); + +} + +void graphic::info(unit* camera_men) { + camera_men->get_info(); + cout << "\t This land will hurt you: " << camera_men->beware(); + printf("\n\n"); + (static_cast(camera_men->get_base()))->get_info(); +} + + + +void graphic::camera(field& F, player* tmp, bool inf) { + unit* camera_men = tmp->get_tmp_unit(); + + + for (int m = 0; m < 1000; m++) { + cout << " "; + } + int tmp_x, tmp_y; + + tmp_x = camera_men->get_x(); + tmp_y = camera_men->get_y(); + system("cls"); + + + + setTextColor(lightRed); + cout << "Game does not support Russian and refuses to work!!! Change language to English to play\n"; + setTextColor(); + cout << "\tmove :wasd, change unit: 123, save: c, load: l, create unit: r, exit: 0\n"; + + setTextColor(yellow); + cout << "PLAYER " << tmp->get_name() << " number " << tmp->get_base()->get_number() << "\n\n"; + setTextColor(); + for (int i = tmp_y - 3; i < tmp_y + 3; i++) { + cout << "\t"; + for (int j = tmp_x - 4; j < tmp_x + 5; j++) { + + if (i < 0 || j < 0 || i >= F.get_y_size() || j >= F.get_x_size()) cout << ""; + else if (F.get_cell(j, i)->is_base()) { + setTextColor(15, F.get_cell(j, i)->get_background()); + if(F.get_cell(j, i)->get_base()->get_number() != camera_men->get_base_number()) + setTextColor(lightRed, F.get_cell(j, i)->get_background()); + + cout << F.get_cell(j, i)->get_base()->get_name(); + setTextColor(); + } + else if (F.get_cell(j, i)->get_unit_type() != None) { + setTextColor(lightRed, F.get_cell(j, i)->get_background()); + if (F.get_cell(j, i)->get_unit()->get_base_number() == camera_men->get_base_number()) + setTextColor(15, F.get_cell(j, i)->get_background()); + if(F.get_cell(j, i)->get_unit() == camera_men) + setTextColor(11, F.get_cell(j, i)->get_background()); + + cout << (static_cast(F.get_cell(j, i)->get_unit()))->get_name(); + setTextColor(); + } + else if (F.get_cell(j, i)->get_item_type() != Non) { + setTextColor(13, F.get_cell(j, i)->get_background()); + cout << F.get_cell(j, i)->get_item()->get_name(); + setTextColor(); + } + else { + setTextColor(F.get_cell(j, i)->get_color(), F.get_cell(j, i)->get_background()); + cout << F.get_cell(j, i)->get_land_icon(); + setTextColor(); + } + + } + printf("\n"); + + } + printf("\n"); + if (inf) { + info(camera_men); + } + +} + +void graphic::help() { + system("cls"); + setTextColor(yellow); + cout << "Here is everething about this game!\n"; + cout << "GAME KNOWS ONLY ENGLISH! other lenguages will be ignored ;)\n"; + setTextColor(); + cout << "This game is for 2 players\n"; + cout << "\tEvery player has own base and units\n"; + cout << "\tMaximum you can have 3 units. Every one of them has some stats: hp, armor, attack and level\n"; + cout << "\tEvery unit are some animal-type: mammal(wolf, hyena), bird(duck, crow) or amphibia(frog, lizard)\n"; + cout << "\tOn the map they look like their first letters: w, h, d, c, f, l\n"; + setTextColor(10); + cout << "Every map-cell has some landscape: sunflower field ☼, mountain ^, lake ~, lance forest ♠\n"; + setTextColor(); + cout << "\tMammals hurts in lakes and heal in lance forests\n"; + cout << "\tBirds hurts in lance forestd and heal in mountains\n"; + cout << "\tAmphibias hurts in mountains and heal in lakes\n"; + setTextColor(lightRed); + cout << "Bases looks like this ▲ when it's alive and like this X when it's hp = 0\n"; + setTextColor(); + cout << "\tYour base can create units if you press 'r' while game is on and it's alive\n"; + cout << "\tYou can change your current unit by pressing: 1, 2, 3, but only if it's alive\n"; + cout << "\tYour units and base are white and your cerrent unit are light blue\n"; + cout << "\tOther payers units and are red\n"; + setTextColor(13); + cout << "In some map-cells you can find items: heart , xp-bottle $, armor-piece * and zatochka ♦\n"; + setTextColor(); + cout << "\tAll of them colored pink and give you: +4hp, +20xp, +1armor, +1attack if you don't have maximum for your level\n"; + setTextColor(yellow); + cout << "You can move by pressing w - go up, a - go left, d - go right, s - go down\n"; + setTextColor(); + cout << "\tNeather you can attack bases and units (not yours)\n\tJust try to move in cell, where is alredy something: you will attack it\n"; + cout << "\tBut if you are weaker - you can hurt youself\n"; + cout << "\tWhen smbd attack you - your armor protect you, but it slowly break down (-1 per attack)\n"; + setTextColor(11); + cout << "You can save your game by pressing c and load it by pressing l\n"; + setTextColor(10); + cout << "There is 2 levels small-size and big-size\n"; + setTextColor(12); + cout << "And 2 gamemodes: normal and hardcore\n"; + setTextColor(); + cout << "\tIn normal each of you have 5 moves per raund and you win if other players-base is dead\n"; + cout << "\tIn hardcore you have 3 moves per raund, bases are already dead and you win if other-players units are dead\n"; + setTextColor(11); + cout << "Press any key to return to menu!\n"; + setTextColor(); + char in; + + in = _getch(); + system("cls"); + +} + diff --git a/8382/Kuzina Anastasiya/Graphic.h b/8382/Kuzina Anastasiya/Graphic.h new file mode 100644 index 000000000..e4bb8f511 --- /dev/null +++ b/8382/Kuzina Anastasiya/Graphic.h @@ -0,0 +1,40 @@ +#pragma once +#include +#include +#include +#include "iostream" +#include "Field.h" +#include "Player.h" +#include + +enum consoleColor { + black = 0, + blue = 1, + green = 2, + cyan = 3, + red = 4, + magenta = 5, + brown = 6, + lightGray = 7, + darkGray = 8, + lightBlue = 9, + lightGreen = 10, + lightCyan = 11, + lightRed = 12, + lightMagenta = 13, + yellow = 14, + white = 15 +}; + +class graphic { + VOID WINAPI Sleep(DWORD dwMilliseconds); + HANDLE hConsole; +public: + graphic(); + void help(); + void setTextColor(int text = 15, int background = 0); + void setTitle(); + void info(unit* camera_men); + void camera(field& F, player* tmp, bool inf = true); + +}; \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Item.cpp b/8382/Kuzina Anastasiya/Item.cpp new file mode 100644 index 000000000..2ee54cf19 --- /dev/null +++ b/8382/Kuzina Anastasiya/Item.cpp @@ -0,0 +1,35 @@ +#include "Item.h" +#include + +item::item() { + name = 'I'; + effect = 0; +} + +int item::get_effect() { + return effect; +} + +char item::get_name() { + return name; +} + +exp_bottle::exp_bottle() : item() { + name = '$'; + effect = 20; +} + +hp_pill::hp_pill() : item() { + name = 3; + effect = 4; +} + +zatochka::zatochka() : item() { + name = 4; + effect = 1; +} + +rpill::rpill() : item() { + name = '*'; + effect = 1; +} \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Item.h b/8382/Kuzina Anastasiya/Item.h new file mode 100644 index 000000000..6cced3479 --- /dev/null +++ b/8382/Kuzina Anastasiya/Item.h @@ -0,0 +1,39 @@ +#pragma once +enum Item {Non, Exp, Pill, Zatochka, Rand}; + +class item { +protected: + char name; + int effect; +public: + item(); + int get_effect(); + char get_name(); +}; + + +// , , , a + + +class exp_bottle :public item { +public: + exp_bottle(); + +}; + +class hp_pill : public item { +public: + hp_pill(); + +}; + +class zatochka :public item { +public: + zatochka(); +}; + +class rpill : public item { +public: + rpill(); + +}; \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Land.cpp b/8382/Kuzina Anastasiya/Land.cpp new file mode 100644 index 000000000..069689c2a --- /dev/null +++ b/8382/Kuzina Anastasiya/Land.cpp @@ -0,0 +1,77 @@ +#include "Land.h" + + +biome::biome() { + icon = 'M'; + color = 15; + background = 0; +} + +char biome::get_icon() { + return icon; +} + +int biome::get_background() { + return background; +} + +int biome::get_color() { + return color; +} + +int biome::get_effect(unit* uni) { + if (icon == 'M')return 0; + char nam = uni->get_name(); + switch (nam) { + case 'w': {} + case 'h': { + if (icon == 15) { return 0; } + if (icon == 126) { return -3; } + if (icon == 6) { return 1; } + if (icon == 94) { return 0; } + break; + } + case 'l': {} + case 'f': { + if (icon == 15) { return 0; } + if (icon == 126) { return 1; } + if (icon == 6) { return 0; } + if (icon == 94) { return -3; } + break; + } + case 'c': {} + case 'd': { + if (icon == 15) { return 0; } + if (icon == 126) { return 0; } + if (icon == 6) { return -3; } + if (icon == 94) { return 1; } + break; + } + } + return 0; +} + +sunflower::sunflower():biome(){ + icon = 15; + color = 14; + background = 2; +} + +lake::lake() : biome() { + icon = 126; + color = 9; + background = 1; +} + +forest::forest() : biome() { + icon = 6;//24 6 + color = 4;//2 + background = 6;//6 +} + +mountain::mountain() : biome() { + icon = 94; //251 30 !94! 94 + color = 7; + background = 8;//8 +} + diff --git a/8382/Kuzina Anastasiya/Land.h b/8382/Kuzina Anastasiya/Land.h new file mode 100644 index 000000000..24644e9dd --- /dev/null +++ b/8382/Kuzina Anastasiya/Land.h @@ -0,0 +1,48 @@ +#pragma once +#include +#include "Unit.h" +enum landscape { Mountain = 1, Lake = 2, Forest = 3, Sunflower = 5}; + + +// : - , - , - , - +// : +// : +//: , , , , + +// +//+: +//0: +//-: +class biome { +protected: + char icon; + int color; + int background; + +public: + biome(); + int get_color(); + int get_background(); + char get_icon(); + int get_effect(unit* uni); +}; + +class sunflower:public biome { +public: + sunflower(); +}; + +class lake :public biome { +public: + lake(); +}; + +class forest :public biome { +public: + forest(); +}; + +class mountain :public biome { +public: + mountain(); +}; \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Logger.cpp b/8382/Kuzina Anastasiya/Logger.cpp new file mode 100644 index 000000000..42a74628c --- /dev/null +++ b/8382/Kuzina Anastasiya/Logger.cpp @@ -0,0 +1,53 @@ +#include "Logger.h" + + +string f() { + time_t rawtime; + struct tm* timeinfo; + string name; + + time(&rawtime); // , + timeinfo = localtime(&rawtime); // , + name = asctime(timeinfo); + for (int i = 0; i < name.size(); i++) { + if (name[i] == ' ') name[i] = ' '; + if (name[i] == ':') name[i] = '-'; + } + name.pop_back(); + name.push_back('.'); + name.push_back('t'); + name.push_back('x'); + name.push_back('t'); + name.push_back('\0'); + name = "Loggs\\" + name; + + return name; +} +string logger::name = f(); +int logger::ForCout = 1; + + + +void logger::set_name() { + + ofstream fout(name); + fout << name << "\n\n"; + fout.close(); + //cout << name; +} + +void logger::add(string s) { + if (ForCout < 3) file(s); + if (ForCout > 1) console(s); +} + +void logger:: file(string s) { + ofstream fout(name, ios_base::app); + fout << s << ""; + fout.close(); +} + +void logger::console(string s) { + cout << s; + +} \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Logger.h b/8382/Kuzina Anastasiya/Logger.h new file mode 100644 index 000000000..925b36c45 --- /dev/null +++ b/8382/Kuzina Anastasiya/Logger.h @@ -0,0 +1,18 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#include +#include +using namespace std; + +class logger { +public: + static int ForCout; + static string name; + void static set_name(); + void static add(string s); + void static file(string s); + void static console(string s); +}; +string f(); \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Loggs/Mon Jun 8 11-59-20 2020.txt b/8382/Kuzina Anastasiya/Loggs/Mon Jun 8 11-59-20 2020.txt new file mode 100644 index 0000000000000000000000000000000000000000..ac45e1a24c4f70744e2f6fdfa6e03d507061c0d4 GIT binary patch literal 2318 zcmb`J!H(K65Qcj#Qr=2;kmzjU;v7b~?=-)q84L{l%U=3+H&pyvt0xV(4C-Y`LM3ZRp93&m_?J1PC94T4=`AX0R(VC0+%rx2X+BN zpfgh$TF2vPhFyRIZhgrNrpq{^@>^MRQ0{4!cMni#Br;pYL|%Oqx&sv1hV?kgy9vce z7+YOatP2UfnK%Vj&inbS?8ctC7?8-3UnQYhug?eF8q>E_Z&#*i%Jo=JGN@s zwd&Mpv|JJ5JUG}DNFcJ#f?uKK=3n{cH#hlR=d9NVw~ol3S;yTc0SgcBc`6t%ICH22 zkzW=Q*_|5Y-2sXmdWS~2Xq>G$L;EOVr(VeFu)QvzyxTd4brU6G3({+fVE_S4Da~*a zj03xXA<&tr4A&k=T;_9G~bEby()Td4e@3#PJC&= T;d<>~u5InF*CXQ?9!>rOHrJ!w literal 0 HcmV?d00001 diff --git a/8382/Kuzina Anastasiya/OOP.cpp b/8382/Kuzina Anastasiya/OOP.cpp new file mode 100644 index 000000000..3a4498281 --- /dev/null +++ b/8382/Kuzina Anastasiya/OOP.cpp @@ -0,0 +1,894 @@ +#pragma once +#define _CRT_SECURE_NO_WARNINGS +#include +using namespace std; +#include +#include +#include +#include "Field.h" +#include "Logger.h" +#include "Rules.h" +#include "Graphic.h" +#include "Player.h" +#include "Exept.h" + + +template +class game { +private: + T* rul; + char in; + field* F; + player* first; + player* second; + int level; + + graphic* gui; + + int load_number(ifstream& fin) { + int num = 0; + bool negative = false; + + fin.get(in); + if (in == '-') { + negative = true; + fin.get(in); + } + while (in != ' ' && in != '\n') { + if (in == '\n') break; + if (isdigit(in)) num = num * 10 + in - '0'; + else throw except("(game::load_number) Expect to read _number_ or _number\\n, but read other symbols!\n"); + fin.get(in); + } + if (negative) num = num * -1; + + + return num; + } + player* load_player(ifstream& fin) { + string w = ""; + int num = 0; + + fin.get(in); + + if (in == 'p') { + fin.get(in); + if (in != ' ') return NULL; + + fin.get(in); + while (in != ' ') { + if (in == '\n') return NULL; + w.push_back(in); + fin.get(in); + } + + fin.get(in); + while (in != ' ' && in != '\n') { + if (in == '\n') break; + if (isdigit(in)) num = num * 10 + in - '0'; + else break; + fin.get(in); + } + } + player* ple = new player(w, num); + return ple; + } + void load_item(ifstream& fin) { + int y = 0, x = 0, type = 0; + + fin.get(in); + + if (in == 'i') { + fin.get(in); + if (in != ' ') return; + + y = load_number(fin); + x = load_number(fin); + type = load_number(fin); + + printf("i %d %d %d\n", y, x, type); + + if (x < 0 || y < 0 || x >= F->get_x_size() || y >= F->get_y_size()) return; + F->get_cell(x, y)->set_item(type); + } + else throw except("(game::load_item) Expected first-char i, was reseved " + to_string(in) + "\n"); + + + return; + } + base* load_base(ifstream& fin) { + int y = 0, x = 0, number = 0, hp = 0; + + fin.get(in); + + if (in == 'b') { + fin.get(in); + if (in != ' ') throw except("(game::load_base) expected _ after b, but get: " + to_string(in) + "\n"); + + y = load_number(fin); + x = load_number(fin); + number = load_number(fin); + hp = load_number(fin); + + printf("b %d %d %d %d\n", y, x, number, hp); + } + else throw except("(game::load_base) Expected first-char b, was reseved " + to_string(in) + "\n"); + if (x < 0 || y < 0 || x >= F->get_x_size() || y >= F->get_y_size()) throw except("(game::load_base) Wrong base-coords(" + to_string(x) + "," + to_string(y) + "), dosn't fit field sizes(" + to_string(F->get_x_size()) + "," + to_string(F->get_y_size()) + ")!\n"); + + base* b = new base(number); + b->set_coords(x, y); + b->set_hp(hp); + return b; + } + void load_unit(ifstream& fin, base* b, int i) { + char name = ' '; + int y = 0, x = 0, hp = 0, hp_max = 0, + armor = 0, attack = 0, xp = 0, xp_level = 1, level = 1; + + fin.get(in); + + if (in == 'u') { + fin.get(in); + if (in != ' ') throw except("(game::load_base) expected _ after u, but get: " + to_string(in) + "\n");; + + y = load_number(fin); + x = load_number(fin); + + fin.get(in); + name = in; + fin.get(in); + + hp = load_number(fin); + hp_max = load_number(fin); + armor = load_number(fin); + attack = load_number(fin); + xp = load_number(fin); + xp_level = load_number(fin); + level = load_number(fin); + + if (x < 0 || y < 0 || x >= F->get_x_size() || y >= F->get_y_size()) return; + printf("u %d %d %c %d %d %d %d %d %d %d\n", y, x, name, hp, hp_max, armor, attack, xp, xp_level, level); + b->set_unit(y, x, name, hp, hp_max, armor, attack, xp, xp_level, level, i); + + + } + else throw except("(game::load_unit) Expected first-char u, was reseved " + to_string(in) + "\n"); + + return; + } + bool level_load() { + bool i = false; + if (level == 1) i = level1_load(); + if (level == 2) i = level2_load(); + if (level == 3) i = load_game(); + + if (!i) return false; + rul = new T; + rul->starts(F); + return true; + } + bool level1_load() { + try { + level = 1; + first = new player("first", 1); + second = new player("second", 2); + F = new field(10, 10); + first->get_base()->set_coords(2, 2); + second->get_base()->set_coords(8, 8); + F->set_base(8, 8, second->get_base()); + F->set_base(2, 2, first->get_base()); + + F->find_empty(8, 8)->set_unit(second->get_base()->get_unit(0)); + F->find_empty(8, 8)->set_unit(second->get_base()->get_unit(1)); + F->find_empty(8, 8)->set_unit(second->get_base()->get_unit(2)); + F->find_empty(2, 2)->set_unit(first->get_base()->get_unit(0)); + F->find_empty(2, 2)->set_unit(first->get_base()->get_unit(1)); + F->find_empty(2, 2)->set_unit(first->get_base()->get_unit(2)); + logger::add("Level 1 sucessfully load\n"); + return true; + } + catch (except &ex) { + level = 1; + cout << "(game::level1_load) Something goes wrong with loading first level!\n\t" << ex.what() << "\n"; + return false; + } + return true; + } + bool level2_load() { + try { + first = new player("first", 1); + second = new player("second", 2); + F = new field(50, 30); + first->get_base()->set_coords(25, 25); + second->get_base()->set_coords(5, 5); + F->set_base(5, 5, second->get_base()); + F->set_base(25, 25, first->get_base()); + + F->find_empty(5, 5)->set_unit(second->get_base()->get_unit(0)); + F->find_empty(5, 5)->set_unit(second->get_base()->get_unit(1)); + F->find_empty(5, 5)->set_unit(second->get_base()->get_unit(2)); + F->find_empty(25, 25)->set_unit(first->get_base()->get_unit(0)); + F->find_empty(25, 25)->set_unit(first->get_base()->get_unit(1)); + F->find_empty(25, 25)->set_unit(first->get_base()->get_unit(2)); + logger::add("Level 1 sucessfully load\n"); + return true; + } + catch (except &ex) { + level = 1; + cout << "(game::level2_load) Something goes wrong with loading second level!\n\t" << ex.what() << "\n"; + return false; + } + } + void level_unload() { + + level = 1; + delete first; + delete second; + delete F; + logger::add("Level sucessfully unload\n"); + } + void save_game() { + if (level == 0) return; + //ПРОВЕРКА ЗАГРУЖЕНА ЛИ ИГРА + string name; + time_t rawtime; + struct tm* timeinfo; + string SF = "SaveFiles\\"; + + time(&rawtime); // текущая дата, выраженная в секундах + timeinfo = localtime(&rawtime); // текущая дата, представленная в нормальной форме + name = asctime(timeinfo); + for (int i = 0; i < name.size(); i++) { + if (name[i] == ' ') name[i] = '-'; + if (name[i] == ':') name[i] = '-'; + } + + name.pop_back(); + name.pop_back(); + name.pop_back(); + name.pop_back(); + name.pop_back(); + name.pop_back(); + name.push_back('.'); + name.push_back('t'); + name.push_back('x'); + name.push_back('t'); + + name = SF + name; + ofstream fout(name); + + //==================================================== + if (level == 0) return; + fout << "p " << first->get_name() << " " << first->get_base()->get_number() << "\n"; + fout << "p " << second->get_name() << " " << second->get_base()->get_number() << "\n"; + + int x = F->get_x_size(); + int y = F->get_y_size(); + fout << x << " " << y << "\n"; + for (int i = 0; i < y; i++) { + for (int j = 0; j < x; j++) { + fout << F->get_cell(j, i)->get_land_number() ; + if (j < x - 1) fout << " "; + } + fout << "\n"; + } + fout << F->get_item_count() << "\n"; + for (int i = 0; i < y; i++) { + for (int j = 0; j < x; j++) { + if (F->get_cell(j, i)->get_item_type() != Non) { + fout << "i " << i << " " << j << " " << F->get_cell(j, i)->get_item_type() << "\n"; + } + } + } + base* bb; + unit* uu; + + for (int i = 0; i < y; i++) { + for (int j = 0; j < x; j++) { + if (F->get_cell(j, i)->is_base()) { + bb = F->get_cell(j, i)->get_base(); + fout << "b " << i << " " << j << " " << bb->get_number() <<" "<< bb->get_hp() << "\n"; + fout << bb->how_many_alive() << "\n"; + for (int k = 0; k < 3; k++) { + uu = bb->get_unit(k); + if (bb->is_unit_alive(k)) { + fout << "u " << uu->get_y() << " " << uu->get_x() << " " << uu->get_name() << " " << uu->get_hp() << " " << uu->get_hp_max() << " "; + fout << uu->get_armor() << " " << uu->get_attack() << " " << uu->get_xp() << " " << uu->get_xp_for_next_level() << " " << uu->get_level() << "\n"; + } + } + + } + } + } + + + //ПРАВИЛА + fout.close(); + } + bool load_game() { + try { + string fname = ""; + cout << "Enter load-file name:\n"; + cin >> fname; + fname = "SaveFiles\\" + fname; + char buff[4]; + char in; + int num = 0; + ifstream finn(fname); + string w = ""; + if (!finn.is_open()) { + throw except("(game::load_game) File with name \"" + fname + "\" can't be found or opened\n"); + } + else { + + first = load_player(finn); + if (first == NULL) { + throw except("(game::load_game) First player can't be load: input structure corrapted\n"); + } + + second = load_player(finn); + if (second == NULL) { + throw except("(game::load_game) Second player can't be load: input structure corrapted\n"); + } + + int w = load_number(finn); + int h = load_number(finn); + printf("[%d], [%d]\n\n", w, h); + if (w <= 0 || h < 0) throw except("(game::load_game) Currupted field-size: w = " + to_string(w) + " h = " + to_string(h) + "\n"); + + int** fieldMatrix = new int* [h]; + for (int i = 0; i < h; i++) { + fieldMatrix[i] = new int[w]; + for (int j = 0; j < w; j++) { + fieldMatrix[i][j] = load_number(finn); + printf("%d", fieldMatrix[i][j]); + } + printf("\n"); + } + + F = new field(w, h, fieldMatrix); + + int itemCounter = load_number(finn); + printf("%d\n", itemCounter); + + + for (int i = 0; i < itemCounter; i++) { + load_item(finn); + } + + base* b; + + b = load_base(finn); + b->delete_unit(0); + b->delete_unit(1); + b->delete_unit(2); + int n = load_number(finn); + if (n < 0 || n > 3) throw except("(game::load_game) Incorrect units number: " + to_string(n) + "\n"); + + + if (first->get_base()->get_number() == b->get_number()) { + first->set_base(b); + F->set_base(b->get_x(), b->get_y(), first->get_base()); + for (int i = 0; i < n; i++) { + load_unit(finn, first->get_base(), i); //base_number 0 + if (first->get_base()->is_unit_alive(i)) { + F->get_cell(first->get_base()->get_unit(i)->get_x(), first->get_base()->get_unit(i)->get_y())->set_unit(first->get_base()->get_unit(i)); + } + } + first->set_tmp_unit(first->get_base()->is_any_alive()); + } + else if (second->get_base()->get_number() == b->get_number()) { + second->set_base(b); + F->set_base(b->get_x(), b->get_y(), second->get_base()); + for (int i = 0; i < n; i++) { + load_unit(finn, second->get_base(), i); //base_number 0 + if (second->get_base()->is_unit_alive(i)) { + F->get_cell(second->get_base()->get_unit(i)->get_x(), second->get_base()->get_unit(i)->get_y())->set_unit(second->get_base()->get_unit(i)); + } + } + second->set_tmp_unit(second->get_base()->is_any_alive()); + } + + else throw except("(game::load_game) Loaded base-number: "+to_string(b->get_number())+" doesn't match any players base-numbers: "+to_string(first->get_base()->get_number())+" and "+to_string(second->get_base()->get_number())+"\n"); + + b = load_base(finn); + b->delete_unit(0); + b->delete_unit(1); + b->delete_unit(2); + + n = load_number(finn); + if (n < 0 || n > 3) throw except("(game::load_game) Incorrect units number: " + to_string(n) + "\n"); + + + if (first->get_base()->get_number() == b->get_number()) { + first->set_base(b); + F->set_base(b->get_x(), b->get_y(), first->get_base()); + for (int i = 0; i < n; i++) { + load_unit(finn, first->get_base(), i); //base_number 0 + if (first->get_base()->is_unit_alive(i)) { + F->get_cell(first->get_base()->get_unit(i)->get_x(), first->get_base()->get_unit(i)->get_y())->set_unit(first->get_base()->get_unit(i)); + } + } + first->set_tmp_unit(first->get_base()->is_any_alive()); + } + else if (second->get_base()->get_number() == b->get_number()) { + second->set_base(b); + F->set_base(b->get_x(), b->get_y(), second->get_base()); + for (int i = 0; i < n; i++) { + load_unit(finn, second->get_base(), i); //base_number 0 + if (second->get_base()->is_unit_alive(i)) { + F->get_cell(second->get_base()->get_unit(i)->get_x(), second->get_base()->get_unit(i)->get_y())->set_unit(second->get_base()->get_unit(i)); + } + } + second->set_tmp_unit(second->get_base()->is_any_alive()); + + + } + else throw except("(game::load_game) Loaded base-number: " + to_string(b->get_number()) + " doesn't match any players base-numbers: " + to_string(first->get_base()->get_number()) + " and " + to_string(second->get_base()->get_number()) + "\n"); + + + + + finn.close(); + level = 3; + return true; + } + + } + catch (except &ex) { + cout << "Something goes wrong with loading game!\n " << ex.what() << "\n"; + level = 1; + return false; + } + } + +public: + game(graphic* e, int leveli) { + level = leveli; + in = 1; + gui = e; + } + void training() { + try { + F = new field(3, 3); + first = new player("YOU", 404); + first->get_base()->delete_unit(1); + first->get_base()->delete_unit(2); + first->get_tmp_unit()->set_hp(500); + first->set_tmp_unit(0); + F->find_empty(0, 0)->set_unit(first->get_base()->get_unit(0)); + gui->camera(*F, first, false); + gui->setTextColor(12); + cout << "THIS IS YOU. FRESH AND CLEAN\n Try to move with 'wasd'\n"; + int x = first->get_tmp_unit()->get_x(); + int y = first->get_tmp_unit()->get_y(); + int steps = 0; + char iter = 'e'; + + while (steps < 5) { + x = first->get_tmp_unit()->get_x(); + y = first->get_tmp_unit()->get_y(); + iter = _getch(); + if (iter == 's') { + F->move_unit(x, y, x, y + 1); + steps++; + } + else if (iter == 'w') { + F->move_unit(x, y, x, y - 1); + steps++; + } + else if (iter == 'a') { + F->move_unit(x, y, x - 1, y); + steps++; + } + else if (iter == 'd') { + F->move_unit(x, y, x + 1, y); + steps++; + } + + gui->camera(*F, first, false); + cout << "THIS IS YOU. FRESH AND CLEAN\n Try to move with 'wasd'\n"; + } + + field_cell* e = F->find_empty(0, 0); + first->get_base()->set_coords(e->get_x(), e->get_y()); + F->set_base(e->get_x(), e->get_y(), first->get_base()); + + gui->camera(*F, first, false); + cout << "Great job! Now look: it's yours base, you can create units with it! Press r to make one!\n"; + iter = 'q'; + while (iter != 'r') { + iter = _getch(); + if (iter == 'r') { + int nunit = first->get_base()->create_unit(); + if (nunit != -1) { + e = F->find_empty(first->get_base()->get_x(), first->get_base()->get_y()); + e->set_unit(first->get_base()->get_unit(nunit)); + e->get_unit()->set_hp(500); + } + } + gui->camera(*F, first, false); + cout << "Great job! Now look: it's yours base, you can create units with it! Press r to make one!\n"; + } + cout << "Cool! Look this is your bro, you can't attack him (even if you try)\n Now: try to press 1-2-3 to swech between them and walk!\n"; + steps = 0; + while (steps < 4) { + x = first->get_tmp_unit()->get_x(); + y = first->get_tmp_unit()->get_y(); + iter = _getch(); + if (iter == '1') first->set_tmp_unit(0); + else if (iter == '2') first->set_tmp_unit(1); + else if (iter == '3') first->set_tmp_unit(2); + else if (iter == 's') { + F->move_unit(x, y, x, y + 1); + steps++; + } + else if (iter == 'w') { + F->move_unit(x, y, x, y - 1); + steps++; + } + else if (iter == 'a') { + F->move_unit(x, y, x - 1, y); + steps++; + } + else if (iter == 'd') { + F->move_unit(x, y, x + 1, y); + steps++; + } + + gui->camera(*F, first, false); + cout << "Cool! Look this is your bro, you can't attack him (even if you try)\n Now: try to press 1-2-3 to swech between them and walk!\n"; + } + cout << "Brilliant! Okey, now i'll show you some more info about you and your base!\n Pay attention for landscape!(just walk arounde while i prepare next test for you)\n"; + steps = 0; + while (steps < 5) { + x = first->get_tmp_unit()->get_x(); + y = first->get_tmp_unit()->get_y(); + iter = _getch(); + if (iter == '1') first->set_tmp_unit(0); + else if (iter == '2') first->set_tmp_unit(1); + else if (iter == '3') first->set_tmp_unit(2); + else if (iter == 's') { + F->move_unit(x, y, x, y + 1); + steps++; + } + else if (iter == 'w') { + F->move_unit(x, y, x, y - 1); + steps++; + } + else if (iter == 'a') { + F->move_unit(x, y, x - 1, y); + steps++; + } + else if (iter == 'd') { + F->move_unit(x, y, x + 1, y); + steps++; + } + + gui->camera(*F, first); + cout << "Brilliant! Okey, now i'll show you some more info about you and your base!\n Pay attention for landscape!(just walk arounde while i prepare next test for you)\n"; + + } + int f = 0; + base* b = new base(-2); + b->delete_unit(1); + b->delete_unit(2); + e = F->find_empty(0, 0); + e->set_unit(b->get_unit(0)); + e->get_unit()->set_all(10, 10, 3, 3, 5, 1, 1); + + + gui->camera(*F, first); + cout << "How are you so far? Nice! Let's try something new!\n It wasn't easy, but i found immobilized enemy for you!\n Kill him now, just try to 'walk' in him\n"; + while (!e->is_empty()) { + x = first->get_tmp_unit()->get_x(); + y = first->get_tmp_unit()->get_y(); + iter = _getch(); + if (iter == '1') first->set_tmp_unit(0); + else if (iter == '2') first->set_tmp_unit(1); + else if (iter == '3') first->set_tmp_unit(2); + else if (iter == 's') { + F->move_unit(x, y, x, y + 1); + steps++; + } + else if (iter == 'w') { + F->move_unit(x, y, x, y - 1); + steps++; + } + else if (iter == 'a') { + F->move_unit(x, y, x - 1, y); + steps++; + } + else if (iter == 'd') { + F->move_unit(x, y, x + 1, y); + steps++; + } + gui->camera(*F, first); + cout << "How are you so far? Nice! Let's try something new!\n It wasn't easy, but i found immobilized enemy for you!\n Kill him now, just try to 'walk' in him\n"; + + } + cout << "Wow you are so smart! Now i hope, you can play some real games! See you soon(press any key to exit)\n"; + iter = _getch(); + + delete first; + delete F; + delete b; + system("cls"); + return; + } + catch (except & ex) { + cout << "Something while training goes wrong!\n" << ex.what() << "\n"; + return; + } + + } + void game_on() { + try { + bool allright = level_load(); + if (!allright) throw - 1; + } + catch (int) { + cout << "Can't start game after loading problems, return to menu\n" << "\n"; + return; + } + + char iter = '1'; + int y = first->get_tmp_unit()->get_y(); + int x = first->get_tmp_unit()->get_x(); + player* tmp = first; + + int steps = 0; + try { + while (iter != '0') { + // проблема - русский язык + if (rul->who_lose(F) != -1) { + system("cls"); + cout << "player " << rul->who_lose(F) << " lose :(\n\tGame over!\n"; + level_unload(); + + return; + } + + if (tmp->get_tmp_unit() == NULL) { + system("cls"); + cout << "YOU DEAD!!!\n"; + int f = tmp->is_any_alive(); + if (f == -1) { + system("cls"); + cout << "player " << rul->who_lose(F) << " lose :(\n\tGame over!\n"; + level_unload(); + return; + } + tmp->set_tmp_unit(f); + + } + x = tmp->get_tmp_unit()->get_x(); + y = tmp->get_tmp_unit()->get_y(); + gui->camera(*F, tmp); + + iter = _getch(); + if (iter == 's') { + F->move_unit(x, y, x, y + 1); + steps++; + } + else if (iter == 'w') { + F->move_unit(x, y, x, y - 1); + steps++; + } + else if (iter == 'a') { + F->move_unit(x, y, x - 1, y); + steps++; + } + else if (iter == 'd') { + F->move_unit(x, y, x + 1, y); + steps++; + } + else if (iter == 'l') { + logger::add("=>Player ask to load game\n"); + system("cls"); + cout << "Save current game before loading? Press 1 to save\n"; + iter = _getch(); + if (iter == '1') save_game(); + level_unload(); + level = 3; + try { + bool allright = level_load(); + if (!allright) throw - 1; + } + catch (int) { + cout << "Can't start game after loading problems, return to menu\n" << "\n"; + return; + } + iter = 'w'; + tmp = first; + steps = 0; + } + else if (iter == '1') tmp->set_tmp_unit(0); + else if (iter == '2') tmp->set_tmp_unit(1); + else if (iter == '3') tmp->set_tmp_unit(2); + else if (iter == 'r') { + logger::add("=>Player " + to_string(tmp->get_base()->get_number()) + " ask for mor units\n"); + int nunit = tmp->get_base()->create_unit(); + if (nunit != -1) { + logger::add("=>Player get new unit\n"); + F->find_empty(tmp->get_base()->get_x(), tmp->get_base()->get_y())->set_unit(tmp->get_base()->get_unit(nunit)); + } + steps++; + } + else if (iter == 'c') { + save_game(); + logger::add("=>Player saved game\n"); + } + else if (iter == '0') { + logger::add("=>Player exit game "); + system("cls"); + cout << "Save current game before exit? Press 1 to save\n"; + iter = _getch(); + if (iter == '1') { + save_game(); + logger::add(" and save in"); + } + logger::add("\n"); + level_unload(); + return; + } + try { + if (rul->who_lose(F) != -1) { + system("cls"); + cout << "player " << rul->who_lose(F) << " lose :(\n\tGame over!\n"; + level_unload(); + return; + } + } + catch (except & ex) { + cout << "(game::game_on) Something goes wrong with ruls:\n\t" << ex.what() << "\n"; + level_unload(); + + return; + } + if (tmp->get_tmp_unit() == NULL) { + system("cls"); + cout << "YOU DEAD!!!\n"; + int f = tmp->is_any_alive(); + if (f == -1) { + system("cls"); + cout << "player " << rul->who_lose(F) << " lose :(\n\tGame over!\n"; + level_unload(); + return; + } + tmp->set_tmp_unit(f); + + } + + if (rul->who_next(steps) == -1) { + if (tmp == first) tmp = second; + else tmp = first; + steps = 0; + } + + + } + } + catch (except ex) { + cout << "(game::game_on) Something goes wrong while playing!\n\t" << ex.what() << "\n"; + level_unload(); + return; + + } + } + +}; + +class menu { + bool hardcore; + int level; + graphic* gui; + +public: + menu() { + logger::set_name(); + hardcore = false; + gui = new graphic(); + gui->setTitle(); + level = 1; + } + void start() { + char in = 'q'; + while (in != '0') { + gui->setTextColor(yellow); + cout << "Hello, Player! How are you? Here is something you can do:\n "; + gui->setTextColor(12); + cout << "Press 1 to start game\n "; + gui->setTextColor(); + cout << "Press 2 for choosing level or loading game\n "; + cout << "Press 3 for help\n "; + cout << "Press 4 for training\n "; + cout << "Press 5 for choosing hardcore mode!\n "; + cout << "Press 0 for exit\n "; + in = _getch(); + switch (in) { + case '1': { + logger::add("=>Player starts game!\n"); + if (hardcore) { + game hard = game(gui, level); + hard.game_on(); + } + else { + game easy = game(gui, level); + easy.game_on(); + } + break; + } + case '2': { + in = 'q'; + + while (in != '1' && in != '2' && in != '3') { + system("cls"); + cout << "If you want small level press 1\nif you want big level press 2\nif you want to load game press 3\n"; + in = _getch(); + if (in == '1') level = 1; + if (in == '2') level = 2; + if (in == '3') level = 3; + } + cout << "Now in menu just choose 'start game' and it will be this level\n"; + logger::add("=>Player choose " + to_string(level) + " level\n"); + break; + } + case '3': { + logger::add("=>Player call help\n"); + gui->help(); + break; + } + case '4': { + logger::add("=>Player start training\n"); + if (hardcore) { + game hard = game(gui, level); + hard.training(); + + return; + } + else { + game easy = game(gui, level); + easy.training(); + return; + } + + break; + } + case '5': { + hardcore = true; + cout << "HARDCOREEE\n"; + logger::add("=>Player choose hardcore mode\n"); + break; + } + case '0': { + logger::add("=>Player exit game\n"); + system("cls"); + cout << "BYE :*\n"; + return; + } + default: { + logger::add("=>Player press " + to_string(in) + " in menu\n"); + system("cls"); + cout << "OOOPS, you press wrong button, try again!\n\n"; + } + + } + + + } + + + } + + + +}; + + +int main(){ + menu* everething = new menu(); + everething->start(); + return 0; +} + diff --git a/8382/Kuzina Anastasiya/OOP.exe b/8382/Kuzina Anastasiya/OOP.exe new file mode 100644 index 0000000000000000000000000000000000000000..6df09b3ee8f9e3bbf8e23af395ff86357ac0e426 GIT binary patch literal 286720 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∈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 literal 0 HcmV?d00001 diff --git a/8382/Kuzina Anastasiya/Player.cpp b/8382/Kuzina Anastasiya/Player.cpp new file mode 100644 index 000000000..df75e46c8 --- /dev/null +++ b/8382/Kuzina Anastasiya/Player.cpp @@ -0,0 +1,31 @@ +#include "Player.h" + +player::player(string new_name, int bn) { + name = new_name; + my = new base(bn); + my->set_owner(this); +} + +player::~player() { + delete my; +} + +base* player::get_base() { return my; } + +unit* player::get_tmp_unit() { return my->get_tmp_unit(); } + +void player::set_tmp_unit(int i) { + my->set_tmp_unit(i); +} + +string player::get_name() { return name; } + +int player::is_any_alive() { + return my->is_any_alive(); +} + +void player::set_base(base* b) { + delete (my); + my = b; + my->set_owner(this); +} \ No newline at end of file diff --git a/8382/Kuzina Anastasiya/Player.h b/8382/Kuzina Anastasiya/Player.h new file mode 100644 index 000000000..f1fd3d710 --- /dev/null +++ b/8382/Kuzina Anastasiya/Player.h @@ -0,0 +1,18 @@ +#pragma once +#include +#include "Base.h" + + +class player { + base* my; + string name; +public: + player(string new_name, int bn); + ~player(); + base* get_base(); + unit* get_tmp_unit(); + void set_tmp_unit(int i); + string get_name(); + int is_any_alive(); + void set_base(base* b); +}; diff --git a/8382/Kuzina Anastasiya/Rules.cpp b/8382/Kuzina Anastasiya/Rules.cpp new file mode 100644 index 000000000..0f31c3f33 --- /dev/null +++ b/8382/Kuzina Anastasiya/Rules.cpp @@ -0,0 +1,74 @@ +#include "Rules.h" + + +//basic one +int ruls1::who_lose(field* F) { + bool is_no_base = true; + for (int i = 0; i < F->get_y_size(); i++) { + for (int j = 0; j < F->get_x_size(); j++) { + if (F->get_cell(j, i)->is_base()) { + is_no_base = false; + if (F->get_cell(j, i)->get_base()->get_hp() <= 0) return F->get_cell(j, i)->get_base()->get_number(); + + } + + } + + } + if (is_no_base) throw exception("(ruls1::who_lose) There is no bases on the field!\n"); + return -1; + +} +int ruls1::who_next(int i) { + if (i > 4) return -1; + return 1; + +} +int ruls1::starts(field* F) { + return 1; + +} + + + +int ruls2::who_lose(field* F) { + bool is_no_base = true; + for (int i = 0; i < F->get_y_size(); i++) { + for (int j = 0; j < F->get_x_size(); j++) { + if (F->get_cell(j, i)->is_base()) { + is_no_base = false; + if (F->get_cell(j, i)->get_base()->is_any_alive() == -1) return F->get_cell(j, i)->get_base()->get_number(); + + } + + } + + } + if (is_no_base) throw exception("(ruls2::who_lose) There is no bases on the field!\n"); + return -1; + +} +int ruls2::who_next(int i) { + if (i > 2) return -1; + return 1; + +} +int ruls2::starts(field* F) { + bool is_no_base = true; + for (int i = 0; i < F->get_y_size(); i++) { + for (int j = 0; j < F->get_x_size(); j++) { + if (F->get_cell(j, i)->is_base()) { + is_no_base = false; + F->get_cell(j, i)->get_base()->set_hp(0); + + } + + } + + } + if (is_no_base) throw except("(ruls2::starts)There is no bases on the field!\n"); + return -1; + + +} + diff --git a/8382/Kuzina Anastasiya/Rules.h b/8382/Kuzina Anastasiya/Rules.h new file mode 100644 index 000000000..4611fce74 --- /dev/null +++ b/8382/Kuzina Anastasiya/Rules.h @@ -0,0 +1,28 @@ +#pragma once +#include "Field.h" + +class Iwinrul { +public: + virtual int who_lose(field* F) =0;//return num of winers-base if win or -1 + virtual int who_next(int i)=0; //return 1 if same and -1 if other one + virtual int starts(field* F)=0; +}; + + +class ruls1: public Iwinrul { +public: + + virtual int who_lose(field* F); + virtual int who_next(int i); + virtual int starts(field* F); + +}; + +class ruls2 : public Iwinrul { + // -, +public: + virtual int who_lose(field* F); + virtual int who_next(int i); + virtual int starts(field* F); +}; + diff --git a/8382/Kuzina Anastasiya/SaveFiles/Mon.txt b/8382/Kuzina Anastasiya/SaveFiles/Mon.txt new file mode 100644 index 000000000..70da18bb2 --- /dev/null +++ b/8382/Kuzina Anastasiya/SaveFiles/Mon.txt @@ -0,0 +1,27 @@ +p first 1 +p second 2 +10 10 +2 2 1 1 2 2 2 0 0 3 +2 2 3 3 1 3 3 3 1 1 +0 0 0 0 0 0 0 0 0 0 +0 0 0 0 2 2 2 1 2 2 +1 1 1 1 0 0 0 3 0 0 +2 3 1 3 1 0 0 0 0 2 +3 0 1 1 1 1 0 0 2 2 +3 3 0 1 1 0 0 0 0 0 +2 1 3 0 0 0 0 2 0 0 +3 2 0 2 2 2 2 1 1 1 +5 +i 0 0 2 +i 1 7 4 +i 1 8 2 +i 2 2 1 +i 4 5 3 +b 2 2 1 200 +2 +u 1 2 w 10 10 5 10 0 20 1 +u 2 1 l 10 10 5 10 0 20 1 +b 8 8 2 200 +1 +u 8 9 c 5 5 10 5 0 20 1 + diff --git a/8382/Kuzina Anastasiya/Unit.cpp b/8382/Kuzina Anastasiya/Unit.cpp new file mode 100644 index 000000000..413b40265 --- /dev/null +++ b/8382/Kuzina Anastasiya/Unit.cpp @@ -0,0 +1,205 @@ +#pragma once +#include +#include +#include "Unit.h" +#include "Feature.h" +#include "Logger.h" +#include "Exept.h" +#define RESET "\033[0m" +#define RED "\033[1;31m" +using namespace std; + + unit::unit() { + base_number = -1; + ubase = NULL; + hp = feature(10); + armor = feature(10); + attack = feature(10); + level = ulevel(); + name = 'u'; + x = -1; + y = -1; + return; + } + void unit::set_info(int new_hp, int new_attack, int new_armor) { + hp = feature(new_hp); + attack = feature(new_attack); + armor = feature(new_armor); + } + void unit::get_info() { + cout << "\tName: " << name << "(" << x << ", " << y << ")\n"; + cout << "\tHP: " << hp.get_tmp() << " Attack : " << attack.get_tmp() << " Armor : " << armor.get_tmp() << endl; + cout << "\tLevel : " << level.get_tmp_level() <<" Xp: "<< level.get_tmp_xp() << " Xp for level up: " << level.get_xp_for_next_level() << "\n"; + } + void unit::set_hp(int nhp) { + hp.set_tmp(nhp); + } + bool unit::add_hp(int num) { + if (hp.add(num)) { + return true; + } + return false; + } + void unit::add_armor(int num) { + armor.add(num); + } + void unit::add_attack(int num) { + attack.add(num); + } + void unit::add_xp(int num) { + if (level.plus_xp(num)) { + hp.set_max(hp.get_max() + 10); + hp.set_tmp(hp.get_tmp() + 5); + armor.set_max(armor.get_max() + 2); + attack.set_max(attack.get_max() + 2); + } + } + void unit::set_type(creature t) { + if (t == None) throw except("(unit::set_type) You can't set unit None-type\n"); + type = t; + } + void unit::set_base_nubmer(int t) { base_number = t; } + int unit::get_base_number() { return base_number; } + void unit::set_base(void* bs) { ubase = bs; } + void* unit::get_base() { return ubase; } + + void unit::set_name(char new_name) { + name = new_name; + } + void unit::set_coords(int new_x, int new_y) { + if (new_x < 0 || new_y < 0) throw except("Trying to set unit negativ coords: ("+to_string(x)+","+to_string(y)+")\n"); + x = new_x; + y = new_y; + } + int unit::get_hp() { return hp.get_tmp(); } + int unit::get_armor() { return armor.get_tmp(); } + int unit::get_attack() { return attack.get_tmp(); } + char unit::get_name() { return name; } + int unit::get_x() { return x; } + creature unit::get_type() { return type; } + int unit::get_y() { return y; } + + char unit::beware() { + switch (name){ + case 'w': + case 'h': return 126; + case 'f': + case 'l': return 94; + case 'd': + case 'c': return 6; + } + throw except("(unit::beware) Incorrect unit name -"+ to_string(name) +"- doesn't match any creature type"); + } + + unit operator+(unit& un, item* it) { + + char c = it->get_name(); + if (c == '$') + un.add_xp(it->get_effect()); + else if (c == 3) + un.add_hp(it->get_effect()); + else if (c == '*') + un.add_armor(it->get_effect()); + else if (c == 4) + un.add_attack(it->get_effect()); + else throw except("(unit::operatior+) Unexpected item name -"+ to_string(c)+", doesn't match any item types\n"); + logger::add("\t"+un.get_u_info()+"find some item\n"); + return un; + } + + unit operator-(unit& un, unit* it) { + logger::add("\tfight between "+ un.get_u_info() + " and " + it->get_u_info() + "\n"); + int att = it->get_attack(); + int arr = un.get_armor(); + it->add_xp(10); + un.add_armor(-1); + if (arr > att) { + it->add_hp(-1); + logger::add("\t\t" + it->get_u_info() + " is weaker and get -1 hp\n"); + return un; + } + logger::add("\t\t" + un.get_u_info() + " is weaker and get " + to_string(arr - att)+" hp\n"); + un.add_hp(arr - att); + return un; + } + + int unit::set_all(int hdp, int hp_max, int aror, int atack, int x, int xp_level, int lvel) { + + hp.set_tmp(hdp); + hp.set_tmp(hp_max); + armor.set_tmp(aror); + attack.set_tmp(atack); + + while (level.get_tmp_xp() != x || level.get_tmp_level() != lvel) { + level.plus_xp(1); + if (level.get_tmp_level() > lvel) return 1; + } + + + return 1; + } + + int unit::get_hp_max() { return hp.get_max(); } + int unit::get_armor_max() { return armor.get_max(); } + int unit::get_attack_max() { return attack.get_max(); } + int unit::get_level() { return level.get_tmp_level(); } + int unit::get_xp() { return level.get_tmp_xp(); } + int unit::get_xp_for_next_level() { return level.get_xp_for_next_level(); } + string unit::get_u_info() { + string inf = " "; + inf.push_back(name); + inf = inf + " base-" + to_string(base_number) + " "; + inf = inf + "(" + to_string(x) + "," + to_string(y) + ")"; + return inf; + + } + + + mammal::mammal():unit(){ + set_name('m'); + } + + wolf::wolf() :mammal() { + set_name('w'); + set_info(15, 5, 5); + set_type(Wolf); + } + + hyena::hyena() :mammal() { + set_name('h'); + set_info(20, 2, 20); + set_type(Hyena); + } + + bird::bird() :unit() { + set_name('b'); + } + + crow::crow() :bird() { + set_name('c'); + set_info(15, 5, 15); + set_type(Crow); + } + + duck::duck() : bird() { + set_name('d'); + set_info(20, 10, 5); + set_type(Duck); + } + + amphibia::amphibia() :unit() { + set_name('a'); + } + + frog::frog() :amphibia() { + set_name('f'); + set_info(5, 5, 10); + set_type(Frog); + } + + lizard::lizard() :amphibia() { + set_name('l'); + set_info(10, 10, 5); + set_type(Lizard); + } + diff --git a/8382/Kuzina Anastasiya/Unit.h b/8382/Kuzina Anastasiya/Unit.h new file mode 100644 index 000000000..8dc60f918 --- /dev/null +++ b/8382/Kuzina Anastasiya/Unit.h @@ -0,0 +1,94 @@ +#pragma once +#include +#include "Feature.h" +#include "Item.h" +enum creature {Hyena, Wolf, Crow, Duck, Frog, Lizard, None }; + +class unit { +private: + feature hp; + feature armor; + feature attack; + ulevel level; + creature type; + int base_number; + void* ubase; + + char name; + + int x; + int y; + +public: + unit(); + void set_info(int new_hp, int new_attack, int new_armor); + char beware(); + std::string get_u_info(); + int set_all(int hdp, int hp_max, int armor, int attack, int xp, int xp_level, int level); + void get_info(); + + int get_base_number(); + void set_base_nubmer(int n); + void set_base(void* b); + void* get_base(); + creature get_type(); + void set_type(creature t); + void set_name(char new_name); + void set_coords(int new_x, int new_y); + void set_hp(int nhp); + bool add_hp(int num); + void add_attack(int num); + void add_armor(int num); + void add_xp(int num); + friend unit operator+(unit& un, item* it); + friend unit operator-(unit& un, unit* it); + int get_hp(); + int get_armor(); + int get_attack(); + int get_hp_max(); + int get_armor_max(); + int get_attack_max(); + int get_level(); + int get_xp(); + int get_xp_for_next_level(); + + char get_name(); + int get_x(); + int get_y(); + +}; + + + +class mammal : public unit { +public: mammal(); +}; +class wolf : public mammal { +public: wolf(); +}; +class hyena : public mammal { +public: hyena(); +}; + +class bird : public unit { +public: + bird(); +}; +class crow : public bird { +public: + crow(); +}; +class duck : public bird { +public: + duck(); +}; + +class amphibia : public unit { +public: amphibia(); +}; +class frog : public amphibia { +public: frog(); +}; +class lizard : public amphibia { +public: lizard(); +};