首页 > 其他分享 >OOP双人决斗(多重继承)

OOP双人决斗(多重继承)

时间:2024-06-23 18:29:01浏览次数:18  
标签:p2 p1 string int 决斗 damage OOP 双人 name

题目描述

写一个Node2D基类,属性有位置location(string)

一个Body子类继承自Node2D,属性当前生命值health(int),防御力defense(int)

一个Weapon子类也继承自Node2D,属性有武器名w_name(string),伤害damage(int)

一个Player多继承自Body和Weapon,属性有名字name(string)。方法有attack,对目标造成伤害

在主函数创建两个Player,p1、p2,判断在p1首先开始攻击的情况下谁会获胜。

我们规定attack中,每次对目标生命力造成的伤害等于damage减去目标的defense。

输入

输入:地点location,玩家1的名字、生命值、防御力、武器名、武器伤害,玩家2的名字、生命值、防御力、武器名、武器伤害

输出

输出:获胜信息

----------------------------------------------

输入示例:

palace
p1 30 5 bow 30
p2 50 10 sword 20

输出示例:

p1 deal 20 damage to p2
p2 still have 30 health

p2 deal 15 damage to p1
p1 still have 15 health

p1 deal 20 damage to p2
p2 still have 10 health

p2 deal 15 damage to p1
p2 defeated p1 by sword in palace

AC代码

#include "bits/stdc++.h"
using namespace std;

class Node2D
{
protected:
    string location;

public:
    Node2D(string loc) : location(loc) {}
};

class Body : virtual public Node2D
{
private:
    int health;
    int defense;

public:
    Body(string loc, int h, int d) : Node2D(loc), health(h), defense(d) {}

    int getHealth() const { return health; }
    void setHealth(int h) { health = h; }
    int getDefense() const { return defense; }
};
class Weapon : virtual public Node2D
{
protected:
    string w_name;
    int damage;

public:
    Weapon(string loc, string name, int dmg) : Node2D(loc), w_name(name), damage(dmg) {}
};

class Player : public Body, public Weapon
{
private:
    string name;

public:
    Player(string loc, string n, int h, int d, string wn, int dmg)
        : Node2D(loc), Body(loc, h, d), Weapon(loc, wn, dmg), name(n) {}

    void attack(Player &target)
    {
        int actual_damage = damage - target.getDefense();
        actual_damage = actual_damage > 0 ? actual_damage : 0;
        target.setHealth(target.getHealth() - actual_damage);
        cout << name << " deal " << actual_damage << " damage to " << target.name << endl;
        if (target.getHealth() > 0)
        {
            cout << target.name << " still have " << target.getHealth() << " health" << endl;
        }
        else
        {
            cout << name << " defeated " << target.name << " by " << w_name << " in " << location << endl;
        }
    }
};

int main()
{
    string location, p1_name, p1_weapon, p2_name, p2_weapon;
    int p1_health, p1_defense, p1_damage, p2_health, p2_defense, p2_damage;

    cin >> location;
    cin >> p1_name >> p1_health >> p1_defense >> p1_weapon >> p1_damage;
    cin >> p2_name >> p2_health >> p2_defense >> p2_weapon >> p2_damage;

    Player p1(location, p1_name, p1_health, p1_defense, p1_weapon, p1_damage);
    Player p2(location, p2_name, p2_health, p2_defense, p2_weapon, p2_damage);

    while (p1.getHealth() > 0 && p2.getHealth() > 0)
    {
        p1.attack(p2);
        cout << endl;
        if (p2.getHealth() > 0)
        {
            p2.attack(p1);
            cout << endl;
        }
    }

    return 0;
}

标签:p2,p1,string,int,决斗,damage,OOP,双人,name
From: https://blog.csdn.net/zgy11026/article/details/139841567

相关文章

  • 17-oop封装
    封装信息隐藏:应禁止直接访问一个对象中数据的实际表示,而应通过接口操作来访问属性私有,get/set追求“高内聚,低耦合”//类//封装的核心关键字:private私有publicclassStudent{//属性私有privateStringname;//名字privateintid;//学号private......
  • 16-oop构造器
    构造器使用new关键字,本质是在调用构造器类中的构造器也成为构造方法,是在进行创建对象的时候必须要调用的。特点:必须和类的名字相同必须没有返回值类型,也不能写voidpublicclassPerson{//一个类即使什么都不写,也会存在一个方法(构造器)/*publicPerso......
  • 14-oop方法回顾
    方法回顾//Demo01类publicclassDemo01{//main方法publicstaticvoidmain(String[]args){}/*修饰符返回值类型方法名(...){//方法体return返回值;//return表示方法结束,返回一个结果}*/publ......
  • 13-oop概述
    面向对象思想物以类聚,分类的思维模式。分类,然后对这些分类进行单独思考,最后对某个分类下的细节进行面向过程对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是具体到微观的操作,仍然需要面向过程的思路去处理。面向对象是......
  • Hadoop+Hive超全笔记 一站式搞定!!
    Hadoophadoop集群的组成hadoop常用端口HDFS常用shell命令HDFS的原理、机制块和副本edits和fsimage文件HDFS的三大机制HDFS数据上传、写入原理(写流程)【重点】HDFS数据读取(读流程)【重点】原数据存储流程【重点】安全模式归档机制(小文件)垃圾桶机制MapReduce底层原......
  • Hadoop电商日志数据分析(一)
    项目要求根据电商日志文件,分析:1.统计页面浏览量(每行记录就是一次浏览)2.统计各个省份的浏览量(需要解析IP)3.日志的ETL操作(ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程)为什么要ETL:没有必要解析出所有数据,只需要解析出有价值的字段即可。本......
  • Hadoop电商日志数据分析(三)
    ETL1.ETL的重要性==>存在的问题:每个MR作业都去全量读取待处理的原始日志,如果数据量很大,将非常不可取ETL:数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程为什么要ETL:没有必要解析出所有数据,只需要解析出有价值的字段即可。全量数据不方便直接进行计算......
  • Hadoop电商日志数据分析(二)
    浏览量统计功能实现统计页面的浏览量count一行记录做成一个固定的KEY,value赋值为1PVStatApp点击查看代码packagecom.imooc.bigdata.hadoop.mr.project.mr;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.......
  • 从工具产品体验对比spark、hadoop、flink
    作为一名大数据开发,从工具产品的角度,对比一下大数据工具最常使用的框架spark、hadoop和flink。工具无关好坏,但人的喜欢有偏好。目录评价标准1效率2用户体验分析从用户的维度来看从市场的维度来看从产品的维度来看3用户体验的基本原则成本和产出是否成正比操作是否“......
  • Hadoop 2.0 大家族(二)
    目录三、Hbase(一)Hbase简介(二)Hbase入门四、Pig(一)Pig简介(二)Pig入门三、Hbase  Hbase是基于Hadoop的开源分布式数据库,它以Google的BigTable为原型,设计并实现了具有高可靠性、高性能、列存储、可伸缩、实时读写的分布式数据库系统。HBase适合于存储非结构化数据H......