Untitled
unknown
plain_text
2 years ago
9.0 kB
11
Indexable
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstdlib>
#include <stdexcept>
#include <limits>
using namespace std;
class Team;
class obstacle ;
class character;
class Map {
private:
int rows; // 地圖的行數
int cols; // 地圖的列數
vector<vector<char> > map; // 地圖的表示
public:
Map() {}
Map(int rows, int cols)
: rows(rows), cols(cols), map(rows, vector<char>(cols, '.')) {}
void draw() const;
// void placeCharacter(const vector<character*>& members, int i);
void cleanCharacter(character& character);
void placeCharacterSingle(const character& character);
};
class character {
protected:
//名字、原始血量、目前血量、攻擊、防禦、速度
char symbol;
string name;
int origin_healthPoints;
int current_healthPoints;
int attackPoints;
int defensePoints;
int speedPoints;
int x; // 角色在方格地圖上的x、y座標
int y;
vector<size_t> canAttackIndex;
public:
//Constructor
character() : symbol('N'), name("None"), origin_healthPoints(0),current_healthPoints(0), attackPoints(0), defensePoints(0), speedPoints(0), x(0), y(0) {}
character(const char charSymbol, const string& charName, int origin_HP, int current_HP, int charAttack,int charDefense, int charSpeed, int x, int y) : symbol(charSymbol), name(charName), origin_healthPoints(origin_HP),current_healthPoints(current_HP),attackPoints(charAttack), defensePoints(charDefense), speedPoints(charSpeed), x(x), y(y) {}
//取得基本資料函數
char getSymbol() const { return symbol; }
string getName() const { return name; }
int get_current_HP() const { return current_healthPoints; }
int get_origin_HP() const { return origin_healthPoints; }
int getAttackPoints() const { return attackPoints; }
int getDefensePoints() const { return defensePoints; }
int getSpeedPoints() const { return speedPoints; }
int getX() const { return x; }
int getY() const { return y; }
//顯示基本資料
void displayInfo(const vector<character*>& team);
//傷害
void takeDamage(int damage);
//攻擊
// void attack();
// 移動角色
void move(Map& chessBoard);
// 確認是否在攻擊範圍內
bool checkDistance(character& character) const;
void heal(int amount);
// void checkObstacle(vector<obstacle>& allObstacles);
};
class obstacle{
private:
char symbol;
string name;
int x;
int y;
public:
obstacle(const char symbol ,const string& name, int X , int Y) : symbol(symbol), name(name), x(X), y(Y) {};
char getSymbol() const { return symbol; }
int getX() const {return x; }
int getY() const {return y; }
// void applyEffect(character& someone);
};
class Wizard : public character {
private:
public:
Wizard(int x, int y): character('W', "Wizard", 80, 80,25, 5, 8, x, y) {}
};
class Knight : public character {
private:
public:
Knight(int x, int y): character('K', "Knight", 100, 100, 15, 3, 5, x, y){}
};
class Archer : public character {
private:
public:
Archer(int x, int y): character('A', "Archer", 50,50, 40, 1, 7, x, y){}
};
class Tank : public character {
private:
public:
Tank(int x, int y): character('T', "Tank", 300 ,300, 5, 10, 10, x, y){}
};
class Team {
private:
vector<character*> members;
bool teamMark;
public:
~Team() {
for (character* member : members) {
delete member;
}
}
Team(){
teamMark = false;
};
void setTeamMark(){teamMark = true; return;}
// 獲得隊伍的大小
size_t getSize() const {
return members.size();
}
const vector<character*>& getMembers() const {
return members;
}
void addClassWizard(int x, int y) {
members.push_back(new Wizard(x, y));
}
void addClassKnight(int x, int y) {
members.push_back(new Knight(x, y));
}
void addClassArcher(int x, int y) {
members.push_back(new Knight(x, y));
}
void addClassTank(int x, int y) {
members.push_back(new Tank(x, y));
}
};
// 確認傳入之角色是否於九宮格內
bool character::checkDistance(character& character) const{
if(abs(x - character.getX()) == 1 || abs(y - character.getY()) == 1 || (abs(x - character.getX()) == 1 && abs(y - character.getY()) == 1)){
return true;
}
return false;
}
void character::displayInfo(const vector<character*>& team){
cout << "Name: " << name << endl;
cout << "HP: " << current_healthPoints << endl;
cout << "Attack: " << attackPoints << endl;
cout << "Defence: " << defensePoints << endl;
// 待修 不確定要不要在character內建一個存此角色可以攻擊的對象的index
// vector<size_t> tempAttackIndex;
// for(size_t i = 0; i < team.size(); i++){
//
// if(this->getSymbol() != team[i].getSymbol() && checkDistance(*(team[i])) == true){
// tempAttackIndex.push_back(i);
// }
// }
// // 如果此vector為空(沒人可以打)
// if(tempAttackIndex.empty() == true){
// return;
// }
// else{
// cout << "You can attack: ";
// canAttackIndex = tempAttackIndex; // 待修
// for(size_t i = 0; i < tempAttackIndex.size(); i++){
// cout << team[tempAttackIndex[i]]->getName() << " ";
// }
// cout << '\n';
// return;
// }
}
//void character::attack() {
// bool checkAttack() = false;
// string dowhat;
// getline(cin, dowhat);
// }
void character::takeDamage(int damage) {
current_healthPoints -= damage;
if (current_healthPoints < 0) {
current_healthPoints = 0;
cout << name << " 被擊敗了!" << endl;
}
else {
cout << name << " 受到 " << damage << " 點傷害,剩餘生命值:" << current_healthPoints << endl;
}
}
void character::heal(int amount) {
int old_healthPoints = current_healthPoints;
int new_healthPoints = current_healthPoints + amount;
// 确保生命值不超過最大值
current_healthPoints = min(new_healthPoints,origin_healthPoints);
cout << name << " 回复了 " << current_healthPoints-old_healthPoints << " 點生命值,當前生命值:" << current_healthPoints << endl;
}
void character::move(Map& chessBoard) {
string input;
int moveX, moveY;
bool validMove = false;
while (!validMove) {
try {
cout << "Your Move (Enter 'attack' to attack or 'move' to move): ";
getline(cin, input);
if (input == "attack") {
// attack(); // 呼叫 attack 方法
validMove = true; // 攻擊完成後退出循環
}
else if (input == "move") {
chessBoard.cleanCharacter(*this); // 將原先位置設為空格
cout << "Enter move X and Y: ";
if (!(cin >> moveX >> moveY)) {
throw runtime_error("Invalid input for movement coordinates.");
}
cin.ignore();
x += moveX;
y += moveY;
chessBoard.placeCharacterSingle(*this); // 嘗試放置到新位置
validMove = true; // 如果成功,退出循環
} else {
cout << "Invalid command. Please enter 'attack' or 'move'." << endl;
}
} catch (const runtime_error& e) {
cout << "Error: " << e.what() << ". Please enter again!" << endl;
cin.clear(); // 清除錯誤標誌
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略錯誤輸入直到下一行
// 重置上一有效位置
x -= moveX;
y -= moveY;
}
}
}
void Map::cleanCharacter(character& character){
int row = character.getY();
int col = character.getX();
// 檢查座標是否合法
if (row >= 0 && row < rows && col >= 0 && col < cols) {
map[row][col] = '.';
}
}
void Map::placeCharacterSingle(const character& character) {
int row = character.getY();
int col = character.getX();
// 檢查座標是否合法
if (row >= 0 && row < rows && col >= 0 && col < cols) {
map[row][col] = character.getSymbol();
}else {
throw runtime_error("the obstacle is out of map bounds");
}
}
void Map::draw() const{
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << map[i][j] << ' ';
}
cout << endl;
}
}
Editor is loading...
Leave a Comment