0 c#
我正在尝试编写一个程序来模拟纸牌游戏.我有一个名为MagicCard的课程,以及各种扩展卡片的课程,比如card1,card2 ......我想找到一种方法来存储不同卡片的列表/数组(甲板).每个card1,card2 ......都有一个"特殊"效果,它们在播放时会触发,因此需要一个独特的功能,这就是为什么我需要所有不同的子类.很多卡都有类似的属性.如何以合理和方便的方式存放卡座?(我希望可以轻松操作卡座,这样我就可以添加卡片,或者在需要时从卡片中取出卡片).
目前这就是我所拥有的:
//My Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace mtgDeckSimulator
{
//General properties of a magic card, extended by individual classes
class cardProperties
{
private String cardName;
/*Mana Array Aranged in the following Order:
* [Colorless,White,Blue,Black,Red,Green] */
private int[] manaCost;
/* Card Type int definitions:
* 0-Artifact
* 1-Creature
* 2-Enchantment
* 3-Instant
* 4-Land
* 5-Planeswalker
* 6-Sorcery
* 7-Tribal */
private int cardType;
public int attack;
public int defense;
private bool permBool;
private bool isLegen; //Or is restricted to one copy
public cardProperties(String cardName,int[] manaCostIn,int cardTypeIn,int attack,int defense,bool permBoolIn,bool isLegenIn)
{
this.cardName = cardName;
manaCost = manaCostIn;
cardType = cardTypeIn;
permBool = permBoolIn;
isLegen = isLegenIn;
}
//Get Variables
public String getCardName()
{
return cardName;
}
public int[] getManaCost()
{
return manaCost;
}
public int getCardType()
{
return cardType;
}
public bool getPermBool()
{
return permBool;
}
public bool getIsLegen()
{
return isLegen;
}
//Other Methods
}
//Interface for magic cards
interface MagicCard
{
int SpecialEffect();
}
#region Magic Card List
class WallOfOmens : cardProperties, MagicCard
{
public WallOfOmens()
: base("Wall of Omens", new int[6] { 1, 1, 0, 0, 0, 0 }, 1, 0, 4, true, false)
{
;
}
public int SpecialEfect()
{
return 1;
//throw new NotImplementedException();
}
}
class Card2 : cardProperties, MagicCard
{
public int SpecialEfect()
{
return 2;
//throw new NotImplementedException();
}
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这个?此外代码不起作用,因为它告诉我WallOfOmens和Card2没有实现SpecialEffect(),为什么会发生这种情况?
我会考虑另一种方法,使用组合而不是继承.组合比继承更灵活,它允许您比继承更自由地组合不同方面.
而不是创造
abstract class BaseCard{abstract int SpecialEffect();}
class Card1 : BaseCard{override int SpecialEffect(){return 1;}}
class Card2 : BaseCard{override int SpecialEffect(){return 2;}}
...
Run Code Online (Sandbox Code Playgroud)
您创建不同的SpecialEffect类
abstract class SpecialEffectBase{abstract int SpecialEffect();}
class SpecialEffect1 : SpecialEffectBase{override int SpecialEffect(){return 1;}}
class SpecialEffect2 : SpecialEffectBase{override int SpecialEffect(){return 2;}}
...
Run Code Online (Sandbox Code Playgroud)
并在工厂组装不同的卡
Card card1 = new Card(new SpecialEffect1());
Card card2 = new Card(new SpecialEffect2());
Run Code Online (Sandbox Code Playgroud)
这可能听起来只是间接的另一个步骤,但是如果你在不同的卡片中重复使用多个效果,并且在卡片之间有其他属性不同,比如规则或其他东西,你可以像这样组装它们
Card card1 = new Card(new SpecialEffect1(), new Rule1());
Card card2 = new Card(new SpecialEffect1(), new Rule2());
Card card3 = new Card(new SpecialEffect2(), new Rule1());
Card card4 = new Card(new SpecialEffect2(), new Rule2());
...
Run Code Online (Sandbox Code Playgroud)
另一个好处是它强制您将SpecialEffect规则封装在SpecialEffect类中,规则类中的规则规则等,而不是将它们全部包含在Card类中.