__桥接模式

news2024/10/24 14:36:21

在C#中

初始版本

namespace _013_桥接模式
{
    /// <summary>
    /// 玩家抽象类
    /// </summary>
    public abstract class AbstractPlayer
    {
        protected IWeapon _weapon;//武器引用
        public void SetWeapon(IWeapon weapon)
        {
            _weapon = weapon;
        }
        //抽象方法使用武器
        public abstract void UseWeaponAttack();
    }
}

namespace _013_桥接模式
{
    //抽象武器
    public abstract class IWeapon
    {
        public string Name { set; get; }    //武器名称
        public float attackValue { set; get; } //攻击力
        public abstract void  Attack();//攻击
        //加入怪物的引用
        public Monster monster { set; get; }

/*public Monster Monsters { set;get;}=null;

//设置攻击目标
public void SetAttackTarget(Monster monster)
{
    Monsters=monster;
}*/


        protected IWeapon(string name, float attackValue)
        {
            Name = name;
            this.attackValue = attackValue;
        }
    }
}

namespace _013_桥接模式
{
    /// <summary>
    /// 玩家接口
    /// </summary>
    public interface IPlayer
    {
        void UseWeaponAttack();
    }
}

namespace _013_桥接模式
{
    public  class Mage: AbstractPlayer
    {       
        public override void UseWeaponAttack()
        {
            Console.WriteLine($"法师使用{_weapon.Name}武器进行攻击!");
            if (_weapon != null)
            {
                _weapon.Attack();
            }
        }
    }
}

namespace _013_桥接模式
{
    public  class Warrior:AbstractPlayer
    {
      
        //使用武器
        public override void UseWeaponAttack()
        {
            
            //面向抽象编程,或者面向接口编程
            if (_weapon != null)
            {
                Console.WriteLine($"战士使用{_weapon.Name}武器进行攻击!");
                _weapon.Attack();
            }
        }
    }
}

namespace _013_桥接模式
{
    public class Sword:IWeapon
    {
        public Sword(string name, float attackValue) : base(name, attackValue)
        {
        }

        public override void Attack()
        {
            //武器特效逻辑
            Console.WriteLine($"{Name}大剑攻击!,发出咣当咣当的声音");
          
            //调用敌人的减血方法
            if(monster!=null)
            {
                //击中敌人后的逻辑
                Console.WriteLine($"敌人掉了{attackValue}滴血!");
                monster.TakeDamage(attackValue);
            }
        }
    }
}

namespace _013_桥接模式
{
    public class Bow:IWeapon
    {
        public Bow(string name, float attackValue) : base(name, attackValue)
        {
        }

        public override void Attack()
        {
            //武器特效逻辑
            Console.WriteLine($"{Name}搭弓射箭!,发出嗖嗖的声音");
            //击中敌人后的逻辑
            Console.WriteLine($"射中敌人,对方很高兴的掉了{attackValue}滴血!");
            //调用敌人的减血方法  if(monster!=null)
            {
                //击中敌人后的逻辑
                Console.WriteLine($"敌人掉了{attackValue}滴血!");
                monster.TakeDamage(attackValue);
            }

        }
    }
}
namespace _013_桥接模式
{
    /// <summary>
    /// 怪物类
    /// </summary>
    public class Monster
    {
    

        public string Name { get; set; }
        public float Hp { get; set; }

        public Monster(string name, float hp)
        {
            Name = name;
            Hp = hp;
        }
        public void TakeDamage(float damage)
        {
            if(damage<Hp)
            {
                Hp-=damage;
            }
            else
            {
                Hp = 0;
            }
        }
    }
}

namespace _013_桥接模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Warrior warrior = new Warrior();
            IWeapon sword = new Sword("风霜小剑",30f);
            IWeapon bow =new Bow("射日长弓",15f);
            Monster monster = new Monster("石头鬼",100f);
            warrior.SetWeapon(sword);
            sword.monster = monster;
