【CCF-CSP】 201609-3 炉石传说 C++

文章介绍了一个用C++实现的炉石传说游戏模拟程序,通过vector存储玩家状态,包括生命值和攻击力。程序根据输入的游戏指令进行操作,如召唤牌、攻击和回合结束,并在操作后更新玩家状态。当一方生命值降为0时,输出游戏结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、题目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

原题目链接

二、解题

1.题目

这段程序是一种简单的模拟实现炉石传说游戏的过程,该游戏中每个玩家拥有一定数量的生命值和一些牌。在该程序中,使用两个 vector 对象 v 来表示两个玩家,其中 v[0] 表示红方,v[1] 表示黑方。每个元素表示该玩家场上一张牌,其类型为 status 结构体,包含了该牌的生命值和攻击力。

程序的主要流程如下:

首先定义了一些常量和 status 结构体,并初始化两个 vector 对象,将两个玩家的初始状态(30 点生命值和 0 点攻击力)分别放入 vector 的第一个位置。

然后输入游戏步数 n,以及每一步的操作。针对每一步的操作,程序分别进行处理:

  • 如果是召唤牌(summon),输入该牌的位置、攻击力和生命值,并在 vector 对应的位置插入一个新的 status 对象。
  • 如果是攻击操作(attack),输入攻击者和被攻击者的位置,然后更新双方的生命值和状态,并在某一方的场上存在牌的生命值小于等于 0 时将它从 vector 中删除。
  • 如果是回合结束操作(end),将玩家变更为对方玩家。

最后程序输出游戏结果,包括胜利方(如果有)、双方剩余的生命值和场上牌的数量(除去英雄牌)。

2.代码

dev c++ 5.11

#include<iostream>
#include<vector>
#include<string> 
using namespace std;
#define OPONENT 1-player
const int RED=0;
const int BLACK=1;
struct status{
	int life,power;
	status(int l,int p){
		life=l;
		power=p;
	}
};
vector<status> v[2];
int main(){
	int n,player=RED;
	cin>>n;
	string action;
	int position,attack,health;
	int attacker,defender;
	v[RED].push_back(status(30,0)); 
	v[BLACK].push_back(status(30,0));
	
	while(n--){
		cin>>action;
		if(action=="summon"){
			cin>>position>>attack>>health;
			v[player].insert(v[player].begin()+position,status(health,attack)); 
		}else if(action=="attack"){
			cin>>attacker>>defender;
			v[player][attacker].life -= v[OPONENT][defender].power;
			v[OPONENT][defender].life -= v[player][attacker].power;
			if(v[player][attacker].life<=0)
				v[player].erase(v[player].begin()+attacker);
			if(defender!=0 && v[OPONENT][defender].life<=0)
				v[OPONENT].erase(v[OPONENT].begin()+defender); 
		}else if(action=="end"){
			player=OPONENT;
		}
	}
	

	if(v[RED][0].life<=0) 
		cout<<-1<<endl;
	else if(v[BLACK][0].life<=0) 
		cout<<1<<endl;
	else 
		cout<<0<<endl;
	
	cout<<v[RED][0].life<<endl;
	cout<<v[RED].size()-1;
	for(int i=1;i<(int)v[RED].size();i++)
		cout<<" "<<v[RED][i].life;  
	cout<<endl;
	
	cout<<v[BLACK][0].life<<endl;
	cout<<v[BLACK].size()-1;
	for(int i=1;i<(int)v[BLACK].size();i++)
		cout<<" "<<v[BLACK][i].life;  
	cout<<endl;
	
	return 0; 
} 



3.提交结果

在这里插入图片描述

总结

1.部分变量的含义

以下是代码中各个变量的含义:

  • n:游戏指令数量。
  • player:当前操作的玩家颜色,0 为红色,1 为黑色。
  • OPONENT:对手的颜色。
  • RED、BLACK:颜色常量,分别表示红色和黑色。
  • struct status:表示一个角色的属性,包括生命和攻击力。
  • vector v[2]:存放两个玩家的所有角色信息,v[0] 为红色玩家,v[1] 为黑色玩家。
  • action:游戏指令类型,可能的取值为 “summon”(召唤一个角色)、“attack”(攻击一个角色)和 “end”(结束当前玩家回合)。
  • position:召唤角色的位置,从左到右位置为 1 到 n。
  • attack、health:召唤的角色的攻击力和生命值。
  • attacker、defender:攻击者和防御者的位置,从左到右位置为 0 到 n。位置 0 表示攻击对方英雄,其他位置表示攻击对方场上的角色。
  • v[player].push_back(status(30,0)):将当前玩家的英雄的生命和攻击力(初始值为 30 和 0)放入 v[player] 的第一项。
  • v[player].insert(v[player].begin()+position,status(health,attack)):将召唤的一个角色的生命和攻击力放入 v[player] 中指定的位置。
  • v[player][attacker].life -= v[OPONENT][defender].power:攻击指令中,攻击者减去防御者的攻击力。
  • v[OPONENT][defender].life -= v[player][attacker].power:防御指令中,防御者减去攻击者的攻击力。
  • v[player].erase(v[player].begin()+attacker): 攻击后如果攻击者死亡(生命值小于等于 0),则从 v[player] 中删除该角色。
  • v[OPONENT].erase(v[OPONENT].begin()+defender): 攻击后如果防御者死亡(生命值小于等于 0),则从 v[OPONENT] 中删除该角色。
  • v[RED][0].life:红色玩家英雄的生命值。
  • v[RED].size()-1:红色场上角色的数量(不包括英雄)。
  • v[RED][i].life:第 i 个角色的生命值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值