【CSP试题回顾】201609-3-炉石传说

CSP-201609-3-炉石传说

解题思路

1.类和结构定义

  • Servant:定义了随从的结构,包含攻击力(attack)和生命值(health)。

  • MyPlayer:定义了玩家的类,包含玩家英雄的生命值(heroHealth)、玩家战场上存活的随从数量(ServantsNum)和玩家控制的随从列表(Servants)。此类包含方法用于召唤随从(callServant)和进行攻击(ServantAttack)。
    MyPlayer类中,主要包含两个函数:callServantServantAttack。这两个函数分别处理游戏中召唤随从和随从攻击的行为。

(1)callServant函数

  • 创建一个新的Servant对象t,其攻击力和生命值由函数参数指定。
  • 检查要召唤的位置(position - 1,因为数组索引从0开始)。如果该位置目前没有随从(即生命值为0),则直接在该位置放置新召唤的随从。
  • 如果该位置已有随从,则需要为新随从腾出空间。这通过从右向左(从战场的最后一个位置开始,即索引6)遍历Servants数组并将随从向右移动一位来实现,直至达到召唤位置。这样,原来的随从和右侧的随从都会顺次向右移动一位,为新随从留出空间。
  • 在召唤位置插入新的随从后,更新战场上随从的数量(ServantsNum)。

(2)ServantAttack()函数

  • 首先,根据attackerdefender参数获取攻击方随从和防御方角色(可能是随从或英雄)的信息。
  • 如果defender为0,表示攻击的是敌方英雄。此时,直接减少敌方英雄的生命值,减少的数值等于攻击方随从的攻击力。
  • 如果defender非0,表示攻击的是敌方随从。这时,双方随从都会对彼此造成伤害:
    - 减少敌方随从的生命值,减少的数值等于攻击方随从的攻击力。
    - 减少攻击方随从的生命值,减少的数值等于防御方随从的攻击力。
  • 检查攻击后双方随从的生命值,如果某随从的生命值小于等于0,则该随从死亡,需要从战场上移除。移除随从后,要更新存活随从的数量,并对剩余随从的位置进行调整(类似召唤随从时的逻辑)。

2.游戏逻辑

  1. 初始化游戏环境:创建两个玩家对象,分别代表先手玩家(firstPlayer)和后手玩家(secondPlayer)。游戏开始时,每个玩家的英雄生命值均为30,且没有随从在战场上。

  2. 执行游戏操作:读取输入的操作数(n)和随后的操作列表。根据当前回合的玩家(使用布尔值currentPlayer标记),执行对应的操作。操作包括:

    • summon:在指定位置召唤一个具有特定攻击力和生命值的随从。
    • attack:使用一个随从攻击对手的随从或英雄。
    • end:结束当前玩家的回合并切换到对手玩家。
  3. 执行攻击和召唤逻辑

    • 在召唤(callServant)时,将新的随从插入到指定位置,并调整其它随从的位置。
    • 在攻击(ServantAttack)时,根据攻击和防御方的攻击力调整双方生命值,并处理随从的死亡(生命值小于等于0)。
  4. 输出游戏结果

完整代码

#include <iostream>
#include <vector>
using namespace std;


struct Servant
{
	int attack;
	int health;
	Servant(int a, int h) : attack(a), health(h) {}
};

class MyPlayer
{
public:
	int heroHealth, ServantsNum;
	vector<Servant>Servants;

	MyPlayer() {
		heroHealth = 30;
		ServantsNum = 0;
		Servants = vector<Servant>(7, { 0,0 });
	}

	void callServant(int position, int attack, int health) {
		Servant t{ attack,health };
		if (Servants[position - 1].health == 0) Servants[position - 1] = t;
		else
		{
			for (int i = 6; i >= position; i--) {
				Servants[i] = Servants[i - 1];
			}
			Servants[position - 1] = t;
		}
		ServantsNum++;
	}


	void ServantAttack(MyPlayer& enemy, int attacker, int defender) {
		if (defender == 0) enemy.heroHealth -= Servants[attacker - 1].attack; // 敌方英雄	
		else // 敌方随从
		{
			int myAttack = Servants[attacker - 1].attack, enemyAttack = enemy.Servants[defender - 1].attack;			
			enemy.Servants[defender - 1].health -= myAttack;
			if (enemy.Servants[defender - 1].health <= 0) { // 死亡检测
				for (int i = defender - 1; i < 6; i++)
				{
					enemy.Servants[i] = enemy.Servants[i + 1];
				}
				Servants[6].attack = 0, Servants[6].health = 0;
				enemy.ServantsNum--;
			}

			Servants[attacker - 1].health -= enemyAttack;
			if (Servants[attacker - 1].health <= 0)
			{
				for (int i = attacker - 1; i < 6; i++)
				{
					Servants[i] = Servants[i + 1];
				}
				Servants[6].attack = 0, Servants[6].health = 0;
				ServantsNum--;
			}	
		}
	}
};