// sword.SetAttackTarget(monster);//设置攻击目标
            warrior.UseWeaponAttack();
        }
    }
}

最终版本

实现玩家之间,玩家和怪物之间相互攻击

新增角色类

namespace _013_桥接模式
{
    /// <summary>
    /// 角色基类
    /// </summary>
    public  abstract class ICharacter
    {
        public string Name { get; set; }
        public float CurrentHP { get; set; }//当前血量
        public float MaxHP { get; set; } //最大血量
        //攻击方法
        public abstract void Attack(ICharacter character);
        //掉血方法
        public void TankDamage(float damage)
        {
            if(CurrentHP > damage)
                CurrentHP -= damage;
            else
                CurrentHP = 0;
        }
    }
}


namespace _013_桥接模式
{
    /// <summary>
    /// 玩家抽象类
    /// </summary>
    public abstract class AbstractPlayer:ICharacter
    {
        public AbstractPlayer(string name,float maxHP)
        {
            Name = name;
            MaxHP = maxHP;
            CurrentHP = MaxHP;
        }
    }
}

namespace _013_桥接模式
{
    public class Warrior : AbstractPlayer
    {
       private IWeapon _weapon;//武器引用

        public Warrior(string name, float maxHP) : base(name, maxHP)
        {
        }

        public void SetWeapon(IWeapon weapon)
        {
            _weapon = weapon;
        }

        public override void Attack(ICharacter character)
        {
            
            //面向抽象编程,或者面向接口编程
            if (_weapon != null)
            {
                Console.WriteLine($"{Name}使用{_weapon.Name}武器进行攻击!");
                _weapon.Attack();
                character.TankDamage(_weapon.attackValue);
                Console.WriteLine($"{character.Name}掉了{_weapon.attackValue}滴血");
            }
        }
    }


}


namespace _013_桥接模式
{
    /// <summary>
    /// 怪物类
    /// </summary>
    public abstract class Monster : ICharacter
    {
        public float AILevel { get; set; }
        public Monster(string name, float maxHP, float aILevel=1)
        {
            Name = name;
            MaxHP = maxHP;
            CurrentHP = maxHP;
            AILevel = aILevel;
        }
    }
}

namespace _013_桥接模式
{
    /// <summary>
    /// 石头怪
    /// </summary>
    public class StoneMonster : Monster
    {
        public StoneMonster(string name, float maxHP, float aILevel = 1) : base(name, maxHP, aILevel)
        {
        }

        public override void Attack(ICharacter character)
        {
            Console.WriteLine($"{Name}对{character.Name}发起攻击");
            Console.WriteLine($"{character.Name}掉了10f血");
            character.TankDamage(10);
        }
    }
}

namespace _013_桥接模式
{
    //抽象武器
    public abstract class IWeapon
    {
        public string Name { set; get; }    //武器名称
        public float attackValue { set; get; } //攻击力
        public abstract void Attack();//攻击

        protected IWeapon(string name, float attackValue)
        {
            Name = name;
            this.attackValue = attackValue;
        }
    }
}

namespace _013_桥接模式
{
    public class Bow:IWeapon
    {
        private Monster monster;
        public Bow(string name, float attackValue) : base(name, attackValue)
        {
        }

        public override void Attack()
        {
            //武器特效逻辑
            Console.WriteLine($"{Name}搭弓射箭!,发出嗖嗖的声音");
            //击中敌人后的逻辑
            Console.WriteLine($"射中敌人,对方很高兴的掉了{attackValue}滴血!");
            Console.WriteLine($"敌人掉了{attackValue}滴血!");

        }
    }
}

namespace _013_桥接模式
{
    public class Sword:IWeapon
    {
        public Sword(string name, float attackValue) : base(name, attackValue)
        {
        }
        private Monster monster;
        public override void Attack()
        {
            //武器特效逻辑
            Console.WriteLine($"{Name}大剑攻击!,发出咣当咣当的声音");
          
            //调用敌人的减血方法
            if(monster!=null)
            {
                //击中敌人后的逻辑
                Console.WriteLine($"敌人掉了{attackValue}滴血!");
                Console.WriteLine($"掉了{attackValue}滴血");
            }
        }
    }
}

