深圳升蓝软件
数据库开发 .Net技术  |  ASP技术 PHP技术 JSP技术 应用技术类   
Hiblue Software

c#写的五子棋程序,供学习WinForms的鼠标事件和使用GD


March 25,2004
前几天没事,写了一个小程序,可以用于学习C#。

程序使用了VS.NET环境编译,你的机器只要安装了.NET Framework SDK就可以运行。

源码和执行文件可以下载

http://www.wh-adv.com/download/five.zip

你不想下载也可读一下源码(图片资源等需要下载)。

namespace Leimom.FiveChess

{

    using System;

    using System.Drawing;

    using System.Collections;

    using System.ComponentModel;

    using System.WinForms;

    using System.Data;

    /// <summary>

    ///    Summary description for Form1.

    /// </summary>

    public class FiveForm : System.WinForms.Form

    {

        /// <summary>

        ///    Required designer variable.

        /// </summary>

        private System.ComponentModel.Container components;

  private System.WinForms.ImageList imageListbw;

  //define the hot Rectangle

  private Rectangle[] pointSquares;

  //chess information

  private int[] chessTable;

  private int nextTurn;

  private const int bTurn = 1;

  private const int wTurn = 2;

  private Stack chessIndex;

  public FiveForm()

        {

            //

            // Required for Windows Form Designer support

            //

            InitializeComponent();

            //

            // TODO: Add any constructor code after InitializeComponent call

            //

   chessIndex = new Stack();

   nextTurn = bTurn;

   chessTable = new int[225];

   pointSquares = new Rectangle[225];

   Size size = new Size(18,18);

   int x = 0;

   int y = 0;

   for(int i = 0;i < 225;i++)

   {

    x = i%15;

    y = i/15;

    pointSquares.Size = size;

    pointSquares.Offset(9+x*20,6+y*20);

    chessTable = 0;

   }

  }



  protected override void OnPaint(PaintEventArgs e)

  {

   //you may paint

            Graphics g = e.Graphics;

  }

  protected override void OnMouseDown(System.WinForms.MouseEventArgs e)

  {

   switch( e.Button )

   {

    //take left button down

    case MouseButtons.Left:

     OnLButtonDown(new Point(e.X,e.Y));

     break;

    //take right button down

    case MouseButtons.Right:

     OnRButtonDown(new Point(e.X,e.Y));

     break;

   }

   base.OnMouseDown(e);

  }

  private void OnLButtonDown(Point p)

  {

   int nPos = GetRectID(p);

   //click hot Rectangle witch have no chess

   if(nPos != -1&&chessTable[nPos] == 0)

   {

    Graphics g = this.CreateGraphics();

    if(nextTurn==bTurn)

    {

     //draw white chess

     DrawBlack(g,nPos);

     chessTable[nPos] = bTurn;

     nextTurn = wTurn;

     chessIndex.Push(bTurn);

     chessIndex.Push(nPos);

    }

    else

    {

     //draw Black chess

     DrawWhite(g,nPos);

     chessTable[nPos] = wTurn;

     nextTurn = bTurn;

     chessIndex.Push(wTurn);

     chessIndex.Push(nPos);

    }

    g.Dispose();

    //witch win

    CheckGameResult(nPos,nextTurn);

   }  

  }

  private void CheckGameResult(int nPos,int nextTurn)

