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

</pre>这个是兰州交大的CShap(C#)作业题,刚开始自己陷入误区了,第一天做时没耐心了,今天花了2个多小时写了这个L型骨牌的覆盖程序<p></p><p>命令行的骨牌实现可以在我的博客里找到</p><p>下面是图形化界面的L型骨牌实现</p><p>具体实现思路:</p><p>利用矩形数组和二维数组,核心的算法是二维数组也就是命令行的L型骨牌,然后利用数值的不同画出不同颜色的方块</p><p></p><p>核心的算法</p><p></p><pre name="code" class="csharp">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

时间: 2024-10-05 05:00:46

C#图形化界面--L型骨牌的相关文章

Java图形化界面设计——容器(JFrame)

Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类(“JavaFoundationClasses”,JFC),由一些软件包组成.这些软件包主要包括下面一些应用程序接口(API): ·抽象窗口工具集(AWT)(1.1及以上版本). ·Swing构件. ·Java 2D应

二十七、Java图形化界面设计——容器(JFrame)

摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类("JavaFoundationClasses",JFC),由一些软件包组成.这些

java之图形化界面(GUI)

一.概述 用户与计算机进行交换的方式有两种: GLI:Command lin User Interface(命令行用户接口),也就是常见的dos窗口,它需要记住一些常用的命令,操作不直观方便. GUI:Graphical User Interface(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更方便直观. 这两种交换方式就对应两种交互界面:命令行界面和图形化界面. 现在图形化界面是主流. Java为GUI提供的对象都在java.awt和javax.swing这两个包中. Awt和

三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式为:从上到下,从左到右. l  组件放入容器的次序决定了它在容器中的位置. l  容器大小改变时,组件

图形化界面设计软件简要介绍

[摘要]:面向使用者的系统工程设计,其目的是要准确.快速地在设计者和使用者之间传递信息和实现功能,也是优化产品性能来适应大众的操作能力,减轻使用者的认知负担.成功的系统工程设计能使得图形化界面更科学合理,更好地满足使用者的需要.对于开发者而言需要主要如下几个方面:1,对系统工程应用需要有准确的定位:2,利用设计开发软件提高GUI运行速度:3,系统开发时对系统工程的可扩展性和提供文档帮助. 1. 前言: 随着计算机技术的发展,软件技术突飞发展.在工程领域,智能化.自动化的的要求也越来越高.所以对应

Java学习之图形化界面(Swing基础)

Java学习之图形化界面(Swing基础) 一.Java图形化界面发展史 起初在早期的计算机系统中,电脑只提供命令行界面(CLI),现在在Windows中开个DOS窗口,就可以历史足迹,这就是命令行界面在 现在Windows界面中的体现. 后来Apple公司率先在电脑的操作系统中实现了图形化的用户界面(Graphical User Interface,简称GUI),但由于Apple公司封闭的市场策略,自己完成电脑硬件.操作系统.应用软件一条龙的产品,与其它PC不兼容.这使得Apple公司错过了一

python+QT designer 做图形化界面EXE程序

1.安装python 2.安装QT designer 或QT creator 3.打开QT designer 绘制你想要的图形化界面 类似这样 之后将文件保存,以ui后缀形式保存 4.下载安装pyside 直接easy_install 或pip安装 可能会保存,我安装的时候,提示 msvc 版本问题 查看许多国外论坛后,可以选择,pyside网站下载 对应Python版本的 whl安装包,下载成功之后,进入对应目录路径,直接 pip install  *.whl    *为包名 安装成功 5.将

PySide——Python图形化界面入门教程(六)

PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/ 上一个教程中,我们讨论了Qt的QListWidget类,它用来实现简单的单列列表框(list boxes).然而,我们还需要更加灵活的widget来实现列表,Qt为此提供了QListView 来实现多种多样的项.它是一

java工程开发之图形化界面之(第三课)

上面我们讲述了通过JOptionPane进行文本I/O操作,一个是通过JOptionPane来获取的 参考链接:http://blog.sina.com.cn/s/blog_993d254201013pgh.html#cmt_3339216 JOptionPane类 1.属于javax.swing 包. 2.功能:定制四种不同种类的标准对话框. ConfirmDialog 确认对话框.提出问题,然后由用户自己来确认(按"Yes"或"No"按钮) InputDialo