namespace _013_桥接模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Warrior warrior = new Warrior("战士",100f);
            IWeapon sword = new Sword("风霜小剑",30f);
            IWeapon bow =new Bow("射日长弓",15f);
            Monster monster = new StoneMonster("石头鬼",100f,1);         
            warrior.SetWeapon(sword);
            warrior.Attack(monster);
            monster.Attack(warrior);
           
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows下Python3.8环境快速安装部署

为了帮助非python计算机软件开发人员快速上手使用python环境&#xff0c;我准备好了的Python 3.8免安装环境&#xff0c;并安装Jupyter Notebook以进行Python学习&#xff0c;以下是一个简单易懂的教程。请按照以下步骤操作&#xff1a; 步骤 1: 解压Python环境 下载并解压&a…

药智网数据库和摩熵医药数据库哪个好?

药智和摩熵医药(原药融云)作为医药行业内专业的医药数据库平台&#xff0c;它们各自在行业内占据着重要的地位&#xff0c;并且都在不断地创新和完善自己的数据库服务&#xff0c;以满足行业日益增长的需求为医药行业的数据服务、决策支持、研发分析等方面提供支持。. 但让大家…

java拆分地址中的省市县区,全国地址通用

package com.sure;import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * description: 拆分地址工具类 * fileName: AddressResolutionUtil.ja…

QExcel 保存数据 (QtXlsxWriter库 编译)

QtXlsxWriter 是一个用于在 Qt 应用程序中创建和操作 Excel XLSX 文件的库。它提供了一个简单的 API&#xff0c;使开发者能够轻松地生成和修改 Excel 文件&#xff0c;而无需依赖 Microsoft Excel 或其他外部应用程序。支持初始化、写文件、读文件、格式设置、合并单元格、加粗…

运维管理软件:如何引领一体化自动运维

在数字化转型的洪流中&#xff0c;运维团队正面临着前所未有的挑战与机遇。随着企业业务规模的不断扩大&#xff0c;IT架构的日益复杂&#xff0c;如何确保服务的连续性、稳定性和高效性&#xff0c;成为了运维团队亟待解决的核心问题。在此背景下&#xff0c;监控易运维管理软…

使用皮尔逊相关系数矩阵进行特征筛选

皮尔逊相关系数矩阵是一个用于量化多个变量之间线性关系的统计工具。它的每个元素表示两个变量之间的皮尔逊相关系数&#xff0c;取值范围从 -1 到 1&#xff1a; 1 表示完全正相关&#xff1a;当一个变量增加时&#xff0c;另一个变量也会增加。-1 表示完全负相关&#xff1a…

#每日一题#自动化 2024年10月

#每日一题#自动化 2024年10月 1、深拷贝和浅拷贝的区别是什么&#xff1f; 参考答案&#xff1a; 深拷贝是将对象本身复制给另一个对象。这意味着如果对对象的副本进行更改时不会影响原对象。在 Python 中&#xff0c;我们使用 deepcopy&#xff08;&#xff09;函数进行深拷贝…

Debezium和SeaTunnel实现MySQL到Hadoop的实时数据流和全量同步(基于尚硅谷的集群环境)

1、hadoop集群连接本地MySQL 1.1 首先测试集群是否可以ping通本地 虚拟机可以ping通网关&#xff08;192.168.10.2&#xff09;&#xff0c;但不能ping通192.168.10.1&#xff0c;这表明问题可能出在Windows主机的防火墙设置或VMware的网络配置上。 1.1.1 检查Windows防火墙…

个人信息窗口(三)

