using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace FiveChess
{
    public partial class Form1 : Form
    {
        private int Player = 1;
        private string game = "";
        private int [,]Position=new int[15,15];
        private int count = 0;        public Form1()
        {
            InitializeComponent();
        }        private void Change()
        {
            for(int i=0;i<15;++i)
                for(int j=0;j<15;++j)
                    Position[i,j]=2;    //2表示空地,1表示黑棋,0表示白棋
        }        protected override void OnPaint(PaintEventArgs e) //画棋盘
        {
            Point StartPoint = new Point(30, 50);
            Pen BlackPen = new Pen(Brushes.Black);
            BlackPen.Width = 1.5F;
            for (int i = 0; i < 15; ++i)         //行
            {
                e.Graphics.DrawLine(BlackPen, new Point(30, 50 + 30 * i), new Point(450, 50 + 30 * i));
            }
            for (int i = 0; i < 15; ++i)         //列
            {
                e.Graphics.DrawLine(BlackPen, new Point(30 + 30 * i, 50), new Point(30 + 30 * i, 470));
            }
            BlackPen.Dispose();
            e.Graphics.Dispose();
        }
        private void Form1_MouseClick(object sender, MouseEventArgs e)       //下棋
        {
            Graphics g = this.CreateGraphics();
            if (e.X < 465 && e.X > 20 && e.Y < 485 && e.Y > 40 && e.X % 30 <= 15 && (e.Y - 50) % 30 <= 15 && game == "开始")
            {
                PaintChess(g, e.X - e.X % 30, e.Y - (e.Y - 50) % 30);
            }
            g.Dispose();
        }        private void PaintChess(Graphics g, int x, int y)              //画棋子
        {
            Brush BrushChess;
            if (Position[x / 30 - 1, (y - 50) / 30] == 2)
            {
                if (Player == 1)
                {
                    BrushChess = new SolidBrush(Color.Black);
                    Position[x / 30 - 1, (y - 50) / 30] = 1;
                    g.FillEllipse(BrushChess, x - 10, y - 10, 20, 20);
                    this.labelPlayer.Text = "白";
                    BrushChess.Dispose();
                }
                else
                {
                    BrushChess = new SolidBrush(Color.White);
                    Position[x / 30 - 1, (y - 50) / 30] = 0;
                    g.FillEllipse(BrushChess, x - 10, y - 10, 20, 20);
                    this.labelPlayer.Text = "黑";
                    BrushChess.Dispose();
                }
                CheckResult(x / 30 - 1, (y - 50) / 30);
                count++;
                Player = (Player + 1) % 2;
            }
            else
                MessageBox.Show("此处已有棋子,请在空处下棋子");
            g.Dispose();
        }

        private void CheckResult(int x,int y)   //此处所说的棋盘不是窗口上面的棋盘,而是按照数学中直角坐标系构建的棋盘
        {
            int n,a,b;
            a = x;
            b = y;            //检查行
            n = 0;
            for (a = x ; a >= 0; --a)      //检查左边
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            for (a = x ; a < 15; ++a)   //检查右边
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            if (n > 5)
            {
                Win(Player);
                return;
             }            //检查列,下,上。
            n = 0; a = x;
            for (b = y ; b >= 0; --b)
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            for (b = y ; b < 15;++b )
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            if (n > 5)
            {
                Win(Player);
                return;
            }            //检查左斜线
            n = 0;
            for (a = x , b = y; a < 15 && b <15; a++, b++)//检查左斜线的上半截
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            for (a = x, b = y ; a >= 0 && b >=0; a--, b--)//检查左斜线的下半截
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            if (n > 5)
            {
                Win(Player);
                return;
            }            //检查右斜线
            n = 0;
            for (a=x , b=y ; a >= 0 && b <15; a--, b++)//检查右斜线的上半截
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            for (a = x, b = y ; a <15 && b >=0; a++, b--)//检查右斜线的下半截
            {
                if (Position[a, b] == Player)
                    ++n;
                else
                    break;
            }
            if (n > 5)
            {
                Win(Player);
                return;
            }
        }        private void Win(int w)
        {
            if (count == 225)
                MessageBox.Show("本局平手!");
            else
            {
                if (w == 1)
                    MessageBox.Show("本局黑棋获胜!");
                if (w == 0)
                    MessageBox.Show("本局白棋获胜!");
            }
            Application.Exit();
        }        private void 开始ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            game = "开始";
            this.labelPlayer.Text = "黑";
            Change();
        }        private void 结束ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("是否确定退出游戏?", "选择", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                Application.Exit();
        }        private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string output;
            output="规则简单,大家都知道,在此不多说。\r\n";
            output += "由于技术浅薄,本游戏暂时不支持悔棋。\r\n";
            output += "感谢各位朋友对作者精神和技术上的帮助!!不胜感激!!\r\n";
            MessageBox.Show(output);
        }
    }
}代码如上,当最小化或者窗口被别的窗口遮盖住之后,所遮盖部分的棋子就会被清除,但是棋盘不会被清除。我想,如果把画棋子的那部分也加到OnPain里面的话,那每下一次棋子就要重新画之前的每个棋子,很麻烦。不知道又没有别的和OnPaint类似的函数,可以让棋子不被覆盖。
我是初学者,刚刚大三,纯属自学,又没有获得哪个的亲自指导,非常多非常多的东西还不懂,希望高手帮忙解决一下。而且我也没多少分可以给,希望大家就当是做点好事,帮帮我。

解决方案 »

  1.   

    把画棋子也放到OnPaint里(先棋盘然后棋子)。
      

  2.   

    有没有别的方法啊?我觉得都放到onpaint里面太麻烦了,之前每一个棋子都要画。请问有没有别的方法啊
      

  3.   

    必须放到onpaint里,最大化时必须重画,最大化后不是每一个棋子都要重画
      

  4.   

    http://user.qzone.qq.com/490257094/infocenter
    这里有我写的一个五子棋程序.没加注释,看起来可能有点吃力.慢慢看啊.祝你好运啊!
      

  5.   

    大致思路就是在Form1_Paint里调用画棋子的函数!