C# 开发2048小游戏

C# 开发2048小游戏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() + "\t" + e.Exception.Message + Environment.NewLine);

        }



        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)

        {

            File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "Exception.log", DateTime.Now.ToString() + "\t" + 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 + "\r\n  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 + "\r\n  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 + "\r\n  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 + "\r\n  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做的打飞机小游戏,是真正的打飞机,不要想歪了,呵呵。

你可能感兴趣的:(C#)