  {

   //witch win

   Stack isFive = new Stack();

   int thisTurn = (nextTurn == bTurn)?wTurn:bTurn;

   int x = nPos%15;

   int y = nPos/15;

   //scan x have five

   for(int i=0;i<15;i++)

   {

    if(chessTable[y*15+i] == thisTurn)

    {

     isFive.Push(y*15+i);

     if(isFive.Count == 5)

     {

      MessageBox.Show("Game Over","Notes",MessageBox.OK);

      ReSetGame();

      return;

     }

    }

    else

    {

     isFive.Clear();

    }

   }

   isFive.Clear();

   //scan y have five

   for(int i=0;i<15;i++)

   {

    if(chessTable[i*15+x] == thisTurn)

    {

     isFive.Push(i*15+x);

     if(isFive.Count == 5)

     {

      MessageBox.Show("Game Over","Notes",MessageBox.OK);

      ReSetGame();

      return;

     }

    }

    else

    {

     isFive.Clear();

    }

   }

   isFive.Clear();

   //scan x=y have five

   for(int i=-14;i<15;i++)

   {

    if(x+i<0||x+i>14||y-i<0||y-i>14)

    {

     continue;

    }

    else

    {

     if(chessTable[(y-i)*15+x+i] == thisTurn)

     {

      isFive.Push((y-i)*15+x+i);

      if(isFive.Count == 5)

      {

       MessageBox.Show("Game Over","Notes",MessageBox.OK);

       ReSetGame();

       return;

      }

     }

     else

     {

      isFive.Clear();

     }

    }

   }

   isFive.Clear();

   //scan x=-y have five

   for(int i=-14;i<15;i++)

   {

    if(x+i<0||x+i>14||y+i<0||y+i>14)

    {

     continue;

    }

    else

    {

     if(chessTable[(y+i)*15+x+i] == thisTurn)

     {

      isFive.Push((y+i)*15+x+i);

      if(isFive.Count == 5)

      {

       MessageBox.Show("Game Over","Notes",MessageBox.OK);

       ReSetGame();

       return;

      }

     }

     else

     {

      isFive.Clear();

     }

    }

   }

   isFive.Clear();

  }

  private void ReSetGame()

  {

   //reset game

   nextTurn = bTurn;

   for(int i=0;i<225;i++)

   {

    chessTable = 0;

   }

   this.Invalidate();

  }

  private int GetRectID(Point p)

  {

   //get witch rectangle click

   for(int i = 0;i < 225;i++)

   {

    if(pointSquares.Contains( p ))

    {

     return i;

    }

   }

   return -1;

  }

  private void OnRButtonDown(Point p)

  {

   //regret chess

   int nPos,x,y;

   if(chessIndex.Count != 0)

   {

    nPos = (int)chessIndex.Pop();

    x = nPos%15;

    y = nPos/15;

    chessTable[nPos] = 0;

    nextTurn = (int)chessIndex.Pop();

    this.Invalidate(new Rectangle(new Point(8+x*20,5+y*20),new Size(20,20)));

   }

  }

  private void DrawBlack(Graphics g,int nPos)

  {

   //draw Black chess

   int x,y;

   x = nPos%15;

   y = nPos/15;

   imageListbw.DrawImage(g,8+20*x,5+20*y,20,20,0,0);

  }

  private void DrawWhite(Graphics g,int nPos)

  {

   //draw White chess

   int x,y;

   x = nPos%15;

   y = nPos/15;

   imageListbw.DrawImage(g,8+20*x,5+20*y,20,20,0,1);

  }

        /// <summary>

        ///    Clean up any resources being used.

        /// </summary>

        public override void Dispose()

        {

            base.Dispose();

            components.Dispose();

        }

        /// <summary>

        ///    Required method for Designer support - do not modify

        ///    the contents of this method with the code editor.

        /// </summary>

        private void InitializeComponent()

  {

   System.Resources.ResourceManager resources = new System.Resources.ResourceManager (typeof(FiveForm));

   this.components = new System.ComponentModel.Container ();

   this.imageListbw = new System.WinForms.ImageList ();

   //@this.TrayHeight = 90;

   //@this.TrayLargeIcon = false;

   //@this.TrayAutoArrange = true;

   //@imageListbw.SetLocation (new System.Drawing.Point (7, 7));

   imageListbw.ImageSize = new System.Drawing.Size (20, 20);

   imageListbw.ImageStream = (System.WinForms.ImageListStreamer) resources.GetObject ("imageListbw.ImageStream");

   imageListbw.ColorDepth = System.WinForms.ColorDepth.Depth8Bit;

   imageListbw.TransparentColor = System.Drawing.Color.Yellow;

   this.Text = "FiveForm";

   this.MaximizeBox = false;

   this.AutoScaleBaseSize = new System.Drawing.Size (6, 14);

   this.BorderStyle = System.WinForms.FormBorderStyle.FixedSingle;

   this.BackgroundImage = (System.Drawing.Image) resources.GetObject ("$this.BackgroundImage");

   this.TransparencyKey = System.Drawing.Color.White;

   this.ClientSize = new System.Drawing.Size (314, 311);

  }



        /// <summary>

        /// The main entry point for the application.

        /// </summary>

        public static int Main(string[] args)

        {

            Application.Run(new FiveForm());

   return 0;

        }

    }

}
       
       
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved