C#版俄罗斯方块含部分代码

这个学期学了C#,大作业是交一个游戏成品,所以写了一个俄罗斯方块,有较完整的注释。
只提供部分代码用于学术交流,请勿转载,如有发现侵权必究。
各部分实现原理请见于文章最后。
该代码分为4大部分–主窗体类、方块类合集、其他窗体类、其他普通类.详情见下图右边。程序结构请看图片右边的项目资源管理器

主窗体运行效果如下主窗体运行结果

主窗体类部分代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Threading;
using System.Media;


namespace Tetris
{
   
    public partial class Form1 : Form
    {
   

        public bool ff = false;         //为true则表示需要阻止下移方法冻结地图
      public static  SoundPlayer sp = new SoundPlayer();        //播放声音的对象
      public static bool voice = true;
      public static bool music = true;

        public static bool iop = true;
      
        public static int mapRow = 20;
     public static  int mapCol = 12;
            Graphics h;
            Graphics h1;
            Graphics h2;
        
        Brush w;
        Brush w1;
        Brush r;
        Brush black;
        Brush blue;
        Brush orage;

             int bSize ;
        int [,] bk;
        Block block;
         int[,] map;
     public   static bool rc = false;     //复活成功校验码
     Thread thread3 =null;     //定义线程3,
     Thread thread2 = null;     //定义线程2
     const bool xc3 = true;       //线程3whil循环终止条件,永远为true;while循环永远执行
       bool xc2= true;       //线程2while循环暂停的条件,永远为true
     public static bool xc2n = true;       //线程2while循环内部判断条件,true为关闭线程
     public static int nd = 0;          //该变量名用于控制难度,为0嗲表线程睡眠500
     public static readonly object Lock = new object();     //Lock对象用于互斥锁
     public   int Score = 0;          //分数
     public static bool f4 = false;         //用于限制开始游戏前进行按键修改造成游戏开始
     public static bool f5 = false;          //限制暂停按钮被按下时,下移键其作用,true代表需要暂停
     public static Form1 frmthis;               //储存自身对象
     public static bool ifblack = false;            //黑色大方块是否出现
    
    


        public Form1()
        {
   
            InitializeComponent();

            panel1.BackColor = Color.White;
            frmthis = this;             //储存自身对象
            w = Brushes.White;
            w1 = Brushes.White; //变量初始化
            r = Brushes.Red;
            black = Brushes.Black;
            blue = Brushes.Blue;
           orage=Brushes.Orange;
         
            h = this.panel1.CreateGraphics();
            h1 = this.panel1.CreateGraphics();
            h2 = this.panel1.CreateGraphics();
         
            bSize = 30;

            frmthis.axWindowsMediaPlayer1.URL = "背景音乐.mp3";
            frmthis.axWindowsMediaPlayer1.Ctlcontrols.play();


            Random r1 = new Random();
            int a = 2;// r1.Next(1, 8);

            if (a == 1)
            {
   
                block = new BlockCT(1);   //产生方块长条类对象 指定类型为1
            }

            if (a == 2)
            {
   
                block = new BlockL(1);
            }

            if (a == 3)
            {
   
                block = new BlockT(1);
            }

            if (a == 4)
            {
   
                block = new BlockTian(1);
            }

            if (a == 5)
            {
   
                block = new BlockZ(1);
            }

            if (a == 6)
            {
   
                block = new BlockTu(1);
            }

            if (a == 7)
            {
   
                block = new BlockShi(1);
            }

         

            map = new int[mapRow, mapCol];

     
        }

      
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
   
            
        }

      
        
