none
《C#入门经典》扑克牌程序,关于“.”的问题!问题都在注释里 RRS feed

  • 问题

  • 需要注释解答的地方我一般都标记了???号!谢谢啦!

    public class Card //: ICloneable
    
      {
    
       //Flag for trump usage. If true, trumps are valued higher 
    
       //than cards of other suits.
    
       public static bool useTrumps = false;//不明白为什么要设置useTrumps,只知道王牌最大
    
    
    
       //Trump suit to use if useTrumps is true.
    
       public static Suit trump = Suit.Club; //第一个问题:不理解Suit.Club有什么含义!只知道Club是枚举Suit四个值
    
      //(Club,Diamond,Heart,Spade,)中的第一个。难道上面这一行是要把枚举Suit中的Club值赋给trump?第二个问题:
    
      //为什么是Suit.Club?为什么不写成(Suit)Club? 还求 “ . ”(点)的用法或含义的例子!
    
       //Flag that determines whether aces are higher than kings or lower
    
       //than deuces.
    
       public static bool isAceHigh = true;//同样不理解isAceHigh为什么要设置!为什么是bool型。书上只是说Ace比King大,
    
      //感觉等于没说,我也不知具体怎么提问。。。
    
    
    
       public readonly Suit suit;
    
       public readonly Rank rank;
    
    
    
       public Card(Suit newSuit, Rank newRank)
    
       {
    
        suit = newSuit;
    
        rank = newRank;
    
       }
    
    
    
       private Card()
    
       {
    
    
    
       }
    
    
    
       public override string ToString()
    
       {
    
        return "The " + rank + " of " + suit + "s";
    
       }
    
    
    
       public object Clone()
    
       {
    
        return MemberwiseClone();
    
       }
    
    
    
       public static bool operator ==(Card card1, Card card2)
    
       {
    
        return (card1.suit == card2.suit) && (card1.rank == card2.rank);
    
       }
    
    
    
       public static bool operator !=(Card card1, Card card2)
    
       {
    
        return !(card1 == card2);
    
       }
    
    
    
       public override bool Equals(object card)
    
       {
    
        return this == (Card)card; //这个this指的是什么?我虽然知道指的是Card类,但可以这样解释么:
    
       }        //Card类中有个card对象,这个card对象的值(Suit和Rank)等于this!!!我很混乱!
    
       public override int GetHashCode()
    
       {
    
        return 13 * (int)rank + (int)suit;
    
       }
    
    
    
       public static bool operator >(Card card1, Card card2)//这个重载>号的循环基本不懂。。。
    
       {
    
        if (card1.suit == card2.suit)
    
        {
    
         if (isAceHigh)
    
         {
    
          if (card1.rank == Rank.Ace)
    
          {
    
           if (card2.rank == Rank.Ace)
    
            return false;
    
           else
    
            return true;
    
          }
    
          else
    
          {
    
           if (card2.rank == Rank.Ace)
    
            return false;
    
           else
    
            return (card1.rank > card2.rank);
    
          }
    
         }
    
         else
    
         {
    
          return (card1.rank > card2.rank);
    
         }
    
        }
    
        else
    
        {
    
         if (useTrumps && (card2.suit == Card.trump))
    
          return false;
    
         else
    
          return true;
    
        }
    
       }
    
    
    
       public static bool operator <(Card card1, Card card2)
    
       {
    
        return !(card1 >= card2);
    
       }
    
    
    
       public static bool operator >=(Card card1, Card card2)
    
       {
    
        if (card1.suit == card2.suit)
    
        {
    
         if (isAceHigh)
    
         {
    
          if (card1.rank == Rank.Ace)
    
          {
    
           return true;
    
          }
    
          else
    
          {
    
           if (card2.rank == Rank.Ace)
    
            return false;
    
           else
    
            return (card1.rank >= card2.rank);
    
          }
    
         }
    
         else
    
         {
    
          return (card1.rank >= card2.rank);
    
         }
    
        }
    
        else
    
        {
    
         if (useTrumps && (card2.suit == Card.trump))
    
          return false;
    
         else
    
          return true;
    
        }
    
       }
    
    
    
       public static bool operator <=(Card card1, Card card2)
    
       {
    
        return !(card1 > card2);
    
       }
    
      }
    
    

     

    2010年12月9日 15:44

