呵呵。
首先先要有牌库来存储所有的牌,然后再弄个手牌库来存储抽出来的牌:
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)
{