基于C#俄罗斯方块

最近在看C#,写了一个很水的方块游戏练手。

namespace game
{
    class Square
    {
        public Square()
        {
            state = 0;
            positionY = 0;
            positionX = 0;
        }
        public Square(int InitShapeCnt, int InitState)
        {
            state = InitState;
            positionY = 0;
            positionX = 0;
            InitShape(InitShapeCnt);

        }
        public void InitShape(int ShapeCnt)
        {
            if (ShapeCnt > 6 || ShapeCnt < 0)
                return;
            else
            {
                switch (ShapeCnt)
                {
                    case (0):
                        Shape = LeftLShape;
                        break;
                    case (1):
                        Shape = RightLShape;
                        break;
                    case (2):
                        Shape = RightZShape;
                        break;
                    case (3):
                        Shape = LeftZShape;
                        break;
                    case (4):
                        Shape = lShape;
                        break;
                    case (5):
                        Shape = TuShape;
                        break;
                    case (6):
                        Shape = TianShape;
                        break;
                    default:
                        break;
                }
            }
        }

        //方向 外形 颜色
        public int[, ,,] Shape = new int[4, 4, 4, 2];
        private int state;  //方向
        public int State
        {
            get
            {
                return (state);
             }
            set
            {
                state = value;
            }
        }

        public void DrawSquare(ref Graphics dc)
        {

            for (int Cnt1 = 0; Cnt1<4; Cnt1++)
            {
                for(int Cnt2=0;Cnt2<4;Cnt2++)
                {
                    //Shape[State][Cnt1][Cnt2][1] = 0;
                    if (Shape[state, Cnt1, Cnt2, 0] == 1)
                    {
                        SolidBrush Brush;
                        switch(Shape[state, Cnt1, Cnt2, 1])
                        {
                            case (1):
                                Brush = new SolidBrush(Color.Red);
                                break;
                            case (2):
                                Brush = new SolidBrush(Color.Blue);
                                break;
                            case (3):
                                Brush = new SolidBrush(Color.Yellow);
                                break;
                            case (4):
                                Brush = new SolidBrush(Color.Green);
                                break;
                            case (5):
                                Brush = new SolidBrush(Color.Tan);
                                break;
                            case (6):
                                Brush = new SolidBrush(Color.Honeydew);
                                break;
                            case (7):
                                Brush = new SolidBrush(Color.ForestGreen);
                                break;
                            default:
                                Brush = new SolidBrush(Color.Red);
                                break;

                        }
                        dc.FillRectangle(Brush, new Rectangle((positionX*16+16*Cnt2), (positionY*16+16*Cnt1), 16, 16));
                    }
                }
            }
        }
        private int positionX;
        public int PositionX
        {
            get
            {
                return (positionX);
            }
            set
            {
                positionX = value;
            }
        }

        private int positionY;
        public int PositionY
        {
            get
            {
                return (positionY);
            }
            set
            {
                positionY = value;
            }
        }

        public void Switch(GameCtrl game)
        {
            if (CoverEdge(game))
                state = (state + 1) % 4;

        }
        public void AddX(GameCtrl game)
        {
            //判断右侧
            if(RightEdge(game))
                positionX++;
        }
        public bool AddY(GameCtrl game)
        {
            if (this.Land(game) == false)
            {
                positionY++;
                return (true);
            }
            else
                return(false);

        }
        public void SubX(GameCtrl game)
        {
            //判断右侧
            if (LeftEdge(game))
                positionX--;
        }
        public void SubY()
        {

        }

        private bool Land(GameCtrl game)
        {
            for (int i = 3; i >= 0; i--)
            {
                int rowNum = 21 - this.PositionY - i;
                for (int j = 0; j < 4; j++)
                {
                    int colNum = this.PositionX + j + 3;

                    if (this.Shape[this.State, i, j, 0] == 1)
                    {
                        if (game.GameBox[rowNum][colNum, 0] == 1)
                        {
                            game.AddBox(this);
                            return (true);
                        }
                    }

                }
            }

            return (false);

        }

        private bool RightEdge(GameCtrl game)
        {
            //判断右侧
            for (int i = 3; i >= 0; i--)
            {
                int rowNum = this.PositionX + i + 4;
                for (int j = 0; j < 4; j++)
                {
                    int colNum = 22-this.PositionY-j;

                    if (this.Shape[this.State, j, i, 0] == 1)
                    {
                        if (game.GameBox[colNum][rowNum, 0] == 1)
                        {
                            return (false);
                        }
                    }
                }

            }
            return (true);

        }

