CCF CSP认证2016年9月,NO.3 炉石传说

2023-05-16

炉石传说

不知道现在题目公开了没有,最近考完试比较闲,所以开通了博客,写写自己考试时候这道题的思路吧。

根据真实“魔兽世界——炉石传说”的游戏建模改编,以下是题目的回忆(若有不准,会继续更新,敬请期待):

  • 有两个玩家同时对阵,分别拥有一个英雄
  • 玩家可以召唤随从帮助对阵,最多召唤7个,每个随从从左向右排列,每次召唤都可以放在任意位置,若放置的位置右边有以召唤的随从,则右边的随从顺次右移
  • 英雄和随从都有攻击力attack和生命值health属性(我代码中写作了life,不要紧
  • 英雄的attack值为0,health值为30;随从的attack和health在召唤时给定
  • 召唤随从的格式为summon <position> <attack> <health>。position是召唤随从要加入的位置,attack是召唤随从的攻击力值的大小,health是召唤随从的生命值大小
  • 命令随从攻击的格式为attack <attacker> <defender>。attacker是本方的随从,defender是要攻击的对方的随从。攻击即为本方attacker的heath值减去对方defender的attack值,对方defender的health值减去本方attacker的attack值
  • 结束本次回合的格式为end,表明将出手权交给对方,轮到对方召唤或者发起攻击
  • 当随从生命值小于或等于0时,随从死亡,剩余随从依次向左移弥补空位。只有当一方随从全部死亡后,才可向英雄发起攻击。
  • 当英雄生命值小于或等于0时,英雄死亡,当某方英雄死亡时,游戏结束

输入样式

输入一共有n行
- 第一行 输入n,代表以下有n条命令
- 接下来n行为命令行,有以下三种格式
summon <position> <attack> <health>
attack <attacker> <defender>`
end
注: 不考虑输入不按格式以及输入错误的情况
0<=n<=1000 , 0<=攻击值<=100,生命值<=100

输出样式

输出一共有五行
- 第一行 输出游戏输赢情况,1代表先手赢,-1代表后手赢,0代表游戏未分出胜负
- 第二行 输出先手方英雄生命值
- 第三行 先输出先手方目前随从个数 后面输出按从左往右顺序排列的随从的生命值
- 第四行 输出后手方英雄生命值
- 第五行 先输出后手方目前随从个数 后面输出按从左往右顺序排列的随从的生命值

输入举例

8
summon 1 3 6
summon 2 4 2
end
summon 1 4 5
summon 1 2 1
attack 1 2
end
attack 1 1

解释:

  1. 有8条命令
  2. 先手方召唤随从a,放在位置1,攻击力为3,生命值为6
  3. 先手方召唤随从b,放在位置2,攻击力为4,生命值为2
  4. 本回合结束,轮到后手方
  5. 后手方召唤随从c,放在位置1,攻击力为4,生命值为5
  6. 后手方召唤随从d,放在位置1,这时随从c向右移一位,变成了位置2,随从d的攻击力为2,生命值为1
  7. 后手方发起攻击,命令站在位置1的随从d攻击先手方站在位置2的随从b,攻击结束后,随从d的生命值变为-3,随从b的生命值变为0,双方的随从d和b全部死亡。
  8. 本轮回合结束,轮到先手方
  9. 先手方发起攻击,命令站在位置1的随从a攻击后手方站在位置1的随从c,攻击结束后,随从a的生命值变为2,随从c的生命值变为2。

输出举例

0
30
1 2
30
1 2

解释:

  1. 游戏中先手后手方英雄均未死亡,游戏尚未结束,输出0
  2. 先手方英雄生命值为30
  3. 先手方有随从1个,生命值为2
  4. 后手方英雄生命值为30
  5. 后手方有随从1个,生命值为2

代码块

代码块语法遵循标准markdown代码,例如:

class suicong{
public:
    suicong(){ life = 0; attack = 0;}
    int life;//生命力 
    int attack;// 攻击力 
    suicong *next;
};//随从要建立一个链表 ,头指针为hero,后面跟上summon

class suilink{
public:
    suilink(){ hero = NULL; suinum = 0; }
    void create();
    suicong* gethero(){ return hero; }
    int getsuinum(){ return suinum; }
    void setsuinum(int num){ suinum=num; }
    int getherolife(){ return hero->life; }
    void setherolife(int hl){ hero->life=hl; }
    int getsuilife(int pos);
    int getsuiattack(int pos);
    void setsuilife(int l, int pos);
    void summon(int attack, int life);//召唤,直接插入链表最后一个结点之后
    void summon(int attack, int life, int pos);//召唤,插入链表某个pos处
    void kill(int pos);//被杀死,将pos位置从链表中移除

private:
    suicong *hero;//英雄是头结点
    int suinum;//拥有的随从数
};

int player = 0;//0代表先手,1代表后手 

void suilink::create()
{
    suicong *s= new suicong();
    s->life = 30;
    s->attack = 0;
    hero=s;
    hero->next = NULL;
}

int suilink::getsuiattack(int pos)
{
    suicong *s = hero;
    for (int i = 0; i < pos; i++)
    {
        s = s->next;
    }
    return s->attack;
}

int suilink::getsuilife(int pos)
{
    suicong *s = hero;
    for (int i = 0; i < pos; i++)
    {
        s = s->next;
    }
    return s->life;
}

void suilink::setsuilife(int l, int pos)
{
    suicong *s = hero;
    for (int i = 0; i < pos; i++)
    {
        s = s->next;
    }
    s->life=l;
}

void suilink::summon(int attack, int life)
{
    suicong *s=hero;//前驱
    suicong *t = new suicong();//新随从
    t->life = life;
    t->attack = attack;
    if (s->next == NULL)//现在还没有新随从
    {
        s->next = t;//连接上这个新的随从
    }
    else//找到最后一个结点
    {
        for (int i = 0; i < suinum; i++)
        {
            s = s->next;
        }
        s->next = t;//连接上这个新的随从
    }
    suinum++;
}

void suilink::summon(int attack, int life, int pos)//在pos处插入
{
    suicong *s = hero;//前驱
    suicong *t = new suicong();//新随从
    t->life = life;
    t->attack = attack;
    for (int i = 0; i < pos-1; i++)
    {
        s = s->next;
    }
    t->next = s->next;//连接上这个新的随从
    s->next = t;
    suinum++;
}

void suilink::kill(int pos)
{
    suicong *s,*r = hero;//r为前驱,s为后继,要删掉的那个,不用保留数据
    for (int i = 0; i < pos-1; i++)
    {
        r = r->next;
    }
    s = r->next;
    r->next = s->next;
    delete s;
    suinum--;
}

int main(int argc, char *argv[]) {
    int n;
    suilink a,b;//两个英雄,a先手,b后手
    string str; //操作类型 
    a.create();//初始化链表
    b.create();
    cin >> n;
    for (int i = 0; i<n; i++)//语句个数 
    {
        cin >> str;
        if (str == "summon")
        {
            int p,l,at;//输入的随从位置,攻击力,生命
            cin >> p;
            cin >> at;
            cin >> l;
            if (player == 0)
            {
                /*-------------易于阅读-------------*/
                if (p>a.getsuinum())//位置>现在的随从数,添加到最后
                {
                    a.summon(at,l);
                }
                else//否则,从最后一个位置+1,移动一下;
                {
                    a.summon(at,l,p);
                }
            }
            else if (player == 1)
            {
                if (p>b.getsuinum())//位置>现在的随从数,添加到最后
                {
                    b.summon(at, l);
                }
                else//否则,从最后一个位置+1,移动一下;
                {
                    b.summon(at, l, p);
                }
            }
        }
        else if (str == "attack")
        {
            int apos, bpos;//攻击位置 0<=pos<=7
            if (player = 0)
            {
                cin >> apos;//玩家1的随从位置
                cin >> bpos; //攻击玩家2的随从位置(0 表示攻击对方英雄) 
                if (bpos == 0)
                    a.setherolife(a.getherolife()- b.getsuiattack(bpos));
                else
                {
                    a.setsuilife(a.getsuilife(apos) - b.getsuiattack(bpos), apos);
                    b.setsuilife(b.getsuilife(bpos) - a.getsuiattack(apos), bpos);
                    if (a.getsuilife(apos) <= 0)//被杀
                    {
                        a.kill(apos);
                    }
                    if (b.getsuilife(bpos) <= 0)//被杀
                    {
                        b.kill(bpos);
                    }
                }

            }
            else if (player = 1)
            {
                cin >> bpos;//玩家2的随从位置
                cin >> apos; //攻击玩家1的随从位置(0 表示攻击对方英雄)
                if (apos == 0)
                    b.setherolife(b.getherolife() - a.getsuiattack(apos));
                else
                {
                    a.setsuilife(a.getsuilife(apos) - b.getsuiattack(bpos), apos);
                    b.setsuilife(b.getsuilife(bpos) - a.getsuiattack(apos), bpos);
                    if (a.getsuilife(apos) <= 0)//被杀,从数组中移除,挨个往前挪 
                    {
                        a.kill(apos);
                    }
                    if (b.getsuilife(bpos) <= 0)//被杀,从数组中移除,挨个往前挪 
                    {
                        b.kill(bpos);
                    }
                }

            }

        }
        else if (str == "end")// 结束该回合 
        {
            if (player == 0)
                player = 1;
            else if (player == 1)
                player = 0;
        }

    }

    //output results
    if (a.getherolife()<=0)//玩家1失败 
        cout << "1" << endl;
    else if (b.getherolife()<=0)//玩家2失败 
        cout << "-1" << endl;
    else
        cout << "0" << endl;
    cout << a.getherolife() << endl << a.getsuinum() << " ";
    for (int k = 0; k < a.getsuinum(); k++)
    {
        cout << a.getsuilife(k+1) << " ";
    }
    cout << endl;

    cout << b.getherolife() << endl << b.getsuinum() << " ";
    for (int k = 0; k < b.getsuinum(); k++)
    {
        cout << b.getsuilife(k+1) << " ";
    }
    cout << endl;

    return 0;
}

考试时本人用了个笨办法,既然最多有7个随从,就直接图简单开了数组,之后左移右移一个循环就可以了,但是效率低下,而且程序不灵活。考完试整理了一下,用链表动态实现,大家可以参考一下,若有错误请私信我更新,谢谢!

本小白第一次写技术blog,为即将走上coding之路打好基础,也请大牛多多指教~~
//撒花★,°:.☆( ̄▽ ̄)/$:.°★

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CCF CSP认证2016年9月,NO.3 炉石传说 的相关文章

  • 运行Djongo项目

    安装 python3 https www python org downloads 设置环境变量 PY HOME C Users Terwer AppData Local Programs Python Python37 Path PY H
  • 数据结构 —— 利用栈实现回文判断

    一 先理解什么是栈 什么是回文 栈的性质 xff1a 先进后出或后进先出的特性 xff0c 栈的实现也很简单 xff0c 只需要一个一维数组和一个指向栈顶的变量top就可以了 我们通过变量top来对栈进行插入和删除操作 回文 xff1a 回
  • 【CSS】flex布局实现一行展示三个子元素并两端对齐

    本代码在微信小程序里实现 xff0c 效果如下 xff1a WXML xff1a lt view class 61 34 goods box 34 gt lt view class 61 34 list 34 gt lt view clas
  • 阿里云域名动态解析

    由于国内个宽带商基本无法对个人用户免费提供固定的公网IP地址 xff0c 所以当我们需要通过公网IP映射域名的时候 xff0c 就会出现IP总是会变 xff0c 这个时候就需要用到域名动态解析 CodePlus AliyunDns Gith
  • Windows beego 安装

    前言 xff1a 是不是在执行go get命令很慢呀 xff0c 现在发大招了 打开window终端 xff0c 执行一下命令 go env w GO111MODULE 61 on go env w GOPROXY 61 https gop
  • left join结果条数会不会大于左表行数?

    会大于 今天电话面试一道题 xff0c 面试官问我 left join结果条数会不会大于左表行数 xff1f 你都这么问了 xff0c 我怎么能随便回答 xff1a 不会吧不会吧不会吧 那举个例子 两个表test和test2 一般情况下 x
  • updateClient

    updateClient lt 64 page contentType 61 34 text html 34 pageEncoding 61 34 gbk 34 gt lt DOCTYPE html gt lt html gt lt hea
  • 课后作业之几何图形

    题目 xff1a 通过程序设计几何图形 xff08 Shape xff09 矩形 xff08 Rectangle xff09 圆形 xff08 Circle xff09 正方形 xff08 Square xff09 几种类型 xff0c 能
  • 七牛云免费对象存储,并绑定到cloudreve中

    之前开通了腾讯云的对象存储COS并使用中 xff0c 不过之前主要将它当作云盘使用 xff0c 这两天再做博客系统时发现也可以将它作为网站的图库 xff0c 这样对网站的访问效率也会提高 今天了解到七牛云有免费的对象存储可以使用 xff0c
  • [蓝桥杯]七段码(Python 实现)

    题目 xff1a 问题描述 小蓝要用七段码数码管来表示一种特殊的文字 上图给出了七段码数码管的一个图示 xff0c 数码管中一共有 7 段可以发光的二极管 xff0c 分别标记为 a b c d e f g 小蓝要选择一部分二极管 xff0
  • Anaconda变量配置

    1 首先鼠标右击打开 此电脑 的属性 xff0c 选择高级系统设置 2 选择环境变量 xff0c 并找寻系统环境变量中的Path 3 单击选中Path xff0c 选择编辑 xff0c 然后选择新建 xff0c 将路径复制到新建的位置 xf
  • java使用MySQL和HQL数据去重

    思路 先查询出满足某种条件的数据的最小ID xff0c 然后删除最小ID以外的数据就实现了去重 实例 查询最小ID的重复数据 select from oms relation model orm where orm fd id 61 sel
  • 在VS2017上配置CMake并生成OpenCV源代码工程的解决方案

    这篇博客是对之前博客 在win10下配置VS2017搭载OpenCV4 0 的补充 xff0c 还没有配置好VS2017 43 OpenCV的小伙伴可以参考一下我之前的博客 一 为什么用CMake xff1f 想要在 Windows 平台下
  • 链表,结构体,文件混合操作

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • 设置CentOS不启用图形界面 CentOS只启动后端

    CentOS不要图形界面 xff0c CentOS只开启终端就行 我用的是CentOS8 方法 xff1a vi etc inittab 以前旧的这种直接改 etc inittab方式已经不支持了 vi etc inittab initta
  • yum安装mysql简单配置版

    yum安装mysql简单配置版 yum y install mysql server root 64 bogon vi etc my cnf 在 client 之后添加一行 xff1a default character set 61 ut
  • 第一次使用GitHub

    GitHub可能是当今开源社区最火爆的版本控制和源代码托管平台 xff0c 也不知道这句话是否正确 对GitHub还很陌生 xff0c 不过其确实很热 咱跟着潮流 xff0c 也注册了账号 一 注册 登录GitHub官方网站https gi
  • 彻底关闭Windows更新

    第一级 在控制面板中 xff0c 关闭Windows更新 xff0c 次方法在Windows7之前的系统是可用的 xff0c 从Windows10开始 xff0c Windows更新放在了设置里 第二级 在此电脑 管理 服务和应用程序 wi
  • 端口被占用,简单快捷的解决方法

    步骤 xff1a 1 键盘上按住Win 43 R xff0c 在弹框里输入cmd并点击Enter键 2 根据自己被占用的端口号输入以下命令 xff08 测试 xff1a 被占用的8080端口 xff09 netstat ano findst
  • MySQL的操作系统和硬件优化

    MySQL服务器性能受制于整个系统最薄弱的环节 xff0c 承载它的操作系统和硬件往往是限制因素 磁盘大小 可用内存和CPU资源 网络 xff0c 以及所有连接它们的组件 xff0c 都会限制系统的最终容量 因此 xff0c 需要小心地选择

随机推荐