• C# 开发2048小游戏


      这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了。

    更改建议:

    a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的。代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小。

    b.玩游戏的时候,使用方向键移动时,焦点可能没有锁定在自定义控件的画布上,能不能使用方向键移动时,锁定画布?答案是可以的,不敢说出来,因为很简单,说出来就不值得提出这个问题让Reader来做了(哈哈)。

    c.还有几条,真的记不住了,唉,老亦。

      其实不难,就是多了点,杂了点,喜欢的可以拉走做毕业设计用,如果要说这里面有什么值得看的地方,我觉得应该没有吧,毕竟做的仓促,也没好好的修改。

    1.应用程序的主入口点:文件名Program.cs,这个简单,可以略过

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.IO;
    
    namespace _2048
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
    
            static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
            {
                File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "Exception.log", DateTime.Now.ToString() + "	" + e.Exception.Message + Environment.NewLine);
            }
    
            static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "Exception.log", DateTime.Now.ToString() + "	" + e.ExceptionObject.ToString() + Environment.NewLine);
            }
        }
    }

    2.用到的数据模型:文件名Unit.cs,这个简单,可以略过

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace _2048
    {
        public class Unit
        {
            public Unit()
            { 
            
            }
    
            public Unit(int num, bool bMerge)
            {
                this._num = num;
                this._bMerge = bMerge;
            }
    
            private int _num = 0;
    
            public int Num
            {
                get { return _num; }
                set { _num = value; }
            }
    
            private bool _bMerge = false;
    
            public bool BMerge
            {
                get { return _bMerge; }
                set { _bMerge = value; }
            }
    
            //private int _x = 0;
    
            //public int X
            //{
            //    get { return _x; }
            //    set { _x = value; }
            //}
    
            //private int _y = 0;
    
            //public int Y
            //{
            //    get { return _y; }
            //    set { _y = value; }
            //}
        }
    }

    3.自定义控件和算法(设计器和后台文件已合并):文件名GridControl.cs,整个程序的核心内容都在这个文件里,包括2048游戏算法、自定义控件的伸缩、方向键移动控制等等吧,后半部分不用看了,设计器自动生成的,不可或缺,没什么嚼劲。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace _2048
    {
        public partial class GridControl : UserControl
        {
            /*
             * 判断结束的必要条件:
             * 无论如何移动(上、下、左、右),矩阵中没有空着的位置时,结束
             * 
             * 
             *1. 初始化参数,初始化数量3
             *2. 每次移动,相同数字合并加分
             *3. 每次移动,在移动后的随机空格位置处产生一个新数
             */
            private int _x = 0;
    
            public int X
            {
                get { return _x; }
                set
                {
                    _x = value;
                    CreateTextBox();
                }
            }
    
            private int _y = 0;
    
            public int Y
            {
                get { return _y; }
                set
                {
                    _y = value;
                    CreateTextBox();
                }
            }
    
            private Unit[][] _matrix = null;
            private Random rand = new Random(DateTime.Now.Millisecond);
            private int _score = 0;
    
            public int Score
            {
                get { return _score; }
                set { _score = value; }
            }
    
            public GridControl()
            {
                InitializeComponent();
            }
    
            public void InitControl()
            {
                /*初始化矩阵图,以下三个方法的顺序不能颠倒*/
                this.InitMatrix();
                this.InitParamter();
                this.InputData();
            }
    
            #region MyRegion
    
            private void CreateTextBox()
            {
                this.flowLayoutPanel1.Controls.Clear();
                this.Size = new System.Drawing.Size(78 * _x + 4, 78 * _y + 4);
    
                 for (int j = 0; j < _y; j++)
                 {
                     for (int i = 0; i < _x; i++)
                     {
                        TextBox textBox = new TextBox();
                        textBox.BackColor = System.Drawing.Color.White;
                        textBox.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                        textBox.Location = new System.Drawing.Point(6, 6);
                        textBox.Name = "textBox" + i.ToString() + j.ToString();
                        textBox.ReadOnly = true;
                        textBox.Size = new System.Drawing.Size(71, 71);
                        textBox.TabIndex = 0;
                        textBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                        this.flowLayoutPanel1.Controls.Add(textBox);
                    }
                }
            }
    
            /// <summary>
            /// 初始化矩阵
            /// </summary>
            private void InitMatrix()
            {
                _matrix = new Unit[_x][];
    
                for (int i = 0; i < _x; i++)
                {
                    _matrix[i] = new Unit[_y];
    
                    for (int j = 0; j < _y; j++)
                    {
                        _matrix[i][j] = new Unit();
                    }
                }
    
                this._score = 0;
            }
    
            /// <summary>
            /// 初始化参数
            /// </summary>
            private void InitParamter()
            {
                //创建三个初始参数
                for (int i = 0; i < 3; i++)
                {
                    CreateOneNum();
                }
            }
    
            private int CountEmpty()
            {
                int iReturn = 0;
    
                for (int i = 0; i < _x; i++)
                {
                    for (int j = 0; j < _y; j++)
                    {
                        if (_matrix[i][j].Num == 0)
                            iReturn++;
                    }
                }
    
                return iReturn;
            }
    
            /// <summary>
            /// 根据矩阵表填充显示数据
            /// </summary>
            private void InputData()
            {
                for (int i = 0; i < _x; i++)
                {
                    for (int j = 0; j < _y; j++)
                    {
                        string name = "textBox" + i.ToString() + j.ToString();
                        Control[] ctls = this.flowLayoutPanel1.Controls.Find(name, false);
                        if (ctls != null)
                        {
                            switch (_matrix[i][j].Num)
                            {
                                default:
                                case 0:
                                    {
                                        ctls[0].Text = string.Empty;
                                        ctls[0].BackColor = Color.White;
                                    } break;
    
                                case 2:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.BurlyWood;
                                    } break;
    
                                case 4:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.DeepPink;
                                    } break;
    
                                case 8:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.BlueViolet;
                                    } break;
    
                                case 16:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.Chartreuse;
                                    } break;
    
                                case 32:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.Crimson;
                                    } break;
    
                                case 64:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.DarkGray;
                                    } break;
    
                                case 128:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.DarkOliveGreen;
                                    } break;
    
                                case 256:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.DarkSalmon;
                                    } break;
    
                                case 512:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.DarkSlateGray;
                                    } break;
    
                                case 1024:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.GreenYellow;
                                    } break;
    
                                case 2048:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.DodgerBlue;
                                    } break;
    
                                case 4096:
                                    {
                                        ctls[0].Text = _matrix[i][j].Num.ToString();
                                        ctls[0].BackColor = Color.Black;
                                    } break;
                            }
                        }
                    }
                }
                
            }
    
            /// <summary>
            /// 游戏是否不能进行
            /// </summary>
            /// <returns>是否能进行</returns>
            private bool CheckGameOver()
            {
                int countEmpty = CountEmpty();
                if (countEmpty == 0)
                {
                    for (int i = 0; i < _x; i++)
                    {
                        Unit[] arr = new Unit[_y];
    
                        for (int j = 0; j < _y; j++)
                            arr[j] = new Unit(_matrix[i][j].Num, false);
    
                        if (Result(ref arr, true))
                            return true;
                    }
    
                    for (int i = 0; i < _x; i++)
                    {
                        Unit[] arr = new Unit[_y];
    
                        for (int j = _y - 1; j >= 0; j--)
                            arr[_y - 1 - j] = new Unit(_matrix[i][j].Num, false);
    
                        if (Result(ref arr, true))
                            return true;
                    }
    
                    for (int i = 0; i < _y; i++)
                    {
                        Unit[] arr = new Unit[_x];
    
                        for (int j = 0; j < _x; j++)
                            arr[j] = new Unit(_matrix[j][i].Num, false);
    
                        if (Result(ref arr, true))
                            return true;
                    }
    
                    for (int i = 0; i < _y; i++)
                    {
                        Unit[] arr = new Unit[_x];
    
                        for (int j = _x - 1; j >= 0; j--)
                            arr[_x - 1 - j] = new Unit(_matrix[j][i].Num, false);
    
                        if (Result(ref arr, true))
                            return true;
                    }
                    return false;
                }
    
                return true;
            }
    
            private void CreateOneNum()
            {
                int countEmpty = CountEmpty();
                int pos = rand.Next(countEmpty);
                int count = 0;
    
                for (int i = 0; i < _x; i++)
                {
                    for (int j = 0; j < _y; j++)
                    {
                        if (_matrix[i][j].Num == 0)
                        {
                            if (count == pos)
                            {
                                int newNum = 0;
                                if (rand.Next(100) < 80)
                                    newNum = 2;
                                else
                                    newNum = 4;
                                _matrix[i][j].Num = newNum;
    
                                return;
                            }
                            count++;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 核心算法
            /// </summary>
            /// <param name="arr"></param>
            /// <returns></returns>
            private bool Result(ref Unit[] arr, bool istest)
            {
                bool bReturn = false;
    
                while (true)
                {
                    //是否发生移动
                    bool bMove = false;
    
                    //前一个单元
                    Unit unit = arr[0];
    
                    for (int i = 1; i < arr.Length; i++)
                    {
                        //如果前面位置为空,当前位置不为空,把当前位置移入前面位置
                        if (unit.Num == 0 && arr[i].Num > 0)
                        {
                            //移动到前一个单元
                            unit.Num = arr[i].Num;
                            unit.BMerge = arr[i].BMerge;
    
                            //当前单元清空
                            arr[i].Num = 0;
                            arr[i].BMerge = false;
    
                            //移动了才能进入循环
                            if (!bMove)
                            {
                                bMove = true;
                                if (!bReturn)
                                    bReturn = true;
                            }
                        }
    
                        //如果前面不为空,当前不为空,前面和当前的数字相同并且都没有进行过合并
                        else if (unit.Num > 0 && arr[i].Num > 0
                            && !unit.BMerge && !arr[i].BMerge
                                && unit.Num == arr[i].Num)
                        {
                            //前一个单元合并操作
                            unit.Num = unit.Num * 2;
                            unit.BMerge = true;
    
                            if (!istest)
                                _score += unit.Num;
    
                            //当前单元清空
                            arr[i].Num = 0;
                            arr[i].BMerge = false;
    
                            //移动了才能进入循环
                            if (!bMove)
                            {
                                bMove = true;
                                if (!bReturn)
                                    bReturn = true;
                            }
                        }
    
                        unit = arr[i];
                    }
                    if (!bMove)
                        break;
                }
    
                return bReturn;
            }
    
            #endregion
    
            internal void MoveUp()
            {
                bool bMove = false;
    
                for (int i = 0; i < _x; i++)
                {
                    Unit[] arr = new Unit[_y];
    
                    for (int j = 0; j < _y; j++)
                    {
                        arr[j] = _matrix[i][j];
                        arr[j].BMerge = false;
                    }
                    if (Result(ref arr, false) && !bMove)
                        bMove = true;
                }
                if (bMove)
                {    //创建一个新数
                    CreateOneNum();
                }
    
                //显示
                InputData();
    
                if (!CheckGameOver())
                    MessageBox.Show(" Score: " + _score + "
      Game Over!!!");
            }
    
            internal void MoveDown()
            {
                bool bMove = false;
    
                for (int i = 0; i < _x; i++)
                {
                    Unit[] arr = new Unit[_y];
    
                    for (int j = _y - 1; j >= 0; j--)
                    {
                        arr[_y - 1 - j] = _matrix[i][j];
                        arr[_y - 1 - j].BMerge = false;
                    }
                    if (Result(ref arr, false) && !bMove)
                        bMove = true;
                }
    
                if (bMove)
                {    //创建一个新数
                    CreateOneNum();
                }
                //显示
                InputData();
    
                if (!CheckGameOver())
                    MessageBox.Show(" Score: " + _score + "
      Game Over!!!");
            }
    
            internal void MoveLeft()
            {
                bool bMove = false;
    
                for (int i = 0; i < _y; i++)
                {
                    Unit[] arr = new Unit[_x];
    
                    for (int j = 0; j < _x; j++)
                    {
                        arr[j] = _matrix[j][i];
                        arr[j].BMerge = false;
                    }
                    if (Result(ref arr, false) && !bMove)
                        bMove = true;
                }
    
                if (bMove)
                {    //创建一个新数
                    CreateOneNum();
                }
                //显示
                InputData();
    
                if (!CheckGameOver())
                    MessageBox.Show(" Score: " + _score + "
      Game Over!!!");
            }
    
            internal void MoveRight()
            {
                bool bMove = false;
    
                for (int i = 0; i < _y; i++)
                {
                    Unit[] arr = new Unit[_x];
    
                    for (int j = _x - 1; j >= 0; j--)
                    {
                        arr[_x - 1 - j] = _matrix[j][i];
                        arr[_x - 1 - j].BMerge = false;
                    }
                    if (Result(ref arr, false) && !bMove)
                        bMove = true;
                }
    
                if (bMove)
                {    //创建一个新数
                    CreateOneNum();
                }
                //显示
                InputData();
    
                if (!CheckGameOver())
                    MessageBox.Show(" Score: " + _score + "
      Game Over!!!");
            }
    
            internal void Back()
            {
    
            }
    
            private System.ComponentModel.IContainer components = null;
    
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            private void InitializeComponent()
            {
                this.textBox00 = new System.Windows.Forms.TextBox();
                this.textBox10 = new System.Windows.Forms.TextBox();
                this.textBox20 = new System.Windows.Forms.TextBox();
                this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
                this.textBox30 = new System.Windows.Forms.TextBox();
                this.textBox01 = new System.Windows.Forms.TextBox();
                this.textBox11 = new System.Windows.Forms.TextBox();
                this.textBox21 = new System.Windows.Forms.TextBox();
                this.textBox31 = new System.Windows.Forms.TextBox();
                this.textBox02 = new System.Windows.Forms.TextBox();
                this.textBox12 = new System.Windows.Forms.TextBox();
                this.textBox22 = new System.Windows.Forms.TextBox();
                this.textBox32 = new System.Windows.Forms.TextBox();
                this.textBox03 = new System.Windows.Forms.TextBox();
                this.textBox13 = new System.Windows.Forms.TextBox();
                this.textBox23 = new System.Windows.Forms.TextBox();
                this.textBox33 = new System.Windows.Forms.TextBox();
                this.flowLayoutPanel1.SuspendLayout();
                this.SuspendLayout();
                // 
                // textBox00
                // 
                this.textBox00.BackColor = System.Drawing.Color.White;
                this.textBox00.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox00.Location = new System.Drawing.Point(6, 6);
                this.textBox00.Name = "textBox00";
                this.textBox00.ReadOnly = true;
                this.textBox00.Size = new System.Drawing.Size(71, 71);
                this.textBox00.TabIndex = 0;
                this.textBox00.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox10
                // 
                this.textBox10.BackColor = System.Drawing.Color.White;
                this.textBox10.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox10.Location = new System.Drawing.Point(83, 6);
                this.textBox10.Name = "textBox10";
                this.textBox10.ReadOnly = true;
                this.textBox10.Size = new System.Drawing.Size(71, 71);
                this.textBox10.TabIndex = 3;
                this.textBox10.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox20
                // 
                this.textBox20.BackColor = System.Drawing.Color.White;
                this.textBox20.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox20.Location = new System.Drawing.Point(160, 6);
                this.textBox20.Name = "textBox20";
                this.textBox20.ReadOnly = true;
                this.textBox20.Size = new System.Drawing.Size(71, 71);
                this.textBox20.TabIndex = 4;
                this.textBox20.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // flowLayoutPanel1
                // 
                this.flowLayoutPanel1.Controls.Add(this.textBox00);
                this.flowLayoutPanel1.Controls.Add(this.textBox10);
                this.flowLayoutPanel1.Controls.Add(this.textBox20);
                this.flowLayoutPanel1.Controls.Add(this.textBox30);
                this.flowLayoutPanel1.Controls.Add(this.textBox01);
                this.flowLayoutPanel1.Controls.Add(this.textBox11);
                this.flowLayoutPanel1.Controls.Add(this.textBox21);
                this.flowLayoutPanel1.Controls.Add(this.textBox31);
                this.flowLayoutPanel1.Controls.Add(this.textBox02);
                this.flowLayoutPanel1.Controls.Add(this.textBox12);
                this.flowLayoutPanel1.Controls.Add(this.textBox22);
                this.flowLayoutPanel1.Controls.Add(this.textBox32);
                this.flowLayoutPanel1.Controls.Add(this.textBox03);
                this.flowLayoutPanel1.Controls.Add(this.textBox13);
                this.flowLayoutPanel1.Controls.Add(this.textBox23);
                this.flowLayoutPanel1.Controls.Add(this.textBox33);
                this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
                this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 0);
                this.flowLayoutPanel1.Name = "flowLayoutPanel1";
                this.flowLayoutPanel1.Padding = new System.Windows.Forms.Padding(3);
                this.flowLayoutPanel1.Size = new System.Drawing.Size(315, 316);
                this.flowLayoutPanel1.TabIndex = 9;
                // 
                // textBox30
                // 
                this.textBox30.BackColor = System.Drawing.Color.White;
                this.textBox30.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox30.Location = new System.Drawing.Point(237, 6);
                this.textBox30.Name = "textBox30";
                this.textBox30.ReadOnly = true;
                this.textBox30.Size = new System.Drawing.Size(71, 71);
                this.textBox30.TabIndex = 5;
                this.textBox30.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox01
                // 
                this.textBox01.BackColor = System.Drawing.Color.White;
                this.textBox01.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox01.Location = new System.Drawing.Point(6, 83);
                this.textBox01.Name = "textBox01";
                this.textBox01.ReadOnly = true;
                this.textBox01.Size = new System.Drawing.Size(71, 71);
                this.textBox01.TabIndex = 6;
                this.textBox01.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox11
                // 
                this.textBox11.BackColor = System.Drawing.Color.White;
                this.textBox11.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox11.Location = new System.Drawing.Point(83, 83);
                this.textBox11.Name = "textBox11";
                this.textBox11.ReadOnly = true;
                this.textBox11.Size = new System.Drawing.Size(71, 71);
                this.textBox11.TabIndex = 7;
                this.textBox11.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox21
                // 
                this.textBox21.BackColor = System.Drawing.Color.White;
                this.textBox21.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox21.Location = new System.Drawing.Point(160, 83);
                this.textBox21.Name = "textBox21";
                this.textBox21.ReadOnly = true;
                this.textBox21.Size = new System.Drawing.Size(71, 71);
                this.textBox21.TabIndex = 8;
                this.textBox21.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox31
                // 
                this.textBox31.BackColor = System.Drawing.Color.White;
                this.textBox31.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox31.Location = new System.Drawing.Point(237, 83);
                this.textBox31.Name = "textBox31";
                this.textBox31.ReadOnly = true;
                this.textBox31.Size = new System.Drawing.Size(71, 71);
                this.textBox31.TabIndex = 9;
                this.textBox31.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox02
                // 
                this.textBox02.BackColor = System.Drawing.Color.White;
                this.textBox02.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox02.Location = new System.Drawing.Point(6, 160);
                this.textBox02.Name = "textBox02";
                this.textBox02.ReadOnly = true;
                this.textBox02.Size = new System.Drawing.Size(71, 71);
                this.textBox02.TabIndex = 10;
                this.textBox02.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox12
                // 
                this.textBox12.BackColor = System.Drawing.Color.White;
                this.textBox12.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox12.Location = new System.Drawing.Point(83, 160);
                this.textBox12.Name = "textBox12";
                this.textBox12.ReadOnly = true;
                this.textBox12.Size = new System.Drawing.Size(71, 71);
                this.textBox12.TabIndex = 11;
                this.textBox12.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox22
                // 
                this.textBox22.BackColor = System.Drawing.Color.White;
                this.textBox22.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox22.Location = new System.Drawing.Point(160, 160);
                this.textBox22.Name = "textBox22";
                this.textBox22.ReadOnly = true;
                this.textBox22.Size = new System.Drawing.Size(71, 71);
                this.textBox22.TabIndex = 12;
                this.textBox22.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox32
                // 
                this.textBox32.BackColor = System.Drawing.Color.White;
                this.textBox32.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox32.Location = new System.Drawing.Point(237, 160);
                this.textBox32.Name = "textBox32";
                this.textBox32.ReadOnly = true;
                this.textBox32.Size = new System.Drawing.Size(71, 71);
                this.textBox32.TabIndex = 13;
                this.textBox32.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox03
                // 
                this.textBox03.BackColor = System.Drawing.Color.White;
                this.textBox03.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox03.Location = new System.Drawing.Point(6, 237);
                this.textBox03.Name = "textBox03";
                this.textBox03.ReadOnly = true;
                this.textBox03.Size = new System.Drawing.Size(71, 71);
                this.textBox03.TabIndex = 14;
                this.textBox03.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox13
                // 
                this.textBox13.BackColor = System.Drawing.Color.White;
                this.textBox13.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox13.Location = new System.Drawing.Point(83, 237);
                this.textBox13.Name = "textBox13";
                this.textBox13.ReadOnly = true;
                this.textBox13.Size = new System.Drawing.Size(71, 71);
                this.textBox13.TabIndex = 15;
                this.textBox13.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox23
                // 
                this.textBox23.BackColor = System.Drawing.Color.White;
                this.textBox23.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox23.Location = new System.Drawing.Point(160, 237);
                this.textBox23.Name = "textBox23";
                this.textBox23.ReadOnly = true;
                this.textBox23.Size = new System.Drawing.Size(71, 71);
                this.textBox23.TabIndex = 16;
                this.textBox23.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // textBox33
                // 
                this.textBox33.BackColor = System.Drawing.Color.White;
                this.textBox33.Font = new System.Drawing.Font("宋体", 42F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.textBox33.Location = new System.Drawing.Point(237, 237);
                this.textBox33.Name = "textBox33";
                this.textBox33.ReadOnly = true;
                this.textBox33.Size = new System.Drawing.Size(71, 71);
                this.textBox33.TabIndex = 17;
                this.textBox33.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
                // 
                // GridControl
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Controls.Add(this.flowLayoutPanel1);
                this.Name = "GridControl";
                this.Size = new System.Drawing.Size(315, 316);
                this.flowLayoutPanel1.ResumeLayout(false);
                this.flowLayoutPanel1.PerformLayout();
                this.ResumeLayout(false);
    
            }
            private System.Windows.Forms.TextBox textBox20;
            private System.Windows.Forms.TextBox textBox10;
            private System.Windows.Forms.TextBox textBox00;
            private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
            private System.Windows.Forms.TextBox textBox30;
            private System.Windows.Forms.TextBox textBox01;
            private System.Windows.Forms.TextBox textBox11;
            private System.Windows.Forms.TextBox textBox21;
            private System.Windows.Forms.TextBox textBox31;
            private System.Windows.Forms.TextBox textBox02;
            private System.Windows.Forms.TextBox textBox12;
            private System.Windows.Forms.TextBox textBox22;
            private System.Windows.Forms.TextBox textBox32;
            private System.Windows.Forms.TextBox textBox03;
            private System.Windows.Forms.TextBox textBox13;
            private System.Windows.Forms.TextBox textBox23;
            private System.Windows.Forms.TextBox textBox33;
    
        }
    }

    4.Form(设计器和后台文件已合并):事件绑定(可以瞅瞅)、布局大小选择、事件传递到内部等等。

    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 _2048
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                this.comboBox1.SelectedIndex = 0;
    
                this.gridControl1.InitControl();
                this.txtScore.Text = gridControl1.Score.ToString();
    
                BindKeyDown(this);
            }
    
            private void BindKeyDown(Control control)
            {
                control.KeyDown += new KeyEventHandler(ControlKeyDown);
    
                foreach (Control ctl in control.Controls)
                {
                    BindKeyDown(ctl);
                }
            }
    
            private void ControlKeyDown(object sender, KeyEventArgs e)
            {
                lock (this)
                {
                    switch (e.KeyCode)
                    {
                        case Keys.Up:
                            gridControl1.MoveUp();
                            this.txtScore.Text = gridControl1.Score.ToString();
                            break;
    
                        case Keys.Down:
                            gridControl1.MoveDown();
                            this.txtScore.Text = gridControl1.Score.ToString();
                            break;
    
                        case Keys.Left:
                            gridControl1.MoveLeft();
                            this.txtScore.Text = gridControl1.Score.ToString();
                            break;
    
                        case Keys.Right:
                            gridControl1.MoveRight();
                            this.txtScore.Text = gridControl1.Score.ToString();
                            break;
    
                        case Keys.Back:
                            gridControl1.Back();
                            this.txtScore.Text = gridControl1.Score.ToString();
                            break;
                    }
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                this.gridControl1.InitControl();
                this.txtScore.Text = gridControl1.Score.ToString();
            }
    
            private void PaintControl(int x, int y)
            {
                this.gridControl1.X = x;
                this.gridControl1.Y = y;
                this.gridControl1.InitControl();
                this.txtScore.Text = gridControl1.Score.ToString();
                this.Size = new Size(78 * x + 28, 78 * y + 156);
    
                foreach (Control ctl in gridControl1.Controls)
                    BindKeyDown(ctl);
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (comboBox1.Text == "自定义")
                {
                    int x = 4;
                    int y = 4;
    
                    if (!int.TryParse(textBoxX.Text, out x) || x < 4)
                        x = 4;
    
                    if (!int.TryParse(textBoxY.Text, out y) || y < 4)
                        y = 4;
    
                    PaintControl(x, y);
                }
                else
                {
                    switch (comboBox1.Text)
                    {
                        default:
                        case "4 * 4":
                            PaintControl(4, 4);
                            break;
    
                        case "5 * 5":
                            PaintControl(5, 5);
                            break;
    
                        case "4 * 5":
                            PaintControl(4, 5);
                            break;
    
                        case "5 * 4":
                            PaintControl(5, 4);
                            break;
    
                        case "6 * 6":
                            PaintControl(6, 6);
                            break;
                    }
                }
            }
    
            private System.ComponentModel.IContainer components = null;
    
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
            private void InitializeComponent()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.txtScore = new System.Windows.Forms.TextBox();
                this.label9 = new System.Windows.Forms.Label();
                this.gridControl1 = new _2048.GridControl();
                this.comboBox1 = new System.Windows.Forms.ComboBox();
                this.button2 = new System.Windows.Forms.Button();
                this.label1 = new System.Windows.Forms.Label();
                this.textBoxX = new System.Windows.Forms.TextBox();
                this.textBoxY = new System.Windows.Forms.TextBox();
                this.label2 = new System.Windows.Forms.Label();
                this.label3 = new System.Windows.Forms.Label();
                this.label4 = new System.Windows.Forms.Label();
                this.SuspendLayout();
                // 
                // button1
                // 
                this.button1.Location = new System.Drawing.Point(232, 84);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(74, 23);
                this.button1.TabIndex = 1;
                this.button1.Text = "New Game";
                this.button1.UseVisualStyleBackColor = true;
                this.button1.Click += new System.EventHandler(this.button1_Click);
                // 
                // txtScore
                // 
                this.txtScore.BackColor = System.Drawing.Color.White;
                this.txtScore.Font = new System.Drawing.Font("宋体", 15F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.txtScore.Location = new System.Drawing.Point(94, 79);
                this.txtScore.Name = "txtScore";
                this.txtScore.ReadOnly = true;
                this.txtScore.Size = new System.Drawing.Size(123, 30);
                this.txtScore.TabIndex = 17;
                this.txtScore.Text = "0";
                this.txtScore.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
                // 
                // label9
                // 
                this.label9.AutoSize = true;
                this.label9.Font = new System.Drawing.Font("宋体", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
                this.label9.Location = new System.Drawing.Point(12, 88);
                this.label9.Name = "label9";
                this.label9.Size = new System.Drawing.Size(82, 21);
                this.label9.TabIndex = 16;
                this.label9.Text = "Score:";
                // 
                // gridControl1
                // 
                this.gridControl1.Location = new System.Drawing.Point(9, 123);
                this.gridControl1.Name = "gridControl1";
                this.gridControl1.Score = 0;
                this.gridControl1.Size = new System.Drawing.Size(394, 394);
                this.gridControl1.TabIndex = 22;
                this.gridControl1.X = 5;
                this.gridControl1.Y = 5;
                // 
                // comboBox1
                // 
                this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
                this.comboBox1.FormattingEnabled = true;
                this.comboBox1.Items.AddRange(new object[] {
                "4 * 4",
                "5 * 5",
                "4 * 5",
                "5 * 4",
                "6 * 6",
                "自定义"});
                this.comboBox1.Location = new System.Drawing.Point(72, 10);
                this.comboBox1.Name = "comboBox1";
                this.comboBox1.Size = new System.Drawing.Size(81, 20);
                this.comboBox1.TabIndex = 23;
                // 
                // button2
                // 
                this.button2.Location = new System.Drawing.Point(232, 43);
                this.button2.Name = "button2";
                this.button2.Size = new System.Drawing.Size(74, 23);
                this.button2.TabIndex = 24;
                this.button2.Text = "重绘布局";
                this.button2.UseVisualStyleBackColor = true;
                this.button2.Click += new System.EventHandler(this.button2_Click);
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(13, 18);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(53, 12);
                this.label1.TabIndex = 25;
                this.label1.Text = "布局样式";
                // 
                // textBoxX
                // 
                this.textBoxX.Location = new System.Drawing.Point(111, 43);
                this.textBoxX.Name = "textBoxX";
                this.textBoxX.Size = new System.Drawing.Size(28, 21);
                this.textBoxX.TabIndex = 26;
                // 
                // textBoxY
                // 
                this.textBoxY.Location = new System.Drawing.Point(180, 43);
                this.textBoxY.Name = "textBoxY";
                this.textBoxY.Size = new System.Drawing.Size(28, 21);
                this.textBoxY.TabIndex = 27;
                // 
                // label2
                // 
                this.label2.AutoSize = true;
                this.label2.Location = new System.Drawing.Point(94, 48);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(11, 12);
                this.label2.TabIndex = 28;
                this.label2.Text = "x";
                // 
                // label3
                // 
                this.label3.AutoSize = true;
                this.label3.Location = new System.Drawing.Point(164, 48);
                this.label3.Name = "label3";
                this.label3.Size = new System.Drawing.Size(11, 12);
                this.label3.TabIndex = 29;
                this.label3.Text = "y";
                // 
                // label4
                // 
                this.label4.AutoSize = true;
                this.label4.Location = new System.Drawing.Point(14, 48);
                this.label4.Name = "label4";
                this.label4.Size = new System.Drawing.Size(65, 12);
                this.label4.TabIndex = 30;
                this.label4.Text = "自定义布局";
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(410, 519);
                this.Controls.Add(this.label4);
                this.Controls.Add(this.label3);
                this.Controls.Add(this.label2);
                this.Controls.Add(this.textBoxY);
                this.Controls.Add(this.textBoxX);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.button2);
                this.Controls.Add(this.comboBox1);
                this.Controls.Add(this.gridControl1);
                this.Controls.Add(this.txtScore);
                this.Controls.Add(this.label9);
                this.Controls.Add(this.button1);
                this.Name = "Form1";
                this.ShowIcon = false;
                this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                this.Text = "2048小游戏";
                this.ResumeLayout(false);
                this.PerformLayout();
    
            }
    
            private System.Windows.Forms.Button button1;
            private System.Windows.Forms.TextBox txtScore;
            private System.Windows.Forms.Label label9;
            private GridControl gridControl1;
            private System.Windows.Forms.ComboBox comboBox1;
            private System.Windows.Forms.Button button2;
            private System.Windows.Forms.Label label1;
            private System.Windows.Forms.TextBox textBoxX;
            private System.Windows.Forms.TextBox textBoxY;
            private System.Windows.Forms.Label label2;
            private System.Windows.Forms.Label label3;
            private System.Windows.Forms.Label label4;
        }
    }

    修改一下,做个补充,下次有时间,我会发个flash做的打飞机小游戏,是真正的打飞机,不要想歪了,呵呵。

  • 相关阅读:
    低功耗蓝牙(BLE)——概念
    低功耗蓝牙(BLE)——概述
    190923——我目前的居所
    190922——真随笔
    行业——5G
    190901——无题
    190831——关于坚持
    190828-对话体
    190827——两种人
    190826-快乐
  • 原文地址:https://www.cnblogs.com/preacher/p/3905593.html
Copyright © 2020-2023  润新知