如何正确使用Switch-Case减少线路

时间:2014-12-10 16:51:32

标签: c#

我正在开发一个二十一点游戏项目。我有一个helper()方法来帮助用户完成他们的行为。例如:

经销商的上牌是:8 玩家手总数为:16

球员不确定,他应该击球还是留下来。 helper()函数在此处执行操作。

它基本上计算了套牌上的好牌数量(playerTotal + goodcard< = 21)

所以我正在考虑以这种方式(伪代码)

public void helper() {

    remain = 21 - playerTotal;

    if (remain == 1) {
        for (int i = 0; i < deck.last(); i++) {
            switch (deck[i]) {
                case A: numOfGood += 1
                default: numOfBad +=1
            }
        }
    }
    else if (remain == 2) {
        for (....) {
            switch (deck[i]) {
                case A: numOfGood += 1
                case 2: numOfGood += 1
                default: numOfBad +=1
            }
        }
    }

//goes like this

}

我需要为所有卡(A,2,3,4,5,6,7,8,9,J,K,Q,K)构建一个switch-case和for循环,但它看起来像一个巨大的一塌糊涂。如何通过做一些不同的事情来减少行数呢?

3 个答案:

答案 0 :(得分:9)

首先编写一个GetValue方法,可以计算卡的(最小)数值。您可以使用switch或您想要的其他方式实现它:

public static int GetValue(char card)
{
    //...
}

一旦你有了,你的方法的实现变得更短更简单:

foreach(var card in deck)
    if(GetValue(card) <= remain)
        numOfGood++;
    else
        numOfBad++;

另请注意,您可以只计算好的坏卡的数量,并根据需要使用剩余的总卡来计算另一张卡。

var oddsOfSuccessfulHit = deck.Count(card => GetValue(card) <= remain) / 
    (double) deck.Count;

答案 1 :(得分:1)

您可以使用HashSet,使用switch效率可能更高一些,但如果您想保存线路......

var goodCards = new HashSet<char>(new[] { 'A', '2' });

然后就像,

var numOfGood = deck.Count(card => goodCards.Contains(card));
var numOfBad = deck.Count - numOfGood;

答案 2 :(得分:0)

或者,由于卡值的逻辑无法改变,因此无需对其进行编码 - 只需将其存储为数据即可。

struct CardEffect
{
    public string CardGlyph;
    public int MinValue;
    public int MaxValue;
}

... load from XML file or some other location and load into ...
public Dictionary<string, CardEffect> cardValues;

然后使用Servy建议的逻辑。