        private bool LeftEdge(GameCtrl game)
        {
            //判断左侧
            for (int i = 0; i < 4; i++)
            {
                int rowNum = this.PositionX + i +2;
                for (int j = 0; j < 4; j++)
                {

                    int colNum = 22 - this.PositionY - j;

                    if (this.Shape[this.State, j, i, 0] == 1)
                    {
                        if (game.GameBox[colNum][rowNum, 0] == 1)
                        {
                            return (false);
                        }
                    }
                }

            }
            return (true);

        }

        private bool CoverEdge(GameCtrl game)
        {
            //判断变行是否有覆盖
            int preState = (this.State + 1) % 4;
            for (int i = 0; i < 4; i++)
            {
                int rowNum = this.PositionX + i + 3;
                for (int j = 0; j < 4; j++)
                {

                    int colNum = 22 - this.PositionY - j;

                    if (this.Shape[preState, j, i, 0] == 1)
                    {
                        if (game.GameBox[colNum][rowNum, 0] == 1)
                        {
                            return (false);
                        }
                    }
                }

            }
            return (true);
            //return (false);

        }
        private int[, , ,] LeftLShape = {
                              {{{1,1},{0,0},{0,0},{0,0}},
                               {{1,1},{0,0},{0,0},{0,0}},
                               {{1,1},{1,1},{0,0},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,1},{1,1},{1,1},{0,0}},
                               {{1,1},{0,0},{0,0},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,1},{1,1},{0,0}},
                               {{0,0},{0,0},{1,1},{0,0}},
                               {{0,0},{0,0},{1,1},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                               {{0,0},{0,0},{1,1},{0,0}},
                               {{1,1},{1,1},{1,1},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}}
                                      };

