2013-03-18 92 views
-2

我在调用main函数时遇到了麻烦,因为它需要同时返回2个列表。该功能将卡从一个列表添加到另一个列表,然后将其从原始列表中删除。但是,当我尝试并调用我得到这个错误的函数...没有重载方法“命中”需要1个参数无过载方法“命中”需要1个参数。需要返回两个列表

using System; 
    using System.Collections.Generic; 
    using System.Text; 

    namespace BlackJackGameX 
    { 
     public class MainClass 
     { 
      public static void Main (string[] args) 
      { 

       Deck Cards = new Deck(); 

       Hand PlayerHand = new Hand(); 

       Console.WriteLine("Welcome to Black Jack\n\nPress Enter To Start"); 
       Console.ReadLine(); 

       PlayerHand.Hit(PlayerHand); 
       PlayerHand.Hit(PlayerHand); 
       PlayerHand.HandPrint(); 


      } 
     } 
    } 

的问题是在这手牌类的命中功能底部

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace BlackJackGameX 
{ 
    public class Hand 
    { 

     Deck CardDeck = new Deck(); 

     public List<Card> PlayerHand; 

     public Hand() 
     { 

     } 

     public void HandPrint() 
     { 
      for (int i = 0; i < PlayerHand.Count; ++i) 
      { 
       Console.WriteLine("You have a " + PlayerHand[i].CardValue + " of " + PlayerHand[i].CardSuit); 

       if (i < PlayerHand.Count) 
       { 
        Console.WriteLine ("&"); 
       } 
      } 

      Console.ReadLine(); 

     } 

     public List<Card> Hit(List<Card> CardDeck, List<Card> PlayerHand) 
     { 
      PlayerHand.Add(CardDeck[1]); 
      CardDeck.Remove(CardDeck[1]); 

      return PlayerHand; 
     } 

    } 
} 
+0

为什么你需要退货?它们是引用(比如指针),所以你不需要返回它们,它们已经被修改了。 – tjameson 2013-03-18 01:57:09

+0

要返回2个项目,通常会使用'Tuple',但是您的问题很难确定。 – 2013-03-18 02:08:22

+0

正如你所看到的,我走出了自己的深度,我很抱歉发布这个,我会看看我能不能找出我出错的地方。 – 2013-03-18 02:18:39

回答

1

您遇到的错误是因为Hand类中的Hit()方法接受2个参数,而不是1.它期望两个参数List<Card>()

您的代码传递的是Hand对象,根本无法工作,无论参数的数量如何。

+0

那么如何在主函数中使用我的其他类的列表? – 2013-03-18 01:59:06

+0

@JonDunn我在主函数中看不到任何列表,只有Hand和Deck对象。 – tjameson 2013-03-18 02:01:46

+0

Deck类是混洗牌的列表,Hand类包含玩家牌的列表 – 2013-03-18 02:07:22

2

您的Hit方法预计有两个List<Card>参数,但只传递一个Hand对象。

public List<Card> Hit(List<Card> CardDeck, List<Card> PlayerHand) 
{ 
    ... 
} 

你需要做的是通过Cards对象主要为Hand构造使手可以使用它什么:

public class Hand 
{ 
    // You should make this private with a public property to guard it 
    public List<Card> PlayerHand; 

    // No reason to expose this to the outside 
    private Deck cardDeck = new Deck(); 

    public Hand (Deck cards) 
    { 
     cardDeck = cards; 
    } 

    // There's nothing worth returning here, so make it void 
    public void Hit() 
    { 
     // I would probably implement a method in the Deck class 
     // so you could do something like (where RemoveNext returns the card removed): 
     // playerHand.Add(cards.RemoveNext()); 
     playerHand.Add(CardDeck[1]); 
     CardDeck.Remove(CardDeck[1]); 
    } 

而且你Main看起来是这样的:

public static void Main (string[] args) 
{ 
    Deck cards = new Deck(); 
    Hand playerHand = new Hand(cards); 

    Console.WriteLine("Welcome to Black Jack\n\nPress Enter To Start"); 
    Console.ReadLine(); 

    playerHand.Hit(); 
    playerHand.Hit(); 
    // I would rename this to PrintHand(). HandPrint is a noun. 
    playerHand.HandPrint(); 
} 
+0

感谢您的帮助,但我的代码仍然有效,如何建议在套牌中实现RemoveNext功能? – 2013-03-19 10:06:35

+0

如果你的'Deck'类包含一个'List',其中包含你用来表示牌的任何东西,并且甲板被洗牌(随机),你可以从甲板的顶部拉。 'var tmp = PlayerHand [0]; PlayerHand.Remove(TMP);你可以使用'RemoveAt(0);'。 – 2013-03-19 12:34:34

+0

嗨,再次,我很抱歉,但即时通讯仍然努力实现Hit功能,我尝试了我所知道的任何东西,但它似乎没有工作,我应该在哪里放置RemoveAt(0)函数?在Hand类中还是在Deck类中? – 2013-03-20 19:20:56

相关问题