csp 201609-3 炉石传说

一、题目描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、思路概述

  • 使用一个struct类型character来表示人物,character里面包括生命值、攻击值和标记是否已经有人物了。对每个玩家都有一个数组来存储英雄和随从的信息,0号表示英雄,1-7号表示随从。
  • 召唤随从时,要看召唤的位置是否已经有了随从,如果有了的,要把从这个位置往后,都后移一位,如果没有,只要直接放入相应的位置即可。(flag可以用来判断此位置是否有了随从)
  • 攻击时,改变对应位置的生命值就可。但是如果英雄被杀死,就直接结束这次攻击,如果某个随从死了,要改变它后面的随从的位置,都提前一位。
  • end操作时,改变当前处理的玩家即可,可以用一个bool类型的变量now,来控制。

三、细节

  1. 第一次是70分,查了一下,感觉大家70分,都是英雄死亡的情况,我看了一下我自己的,把两个英雄死亡时,输出0,1,-1那个地方,搞混了,就出现了错误。真的是,改bug很快,找bug真爽。

四、完整代码

#include<iostream>
using namespace std;

bool now=false ;//用来标记一个当前是哪一个玩家 

struct  character{//人物 
	int health;//生命值  当生命值小于等于 0 时,该角色死亡
	int attack;//攻击值
	int flag;//标记一下当前位置是否已经有人物了 
	int size;
	
	character(){
		health=attack=size=0;
		flag=-1;
	}
	
	character& operator =(character& c){
		health=c.health;
		attack=c.attack;
		flag=c.flag;
		size=c.size;
		return *this;
	} 
	
}; 

character cha1[8];character cha2[8];//先手和后手

void summon(character* cha){
    //当前玩家在位置<position>召唤一个生命值为<health>、攻击力为<attack>的随从
	int position,health,attack;
	cin>>position>>attack>>health;
	if(cha[position].flag ==-1){//position这个位置没有随从 
		cha[position].health =health;
		cha[position].attack =attack;
		cha[position].flag =1;
	}
	else {
		
		for(int i=cha[0].size+1;i>position ;i--){
			cha[i]=cha[i-1];
		}
		cha[position].health =health;
		cha[position].attack =attack;
		cha[position].flag =1;
	}
	cha[0].size++;
}

void attack(character* c1,character* c2){
//当前玩家c1的角色<attacker>攻击对方c2的角色 <defender>
    int attacker,defender;
	cin>>attacker>>defender;
	
	c1[attacker].health =c1[attacker].health-c2[defender].attack ;
	c2[defender].health =c2[defender].health-c1[attacker].attack ;
	
	if(c2[0].health <=0)return;
	
	if(c1[attacker].health<=0){
		for(int i=attacker;i<c1[0].size;i++){
			c1[i]=c1[i+1];
		}
		c1[c1[0].size].flag =-1;
		//c1[c1[0].size].attack =c1[c1[0].size].health =0;
		c1[0].size --;
	}
	
	
	if(c2[defender].health<=0){
		for(int i=defender;i<c2[0].size ;i++){
			c2[i]=c2[i+1];
		}
		c2[c2[0].size].flag =-1;
		//c2[c2[0].size].attack =c2[c2[0].size].health =0;
		c2[0].size --;
	}
	
}


int main(){
	
	cha1[0].health=cha2[0].health=30;//英雄的生命值和攻击力 
	cha1[0].attack = cha2[0].attack=0;
	
	int n;cin>>n;//指令个数
	for(int i=0;i<n;i++){		
		string command;cin>>command;

		if(now==false){
			//cout<<"先手"<<endl; 
		    if(command=="summon")summon(cha1);
		    else if(command=="attack")attack(cha1,cha2);
	 	    else if(command=="end")now=true;//??略	
		}
		else{
			//cout<<"后手"<<endl;
			if(command=="summon")summon(cha2);
		    else if(command=="attack")attack(cha2,cha1);
	 	    else if(command=="end")now=false;
		} 
	
	}
	
	//指令结束,判断胜负
	if(cha1[0].health <=0)cout<<-1<<endl;
	else if(cha2[0].health <=0)cout<<1<<endl;
	else cout<<0<<endl;
	
	cout<<cha1[0].health <<endl;
	cout<<cha1[0].size<<" ";
	for(int i=1;i<=cha1[0].size;i++) {
		cout<<cha1[i].health <<" ";
	}
	cout<<endl;
	
	cout<<cha2[0].health <<endl;
	cout<<cha2[0].size<<" ";
	for(int i=1;i<=cha2[0].size;i++) {
		cout<<cha2[i].health <<" ";
	}
	cout<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值