个人信息窗口&#xff08;三&#xff09; 前言 在上一集我们就可以显示我们就可以全部显示所有的未隐藏的组件了&#xff0c;但是隐藏的组件我们还没有蛆完成&#xff0c;所以我们这一集就需要去做隐藏组件的显示&#xff0c;以及如何切换到隐藏的组件的功能。 需求分析并实…

centos7 nginx优化

优化nginx进程个数的策略 在高并发、高访问量的web服务场景&#xff0c;需要事先启动好更多的nginx进程&#xff0c;以保证快速响应并处理大量并发用户的请求。worker_processes 1;一般调整到与CPU的颗数相同查看LInux可查看CPU个数及总核数grep processor /proc/cpuinfo|wc …

开放式耳机排行榜前十名,开放式耳机全价位段盘点

关于开放式蓝牙耳机的品牌选择&#xff0c;这是一个常见的问题。因为市面上的蓝牙耳机种类繁多&#xff0c;各种样式和类型层出不穷&#xff0c;让许多消费者感到困惑&#xff0c;不知道如何选择一款适合自己的蓝牙耳机。一款好的蓝牙耳机不仅需要音质好、配置高&#xff0c;还…

计算机毕业设计hadoop+spark知识图谱中药推荐系统 中药材推荐系统 中药可视化 中药数据分析 中药爬虫 机器学习 深度学习 人工智能 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 摘 要 本文所探讨的领域是…

深度学习-2:数据向量化

向量化 在逻辑回归中&#xff0c;x,w,b都是列向量&#xff0c;若要计算w.T*xb&#xff0c;不向量化的话就需要for循环计算起来很麻烦 向量化后&#xff0c;使用numpy.dot(w,x)函数即可快速计算 逻辑回归向量化

接口测试(六)jmeter——参数化(配置元件 --> 用户定义的变量)

一、jmeter——参数化&#xff08;配置元件 --> 用户定义的变量&#xff09; 注&#xff1a;示例仅供参考 1. 参数化格式&#xff1a;${变量名} 2. 配置元件&#xff1a;用户定义的变量 3. 添加【用户定义的变量】&#xff0c;【线程组】–>【添加】–>【配置元件】–…

手持无人机飞手执照,会组装调试入伍当兵有多香!

手持无人机飞手执照&#xff0c;并具备组装调试技能&#xff0c;在入伍当兵时确实会具有显著的优势和吸引力。以下是对这一情况的详细分析&#xff1a; 一、无人机飞手执照的优势 1. 法规遵从与安全保障&#xff1a; 根据《民用无人驾驶航空器系统驾驶员管理暂行规定》等相关…

深入浅出 Vue3 nextTick

程序员节日快乐~ #1024程序员节 | 征文# nextTick 概念 当你在 Vue 的响应式数据模型中对数据进行修改时&#xff0c;这些变化并不会立即同步到 DOM 上_&#xff0c;而是会在当前的微任务队列&#xff08;microtask queue&#xff09;执行完毕后进行批量更新。这种机制被称为…

【宝塔面板】轻松使用docker搭建lobe-chat项目(AI对话)

我们的目的&#xff1a;就是下面的这个玩意&#xff1a; 主要也就三步 1、创建容器编排模版 2、创建容器 3、配置 第一步&#xff1a;创建编排模版 代码我放下面了&#xff1a;&#xff08;你要记住这里开放的是3210端口&#xff09; # https://github.com/lobehub/lobe-ch…

Spring Boot驱动的植物健康监测革命

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理植物健康系统的相关信息成为必然。开发合适…

Linux Redis查询key与移除日常操作

维护老项目Express node 编写的后端程序、有这么一个方法、没有设置redis过期时间&#xff08;建议设置过期时间&#xff0c;毕竟登录生产服务器并不是每个人都有权限登录的&#xff01;&#xff01;&#xff01;&#xff09;。如果变动只能通过登录生产服务器、手动修改… 于…

自动化抖音点赞取消脚本批量处理

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…