        private int[, , ,] RightLShape = {
                              {{{0,0},{0,0},{1,2},{0,0}},
                              {{0,0},{0,0},{1,2},{0,0}},
                              {{0,0},{1,2},{1,2},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,2},{0,0},{0,0},{0,0}},
                              {{1,2},{1,2},{1,2},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,2},{1,2},{0,0},{0,0}},
                              {{1,2},{0,0},{0,0},{0,0}},
                              {{1,2},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,2},{1,2},{1,2},{0,0}},
                              {{0,0},{0,0},{1,2},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}

                               };
        private int[, , ,] LeftZShape = {
                              {{{1,3},{1,3},{0,0},{0,0}},
                              {{0,0},{1,3},{1,3},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,3},{0,0},{0,0}},
                              {{1,3},{1,3},{0,0},{0,0}},
                              {{1,3},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,3},{1,3},{0,0},{0,0}},
                              {{0,0},{1,3},{1,3},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,3},{0,0},{0,0}},
                              {{1,3},{1,3},{0,0},{0,0}},
                              {{1,3},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}
                               };

        private int[, , ,] RightZShape = {
                              {{{0,0},{1,4},{1,4},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,4},{0,0},{0,0},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,4},{1,4},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,4},{0,0},{0,0},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}
                               };

        private int[, , ,] lShape = {
                              {{{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,6},{1,6},{1,6},{1,6}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,6},{1,6},{1,6},{1,6}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}
                               };
        private int[, , ,] TuShape = {
                              {{{0,0},{1,7},{0,0},{0,0}},
                              {{1,7},{1,7},{1,7},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {{{0,0},{1,7},{0,0},{0,0}},
                              {{1,7},{1,7},{0,0},{0,0}},
                              {{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,7},{1,7},{1,7},{0,0}},
                              {{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {{{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{1,7},{1,7},{0,0}},
                              {{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },
                               };
        private int[, , ,] TianShape = {
                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              }
                               };
    }
    class GameCtrl
    {
        public List<int[,]> GameBox = new List<int[,]>();

        public int gameSclpe;

        public GameCtrl()
        {
            gameSclpe = 0;
            this.InitBox();
        }
        public void InitBox()
        {
            int[,] InitZore = new int[18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },
                                               { 0, 0 }, { 0, 0 }, { 0, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },
                                               { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }};

            int[,] InitOne = new int[18, 2]  { { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 },
                                                { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 },
                                               { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 } };
            GameBox.Add(InitOne);
            GameBox.Add(InitOne);
            GameBox.Add(InitOne);
            for (int Cnt = 0; Cnt < 20; Cnt++)
                GameBox.Add(InitZore);

        }
        public void ClrBox()
        {
            GameBox.Clear();
        }

        public void AddBox(Square landSquare)
        {
            for (int i = 0; i < 4; i++)
            {
                int rowNum = 22 - landSquare.PositionY - i;
                int[,] ShapeRow = new int[18, 2];

                for(int j =0;j<18;j++)
                {
                    if (GameBox[rowNum][j, 0] == 1)
                    {
                        ShapeRow[j, 0] = 1;
                        ShapeRow[j, 1] = GameBox[rowNum][j, 1];
                    }
                }
                for (int j = 0; j < 4; j++)
                {

                    int colNum = landSquare.PositionX + j+3;
                    if (landSquare.Shape[landSquare.State, i, j, 0] == 1)
                    {
                        ShapeRow[colNum, 0] = 1;
                        ShapeRow[colNum, 1] = landSquare.Shape[landSquare.State, i, j, 1];

                    }

                }
                GameBox[rowNum] = ShapeRow;

            }
            SubBox();
        }

        private void SubBox()
        {
            int[,] InitZore = new int[18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },
                                               { 0, 0 }, { 0, 0 }, { 0, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },
                                               { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }};
            int Cnt;
            for (Cnt = 3; Cnt < 23; Cnt++)
            {
                int ColSum,Cnt2;
                for (ColSum = 0, Cnt2 = 3; Cnt2 < 15;Cnt2++ )
                    ColSum += GameBox[Cnt][Cnt2, 0];
                if(ColSum==12)
                {
                    this.gameSclpe++;
                    GameBox.RemoveAt(3);
                    GameBox.Add(InitZore);
                    Cnt--;
                }
            }

        }

        public void BoxDraw(ref Graphics dc)
        {
            for (int Cnt1 = 3; Cnt1 < 23; Cnt1++)
            {
                for (int Cnt2 = 3; Cnt2 < 15; Cnt2++)
                {
                    if (GameBox[Cnt1][Cnt2, 0] == 1)
                    {
                        SolidBrush Brush;
                        switch (GameBox[Cnt1][Cnt2, 1])
                        {
                            case (1):
                                Brush = new SolidBrush(Color.Red);
                                break;
                            case (2):
                                Brush = new SolidBrush(Color.Blue);
                                break;
                            case (3):
                                Brush = new SolidBrush(Color.Yellow);
                                break;
                            case (4):
                                Brush = new SolidBrush(Color.Green);
                                break;
                            case (5):
                                Brush = new SolidBrush(Color.Tan);
                                break;
                            case (6):
                                Brush = new SolidBrush(Color.Honeydew);
                                break;
                            case (7):
                                Brush = new SolidBrush(Color.ForestGreen);
                                break;
                            default:
                                Brush = new SolidBrush(Color.Red);
                                break;

                        }
                        dc.FillRectangle(Brush, new Rectangle((Cnt2-3)* 16, (22 - Cnt1) * 16, 16, 16));
                    }
                }
            }

        }
    }

}
时间: 2024-12-26 04:38:20

基于C#俄罗斯方块的相关文章

基于51的俄罗斯方块

//variable.h 定义该程序用到的全局变量 #ifndef _VARIABLE_H #define _VARIABLE_H #define GAME_BOARD_WIDTH 50 #define GAME_BOARD_HEIGHT 64 #define PIXEL_PER_CUBE_X 5//4 #define PIXEL_PER_CUBE_Y 4//3 #define NEXT_CUBES_SHOW_POS_X 11 #define NEXT_CUBES_SHOW_POS_Y 9 #d

基于.NET的俄罗斯方块课程设计

前言 随着我国物质生活的巨大提高,人们的精神文化需求也不断提升,从温饱中解放出来的人们将会更多地关注娱乐活动.俄罗斯方块游戏就能够很好地满足人们日常简单的娱乐需求.俄罗斯方块游戏风靡于90年代,是现在青年人的美好回忆.因为俄罗斯方块游戏的规则简单,而且简单的几条规则就足够使得游戏过程变化多端,因此一直以来都被认为是益智游戏而广泛流行于人民群众中.Windows自带的游戏功能一直缺少俄罗斯方块这一个最流行最原始的游戏,因此基于C#和.NET平台开发一个俄罗斯方块游戏是很有必要的. 我们将设计实现一

基于python的俄罗斯方块小游戏

课 程 名:   python课程设计 课程设计项目名称:   基于python的俄罗斯方块 团队成员:     叶焱镔.柯博群.钱昱铭 一.项目简介 1.1 项目博客地址 1.2 项目完成的功能与特色 俄罗斯方块的游戏实现,实现了随机方块的生成.下落.旋转,游戏的进行.消除.结束,游戏的重新开始.退出.暂停,可显示最高记录.历史记录.记录的排行,可继续上回的游戏 1.3 项目采用的技术栈    python 1.4 项目借鉴源代码的地址 https://blog.csdn.net/lanseg

基于 HTML5 的 WebGL 3D 版俄罗斯方块

前言 摘要:2D 的俄罗斯方块已经被人玩烂了,突发奇想就做了个 3D 的游戏机,用来玩俄罗斯方块...实现的基本想法是先在 2D 上实现俄罗斯方块小游戏,然后使用 3D 建模功能创建一个 3D 街机模型,最后将 2D 小游戏贴到 3D 模型上.(ps:最后拓展部分实现将视频与3D模型的结合) http://www.hightopo.com/demo/tetris/ 代码实现 首先,先完成 2D 小游戏 在查看官方文档的过程中,了解到 HT 的组件参数都是保存在 ht.DataModel() 对象

基于jQuery的俄罗斯方块

代码是其次,可能有很多不足,而且有一个功能没有实现,那就是方块的变形,没有想到一个很完美的解决方案.下面说一下我的思路,因为当时做的时候,并没有看其他人 的思路,故而不知道自己是否走了弯路,先制作四个基础小方块model,所有的积木都是由这四个方块组合而成.感觉问题的难点就在于判定运动终止,这里我设定了一条基线, 最开始基线的值就是为整个框架的高度,当model的top值等于整个高度时,运动停止,而判定左右运动的条件同理,当运动落至底部的时候,更新基线,即将四个model的坐标,插入基线之中,不

C语言:俄罗斯方块

大一下学期,第一节c语言课程设计,老师分享了一个基于C语言的俄罗斯方块的游戏,让我们感受. 如果你想用Mac系统跑的话,也不是不行,但是得解决一些问题.在语言程序中#include<windows.h>这个是基于windows下的头文件,用在Mac的Xcode软件会出现Symbol not found的问题.自己百度了一下,一个是装虚拟机,另一个是把报错的地方修改成Xcode的代码,不用windows特有代码.还有一个就是定义了一个全局的变量,让工程不走windows.h.用Mac的同学们可以

前端作品五之——完美俄罗斯方块

---恢复内容开始--- 1.功能概述 实现传统的俄罗斯方块的功能.有几种固定形状和颜色的方块随机下落,满一行则此行消除.并让积分增加100,使用本地存储功能将方块的状态和得分存起来.在下次进行游戏的时候载入数据,并在游戏中进行存储操作. 2.选材布局 用canvas组件画方格图.用JavaScript语言实现逻辑功能. 3.功能实现与体会 源码中本人发现了几处bug, 1.测试发现在旋转操作频繁的时候,会出现方块严重错位,或丢失,出现一些匪夷所思的现象. 经分析,是旋转操作的处理出现的问题.

从零开始设计一台计算机?公开课:从与非门到俄罗斯方块

MOOC: Build a Modern Computer from First Principles: From Nand to Tetris用第一原理设计现代计算机:从与非门到俄罗斯方块https://www.coursera.org/learn/build-a-computer/ 从零开始设计一台计算机,这就是这门公开课在宣传片中许诺的.一开始是我是质疑的,作为一个电子信息工程专业毕业的学生,大学4年,学完<模拟电路>.<数字电路>.<计算机组成原理>.<硬

拜拜了,浮动布局-基于display:inline-block的列表布局——张鑫旭

一.一抹前言 没有爱的日子,时间如指尖细沙,不知不觉就流逝了.写“CSS float浮动的深入研究.详解及拓展(一)”和“CSS float浮动的深入研究.详解及拓展(二)”似乎就在不久前,然而相隔差不多有一年之久了.文章最后留下了“浮动布局更好的替代方案是什么?”后文再介绍的预告. 由于自己肚子中的货物不足以撑起一篇足够质量的文章,所以关于“浮动布局更好的替代方案是什么?”的文章一直并未动笔.好在事物总是在发展的,我也是每天都是在进步,对于列表布局的思考也愈发成熟.加上正好前不久又有人询问我“