黑马程序员技术交流社区

标题: 面向对象版猜拳游戏问题 [打印本页]

作者: 凤凰涅槃    时间: 2013-11-7 19:55
标题: 面向对象版猜拳游戏问题
本帖最后由 凤凰涅槃 于 2013-11-7 21:16 编辑
  1. /// <summary>
  2.     /// 用户玩家类
  3.     /// </summary>
  4.     class Player
  5.     {
  6.    /// <summary>
  7.    /// 用户玩家姓名
  8.    /// </summary>
  9.    public string Name { get; set; }

  10.    /// <summary>
  11.    /// 用户玩家出拳
  12.    /// </summary>
  13.    /// <param name="fist"></param>
  14.    /// <returns></returns>
  15.    public string ShowFist(string fist)
  16.    {
  17.       return fist;
  18.    }
  19.     }
复制代码
  1. /// <summary>
  2.     /// 电脑玩家类
  3.     /// </summary>
  4.     class PC
  5.     {
  6.    /// <summary>
  7.    /// 电脑玩家出拳
  8.    /// </summary>
  9.    /// <returns></returns>
  10.    public string ShowFist()
  11.    {
  12.       string fist = "";
  13.       Random ran = new Random();
  14.       int fistNum = ran.Next(1,4);
  15.       switch (fistNum)
  16.       {
  17.           case 1:
  18.           fist = "石头";
  19.          break;
  20.          case 2:
  21.          fist = "剪刀";
  22.          break;
  23.          case 3:
  24.          fist = "布";
  25.          break;
  26.          default:
  27.          fist = "未知拳法!";
  28.          break;
  29.    }
  30.    return fist;
  31. }
复制代码
  1. /// <summary>
  2.     /// 判断输赢类
  3.     /// </summary>
  4.     class IsWin
  5.     {
  6.      //用户出拳值
  7.      public string PlayerFist { get; set; }
  8.      //电脑出拳值
  9.      public string PCFist { get; set; }

  10.       /// <summary>
  11.       /// 判断输赢
  12.      /// </summary>
  13.      /// <returns></returns>
  14.      public string GetWin()
  15.      {
  16.          if ((PlayerFist == "石头" && PCFist == "剪刀")
  17.             || (PlayerFist == "剪刀" && PCFist == "布")
  18.             || (PlayerFist == "布" && PCFist == "石头"))
  19.          {
  20.                return new Player().Name + "赢"; //这里取不到Player的Name属性值
  21.          }
  22.         else if ((PCFist == "石头" && PlayerFist == "剪刀")
  23.                     || (PCFist == "剪刀" && PlayerFist == "布")
  24.                     || (PCFist == "布" && PlayerFist == "石头"))
  25.          {
  26.                return "电脑赢";
  27.          }
  28.         else
  29.         {
  30.               return "平局";
  31.         }
  32.         }
复制代码
  1. ///单击"石头"、"剪刀"、"布"三个按钮的公共处理程序(方法)
复制代码

求大侠帮忙看看    有点麻烦   这里先谢谢了  。。。。。。。。。。
判断输赢部分: return new Player().Name + "赢"; //这里取不到Player的Name属性值  我真不晓得是哪儿出错了   
调一下午了   , 这里先谢谢各位大侠了 。。。。。。。。。。。。

作者: 凤凰涅槃    时间: 2013-11-7 20:01
发的太多了   给我丢了一部分代码,这里补上:
  1. private void ShowFist(object sender, EventArgs e)
  2.         {
  3.             if (txtPlayerName.Text == "")
  4.             {
  5.                 MessageBox.Show("用户玩家姓名不能为空!");
  6.                 return;
  7.             }
  8.             //实例化判断输赢(IsWin)类
  9.             IsWin isWin = new IsWin();

  10.             //获得触发事件的Button控件
  11.             Button btn = (Button)sender;

  12.             //用户玩家出拳
  13.             Player player = new Player();
  14.             player.Name = txtPlayerName.Text;
  15.             isWin.PlayerFist = player.ShowFist(btn.Text);

  16.             //电脑玩家出拳
  17.             PC pc = new PC();
  18.             isWin.PCFist = pc.ShowFist();
  19.             lblPCName.Text = isWin.PCFist;

  20.             //判断输赢
  21.             lblResult.Text = isWin.GetWin();
  22.         }
复制代码

作者: 追影    时间: 2013-11-7 20:57
return new Player().Name + "赢"; 这里你又new了一次,又没给Name属性赋值,所以拿不到,等于new了两次
作者: 凤凰涅槃    时间: 2013-11-7 21:10
但是这里不用new访问不到Player类的Name属性啊   用new又没法获得值,不过还是非常感谢你了。。。
我再想想。。。。。。
作者: 凤凰涅槃    时间: 2013-11-7 21:15
追影 发表于 2013-11-7 20:57
return new Player().Name + "赢"; 这里你又new了一次,又没给Name属性赋值,所以拿不到,等于new了两次 ...

恩    搞定了   我将Player类的Name属性了   非常感谢你。。。。。。
作者: hourglass    时间: 2013-11-7 21:19
return new Player().Name + "赢";
你这里是直接new了一个Player实例,而你的Player类定义中, 没有声明构造方法来初始化Name属性,所以在取Name属性的值的时候是取不到值的。
在设计上,稍作修改的话, 你应该IsWin类中保存一个Player实例, 在对IsWin进行创建的时候,通过构造方法实例化Player,最后在判断出拳结果后, 直接取IsWin中Player实例的Name属性。
我建议的是, 你可以取消IsWin类中PlayerFist属性和PCFist属性, 将这两个属性换为对应的Player对象和PC对象,然后在Player对象和PC对象里面分别添加一个出拳值的属性,在对比出拳值的时候, 直接取两个对象的出拳值进行对比。
作者: 凤凰涅槃    时间: 2013-11-7 21:44
hourglass 发表于 2013-11-7 21:19
return new Player().Name + "赢";
你这里是直接new了一个Player实例,而你的Player类定义中, 没有声明构 ...

谢谢   我将Player类的Name属性设置为静态属性了。这样就不用实例化可以访问了  。
作者: 大虾挂了    时间: 2013-11-7 21:58
说下我的想法
return new Player().Name + "赢"; 这句话本来就是创建个新Player实例,Name属性你还没赋值呢

你点击出拳按钮的时候,是实例化了一个Player类player,也实例化了一个Iswin类iswin。可是这两个实例之间没什么关联性。iswin在执行Getwin方法,而且玩家胜利的时候又创建了一个Player实例(这个实例不是palyer了,Name属性你还没给他赋值)。
想要让结果有名字,最简单的方法就是给Getwin方法传一个string类型参数player.Name。不过这样没有体现出面向对象的感觉。

我觉得这样设计比较好,你让Getwin方法有两个参数传入,分别Player类型和PC类型的。需要的东西直接从这两个传入参数的属性获取就好。这样的话这两句指令            
            player.Name =xtPlayerName.Text;
            isWin.PlayerFist = player.ShowFist(btn.Text);
就省了。Iswin类中也没必要在写电脑出拳和玩家出拳两个属性了,直接写一个Getwin方法就好了(甚至觉得这样都画蛇添足了,直接把Iswin类去掉就行了,单纯一个Getwin方法就够了)。
还有这个ShowFist,写成方法也有点画蛇添足,写成属性不是更好么(这个方法传入一个字符串参数,并且返回这个字符串参数,这不就是属性的读和取么)?
我大概写几句
public string Getwin(Player a,PC b)
{
if(//这里写的是a.ShowFist()和b.ShowFist()的比较)
{return a.Name+"赢"}
else if(a.ShowFist()==b.ShowFist())//平局判断的过程明明是最简单的,你却把它丢到else里啦
{return "平局"}
else
{return "电脑胜利'}

作者: 凤凰涅槃    时间: 2013-11-7 22:15
大虾挂了 发表于 2013-11-7 21:58
说下我的想法
return new Player().Name + "赢"; 这句话本来就是创建个新Player实例,Name属性你还没赋值呢 ...

恩   不错  不错  受教了   谢谢了。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2