2016-08-19 23 views
4

所以我在c#中做了一個愚蠢的遊戲,但我有點卡在這裏。如何用Tuple返回2或3的值?

我想要返回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

你能不能給的這是什麼進行了總結,用來做什麼?什麼是元組和元組2將用於? – sr28

+3

@Thibaut如果所有的值都是int,你是否考慮過返回一個數組,IEnumerable或者列表? – Sascha

+0

@ sr28我想製作一款國際象棋遊戲,所以如果我點擊一個pion,它會顯示所有不同位置的pion可以放置。當可以放置更多位置時,我需要更多的行或列。 – Thibaut

回答

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; 
    } 
} 
+0

這看起來非常好,我會試試這個,讓你知道它是否工作! – Thibaut

+0

@Thibaut - 檢查我添加的接口 - 可能更多你正在尋找 –

+0

我有這個奇怪的問題'列表'在'新列表'給我一個錯誤,我不知道爲什麼...我會先嚐試第一種可能性,然後我會盡力讓它進入你在這裏給我的下一步。你真的幫我出去了! – Thibaut

2

嘗試改變返回類型

Tuple<int, int, int?> 

這樣,你會有

var tuple = new Tuple<int, int, int?>(row, column, null); 

無論如何,我認爲這將是最好的清除該方法的語義和親可以讓它返回一個有意義的自定義數據類型。

+0

這仍然返回3個值 - 只是他們中的一個是'null' –

+0

這沒有奏效,我無法將類型'int?'轉換爲'int'它說 – Thibaut

+0

使用.Value從您的int中獲取int可爲空 Geoffrey