C#图形化界面--L型骨牌

这个是兰州交大的CShap(C#)作业题,刚开始自己陷入误区了,第一天做时没耐心了,今天花了2个多小时写了这个L型骨牌的覆盖程序

命令行的骨牌实现可以在我的博客里找到

下面是图形化界面的L型骨牌实现

具体实现思路:

利用矩形数组和二维数组,核心的算法是二维数组也就是命令行的L型骨牌,然后利用数值的不同画出不同颜色的方块

核心的算法

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace L骨牌
{
    public partial class Form1 : Form
    {
        Graphics g;
        //定义画刷数组
       // SolidBrush[] brush = { new SolidBrush(Color.Gold), new SolidBrush(Color.Black), new SolidBrush(Color.Yellow), new SolidBrush(Color.DarkBlue), new SolidBrush(Color.Purple), new SolidBrush(Color.Red), new SolidBrush(Color.Blue) ,new SolidBrush(Color.DarkCyan),new SolidBrush(Color.Crimson),new SolidBrush(Color.Green),new SolidBrush(Color.Honeydew),new SolidBrush(Color.LawnGreen)};
        //定义一个数计数brush
       // int count = 0;
        //二位数组
        int[,] board;
        //对应的方块
        Rectangle[,] rect;
        //k
        int k;
        //x
        int x;
        //y
        int y;
        //2^K
        int num;
        
        //画线开始的坐标
        int x0, y0;

        //递归层数
        int n = 1;

        //每次画出的L型骨牌
        int next;
        //定时器
        System.Timers.Timer t;
        //获取一个不同的画刷
        public SolidBrush getSolidBrush()
        {
            long tick = DateTime.Now.Ticks;
            Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));

            SolidBrush sb = new SolidBrush(Color.FromArgb(ran.Next(255),ran.Next(255),ran.Next(255)));
            return sb;
        }
        //构造函数
        public Form1()
        {
            InitializeComponent();
            g = this.CreateGraphics();
        }

        public void resetX0Y0()
        {
            x0 = 10;
            y0 = 10;
        }

        public void initValue()
        {
            k = Int32.Parse(textBox_K.Text);
            x = Int32.Parse(textBox_x.Text);
            y = Int32.Parse(textBox_Y.Text);
            num = (int)Math.Pow(2, k);
            //二维数组
            board = new int[num, num];
            //对应的方块
            rect = new Rectangle[num, num];
            //重置x0和y0
            resetX0Y0();
            //
            next = 1;
        }


        public void drawInitLine()
        {
            //横向画线
            for (int j = 0; j <=num; j++)
            {
                Pen p = new Pen(new SolidBrush(Color.Brown));
                g.DrawLine(p,x0,y0,x0+400,y0);
                y0 += 400 / num;
            }
            //重置x0,y0
            resetX0Y0();
            //竖向画线
            for (int j = 0; j <= num; j++)
            {
                Pen p = new Pen(new SolidBrush(Color.Brown));
                g.DrawLine(p, x0, y0, x0, y0+400);
                x0 += 400 / num;
            }
            //重置x0,y0
            resetX0Y0();
        }
        public void initArray()
        {
            //每个方格的宽度
            int size = 400/num;
            //重置x0,y0
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    rect[i, j] = new Rectangle(x0,y0,size,size);
                    
                    y0 += size;
                }
                x0 += size;
                y0 = 10;
            }

            //////////////
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    board[i, j] = 0;
                }
            }
        }
        //public   void chess_Board( int dr, int dt, int pr, int pt, int size)
        //{
        //    if (size == 1)  return;//当规模为一时,不需要做任何的改变了

        //    int t = n++;
        //    int tsize = size / 2;//每一次棋盘大小变成原来的1/4 

        //    //棋盘分为四大区域
        //    //最先处理了特殊方块位于左上方的
        //    if (pr < dr + tsize && pt < dt + tsize)
        //    {
        //        //左上方的
        //        chess_Board(dr, dt, pr, pt, tsize);
        //    }
        //    else
        //    {
        //        //左上方的
        //        board[dr + tsize - 1,dt + tsize - 1] = t;
        //        chess_Board(dr, dt, dr + tsize - 1, dt + tsize - 1, tsize);
        //    }
        //    //特殊方块位于右上方
        //    if (pr < dr + tsize && pt >= dt + tsize)
        //    {
        //        //右上方
        //        chess_Board(dr, dt + size, pr, pt, tsize);
        //    }
        //    else
        //    {
        //        //右上方
        //        board[dr + tsize - 1,dt + tsize] = t;
        //        chess_Board(dr, dt + tsize, dr + tsize - 1, dt + tsize, tsize);
        //    }

        //    //特殊方块位于左下方

        //    if (pr >= dr + tsize && pt < dt + tsize)
        //    {
        //        //左下方
        //        chess_Board(dr + tsize, dt, pr, pt, tsize);
        //    }
        //    else
        //    {
        //        //左下方
        //        board[dr + tsize,dt + tsize - 1] = t;
        //        chess_Board( dr + tsize, dt, dr + tsize, dt + tsize - 1, tsize);
        //    }


        //    //特殊方块位于右下方

        //    if (pr >= dr + tsize && pt >= dt + tsize)
        //    {
        //        //右下方
        //        chess_Board(dr + tsize, dt + tsize, pr, pt, tsize);
        //    }
        //    else
        //    {
        //        //右下方
        //        board[dr + tsize,dt + tsize] = t;
        //        chess_Board( dr + tsize, dt + tsize, dr + tsize, dt + tsize, tsize);
        //    }
        //}
        private void ChessBoard(int tr, int tc, int x, int y, int s)
        {

            //算法主体

            if (s == 1) return;

            int si = s / 2, t = n++;

            //覆盖左上角子棋盘
            if (x < tr + si && y < tc + si)
                //特殊方格在此棋盘中
                ChessBoard(tr, tc, x, y, si);
            else
            {  //此棋盘中无特殊方格
                //用L形骨牌覆盖左上角
                board[tr + si - 1, tc + si - 1] = t;
                //覆盖其余方格
                ChessBoard(tr, tc, tr + si - 1, tc + si - 1, si);
            }

            //覆盖右上角子棋盘
            if (x < tr + si && y >= tc + si)
                //特殊方格在此棋盘中
                ChessBoard(tr, tc + si, x, y, si);
            else
            {  //此棋盘中无特殊方格
                //用L形骨牌覆盖左下角
                board[tr + si - 1, tc + si] = t;
                //覆盖其余方格
                ChessBoard(tr, tc + si, tr + si - 1, tc + si, si);
            }

            //覆盖左下角子棋盘
            if (x >= tr + si && y < tc + si)
                //特殊方格在此棋盘中
                ChessBoard(tr + si, tc, x, y, si);
            else
            {  //此棋盘中无特殊方格
                //用L形骨牌覆盖右上角
                board[tr + si, tc + si - 1] = t;
                //覆盖其余方格
                ChessBoard(tr + si, tc, tr + si, tc + si - 1, si);
            }

            //覆盖右下角子棋盘
            if (x >= tr + si && y >= tc + si)
                //特殊方格在此棋盘中
                ChessBoard(tr + si, tc + si, x, y, si);
            else
            {  //此棋盘中无特殊方格
                //用L形骨牌覆盖左上角
                board[tr + si, tc + si] = t;
                //覆盖其余方格
                ChessBoard(tr + si, tc + si, tr + si, tc + si, si);
            }
        }

        public void drawSpecialRect()
        {
            g.FillRectangle(getSolidBrush(), rect[x - 1, y - 1]);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            initValue();
            drawInitLine();
            initArray();
            drawSpecialRect();
            ChessBoard(0, 0, x - 1, y - 1, num);
            next = getMin();
          //  MessageBox.Show("" + board[4, 5]);
            showArray();
        }

        public int getMax()
        {
            int max = board[0, 0];
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    if (board[i, j] > max)
                    {
                        max = board[i, j];
                    }
                }
            }
            return max;
        }
        public int getMin()
        {
            int min = board[0, 0];
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    if (board[i, j] < min)
                    {
                        min = board[i, j];
                    }
                }
            }
            return min;
        }

        public void showArray()
        {
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    Console.Write("" + board[i, j]+"\t");
                }
                Console.WriteLine();
            }
            Console.WriteLine("///////////////////////////////");
        }
        public void drawRectNext()
        {
            int max = getMax();
            if (next > max)
            {
                MessageBox.Show("客官,已经画完了");
                return;
            }
           // int count = 1;
            //bool t = true;
            SolidBrush sb = getSolidBrush();
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    if (board[i, j] == next)
                    {
                       // MessageBox.Show("I:" + i + "\n J:"+j);
                        if (i == x-1 && j == y-1)
                        {
                            continue;
                        }
                        //if (count>3&&t==true)
                        //{
                        //    sb = getSolidBrush();
                        //    t = false;
                        //}
                        g.FillRectangle(sb, rect[i, j]);
                        //count++;
                    }
                }
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            drawRectNext();
            next++;
        }

        public bool drawRectNextOnTimer()
        {
            int max = getMax();
            if (next > max)
            {
                //drawInitLine();
                t.Enabled = false;
                MessageBox.Show("动态绘制完毕");
                
                
                return true;
            }
            // int count = 1;
            //bool t = true;
            SolidBrush sb = getSolidBrush();
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    if (board[i, j] == next)
                    {
                        // MessageBox.Show("I:" + i + "\n J:"+j);
                        if (i == x - 1 && j == y - 1)
                        {
                            continue;
                        }
                        //if (count>3&&t==true)
                        //{
                        //    sb = getSolidBrush();
                        //    t = false;
                        //}
                        g.FillRectangle(sb, rect[i, j]);
                        //count++;
                    }
                }
            }
            return false;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            t= new System.Timers.Timer(1000);

            t.Elapsed += new System.Timers.ElapsedEventHandler(drawL);

            t.Enabled = true;
            t.AutoReset = true;

            int min = getMin();
            int max = getMax();
            next = min;
        }

        public void drawL(object source, System.Timers.ElapsedEventArgs e)
        {
            //MessageBox.Show("时间到");
            drawRectNextOnTimer();
            next++;
        }


    }
}


我使用的是VS2013

下面是下载连接

http://download.csdn.net/detail/jackhall/8817479

http://download.csdn.net/detail/jackhall/8871083


你可能感兴趣的:(C/C++经典,算法分析)