首页 > 编程语言 >C#版俄罗斯方块

C#版俄罗斯方块

时间:2024-01-15 10:46:29浏览次数:31  
标签:C# void public Color int static 俄罗斯 方块

C#版俄罗斯方块

 

C++是游戏编程的首选语言,但我相信C++能做到的C#也能做到。

本篇介绍用C#编写一个俄罗斯方块程序的原理,以及在C#里面播放声音,保存游戏设置的方法。

游戏界面预览:



菜单预览:



自定义每个小方块颜色功能界面:



游戏主要有四部分组成:Square类,Block类,gameField类,游戏引擎

Square类:
          这个类描述的对象是组成大方块中的每个小正方形实体。
     类设计:
    class Square
    {
        public Point location;   //小方块的坐标
        public Size size;          //小方块大小
        public Color foreColor;  //小方块前景色
        public Color backColor; //小方块背景色
        public Square(Size initSize,Color initForeColor,Color initBackColor) //构造函数
        {  ……}
         public void Draw(System.IntPtr winHandle) //在指定设备上画方块
        {  …… }
         public void Erase(System.IntPtr winHandle)//擦除方块
        { ……  }
     }

Block类:
          这个类描述的对象是某一个大方块的实体。每个大方块由四个小正方形组成,一共有7种组合方式。这个类需要实现一个大方块实体所有的属性和动作。包括:方块的形状,位置,方块左移,右移,下移,旋转等。
      类设计:
 class Block
    {
        public Square square1;  //组成block的四个小方块
        public Square square2;
        public Square square3;
        public Square square4;

        private const int squareSize = GameField.SquareSize; //小方块的边长
        public enum BlockTypes
        {
            undefined = 0,
            square = 1,
            line = 2,
            J = 3,
            L = 4,
            T = 5,
            Z = 6,
            S = 7
        };//一共有7种形状
        public BlockTypes blockType;  //方块的形状
        //七个小方块的颜色数组
        private Color foreColor;
        private Color backColor;
        //方块的方向
        public enum RotateDirections
        {
            North = 1,
            East = 2,
            South = 3,
            West = 4
        };
        public RotateDirections myRotation = RotateDirections.North;
       
        public Block(Point thisLocation,BlockTypes bType)
        { ……}
        //含有自定义颜色的重载
        public Block(Point thisLocation, BlockTypes bType,Color fc,Color bc)
        { ……}

        /*画方块*/
        public void Draw(System.IntPtr winHandle)
        {…… }
        /*擦方块*/
        public void Erase(System.IntPtr winHandle)
        {…… }

        /*移动*/
        public bool down()
        {……}
        public bool left()
        {……}
        public bool right()
        {……}
        /*旋转block*/
        public void Rotate()
        {……}
        /*检测是否到顶*/
        public int Top()
        {……}
    }

GameField类:
        这个类描述的对象是游戏场景实体,包括场景的背景色,大小,方块是否还可以移动,以及场景中填满一行的检测等。
        类设计:
     class GameField
    {
        public const int width = 20;           //场景的宽,以方块个数为单位
        public const int height = 30;
        public const int SquareSize = 15;      //每个四分之一小方块的边长
        public static Color BackColor;         //场景的背景色
        public static System.IntPtr winHandle; //场景的handle
        public static Color[] BlockForeColor ={ Color.Blue, Color.Beige, Color.DarkKhaki, Color.DarkMagenta, Color.DarkOliveGreen, Color.DarkOrange, Color.DarkRed };
        public static Color[] BlockBackColor ={ Color.LightCyan, Color.DarkSeaGreen, Color.Beige, Color.Beige, Color.Beige, Color.Beige, Color.Beige };
        public static bool isChanged=false; //设置是否被更改的标志位
        public static SoundPlayer sound = new SoundPlayer();  //播放声音

        public static Square[,] arriveBlock = new Square[width, height]; //保存已经不能再下落了的方块
        public static int[] arrBitBlock=new int[height];  //位数组:当某个位置有方块时,该行的该位为1
        private const int bitEmpty = 0x0;      //0000 0000 0000 0000 0000
        private const int bitFull = 0xFFFFF;   //1111 1111 1111 1111 1111

        /*检测某个位置是否为空*/
        public static bool isEmpty(int x, int y)
        {……}
        /*将方块停住*/
        public static void stopSquare(Square sq, int x, int y)
        {……}
        /*检测行是否满
         * 返回:成功消除的行数和  (方便统计分数)
         */
        public static int CheckLines()
        { ……}
        /*播放声音*/
        public static void PlaySound(string soundstr)
        {……}
        /*重画*/
        public static void Redraw()
        { …… }
         //结束
    }

游戏引擎:
      游戏引擎正如其名,就像一个发动机一样让游戏不间断运行。本游戏中就是让方块以一定的速度下落。并响应键盘事件,实行左右移动,和向下加速功能。(代码见源码)

声音播放:

     音效是游戏不可缺少的一部分。在.Net2.0中已经提供了一个类来播放声音。在using System.Media;命名空间。
     本游戏中播放声音的代码如下:(在 GameField类中)
     using System.Media;

     public static SoundPlayer sound = new SoundPlayer();
     
     /*播放声音*/
        public static void PlaySound(string soundstr)
        {
            switch (soundstr)
            {
                case "FinishOneLine": //消除一行的声音
                    if (!File.Exists("FinishOneLine.wav")) return;
                    sound.SoundLocation = "FinishOneLine.wav";
                    break;
                case "CanNotDo": //当无法操作时
                    if (!File.Exists("CanNotDo.wav")) return;
                    sound.SoundLocation = "CanNotDo.wav";
                    break;
            }
            sound.Play();
        }
        要播放的时候调用PlaySound()方法即可。
        其实步骤很简单,先引用System.Media空间,然后创建一个SoundPlayer 对象,用SoundLocation 属性设置声音文件的地址,然后调用Play()方法即可播放。不过注意,这个类可以播放的声音格式只有Wav文件。

