用C#制作卡牌游戏

本文介绍了一个基于C#的卡片游戏实现,包括牌库、手牌库的创建,牌的属性定义如攻击、回血,以及牌的分类如攻击牌、回血牌。通过冒泡排序算法打乱牌库,并提供了出牌逻辑,允许玩家根据手牌编号选择出牌,同时实现了简单的AI对手。游戏还包括弃牌和检查特殊牌效果的功能。

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

呵呵。

首先先要有牌库来存储所有的牌,然后再弄个手牌库来存储抽出来的牌:

    public static List<Pai> pai = new();
    public static List<Pai> moster_pai = new();
    public List<Pai> handpaiku = new();
    public List<Pai> monsterpaiku = new();

牌库应该可以添加牌,也就是说它的长度可以改变,所以集合就成了我们的首选。

然后就到了构建牌属性的时候了,牌应该被分为几个种类例如攻击或回血。所以我们可以利用是一个(继承)的办法。看作攻击等牌类是一种牌的特性。这样就出来了

class Pai
{
    public int ATk = 0;
    //可以使用属性封装字段
    public int huiHP = 0;
    public int useblue = 0;
    public string PaiName;//牌的名字,给check方法使用
    public int burn = 0;
    public int frozen = 0;
    public int bleed = 0;
    public int kuangbao = 0;
    public static List<Pai> pai = new();
    public static List<Pai> moster_pai = new();
    protected int identifier=0;
}
class ATkPai : Pai
{
    public void SetAtkPai()
    {
        ATkPai kill = new();
        ATkPai kill2 = new(); 
        ATkPai kill3 = new();
        ATkPai kill4 = new();
        ATkPai kill5= new();
        ATkPai kill6 = new();
        kill.ATk = 10;
        kill2.ATk =16;
        kill3.ATk = 30;
        kill4.ATk = 10;
        kill5.ATk = 24;
        kill6.ATk = 34;
        kill.PaiName = "斩";
        kill2.PaiName = "射击";
        kill3.PaiName = "重斩";
        kill4.PaiName = "突刺";
        kill5.PaiName = "雷切";
        kill6.PaiName = "全力一击";
        kill4.bleed = 2;
        pai.Add(kill);
        pai.Add(kill2);
        pai.Add(kill3);
        pai.Add(kill4);
        pai.Add(kill5);
        pai.Add(kill6);
    }
}//6
class HPPai : Pai
{
    public void SetHPPai()
    {
        HPPai hppai = new();
        HPPai hppai2 = new();
        HPPai hppai3 = new();
        hppai.huiHP = 20;
        hppai2.huiHP = 100;
        hppai3.huiHP = 40;
        hppai.PaiName = "治疗";
        hppai2.PaiName = "自然恩赐";
        hppai3.PaiName = "滋润";
        pai.Add(hppai);
        pai.Add(hppai2);
        pai.Add(hppai3);
    }
}//3
class NullPAi:Pai
{
    public void SetNullPai()
    {
        NullPAi nullPAi = new();
        NullPAi nullPAi2 = new();
        NullPAi nullPAi3 = new();
        NullPAi nullPAi4 = new();
        nullPAi.PaiName = "自残";
        nullPAi2.PaiName = "俄罗斯轮盘赌";
        nullPAi3.PaiName = "终止";
        nullPAi4.PaiName = "轮到你了";
        nullPAi.ATk = 15;
        nullPAi2.ATk = 2000;
        pai.Add(nullPAi);
        pai.Add(nullPAi2);
        pai.Add(nullPAi3);
        pai.Add(nullPAi4);
    }
}//4
class MonsterATKPai : Pai
{
    public void SetMonsterATKPai()
    {
        MonsterATKPai monsterATKPai = new();
        MonsterATKPai monsterATKPai2 = new();
        MonsterATKPai monsterATKPai3 = new();
        monsterATKPai.ATk = 10;
        monsterATKPai2.ATk = 20;
        monsterATKPai3.ATk = 14;
        monsterATKPai.PaiName = "斩";
        monsterATKPai2.PaiName = "斩2";
        monsterATKPai3.PaiName = "斩3";
        moster_pai.Add(monsterATKPai);
        moster_pai.Add(monsterATKPai2);
        moster_pai.Add(monsterATKPai3);
    }
}
class MonsterHPPai : Pai
{
    public void SetmonsterHPPAi()
    {
        MonsterHPPai monsterHPPai = new();
        MonsterHPPai monsterHPPai2 = new();
        MonsterHPPai monsterHPPai3 = new();
        monsterHPPai.huiHP = 20;
        monsterHPPai2.huiHP = 40;
        monsterHPPai3.huiHP = 1000;
        monsterHPPai.PaiName = "回复";
        monsterHPPai2.PaiName = "回复2";
        monsterHPPai3.PaiName = "起死回生";
        moster_pai.Add(monsterHPPai);
        moster_pai.Add(monsterHPPai2);
        moster_pai.Add(monsterHPPai3);
    }
}

而每张牌都是一个对象。而每个对象又都有自己的属性。属性用来区分对象

顺便说一下new关键字,它分配内存给实例并初始化内部数据:

 A a=new A();

它把A的地址分给a这个实例,并初始化A内的数据(靠的是它后面的()也就是构造函数)。

然后是打乱牌的顺序,这里采用一个冒泡排序算法跟据每个对象的HashCode来进行排序:

    public List<Pai> Sort(List<Pai> a )//使用冒泡排序把牌库打乱
    {
        int z = a.ToArray().Length;
        for (int i = 0; i < z - 1; i++)
        {
            for (int j = 0; j < z - 1 - i; j++)
            {
                if (a[j].GetHashCode() > a[j + 1].GetHashCode())
                {
                    var temp = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = temp;
                }
            }
        }
        return a;
    }

完成了牌属性后,就到了出牌逻辑了。

    public void Use()//使用牌方法
    {
        do
        {
            if (handpaiku.Count== 0)
            {
                Game.Round++;
                break;
            }
            foreach (var i in handpaiku)//var关键字的正确用法
            {
                WriteLine($"你有的牌为{i.PaiName},耗蓝为{i.useblue}");
                WriteLine();//如果感觉游玩时看着比较怪可以删掉它
            }//每次获得新牌都输出手牌库中有什么牌
            string use = ReadLine();
            if(use=="t")
            {
                Game.Round++;
                break;
            }
            if (handpaiku.Count > 0)
            {
                switch (use)
                {
                    case "1":
                        if (handpaiku.Count >= 1 && Role_bule > handpaiku[0].useblue)
                        {
                            if (handpaiku[0] is ATkPai)
                            {
                                Moster_HP -= (handpaiku[0].ATk + handpaiku[0].bleed * 2);
                                //Role_bule -= handpaiku[0].useblue;
                                WriteLine($"你打出了一张{handpaiku[0].PaiName}");
                                WriteLine($"你造成伤害为{handpaiku[0].ATk},敌方血量还有{Moster_HP}");
                            }
                            if(handpaiku[0] is HPPai)
                            {
                     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值