【模拟】我爱三国杀

【题目】

我爱三国杀

Description

 

Image

这是一道跟三国杀有关的题目,

为了照顾没有玩过三国杀的同学,我们对游戏机制进行了化简。

牌堆:所有玩家从牌堆摸牌,每人每回合摸取两张牌,当牌堆被抽完后,视为平局。(每回合 每人一次性抽取两张)

基础牌:杀、闪,每回合最多使用一张杀

装备牌:+1马、-1马,每名角色最多装备一匹加一马和一匹减一马。

手牌:在手里留存的卡牌,装备在身上的装备牌和需要判定的延迟类锦囊皆不算手牌。 玩家可决定出牌顺序,如 你可以先装备减一马来减小双方距离。

武将技能:每个武将都有他专属的武将技能,合理运用技能可以获得额外的功效武将

血量:在不计入某些武将技能的前提中,武将血量归零将代表濒死。武将血量还代表了您的存牌量。例如在武将1 血的情况下您在回合弃牌阶段后最多只能留有1 张手牌。

距离:武将角色之间默认距离为1 ,-1马来拉近角色之间的攻击距离。武将角色在没有装备-1马时只能攻击距离为一的其他角色。所以+1马会使没有-1马的对手不能对你使用杀(既在你的回合内,如果你的手牌中有杀,你可以弃置一张杀,对一名在你攻击范围内的角色发动一次攻击,如果被攻击角色不能弃置闪来响应,则会被扣除一点体力值,如果体力值小于等于零 则进行濒死判断)

为了再对问题进行化简,我们假定三国杀只有周泰这一个武将。

他的技能为:不屈:每当你扣减1点体力后,若你体力值为0,你可以从牌堆亮出一张牌置于你的武将牌上。若此牌的点数与你武将牌上已有的任何一张牌都不同,你不会死亡。(但视你体力为0)若出现相同点数的牌,你进入濒死状态。

(既,假设你现在只有一滴血,你的对手对你使用“杀”手牌,你无法使用“闪”进行响应你的体力值归零,然后武将技能发动,你抽取一张牌堆顶的牌,假设这张牌点数为6,你将之置于你的武将牌之上。因为是第一次发动技能,你可以直接跳过濒死判定。假设在经历了多次技能发动后,你的武将牌上有了 “1”“2”“3”“4”“5”“6”“7” 这七种点数的牌。现在 你又进入了濒死状态,然后 你抽到一张点数为“5”的牌,由于现在已经有点数相同的牌了,如果不出意外,你直接死亡,对手获胜。)

现在 yx正在进行一场生死1v1对抗,已经进展到白热化阶段。双方使用周泰,体力值均为0,且均只有一张不屈牌。(这意味着,你不能在回合外存有手牌,也就是说,对方使用杀,你只能损失体力值)现在yx首先开始回合。

给出牌堆的所有信息,问你最后结果如何

。假设双方有杀出杀,有马装马。

Input

 

第一行输入一个整数n ,n<=500,表示牌堆中牌堆的数量。

第二行为n个字符从左到右依次表示牌堆顶到牌堆底的牌的类型。s 表示闪,a表示杀,+表示+1马,-表示-1马

第三行为n个1-9的数字,每张牌对应的点数。

第四行为两个1-9的数字。 第一个数字为yx的第一张现有不屈牌,第二个数字为yx的对手的第一张现有不屈牌。

Output

 

输出一行,

如果是平局,则输出ping

如果yx率先杀死对手 这输出win

否则 输出lose

Sample Input 1 

11
saa+asasasa
11111111111
2 2

Sample Output 1

ping

Sample Input 2 

3
saa
111
1 1

Sample Output 2

ping

Sample Input 3 

4
saaa
1111
1 1

Sample Output 3

win

Hint

对于第一个样例

首先yx先动,摸到一闪一杀,杀了对手一下,

对手抽取一张濒死牌(点数为1的杀)这是对手第一张点数为1的濒死牌。所以对手不会去世。yx回合结束,弃置所有手牌。

之后到对手回合,抽取一张加一马,和一张杀。

对手装备+1马,对yx使用一张杀。

yx抽取一张濒死牌(点数为1的杀)这是yx第一张点数为1的濒死牌。所以yx不会去世.

之后yx回合打不到对手了。弃置其手牌。

对手回合,抽取一杀一闪,杀了yx一下,抽取一张不屈牌,现在yx有两张点数为1的不屈牌了。 你以为yx已经输了吗?当然没有,这时候牌堆刚好抽完,yx苟到了平局。

输出ping

【思路】yxdl出的模拟题..打的时候wa了10发,多打了个else if然后就炸裂了..晚上1发A...还是太菜了

【代码】

#include<bits/stdc++.h>
using namespace std;
const int M=2e5+10;

int main()
{
    int n;
    cin>>n;
    char p[505];
    char s[505];
    bool yxbq[15]= {0};
    bool dbbq[15]= {0};
    cin>>p;
    cin>>s;
    int t1;
    cin>>t1;
    yxbq[t1]=1;
    cin>>t1;
    dbbq[t1]=1;
    bool person=0;
    int nowcard=0;
    bool yxaddhs=0,dbaddhs=0,yxdwnhs=0,dbdwnhs=0;
    while(1)
    {
        char x=p[nowcard];
        char y=p[nowcard+1];
        nowcard=nowcard+2;
        if(nowcard>=n-1)
        {
            cout<<"ping"<<endl;
            break;
        }
        if(person==0)
        {
            if(x=='+'||y=='+')
            {
                yxaddhs=1;
            }
            if(x=='-'||y=='-')
            {
                yxdwnhs=1;
            }
            if(x=='a'||y=='a')
            {
                if(yxdwnhs==1||dbaddhs==0)
                {
                    if(dbbq[s[nowcard]-48]==1)
                    {
                        cout<<"win"<<endl;
                        break;
                    }
                    dbbq[s[nowcard]-48]=1;
                    nowcard++;
                }
            }
        }
        else
        {
            if(x=='+'||y=='+')
            {
                dbaddhs=1;
            }
            if(x=='-'||y=='-')
            {
                dbdwnhs=1;
            }
            if(x=='a'||y=='a')
            {
                if(dbdwnhs==1||yxaddhs==0)
                {
                    if(yxbq[s[nowcard]-48]==1)
                    {
                        cout<<"lose"<<endl;
                        break;
                    }
                    yxbq[s[nowcard]-48]=1;
                    nowcard++;
                }
            }
        }
        person^=1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值