int n, pos, att, hea, atter, def;
string action;
MyPlayer firstPlayer, secondPlayer;

int main()
{
	cin >> n;

	MyPlayer& t = firstPlayer, & t_enemy = secondPlayer;
	bool currentPlayer = 0; // 0-firstPlayer 1-secondPlayer

	for (int i = 0; i < n; i++)
	{
		cin >> action;

		if (!currentPlayer) // firstPlayer
		{
			if (action == "summon")
			{
				cin >> pos >> att >> hea;
				firstPlayer.callServant(pos, att, hea);
			}
			else if (action == "attack")
			{
				cin >> atter >> def;
				firstPlayer.ServantAttack(secondPlayer, atter, def);
			}
			else if (action == "end") currentPlayer = 1;
		}
		else
		{
			if (action == "summon")
			{
				cin >> pos >> att >> hea;
				secondPlayer.callServant(pos, att, hea);
			}
			else if (action == "attack")
			{
				cin >> atter >> def;
				secondPlayer.ServantAttack(firstPlayer, atter, def);
			}
			else if (action == "end") currentPlayer = 0;
		}
		
	}

	// 1.游戏的胜负结果
	if (firstPlayer.heroHealth > 0 && secondPlayer.heroHealth <= 0) cout << 1 << endl; // 先手玩家获胜
	else if (firstPlayer.heroHealth <= 0 && secondPlayer.heroHealth > 0) cout << -1 << endl; // 后手玩家获胜
	else cout << 0 << endl;

	// 2.先手玩家的英雄的生命值
	cout << firstPlayer.heroHealth << endl;

	// 3.先手玩家在战场上存活的随从个数以及生命值
	cout << firstPlayer.ServantsNum << " ";
	for (auto& it : firstPlayer.Servants) {
		if (it.health != 0) {
			cout << it.health << " ";
		}
	}
	cout << endl;

	// 4-5.后手(同理)
	cout << secondPlayer.heroHealth << endl;

	cout << secondPlayer.ServantsNum << " ";

	for (auto& it : secondPlayer.Servants) {
		if (it.health != 0) {
			cout << it.health << " ";
		}
	}

	return 0;
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GRC宝石实验室鉴定证书,你真的读懂了吗?

随着人们审美需求的提升,兼具审美价值和收藏价值的彩色宝石成为越来越多人的心头好,市面上也随之涌现出许多宝石鉴定机构。在众多选择中,GRC宝石实验室以其高速度、专业化和高标准等诸多优势,成为许多宝石爱好者信赖的选择。 熟悉彩石圈的人,几乎都知道GRC宝石实验室,其总部位于…

网络模块使用Hilt注入

retrofit的异步回调方法已经做了线程切换&#xff0c;切换到了主线程 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"><uses-permission android:name"andr…

中医把脉笔记

目录 寸关尺对应的五脏六腑把脉的时间、姿势、指法自己给自己把脉把脉五步法定寸关尺分浮中沉分快慢辨阴阳看虚实 参考文章 寸关尺对应的五脏六腑 把脉的时间、姿势、指法 时间&#xff1a;应选在清晨病人未活动时&#xff0c;若病人活动&#xff0c;应休息15分钟左右再进行脉…

不会用虚拟机装win10?超详细教程解决你安装中的所有问题!

前言&#xff1a;安装中有任何疑问&#xff0c;可以在评论区提问&#xff0c;博主身经百战会快速解答小伙伴们的疑问 BT、迅雷下载win10镜像&#xff08;首先要下载win10的镜像&#xff09;&#xff1a;ed2k://|file|cn_windows_10_business_editions_version_1903_updated_sep…

前端开发的发展史:框架与技术栈的演变

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

开发跨平台 App 推荐 React Native 还是 Flutter?

Hello大家好我是咕噜铁蛋&#xff01;今天我要和大家一起探讨一个备受关注的话题&#xff1a;“开发跨平台 App 推荐 React Native 还是 Flutter&#xff1f;”在移动应用开发领域&#xff0c;选择合适的跨平台开发框架对于开发者来说至关重要。而React Native和Flutter作为两种…

eclipse maven 项目导入报错

错误&#xff1a;Internal compiler error: java.lang.NullPointerException at org.eclipse.jdt.internal.compiler.apt.dispatch.AnnotationDiscoveryVisitor 环境&#xff1a;eclipse Kepler Service Release 2 ,JDK1.7 解决办法&#xff1a;编码不对&#xff0c;修改

微信视频号视频下载全攻略:轻松保存至手机的步骤!

微信视频号已经成为了我们获取信息、分享生活的重要平台。其中丰富的短视频内容&#xff0c;让我们流连忘返。然而&#xff0c;有时我们想要将这些精彩瞬间保存到手机&#xff0c;以便日后观看或分享&#xff0c;那么如何操作呢&#xff1f;本文将详细解析微信视频号保存视频到…

ceph跨集群迁移ceph pool rgw

1、跨集群迁移ceph pool rgw 我这里是迁移rgw的pool l老环境 [rootceph-1 data]# yum install s3cmd -y [rootceph-1 ~]# ceph config dump WHO MASK LEVEL OPTION VALUE RO mon advanced au…

2-LINUX--Linux 系统文件类型与文件权限

一.文件类型 Linux 下所有的东西都可以看做文件&#xff0c;Linux 将文件分为以下几种类型&#xff1a; 1. 普通文件 ‘-’ 2. 目录文件 ‘d’ 3. 管道文件 ‘p’ 4. 链接文件 ‘l’ 5. 设备文件&#xff08;块设备 ’b’ 、字符设备 ‘c’&#xff09; 6. 套接字…

蓝桥杯真题讲解:异或和之和 (拆位、贡献法)

蓝桥杯真题讲解&#xff1a;异或和之和 &#xff08;拆位、贡献法&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;异或和之和 &#xff08;拆位、贡献法&#xff09; 二、正解代码 //拆位考虑 #include<bits/stdc.h> #define endl &…

AI时代,AI智能交互数字人赋能公共服务降本增效

人工智能时代&#xff0c;AI交互数字人技术不断在冲击公共服务领域。越来越多公共服务领域开始在自身业务中运用AI智能交互数字人&#xff0c;通过布局AI交互数字人应用于代言人、推荐官、客服、主播等诸多领域。 近年来&#xff0c;数字人技术正在成为引领数字化时代营销的重…

【Python】科研代码学习:八 FineTune PretrainedModel (用 trainer,用 script);LLM文本生成

【Python】科研代码学习&#xff1a;八 FineTune PretrainedModel [用 trainer&#xff0c;用 script] LLM文本生成 自己整理的 HF 库的核心关系图用 trainer 来微调一个预训练模型用 script 来做训练任务使用 LLM 做生成任务可能犯的错误&#xff0c;以及解决措施 自己整理的 …

【STM32】串口助手接受数据是乱码如何解决

第一步 首先判断自己使用的串口助手和工程配置的波特率是否相同&#xff0c;一般都是115200 第二步 如果不是上一条的问题&#xff0c;继续排查&#xff0c;检查时钟问题 打开工程&#xff0c;找到此文件(stm32f10x.h)的这个位置&#xff0c;如工程中未添加&#xff0c;可以从…

B2B2C电商系统源代码部署,让你轻松开启网店生意

在当今数字化时代&#xff0c;开设一家网店已经变得异常简单。借助B2B2C电商系统源代码部署&#xff0c;你可以轻松搭建自己的在线商城&#xff0c;开始网店生意。这种系统为企业提供了一个强大的平台&#xff0c;让他们可以直接与制造商和消费者进行交易&#xff0c;从而实现品…

【生成式AI導論 2024】第4講:訓練不了人工智慧?你可以訓練你自己 (中) — 拆解問題與使用工具

文章目录 我的总结 拆解任务让语言模型检查自己的错误为什么同一个问题每次答案都不同&#xff1f;组合拳使用工具使用工具-搜索引擎-RAG使用工具-文字生图AIGPT4 其他插件 from: https://www.youtube.com/watch?vlwe3_x50_uw 我的总结 复杂任务拆解为多个步骤让模型检查自己…

redis缓存满了的话会发生什么?

线上问题 未及时加监控&#xff0c;导致线上redis被逐出&#xff0c;业务有损 示例&#xff1a; 一个key临时存储在redis等缓存中&#xff0c;如果该key在一段时间内有很大作用 比如一次业务请求&#xff0c;上游服务写入一个value&#xff0c;时长1小时&#xff0c;下游服务…

【Android】数据安全(一) —— Sqlite加密

目录 SQLCipherSQLiteCrypt其它 SQLCipher SQLCipher 是 SQLite 数据库的的开源扩展&#xff0c;使用了 256 位 AES 加密&#xff0c;支持跨平台、零配置、数据100%加密、加密开销低至 5 -15%、占用空间小、性能出色等优点&#xff0c;因此非常适合保护嵌入式应用程序数据库&a…

238.除自身以外数组的乘积

题目&#xff1a;给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且…

八、软考-系统架构设计师笔记-系统质量属性和架构评估

1、软件系统质量属性 软件架构的定义 软件架构是指在一定的设计原则基础上&#xff0c;从不同角度对组成系统的各部分进行搭配和安排&#xff0c;形成系统的多个结构而组成架构&#xff0c;它包括该系统的各个构件&#xff0c;构件的外部可见属性及构件之间的相互关系。 软件架…