zoukankan      html  css  js  c++  java
  • c#写的五子棋程序,供学习WinForms的鼠标事件和使用GDI+

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


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

    namespace Leimom.FiveChess
    {
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.WinForms;
    using System.Data;
    ///
    /// Summary description for Form1.
    ///
    public class FiveForm : System.WinForms.Form
    {
    ///
    /// Required designer variable.
    ///
    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[i].Size = size;
    pointSquares[i].Offset(9+x*20,6+y*20);
    chessTable[i] = 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[i] = 0;
    }
    this.Invalidate();
    }
    private int GetRectID(Point p)
    {
    //get witch rectangle click
    for(int i = 0;i < 225;i++)
    {
    if(pointSquares[i].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);
    }
    ///
    /// Clean up any resources being used.
    ///
    public override void Dispose()
    {
    base.Dispose();
    components.Dispose();
    }
    ///
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    ///
    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);
    }

    ///
    /// The main entry point for the application.
    ///
    public static int Main(string[] args)
    {
    Application.Run(new FiveForm());
    return 0;
    }
    }
    }


  • 相关阅读:
    you must restart adb and eclipse的相关解决办法
    配有Tesla K40c的服务器新装Ubuntu16.04并安装CUDA8.0、Anaconda3、Matlab2016a、OPENCV3.1、CuDNN5.1、MXNet
    MXNet在64位Win7下的编译安装
    [Kinect]XBox One Kinect连接Windows
    64位Win7下编译Python3的计算机视觉库:OpenCV
    64位Win7下安装并配置Python3的深度学习库:Theano
    Noah的学习笔记之Python篇:命令行解析
    Noah的学习笔记之Python篇:函数“可变长参数”
    Noah的学习笔记之Python篇:装饰器
    linux下安装MySQL5.6记录
  • 原文地址:https://www.cnblogs.com/flyfish/p/80768.html
Copyright © 2011-2022 走看看