答案

  • 您好,感觉您提了这么多的问题,常把代码要解决的问题域、代码语法和面向对象思想混在一块。而且这三者您好像都很模糊,所以学起来很吃力。多花时间把这三类问题琢磨琢磨。有很多是要靠自己的,别人也解释不来。

    1、问:不明白为什么要设置useTrumps,只知道王牌最大

    答:这要看问题域是什么,在不清楚问题及解决方案,都不知道为什么要设置useTrumps。不同的人有不同的解法。

    2、问:不理解Suit.Club有什么含义!只知道Club是枚举Suit四个值

    答案同上,在这里每个枚举值应该分别代表黑、红、梅、方。四色扑克牌,如果这都没看出来,那么好好研究一下问题域的东西。

    3、问:为什么是Suit.Club?为什么不写成(Suit)Club? 还求 “ . ”(点)的用法或含义的例子!

         答:建议您好好看看有关枚举的概念和语法。Suit.Club就是获取某个枚举值得标准用法,如果写成(Suit)Club就错了,这样的语法相当于把一个对象转型成Suit类。"."的用法最简单的就是访问对象的域、属性和方法等成员。在枚举中的值,您可以理解为Club是Suit的一个成员域。所以得Suit.Club这么用

    4、问: //这个this指的是什么?我虽然知道指的是Card类,但可以这样解释么:
     //Card类中有个card对象,这个card对象的值(Suit和Rank)等于this!!!我很混乱!

        答:this就是指Card类的实例,注意理解类、实例的概念就能明白为什么要用this了。在这里不是等于this。注意是"=="而不是"="。"=="是判断语句本例子中是指两者相等就返回真否则返回假

    5、问://这个重载>号的循环基本不懂。。。

         答:这里的不是循环,而是不同条件的判断,只有研究了问题域及解决方案才会知道为什么有这么多的判断,否则谁也不会懂得为什么。

    小结:正如我一开始提到的您把那三类问题混在一块了,例如1、2和5就是对您要解决的问题和解决方案十分不清造成的;3和4是语法问题;还有您以前提过的接口等问题也是语法和面向对象的思想。

    别着急,先把语法学了,书需要反复看,祝成功。

    2010年12月12日 13:27
    版主

全部回复

  • 您好,感觉您提了这么多的问题,常把代码要解决的问题域、代码语法和面向对象思想混在一块。而且这三者您好像都很模糊,所以学起来很吃力。多花时间把这三类问题琢磨琢磨。有很多是要靠自己的,别人也解释不来。

    1、问:不明白为什么要设置useTrumps,只知道王牌最大

    答:这要看问题域是什么,在不清楚问题及解决方案,都不知道为什么要设置useTrumps。不同的人有不同的解法。

    2、问:不理解Suit.Club有什么含义!只知道Club是枚举Suit四个值

    答案同上,在这里每个枚举值应该分别代表黑、红、梅、方。四色扑克牌,如果这都没看出来,那么好好研究一下问题域的东西。

    3、问:为什么是Suit.Club?为什么不写成(Suit)Club? 还求 “ . ”(点)的用法或含义的例子!

         答:建议您好好看看有关枚举的概念和语法。Suit.Club就是获取某个枚举值得标准用法,如果写成(Suit)Club就错了,这样的语法相当于把一个对象转型成Suit类。"."的用法最简单的就是访问对象的域、属性和方法等成员。在枚举中的值,您可以理解为Club是Suit的一个成员域。所以得Suit.Club这么用

    4、问: //这个this指的是什么?我虽然知道指的是Card类,但可以这样解释么:
     //Card类中有个card对象,这个card对象的值(Suit和Rank)等于this!!!我很混乱!

        答:this就是指Card类的实例,注意理解类、实例的概念就能明白为什么要用this了。在这里不是等于this。注意是"=="而不是"="。"=="是判断语句本例子中是指两者相等就返回真否则返回假

    5、问://这个重载>号的循环基本不懂。。。

         答:这里的不是循环,而是不同条件的判断,只有研究了问题域及解决方案才会知道为什么有这么多的判断,否则谁也不会懂得为什么。

    小结:正如我一开始提到的您把那三类问题混在一块了,例如1、2和5就是对您要解决的问题和解决方案十分不清造成的;3和4是语法问题;还有您以前提过的接口等问题也是语法和面向对象的思想。

    别着急,先把语法学了,书需要反复看,祝成功。

    2010年12月12日 13:27
    版主
  • 同意楼上的说法

    useTrumps应该是指非否用王牌 如果为true则王牌为最大并且定义王牌的suit字段为club 如果useTrumps为true则任何牌和王牌比大 都返回false(>重载中定义)  默认为不用 可以根据需要改变

    this指代本身 你实例化时对象是什么就是指代什么,不是Card类的成员suit和rank。suit和rank为Card成员,应该分别指花色和大小(构造函数中初始化)。  Equals函数传入一个object类型对象名为card 然后转为Card类 再与本对象比较 如果相等即为true 这是很普遍的重写Equals方法的基本模式 由于本类重写了==符号 所以可以直接使用==来比较对象内容是否相等

    http://msdn.microsoft.com/zh-cn/library/cc138362.aspx

    '.'的用法在各大主流的语言里面基本都有 作用也大同小异 基本作用就是访问对象或者类的成员

    重载的>只是加入了很多判断 并没有循环 书上应该有详细的解释 只要将书及全部源码仔细看几遍 应该能够理解各判断的含义及作用

    isAceHigh 是定义是否ace是比king大的牌 有些牌可能需要ace小于king 默认为大于 这个需要看原书的解释及问题的声明 定义前面那几个字段useTrumps和isAceHigh只是增加程序的适应性,可以满足不同的需求。

    希望对你有所帮助 祝早日学精通c#

    Jelly

     

    2010年12月14日 7:33
  •  

    由于没有这本书,有些地方可能理解偏差,请见谅

    你可以自己仔细结合书及注释然后参考我们的见解,体会下代码的原意。

    Jelly

    2010年12月14日 7:36