          private void  drawMap()
        {
   
            

            lock (Lock)
            {
   
                for (int i = 0; i < mapRow; i++)
                    for (int j = 0; j < mapCol; j++)
                    {
   
                      /*  
                        if (map[i, j] == 0)
                        {
                            h.FillRectangle(w, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);

                        }*/

                        if (map[i, j] == 1)
                        {
   
                           h.FillRectangle(r, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                           // h1.DrawImage(bit, (j + block.col) * 30 + 1, (i + block.row) * 30 + 1);
                            //g//NC.DrawImage(imgbg, 1, 1, 28, 28);
                        }

                        if (map[i, j] == 2)
                        {
   
                            h.FillRectangle(blue, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                        }

                        if (map[i, j] == 3)  //将橙色方块画出来
                        {
   
                            h.FillRectangle(orage, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                        }

                        if (map[i, j] == 4)  //将黑色方块画出来
                        {
   
                            h.FillRectangle(black, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                        }

                    }
            }



        }


          public void drawMap1()
          {
   

              lock (Lock)
              {
   
                  for (int i = 0; i < mapRow; i++)
                      for (int j = 0; j < mapCol; j++)
                      {
   
                           
                            if (map[i, j] == 0)
                            {
   
                                h.FillRectangle(w, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);

                            }

                          if (map[i, j] == 1)
                          {
   
                              h.FillRectangle(r, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                              // h1.DrawImage(bit, (j + block.col) * 30 + 1, (i + block.row) * 30 + 1);
                              //g//NC.DrawImage(imgbg, 1, 1, 28, 28);
                          }

                          if (map[i, j] == 2)
                          {
   
                              h.FillRectangle(blue, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                          }

                          if (map[i, j] == 3)  //将橙色方块画出来
                          {
   
                              h.FillRectangle(orage, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                          }

                          if (map[i, j] == 4)  //将黑色方块画出来
                          {
   
                              h.FillRectangle(black, j * bSize - 1, i * bSize - 1, bSize - 1, bSize - 1);
                          }

                      }
              }



          }


      

 


        private void drawBlock()
        {
   
            lock(Lock){
   
               // gNC.DrawImage(imgbg, 1, 1, 28, 28);
             
            bk = block.getBlock();
                for (int i = 0; i < bk.GetLength(0); i++)       //注意长度表示
                    for (int j = 0; j < bk.GetLength(1); j++)
                    {
   
                       /* if (i == 0 && bk[i, j] == 1)        //如果是第零行并且为红色方块,上方方块涂白
                        {
                            h1.FillRectangle(w, (j + block.col) * bSize - 1,
                                                        (i + block.row) * bSize - 1, bSize - 1, bSize - 1);

                        }
                        * */
                        if (bk[i, j] == 1)  //将红色方块画出来
                        {
   
                            h1.FillRectangle(r, (j + block.col) * bSize - 1,
                              (i + block.row) * bSize - 1, bSize - 1, bSize - 1);
                           // h1.DrawImage(bit, (j + block.col) * 30 + 1, (i + block.row) * 30 + 1);
                           // gNC.DrawImage(imgbg, 1, 1, 28, 28);
                        }

                        if (bk[i, j] == 2)  //将蓝色方块画出来
                        {
   
                            h1.FillRectangle(blue, (j + block.col) * bSize - 1,
                              (i + block.row) * bSize - 1, bSize - 1, bSize - 1);
                        }

                        if (bk[i, j] == 3)  //将橙色方块画出来
                        {
   
                            h1.FillRectangle(orage, (j + block.col) * bSize - 1,
                              (i + block.row) * bSize - 1, bSize - 1, bSize - 1);
                        }

                          if (bk[i, j] == 4)  //将黑色方块画出来
                        {
   
                            h1.FillRectangle(black, (j + block.col) * bSize - 1,
                              (i + block.row) * bSize - 1, bSize - 1, bSize - 1);
                        }


                    }
                

                    
            }
        }
        public  void drawBlock2()//下移用
        {
   
 lock(Lock){
   
               // gNC.DrawImage(imgbg, 1, 1, 28, 28);
             
            bk = block.getBlock();
                for (int i = 0; i < bk.GetLength(0); i++)       //注意长度表示
                    for (int j = 0; j < bk.GetLength(1); j++)
                    {
   
                        if (i == 0 && (bk[i, j] == 1||bk[i, j] 
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值