所以我在c#中制作了一个愚蠢的游戏,但我有点卡在这里。
我试图返回2个值或3个值,取决于游戏规则。
我需要知道如何只在一个函数中返回不同数量的值。就像有时候我需要在一个函数中返回3个值,有时需要返回7个值。
错误当然是变量tuple
,因为我不能返回少于3个值。
public Tuple<int, int, int> movepion(schaken.pion pion, int row, int column)
{
int row2 = row + 1;
//posities berekenen
if (pion.kleur == Color.Blue)
{
if (pion.volgnr == 0) { row++; row2++; }
else { row++; }
}
else
{
}
// declaration
var tuple = new Tuple<int, int>(row, column);
var tuple2 = new Tuple<int, int, int>(row, row2, column);
// what position?
if (pion.volgnr == 0)
{
pion.volgnr = pion.volgnr + 1;
return tuple2;
}
else
{
return tuple;
}
}
答案 0 :(得分:10)
返回集合而不是Tuple<>
public IEnumerable<int> movepion(schaken.pion pion, int row, int column)
{
IEnumerable<int> result;
bool return2Items = false; //Some logic part to decide how many items to return
if(return2Items)
result = new List<int> { 1, 2 };
else
result = new List<int> { 1, 2, 3 };
return result;
}
在更好地理解我建议创建对象MoveOption
的评论之后,该函数将返回IEnumerable<MoveOption>
public class MoveOption
{
public int X { get; set; }
public int Y { get; set; }
}
然后在你的函数中:
public IEnumerable<MoveOption> movepion(schaken.pion pion, int row, int column)
{
List<MoveOption> options = new List<MoveOption>();
if(/*some condition*/)
{
options.Add(new MoveOption{ X = 1, Y = 2 });
}
if(/*some condition*/)
{
options.Add(new MoveOption{ X = 5, Y = 7 });
}
//Rest of options
return options;
}
然后,如果你想向前迈出一步,你可以使用继承和:
public interface IMoveOptionCalcumator
{
public MoveOption Calculate(/*input*/);
}
public class MoveOptionX : IMoveOptionCalcumator
{
public MoveOption Calculate(/*input*/) { /*some implementation*/ }
}
在你的功能中:
public class YourClass
{
public IEnumerable<IMoveOptionCalcumator> MoveOptionCalculators { get; set; }
public YourClass()
{
// Initialize the collection of calculators
// You can look into Dependency Injection if you want even another step forward :)
}
public IEnumerable<int> movepion(schaken.pion pion, int row, int column)
{
List<MoveOption> options = new List<MoveOption>();
foreach (var item in MoveOptionsCalculators)
{
var result = item.Calculate(/*input*/);
if(result != null)
{
options.Add(result);
}
}
return options;
}
}
答案 1 :(得分:2)
尝试将返回类型更改为
Tuple<int, int, int?>
那样你会有
var tuple = new Tuple<int, int, int?>(row, column, null);
无论如何,我认为最好清除方法的语义,并且可能让它返回有意义的自定义数据类型。