win8 开发之旅(5) --五子棋游戏开发

    上节说道了对这个游戏  面向对象的分析,各位读者 ,有什么不懂,尽情给我留言把!!!!!!

闲话少说,这节我们对 游戏的实体类,先进行伪代码分析,然后进行源代码的分析。

           我们先看这些类的整体的架构如下图所示:

 

            Piece类  代表相应的棋子的类, 他应该有 位置这个属性,而位置的最好的体现是通过纵坐标横坐标来体现;相应形状这个属性代表是黑色用户控件还是白棋的用户控件。

             类型属性代表代表这是黑棋, 还是白棋;

           索引属性  插入相应的索引的位置。  相应源代码如下:

          private UserControl _shape;

         private Position _position;

       /// <summary>
      /// Gets or sets the X.
     /// </summary>
    /// <value>The X.</value>
     public int X
 {
    get { return _position.X; }
     set { _position.X = value; }
  }

   /// <summary>
   /// Gets or sets the Y.
   /// </summary>
  /// <value>The Y.</value>
   public int Y
  {
   get { return _position.Y; }
   set { _position.Y = value; }
  }

  /// <summary>
  /// Gets or sets the position.
  /// </summary>
  /// <value>The position.</value>
  public Position Position
 {
get { return _position; }
set { _position = value; }
}

  public PieceType Type { get; set; }
  public int Index { get; set; }

   /// <summary>
 /// Initializes a new instance of the <see cref="Piece"/> class.
 // </summary>
  public Piece()
 {
  _position = new Position(0,0);
  }

   /// <summary>
  /// Gets the shape.
  /// </summary>
  /// <value>The shape.</value>
  public UserControl Shape
 {
 get
 {
 if (_shape == null)
 {
 if (Type == PieceType.Black)
 _shape = new BlackPieceComponent();
 if (Type == PieceType.White)
 _shape = new WhitePieceComponent();
 }
 return _shape;
 }
 }

   PieceBoard(棋盘) 这个类 是用于对棋盘进行面向对象的处理后的类,   他有那些属性和方法了

    首先,考虑整块游戏只需要一块棋盘,因此我们是不是用单例模式来产生这快棋盘。 说道单例模式的话,有一个 相应类事例和产生单独一个对象的方法。

  棋盘棋盘本身就是盛放棋子的容器,因此我们这里需要一个盛放棋子的数组,为什么是数组啊? 因为棋盘是15*15方格子。

    相应的源代码如下

    public class PieceBoard
   {
    static PieceBoard _Instance { get; set; }

    public Piece[,] pieces { get; set; }  

   private PieceBoard()
  {
  Init();
  }

  private void Init()
  {
   pieces = new Piece[AppConfig.BoardWidth, AppConfig.BoardWidth];
    }
    public static PieceBoard GetPieces()
  {
  lock (_Instance)
  {
  if (_Instance==null)
  {
   _Instance = new PieceBoard();
   }
  }
  return _Instance;
  }
  }

   怎么知道谁赢了,当然是有一套复杂判断连五子的方法,显然,我们需要一套复杂,的算法。这节我们不说他,说一说储存胜利结果的类。

   WinningResult 他有哪些属性,谁取胜的一个枚举的属性,一个那种棋子属性,一个棋子的泛型数组。可能读者就纳闷了,前两个属性需要

  还好理解,而一个棋子的泛型数组  是干嘛的,首先他不是吃饭的。他是把每个胜利结果下的棋子储存起来,以做以后判断使用。

    相应的源代码如下:

    

 

   public class WinningResult
  {
  public WinningType wtype { get; set; }

  public PieceType ptype { get; set; }

  public List<Piece> piecs;

  public WinningResult()
  {
  piecs = new List<Piece>();
  }
 }

  这里说他两个枚举类型,源代码就不用多贴了,PieceType棋子的类型分别 代表的   白色、黑色类型。  WinningType 胜利的类型,        有水平,垂直,斜起方向。

你会问我为什么要枚举,简而言之,就是避免魔鬼数字, 更好的见名之义。 增强源代码的可读性。      是1更好理解, 还是Black更好的理解,你说了

我这节说的够多了,就此休笔把!!!      欲知后事如何,且听下回分解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://blog.csdn.net/xiaoxiao108/article/details/37882295 unity3d用的人挺多,本来想写个3d游戏试试,额,貌似挺麻烦,先用unity写个简单的2d游戏吧 (adsw回车 或者 触摸屏虚拟摇杆) 开发环境 unity4.5.1f3 vs2013 express win8.1 实现方法如下 1.创建自己的坦克Sprite 2.创建敌方坦克Prefab 3.创建子弹Prefab 4.添加虚拟摇杆 5.碰撞检测 具体实现 1.控制自己坦克的代码 [csharp] view plaincopy if (Input.GetKey (KeyCode.W)) { Rotate (0); } else if (Input.GetKey (KeyCode.S)) { Rotate (180); } else if (Input.GetKey (KeyCode.A)) { Rotate (90); } else if (Input.GetKey (KeyCode.D)) { Rotate (270); } i++; if (i == 10) {i=0; if (Input.GetKey (KeyCode.Return)||rotateJoystick.tapCount > 0) { m.tag = "GOOD"; Instantiate (m, transform.position, transform.rotation); } } 2.控制地方坦克的代码 [csharp] view plaincopy if (step == 0) { int i=Random.Range(0, 4); Rotate(angles[i]); step = Random.Range(0, 20) + 85; if(Random.Range(0,50)>40) { m.tag="BAD"; Instantiate(m, transform.position, transform.rotation); } } else { step--; } transform.Translate (Vector3.up*Time.deltaTime*4); 3.控制子弹移动 transform.Translate (Vector3.up * Time.deltaTime * 10); 4.虚拟摇杆用的Untiy 里面 Standard Assets(Mobile).unityPackage自带的 5.碰撞检测代码 [csharp] view plaincopy void OnTriggerEnter2D(Collider2D mCollider) { if ((mCollider.gameObject.tag == "Enemy"&&gameObject.tag=="GOOD")||(mCollider.gameObject.tag == "Player"&&gameObject.tag=="BAD")) { Destroy(mCollider.gameObject); Destroy(this.gameObject); if(gameObject.tag=="BAD") { PlayerPrefs.SetString("key","OVER"); Application.LoadLevel(1); } } } 如果你发现有什么不合理的,需要改进的地方,留言。 http://blog.csdn.net/xiaoxiao108/article/details/37882295
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值