保存游戏设置:
      在游戏中经常要保存用户自定义的设置。本游戏通过写进ini文件来保存。
      主要代码如:

       /*加载窗体时从配置文件Setting.ini中读取游戏设置*/
        private void getSettings()
        {
            if (!File.Exists("Setting.ini"))
                return;
            FileStream fs = new FileStream("Setting.ini", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamReader sr = new StreamReader(fs);
            string line1=sr.ReadLine();
            string line2=sr.ReadLine();
            string line3=sr.ReadLine();
            if (line1 != null && line1.Split('=').Length > 1)
            {
                GameField.BackColor = Color.FromArgb(int.Parse(line1.Split('=')[1]));
                picBackGround.BackColor = GameField.BackColor;
            }
            if (line2 != null && line2.Split('=').Length > 1)
                GameField.BlockForeColor = strToColor(line2.Split('=')[1]);
            if (line3 != null && line3.Split('=').Length > 1)
                GameField.BlockBackColor = strToColor(line3.Split('=')[1]);
            sr.Close();
            fs.Close();
        }
        /*如果游戏设置被更改,将新的设置保存到Setting.ini*/
        private void saveSettings()
        {
            FileStream fs = new FileStream("Setting.ini", FileMode.Create, FileAccess.ReadWrite);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("GameFieldColor="+GameField.BackColor.ToArgb());
            sw.WriteLine("BlockFroeColor=" + colorToStr(GameField.BlockForeColor));
            sw.WriteLine("BlockBackColor=" + colorToStr(GameField.BlockBackColor));
            sw.Flush();
            sw.Close();
            fs.Close();
        }

麻雀虽小,五脏俱全,了解更多请看源码。
游戏源码下载:CODE

-----------------------------------------------------------------

标签:C#,void,public,Color,int,static,俄罗斯,方块
From: https://www.cnblogs.com/sexintercourse/p/17964920

相关文章

  • Redis、Memcache和MongoDB的区别
    Redis、Memcache和MongoDB的区别 >>MemcachedMemcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key、value的字节大小以及服务器硬件性能,日常环境中QPS高峰大约在4-6w左右)。适用于最大程度扛量。支持直接配置为sessionhandle。Memcached的......
  • C#实现Base64编码与解码
    C#实现Base64编码与解码 一、编码规则     Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺序排列24位数据,再把这24位数据分成4组,即每组6位。再在每组的的最高位前补两个0凑足一个字节。......
  • C#线程篇---Task(任务)和线程池不得不说的秘密
    C#线程篇---Task(任务)和线程池不得不说的秘密 我们要知道的是,QueueUserWorkItem这个技术存在许多限制。其中最大的问题是没有一个内建的机制让你知道操作在什么时候完成,也没有一个机制在操作完成是获得一个返回值,这些问题使得我们都不敢启用这个技术。Microsoft为了克服......
  • ElasticSearch降本增效常见的方法 | 京东云技术团队
    Elasticsearch在db_ranking的排名不断上升,其在存储领域已经蔚然成风且占有非常重要的地位。随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢?今天我们就特地来聊聊ES降本增效的常见方法:弹性伸缩分级存储其他:(1)数据压缩(2)off......
  • 使用C#版Tesseract库
    使用C#版Tesseract库 上一篇介绍了Tesseract库的使用(OCR库Tesseract初探),文末提到了Tesseract是用c/c++开发的,也有C#的开源版本,本篇介绍一下如何使用C#版的Tesseract。C#版本源码下载地址:https://github.com/charlesw/tesseract其实在vs中可以直接用NuGet工具进行下载:打开n......
  • 开源字符识别 OCR 引擎推荐
    开源字符识别OCR引擎推荐sea​现代支付架构部经理 Tesseract开源OCR引擎(主存储库) github地址 GitHub-tesseract-ocr/tesseract:TesseractOpenSourceOCREngine(mainrepository) 官方网址 Tesseractdocumentation Tesseract......
  • elixir before_compile && on_definition 简单使用
    elixir提供了一些方便的模块属性,可以让我们方便的进行elixir的扩展(尤其是进行元编程的时候)比如elixir_agent就使用到了before_compile以及on_definition,方便进行trace的处理on_definition的简单使用参考demo内容来自官方,可以实现输出函数的一些信息 defm......
  • C#结合串口通信类实现串口通信源代码(原创)
    C#结合串口通信类实现串口通信源代码(原创) mycom是串口通信类,在本blog前一篇中有完整代码。( C#串口通信编程类(修改版) )下面是串口通讯测试程序的源代码,将mycom类放在此项目中可以实现简单的串口通信,希望读者能通过这个程序对串口通信过程有一个初步的了解:usingSystem;us......
  • C#串口通信编程类(修改版)
    C#串口通信编程类(修改版) 这是从网上down下来的一个串口通信类,发现close函数忘记了设置Opened属性为false还有后面string转byte[]和byte[]转string的函数有错误,索性删掉了修改后的串口通信类如下:下一篇将把我的测试程序主程序部分全部代码贴出来可以坚强勇敢的用来实现串口......
  • 5.HTTP和TCP
    6.1http1.0和http1.1有什么区别。HTTP1.1相较于HTTP1.0增加了长连接、管道。长连接:为解决HTTP/1.0发送一次请求,建立一次TCP,因此HTTP/1.1新增了长连接,减少连接重复创建和断开管道:解决HTTP/1.0在一个TCP连接中每发送一个请求需等待一个响应的问题,HTTP/1.1新增管道,一个TCP中......