public partial class Form1 : Form
    {
        private Rules rules;
        public Form1()
        {
            InitializeComponent();
            timer1.Enabled = true;
            timer1.Interval = 50;
        }        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (rules != null) rules.DrawMain(e.Graphics);
        }        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            if (rules != null) rules.DrawMain(e.Graphics);
        }        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F1)
            {
                if (rules != null)
                {
                    rules.Close();
                    rules = null;
                }
                MyList array = new MyList();
                array.Add_Brick("0000001000011100000000000", Color.Blue);
                array.Add_Brick("0000000000111100000000000", Color.Chocolate);
                array.Add_Brick("0000001000011000010000000", Color.Green);
                array.Add_Brick("0000000100011100000000000", Color.Coral);
                array.Add_Brick("0000000100011000100000000", Color.HotPink);
                array.Add_Brick("0000000000011100100000000", Color.YellowGreen);
                array.Add_Brick("0000000000011000110000000", Color.Violet);
                rules = new Rules(15, 20, array, 20, Color.Black, pictureBox1.CreateGraphics(), pictureBox2.CreateGraphics(), 0, Color.Blue, false);
                rules.Start();
            }
            else 
            {
                if (rules == null || rules.GameOver())
                    return;
                else if (e.KeyCode == Keys.Left) rules.Left();
                else if (e.KeyCode == Keys.Right) rules.Right();
                else if (e.KeyCode == Keys.Up) rules.Rotate();
                else if (e.KeyCode == Keys.Down) rules.Down();
                else if (e.KeyCode == Keys.Space) rules.DropDown();
            }
        }        class Brick //方块基本元素
        {
            private Point[] brick_point; //方块坐标数组
            private Color brick_color; //方块
            private Color backgroud_color; //背景颜色
            private int size; //像素
            private SolidBrush brick_brush; //着色刷            public Brick(Point[] brick_point, Color brick_color, Color backgroud_color, int size)
            {
                this.brick_point = brick_point;
                this.brick_color = brick_color;
                this.backgroud_color = backgroud_color;
                this.size = size;
                this.brick_brush = new SolidBrush(this.brick_color);
            }
            public int X 
            {
                get {  return 0; }
                set 
                {
                   for (int i = 0; i < brick_point.Length; i++)
                    {                        brick_point[i].X = brick_point[i].X + value;
                    } 
                } 
            }
            public int Y //用于从外部获取点的坐标并修改
            {
                get { return 0; }
                set
                {
                    for (int i = 0; i < brick_point.Length; i++)
                    {                        brick_point[i].Y = brick_point[i].Y + value;
                    } 
                }  
            } 
            public Point[] Points { get { return brick_point; } } //用于外部获取point坐标
            public Color Colors { get { return brick_color; } }
            public void Clockwise( ) //顺时针旋转90°
            {
                int temp, i;
                int a = brick_point[2].X;
                int b = brick_point[2].Y;
                for (i = 0; i < brick_point.Length; i++)
                {
                    brick_point[i].X = brick_point[i].X - a;
                    brick_point[i].Y = brick_point[i].Y - b;
                }
                for ( i = 0; i < brick_point.Length; i++)
                {
                    temp = brick_point[i].X;
                    brick_point[i].X = -brick_point[i].Y;
                    brick_point[i].Y = temp;
                }
                for (i = 0; i < brick_point.Length; i++)
                {
                    brick_point[i].X = brick_point[i].X + a;
                    brick_point[i].Y = brick_point[i].Y + b;
                }            }
            public void Anticlockwise() //逆时针旋转90°
            {
                int temp, i;
                int a = brick_point[2].X;
                int b = brick_point[2].Y;
                for (i = 0; i < brick_point.Length; i++)
                {
                    brick_point[i].X = brick_point[i].X - a;
                    brick_point[i].Y = brick_point[i].Y - b;
                }
                for (i = 0; i < brick_point.Length; i++)
                {
                    temp = brick_point[i].Y;
                    brick_point[i].Y = -brick_point[i].X;
                    brick_point[i].X = temp;
                }
                for (i = 0; i < brick_point.Length; i++)
                {
                    brick_point[i].X = brick_point[i].X + a;
                    brick_point[i].Y = brick_point[i].Y + b;
                }            }
            public void Draw(Graphics photo) //画俄罗斯方块
            {
                foreach (Point p in brick_point)
                {
                    lock (photo)
                    {
                        photo.FillRectangle(brick_brush, ToRectangle(p));
                    }
                }
            }
            public void Erase(Graphics photo) //擦俄罗斯方块
            {
                using (SolidBrush sb = new SolidBrush(backgroud_color))
                {
                    foreach (Point p in brick_point)
                    {
                        lock (photo)
                        {
                            photo.FillRectangle(sb, ToRectangle(p));
                        }
                    }
                }
            }
            private Rectangle ToRectangle(Point p) //生成矩形
            {
                Rectangle a = new Rectangle( p.X * size + 1,  p.Y * size + 1, size - 2, size - 2);
                return a;
            }
        }
        class Template //方块样式信息
        {
            private String brick_code;
            private Color brick_color;
            public Template(String brick_code, Color brick_color)
            {
                this.brick_code = brick_code;
                this.brick_color = brick_color;
            }
            public String Brick_Code() { return brick_code; }
            public Color Brick_Color() { return brick_color; }
        }
        class MyList //方块列表信息
        {
            private ArrayList list = new ArrayList(); //大小可改变的动态数组
            public int Sum() { return list.Count; } //获取ArrayList的元素个数
            public Template this[int i] { get { return (Template)list[i]; } } //获取方块的模板信息
            public void Add_Brick(String brick_code, Color brick_color)
            {
                list.Add(new Template(brick_code, brick_color));
            }
            public void Clear_Brick() { list.Clear(); }

解决方案 »

  1.   

    [code=csharp]        }
            class Produce //产生方块
            {
                private MyList mylist_list;
                private Color backgroud_color;
                private int size;
                public Produce(MyList mylist_list, Color backgroud_color, int size)
                {
                    this.mylist_list = mylist_list;
                    this.backgroud_color = backgroud_color;
                    this.size = size;
                }
                public Brick Creat()
                {
                    Random i = new Random();
                    int j = i.Next(mylist_list.Sum());
                    String code = mylist_list[j].Brick_Code(); //随机获取一个方块模板的编码
                    List<Point> list = new List<Point>();
                    for (int a = 0; a < code.Length; a++)
                    {
                        if (code[a] == '1')
                        {
                            Point p = new Point(a % 5, a / 5); //根据下表计算坐标
                            list.Add(p);
                        }
                    }
                    Brick brick = new Brick(list.ToArray(), mylist_list[j].Brick_Color(), backgroud_color, size);
                    //if (i.Next(2) == 1) brick.Clockwise(); //如果两个形状一样,随机旋转。
                    return brick;
                }
            }
            class Rules
            {
                #region 常量属性
                private readonly Color[] colors = new Color[] { Color.Violet, Color.Tomato, Color.Red, Color.Green };//闪烁颜色
                private readonly int[] speed = new int[] { 700, 600, 550, 500, 450, 400, 350, 300, 250, 200 }; //速度
                private readonly int[] score = new int[] { 100, 300, 500, 1000, 1500 }; //得分
                #endregion            #region 可变属性
                private Produce a_produce; //产生方块
                private int a_height = 15, a_width = 25; //画板尺寸
                private Color[,] a_brickarray; //固定砖块颜色数组
                private Color a_backgroud, a_gridcolor; //背景和网格颜色
                private int a_size; //单元格像素
                private int a_score = 0, a_level = 0; //分数等级初始化
                private bool a_gameover = false, a_go = false, a_pause = false, a_gridon = false; //游戏运行指令
                private Graphics a_maincanvas, a_nextcanvas; //主屏幕和辅屏幕
                private Brick a_movebrick, a_nextbrick; //正在操作的方块和下一个方块
                private System.Timers.Timer a_timer; //定时器
                #endregion            public Rules(int a_width, int a_height, MyList a_mylist, int a_size, Color a_backgroud, Graphics a_maincanvas, Graphics a_nextcanvas, int a_level, Color a_gridcolor, bool a_gridon)
                {
                    this.a_width = a_width;
                    this.a_height = a_height;
                    this.a_brickarray = new Color[a_width, a_height];
                    this.a_backgroud = a_backgroud;
                    this.a_maincanvas = a_maincanvas;
                    this.a_nextcanvas = a_nextcanvas;
                    this.a_size = a_size;
                    this.a_level = a_level;
                    this.a_gridcolor = a_gridcolor;
                    this.a_produce = new Produce(a_mylist, a_backgroud, a_size);                RanndomBrick();
                }
                public void Start()
                {
                    a_movebrick = a_produce.Creat();
                    a_movebrick.X = 5; //保证出现的方块在屏幕中间
                    a_movebrick.Y = a_movebrick.Y;
                    DrawMain(a_maincanvas);
                    int y = 0;
                    for (int i = 0; i < a_movebrick.Points.Length; i++)
                    {
                        if (a_movebrick.Points[i].Y < y)
                            y = a_movebrick.Points[i].Y;
                    }
                    a_movebrick.Y = -y; //保证完整显示方块
                    Thread.Sleep(20);
                    a_nextbrick = a_produce.Creat();
                    DrawNext(a_nextcanvas);
                    a_timer = new System.Timers.Timer(speed[a_level]);
                    a_timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
                    a_timer.AutoReset = true;
                    a_timer.Start();
                }
                public void Close()
                {
                    if (a_timer != null)
                    {
                        a_timer.Close();
                        a_timer.Dispose();
                        a_maincanvas.Dispose();
                        a_nextcanvas.Dispose();
                    }            }
                public bool GameOver()
                {
                    return a_gameover;
                }
                public bool Down()
                {
                    if (a_movebrick == null) return true;
                    for (int i = 0; i < a_movebrick.Points.Length; i++) //检测方块下一个坐标是否合法
                    {
                        if (a_movebrick.Points[i].Y >= a_height - 1)  
                            return false;//检测方块下一个坐标是否超出范围
                        if (!a_brickarray[a_movebrick.Points[i].X,a_movebrick.Points[i].Y+1].IsEmpty)
                            return false; //检测方块下方是否有方块
                    }
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.Y++;
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public void DropDown() //方块直接沉底
                {
                    a_timer.Stop();
                    while (Down()) ;
                    a_timer.Start();
                }
                public bool Rotate()
                {
                    if (a_movebrick == null) return true;
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.Clockwise();
                    for (int i = 0; i < a_movebrick.Points.Length; i++) //检测方块下一个坐标是否合法
                    {                    if (a_movebrick.Points[i].X > a_width - 1 || a_movebrick.Points[i].Y >= a_height - 1 || a_movebrick.Points[i].X < 0)
                        {
                            a_movebrick.Anticlockwise();
                            break;
                        }                }                
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public bool Right()
                {
                    for (int i = 0; i < a_movebrick.Points.Length; i++)
                    {
                        if (a_movebrick.Points[i].X >= a_width - 1)
                            return false;//检测方块下一个坐标是否超出范围
                        if (!a_brickarray[a_movebrick.Points[i].X+1, a_movebrick.Points[i].Y].IsEmpty)
                            return false; //检测方块右方是否有方块
                    }
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.X++;
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public bool Left()
                {
                    for (int i = 0; i < a_movebrick.Points.Length; i++)
                    {
                        if (a_movebrick.Points[i].X <= 0)
                            return false;//检测方块下一个坐标是否超出范围
                        if (!a_brickarray[a_movebrick.Points[i].X - 1, a_movebrick.Points[i].Y].IsEmpty)
                            return false; //检测方块左方是否有方块
                    }
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.X--;
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public void DrawMain(Graphics photo)
                {
                    lock (photo)
                    {
                        photo.Clear(a_backgroud);
                    }
                    if (a_gridon) DrawLines(photo);
                    DrawBrick(photo);
                    if (a_movebrick != null) a_movebrick.Draw(photo);
                }
                public void DrawNext(Graphics photo)
                {
                    lock (photo)
                    {
                        photo.Clear(a_backgroud);
                    }
                    if (a_nextbrick != null) a_nextbrick.Draw(photo);
                }
                private void OnTimedEvent(object source,ElapsedEventArgs e) //时时更新方块
                {
                    if (a_pause || a_gameover)
                    {
                        if (a_gameover) DrawGameOver();
                        return;
                    }
                    if (a_go)
                    {
                        if(!Down()) Check();
                    }
                }
                private void DrawLines(Graphics photo) //画网格
                {
                    lock(photo)
                    {
                        using (Pen p = new Pen(a_gridcolor, 1)) 
                        {
                            int i;
                            for (i = 1; i < a_width; i++)
                                photo.DrawLine(p, i * a_size - 1, 0, i * a_size - 1, a_height * a_size);
                            for (i = 1; i < a_height; i++) 
                                photo.DrawLine(p, 0, i * a_size, a_width * a_size, i * a_size);
                        }
                    }
                }
                private void DrawBrick(Graphics photo) //画已有砖块
                {
                    lock(photo)
                    {
                        int row,column;
                        for (row = 0; row < a_height; row++) 
                        {
                            for (column = 0; column < a_width; column++) 
                            {
                                Color c = a_brickarray[column, row];
                                if (c.IsEmpty) c = a_backgroud;
                                using (SolidBrush sb = new SolidBrush(c)) 
                                {
                                    photo.FillRectangle(sb, column * a_size + 1, row * a_size + 1, a_size - 2, a_size - 2);
                                }
                            }
                        }
                    }
                }
      

  2.   

    上面的回复忽略 打错了
            }
            class Produce //产生方块
            {
                private MyList mylist_list;
                private Color backgroud_color;
                private int size;
                public Produce(MyList mylist_list, Color backgroud_color, int size)
                {
                    this.mylist_list = mylist_list;
                    this.backgroud_color = backgroud_color;
                    this.size = size;
                }
                public Brick Creat()
                {
                    Random i = new Random();
                    int j = i.Next(mylist_list.Sum());
                    String code = mylist_list[j].Brick_Code(); //随机获取一个方块模板的编码
                    List<Point> list = new List<Point>();
                    for (int a = 0; a < code.Length; a++)
                    {
                        if (code[a] == '1')
                        {
                            Point p = new Point(a % 5, a / 5); //根据下表计算坐标
                            list.Add(p);
                        }
                    }
                    Brick brick = new Brick(list.ToArray(), mylist_list[j].Brick_Color(), backgroud_color, size);
                    //if (i.Next(2) == 1) brick.Clockwise(); //如果两个形状一样,随机旋转。
                    return brick;
                }
            }
            class Rules
            {
                #region 常量属性
                private readonly Color[] colors = new Color[] { Color.Violet, Color.Tomato, Color.Red, Color.Green };//闪烁颜色
                private readonly int[] speed = new int[] { 700, 600, 550, 500, 450, 400, 350, 300, 250, 200 }; //速度
                private readonly int[] score = new int[] { 100, 300, 500, 1000, 1500 }; //得分
                #endregion            #region 可变属性
                private Produce a_produce; //产生方块
                private int a_height = 15, a_width = 25; //画板尺寸
                private Color[,] a_brickarray; //固定砖块颜色数组
                private Color a_backgroud, a_gridcolor; //背景和网格颜色
                private int a_size; //单元格像素
                private int a_score = 0, a_level = 0; //分数等级初始化
                private bool a_gameover = false, a_go = false, a_pause = false, a_gridon = false; //游戏运行指令
                private Graphics a_maincanvas, a_nextcanvas; //主屏幕和辅屏幕
                private Brick a_movebrick, a_nextbrick; //正在操作的方块和下一个方块
                private System.Timers.Timer a_timer; //定时器
                #endregion            public Rules(int a_width, int a_height, MyList a_mylist, int a_size, Color a_backgroud, Graphics a_maincanvas, Graphics a_nextcanvas, int a_level, Color a_gridcolor, bool a_gridon)
                {
                    this.a_width = a_width;
                    this.a_height = a_height;
                    this.a_brickarray = new Color[a_width, a_height];
                    this.a_backgroud = a_backgroud;
                    this.a_maincanvas = a_maincanvas;
                    this.a_nextcanvas = a_nextcanvas;
                    this.a_size = a_size;
                    this.a_level = a_level;
                    this.a_gridcolor = a_gridcolor;
                    this.a_produce = new Produce(a_mylist, a_backgroud, a_size);                RanndomBrick();
                }
                public void Start()
                {
                    a_movebrick = a_produce.Creat();
                    a_movebrick.X = 5; //保证出现的方块在屏幕中间
                    a_movebrick.Y = a_movebrick.Y;
                    DrawMain(a_maincanvas);
                    int y = 0;
                    for (int i = 0; i < a_movebrick.Points.Length; i++)
                    {
                        if (a_movebrick.Points[i].Y < y)
                            y = a_movebrick.Points[i].Y;
                    }
                    a_movebrick.Y = -y; //保证完整显示方块
                    Thread.Sleep(20);
                    a_nextbrick = a_produce.Creat();
                    DrawNext(a_nextcanvas);
                    a_timer = new System.Timers.Timer(speed[a_level]);
                    a_timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
                    a_timer.AutoReset = true;
                    a_timer.Start();
                }
                public void Close()
                {
                    if (a_timer != null)
                    {
                        a_timer.Close();
                        a_timer.Dispose();
                        a_maincanvas.Dispose();
                        a_nextcanvas.Dispose();
                    }            }
                public bool GameOver()
                {
                    return a_gameover;
                }
                public bool Down()
                {
                    if (a_movebrick == null) return true;
                    for (int i = 0; i < a_movebrick.Points.Length; i++) //检测方块下一个坐标是否合法
                    {
                        if (a_movebrick.Points[i].Y >= a_height - 1)  
                            return false;//检测方块下一个坐标是否超出范围
                        if (!a_brickarray[a_movebrick.Points[i].X,a_movebrick.Points[i].Y+1].IsEmpty)
                            return false; //检测方块下方是否有方块
                    }
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.Y++;
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public void DropDown() //方块直接沉底
                {
                    a_timer.Stop();
                    while (Down()) ;
                    a_timer.Start();
                }
                public bool Rotate()
                {
                    if (a_movebrick == null) return true;
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.Clockwise();
                    for (int i = 0; i < a_movebrick.Points.Length; i++) //检测方块下一个坐标是否合法
                    {                    if (a_movebrick.Points[i].X > a_width - 1 || a_movebrick.Points[i].Y >= a_height - 1 || a_movebrick.Points[i].X < 0)
                        {
                            a_movebrick.Anticlockwise();
                            break;
                        }                }                
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public bool Right()
                {
                    for (int i = 0; i < a_movebrick.Points.Length; i++)
                    {
                        if (a_movebrick.Points[i].X >= a_width - 1)
                            return false;//检测方块下一个坐标是否超出范围
                        if (!a_brickarray[a_movebrick.Points[i].X+1, a_movebrick.Points[i].Y].IsEmpty)
                            return false; //检测方块右方是否有方块
                    }
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.X++;
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public bool Left()
                {
                    for (int i = 0; i < a_movebrick.Points.Length; i++)
                    {
                        if (a_movebrick.Points[i].X <= 0)
                            return false;//检测方块下一个坐标是否超出范围
                        if (!a_brickarray[a_movebrick.Points[i].X - 1, a_movebrick.Points[i].Y].IsEmpty)
                            return false; //检测方块左方是否有方块
                    }
                    a_movebrick.Erase(a_maincanvas);
                    a_movebrick.X--;
                    a_movebrick.Draw(a_maincanvas);
                    return true;
                }
                public void DrawMain(Graphics photo)
                {
                    lock (photo)
                    {
                        photo.Clear(a_backgroud);
                    }
                    if (a_gridon) DrawLines(photo);
                    DrawBrick(photo);
                    if (a_movebrick != null) a_movebrick.Draw(photo);
                }
                public void DrawNext(Graphics photo)
                {
                    lock (photo)
                    {
                        photo.Clear(a_backgroud);
                    }
                    if (a_nextbrick != null) a_nextbrick.Draw(photo);
                }
                private void OnTimedEvent(object source,ElapsedEventArgs e) //时时更新方块
                {
                    if (a_pause || a_gameover)
                    {
                        if (a_gameover) DrawGameOver();
                        return;
                    }
                    if (a_go)
                    {
                        if(!Down()) Check();
                    }
                }
                private void DrawLines(Graphics photo) //画网格
                {
                    lock(photo)
                    {
                        using (Pen p = new Pen(a_gridcolor, 1)) 
                        {
                            int i;
                            for (i = 1; i < a_width; i++)
                                photo.DrawLine(p, i * a_size - 1, 0, i * a_size - 1, a_height * a_size);
                            for (i = 1; i < a_height; i++) 
                                photo.DrawLine(p, 0, i * a_size, a_width * a_size, i * a_size);
                        }
                    }
                }
                private void DrawBrick(Graphics photo) //画已有砖块
                {
                    lock(photo)
                    {
                        int row,column;
                        for (row = 0; row < a_height; row++) 
                        {
                            for (column = 0; column < a_width; column++) 
                            {
                                Color c = a_brickarray[column, row];
                                if (c.IsEmpty) c = a_backgroud;
                                using (SolidBrush sb = new SolidBrush(c)) 
                                {
                                    photo.FillRectangle(sb, column * a_size + 1, row * a_size + 1, a_size - 2, a_size - 2);
                                }
                            }
                        }
                    }
                }
      

  3.   

    http://download.csdn.net/detail/chenxh/2242,这里也有,你下载看看,
    http://download.csdn.net/detail/zhenjinsuo/385072