🐎要打一个血量为 的史莱姆,每回合他可以攻击一次,造成 点伤害。当一个史莱姆的血量小于等于 时,就会死亡。 如果一个史莱姆受到攻击后,当前血量小于等于最大血量的一半,且没有死亡,就会分裂成两个史莱姆,它们的当前血量和最大血量都等于分裂前的血量。 假设史莱姆不会攻击,只会挨打,求🐎打掉所有史莱姆需要的回合数。(用C++写)
时间: 2023-05-26 12:03:08 浏览: 172
#include<stdio.h>
int main()
{
int hp, dam; //血量和攻击伤害
scanf("%d%d", &hp, &dam);
int cnt = 0; //打掉的史莱姆数量
while(hp > 0)
{
if(hp <= dam) //当前史莱姆血量小于等于伤害,直接打死
{
cnt++;
break;
}
else if(hp <= hp/2*2) //当前史莱姆血量小于等于最大血量的一半
{
cnt += 2; //打掉两个史莱姆
hp = hp/2; //史莱姆分裂,血量减半
}
else //血量大于最大血量的一半,打死一个史莱姆
{
cnt++;
hp -= dam;
}
}
printf("%d", cnt);
return 0;
}
相关问题
🐎要打一个血量为 的史莱姆,每回合他可以攻击一次,造成 点伤害。当一个史莱姆的血量小于等于 时,就会死亡。 如果一个史莱姆受到攻击后,当前血量小于等于最大血量的一半,且没有死亡,就会分裂成两个史莱姆,它们的当前血量和最大血量都等于分裂前的血量。 假设史莱姆不会攻击,只会挨打,求🐎打掉所有史莱姆需要的回合数。
假设打掉一个史莱姆需要 x 回合,则可以列出如下递推式:
x = ceil(HP/ATK) + (HP/2 > ATK ? x : x+1)
其中 ceil 表示向上取整操作。第一项代表🐎直接攻击将史莱姆打死的回合数,第二项表示如果史莱姆分裂,则需要多一回合的时间将分裂出的另一个史莱姆也打死。
假设初始只有一个史莱姆,其最大血量为 HP0,则打掉所有史莱姆需要的总回合数为:
x_total = x1 + x2 + ... + xn
其中 xi 表示打死第 i 个史莱姆需要的回合数。每个史莱姆分裂都会增加一个史莱姆,因此只需要考虑每个史莱姆分裂后的情况即可。
例如,第一个史莱姆分裂后会变成两个史莱姆,每个史莱姆的最大血量都是 HP0,因此 xi = ceil(HP0/ATK) + 1。
第二个史莱姆和其他史莱姆一样也会分裂,假设它之前已经被攻击过一次,那么它的当前血量就是 HP0/2,最大血量还是 HP0。根据递推式,打死这个史莱姆需要的回合数为:
x2 = ceil(HP0/ATK) + (HP0/4 > ATK ? x1 : x1+1)
其中的 HP0/4 表示当前血量小于等于最大血量的一半。
以此类推,可以得到打掉所有史莱姆需要的总回合数。
用C++写一个RPG游戏,用类和封装继承,里面的属性有攻击力、防御力、暴击率、闪避率、掉落率、血量,要用指针和构造函数、析构函数
好的,以下是一个简单的RPG游戏的类设计:
```cpp
#include <iostream>
#include <string>
#include <cstdlib> // 用于随机数生成
using namespace std;
class Role {
public:
Role(string name, int attack, int defense, double criticalRate, double dodgeRate, double dropRate, int maxHp) {
this->name = name;
this->attack = attack;
this->defense = defense;
this->criticalRate = criticalRate;
this->dodgeRate = dodgeRate;
this->dropRate = dropRate;
this->maxHp = maxHp;
this->hp = maxHp;
}
virtual ~Role() {}
string getName() { return name; }
int getAttack() { return attack; }
int getDefense() { return defense; }
double getCriticalRate() { return criticalRate; }
double getDodgeRate() { return dodgeRate; }
double getDropRate() { return dropRate; }
int getHp() { return hp; }
int getMaxHp() { return maxHp; }
bool isDead() { return hp <= 0; }
void attackRole(Role* target) {
if (rand() % 100 < criticalRate * 100) {
cout << name << "发动了暴击!" << endl;
target->takeDamage(attack * 2);
} else {
cout << name << "攻击了" << target->getName() << "!" << endl;
target->takeDamage(attack);
}
}
void takeDamage(int damage) {
int realDamage = damage - defense;
if (realDamage < 0) {
realDamage = 0;
}
if (rand() % 100 < dodgeRate * 100) {
cout << name << "闪避了攻击!" << endl;
} else {
hp -= realDamage;
if (hp < 0) {
hp = 0;
}
cout << name << "受到了" << realDamage << "点伤害!" << endl;
}
}
void addHp(int hp) {
this->hp += hp;
if (this->hp > maxHp) {
this->hp = maxHp;
}
cout << name << "恢复了" << hp << "点生命值!" << endl;
}
bool dropItem() {
return rand() % 100 < dropRate * 100;
}
private:
string name;
int attack;
int defense;
double criticalRate;
double dodgeRate;
double dropRate;
int maxHp;
int hp;
};
class Player : public Role {
public:
Player(string name, int attack, int defense, double criticalRate, double dodgeRate, double dropRate, int maxHp, int level)
: Role(name, attack, defense, criticalRate, dodgeRate, dropRate, maxHp) {
this->level = level;
}
void levelUp() {
level++;
attack += 5;
defense += 5;
maxHp += 10;
hp = maxHp;
cout << getName() << "升到了" << level << "级!" << endl;
}
private:
int level;
};
class Monster : public Role {
public:
Monster(string name, int attack, int defense, double criticalRate, double dodgeRate, double dropRate, int maxHp, int exp)
: Role(name, attack, defense, criticalRate, dodgeRate, dropRate, maxHp) {
this->exp = exp;
}
int getExp() { return exp; }
private:
int exp;
};
int main() {
// 创建玩家和怪物
Player* player = new Player("玩家", 20, 10, 0.1, 0.1, 0.1, 100, 1);
Monster* monster = new Monster("史莱姆", 10, 5, 0.05, 0.05, 0.3, 50, 10);
// 玩家攻击怪物直到怪物死亡
while (!monster->isDead()) {
player->attackRole(monster);
if (monster->isDead()) {
break;
}
monster->attackRole(player);
}
// 如果怪物死亡,掉落物品
if (monster->isDead()) {
if (monster->dropItem()) {
cout << monster->getName() << "掉落了一件物品!" << endl;
} else {
cout << monster->getName() << "没有掉落任何物品。" << endl;
}
// 增加经验值
player->addHp(10);
int exp = monster->getExp();
cout << player->getName() << "获得了" << exp << "点经验值!" << endl;
// 判断是否升级
while (true) {
int levelUpExp = player->getMaxHp() * 2;
if (exp >= levelUpExp) {
exp -= levelUpExp;
player->levelUp();
} else {
break;
}
}
} else {
cout << player->getName() << "被" << monster->getName() << "打败了。" << endl;
}
delete player;
delete monster;
return 0;
}
```
在这个RPG游戏中,有两个角色类:`Player`和`Monster`,它们都继承自`Role`类。`Role`类中包含了各种角色共有的属性和方法,如攻击力、防御力、暴击率、闪避率、掉落率、血量等。`Player`类中还有一个`level`属性,表示玩家的等级,以及一个`levelUp`方法,用于将玩家升级。`Monster`类中有一个`exp`属性,表示杀死这个怪物可以获得的经验值。
在`main`函数中,我们创建了一个玩家和一个怪物,然后进行了一系列交战操作,直到其中一个角色死亡。如果怪物死亡,我们会判断是否掉落物品、增加经验值、升级等操作。最后,我们需要手动释放动态内存,因为我们在堆上创建了`Player`和`Monster`对象。