在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 俄罗斯方块 游戏源码下载

C# 俄罗斯方块 游戏源码下载

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.09M
  • 下载次数:33
  • 浏览次数:277
  • 发布时间:2017-06-09
  • 实例类别:C#语言基础
  • 发 布 人:丁皓敏
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 俄罗斯方块

实例介绍

【实例简介】

【实例截图】

【核心代码】

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;
using System.Threading;
using System.Timers;

namespace fangkuai_1
{
    class GamePalette
    {
        #region//常量区
        private readonly Color[] COLORS = new Color[] { Color.White, Color.Tomato, Color.Thistle, Color.Turquoise };//闪烁颜色
        private readonly int[] TIME_SPANS = new int[] { 700, 600, 550, 500, 450, 400, 350, 300, 250, 200 };//对应等级的速度
        private readonly int[] SCORE_SPANS = new int[] { 100, 300, 500, 1000, 1500 };//分值列表
        #endregion

        #region//属性区
        private BrickFactory m_BrickFactory;//砖块生产机
        private int m_Width = 15;//画板宽
        private int m_Heigh = 25;//画板高
        private Color[,] m_CoorArray;//固定砖块颜色数组
        private Color m_BgColor;//背景色
        private Color m_GridColor;//网格颜色
        private int m_Size;//单元格像素
        private int m_Level = 0;//等级
        private int m_Score = 0;//总分数
        private bool m_GameOver = false;//是否结束
        private bool m_ShowGrid = false;//显示网格
        private bool m_Pause = false;//暂停标志
        private bool m_Ready = false;//运行标志

        private Graphics m_MainPalette;//游戏主画布
        private Graphics m_NextPalette;//Next画布
        private Graphics m_Fen;
        private Graphics m_Ji;
        private Brick m_RunBrick;//活动的砖块
        private Brick m_NextBrick;//下一个砖块
        private System.Timers.Timer m_TimerBrick;//定时器,用来更新砖块
        #endregion

        #region 构造函数
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="info"></param>
        /// <param name="size"></param>
        /// <param name="bgColor"></param>
        /// <param name="gpPalette"></param>
        /// <param name="gpNext"></param>
        /// <param name="level"></param>
        /// <param name="gridColor"></param>
        /// <param name="showGrid"></param>
        public GamePalette(
            int width,
            int height,
            TemplateArray info,
            int size,
            Color bgColor,
            Graphics gpPalette,
            Graphics gpNext,
            Graphics gpFen,
            Graphics gpJi,
            int level,
            Color gridColor,
            bool showGrid)
        {
            m_Width = width;
            m_Heigh = height;
            m_CoorArray = new Color[width, height];
            m_BgColor = bgColor;
            m_MainPalette = gpPalette;
            m_NextPalette = gpNext;
            m_Fen = gpFen;
            m_Ji = gpJi;
            m_Size = size;
            m_Level = level;
            m_GridColor = gridColor;
            m_ShowGrid = showGrid;
            m_BrickFactory = new BrickFactory(info, bgColor, size);

            //InitRandowBrick();//生成level行随机砖块,以增加游戏可玩度
        }
        #endregion

        #region 属性访问器
        /// <summary>
        /// 游戏是否结束标志
        /// </summary>
        public bool IsGameOver
        {
            get { return m_GameOver; }
            set { m_GameOver = value; }
        }
        /// <summary>
        /// 获取当前游戏等级(0-9)
        /// </summary>
        public int Level
        {
            get { return m_Level; }
            set { m_Level = value; }
        }
        /// <summary>
        /// 获取当前积分
        /// </summary>
        public int Score
        {
            get { return m_Size; }
            set { m_Size = value; }
        }
        #endregion

        #region 公有函数
        /// <summary>
        /// 下移一个单位
        /// </summary>
        /// <returns></returns>
        public bool MoveDown()
        {
            if (m_RunBrick == null) return true;
            int xPos = m_RunBrick.X;//x坐标不变
            int yPos = m_RunBrick.Y   1;//y坐标加一
            for (int i = 0; i < m_RunBrick.Points.Length;i   )//循环检测各个砖点的下一个位置是否合法
            {
                //下一个位置超出画布不能移动
                if (yPos   m_RunBrick.Points[i].Y >= m_Heigh-2)
                    return false;

                //下一个位置已有砖块,不能移动
                if (!m_CoorArray[xPos   m_RunBrick.Points[i].X, yPos   m_RunBrick.Points[i].Y].IsEmpty)
                    return false;
            }

            m_RunBrick.Erase(m_MainPalette);//清除当前砖块在画布上的图形
            m_RunBrick.Y  ;//修正新的坐标偏移
            m_RunBrick.Paint(m_MainPalette);//从新绘制砖块图形到画布上
            return true;
        }

        /// <summary>
        /// 下移到底
        /// </summary>
        public void DropDown()
        {
            m_TimerBrick.Stop();//暂停定时器
            while (MoveDown()) ;//循环调用向下知道不能
            m_TimerBrick.Start();//从新启用计时器
        }

        /// <summary>
        /// 左移一个单位
        /// </summary>
        /// <returns></returns>
        public bool MoveLeft()
        {
            if (m_RunBrick == null) return true;
            int xPos = m_RunBrick.X-1;//x坐标减一
            int yPos = m_RunBrick.Y;//y坐标加一
            for (int i = 0; i < m_RunBrick.Points.Length; i  )//循环检测各个砖点的下一个位置是否合法
            {
                //左一个位置超出画布不能移动
                if (xPos   m_RunBrick.Points[i].X <0)
                    return false;

                //左移一个位置已有砖块,不能移动
                if (!m_CoorArray[xPos   m_RunBrick.Points[i].X, yPos   m_RunBrick.Points[i].Y].IsEmpty)
                    return false;
            }

            m_RunBrick.Erase(m_MainPalette);//清除当前砖块在画布上的图形
            m_RunBrick.X--;//修正新的坐标偏移
            m_RunBrick.Paint(m_MainPalette);//从新绘制砖块图形到画布上
            return true;
        }

        /// <summary>
        /// 右移一个单位
        /// </summary>
        /// <returns></returns>
        public bool MoveRight()
        {
            if (m_RunBrick == null) return true;
            int xPos = m_RunBrick.X   1;//x坐标减一
            int yPos = m_RunBrick.Y;//y坐标加一
            for (int i = 0; i < m_RunBrick.Points.Length; i  )//循环检测各个砖点的下一个位置是否合法
            {
                //左一个位置超出画布不能移动
                if (xPos   m_RunBrick.Points[i].X >= m_Width)
                    return false;

                //左移一个位置已有砖块,不能移动
                if (!m_CoorArray[xPos   m_RunBrick.Points[i].X, yPos   m_RunBrick.Points[i].Y].IsEmpty)
                    return false;
            }

            m_RunBrick.Erase(m_MainPalette);//清除当前砖块在画布上的图形
            m_RunBrick.X  ;//修正新的坐标偏移
            m_RunBrick.Paint(m_MainPalette);//从新绘制砖块图形到画布上
            return true;
        }

        /// <summary>
        /// 顺时针旋转
        /// </summary>
        /// <returns></returns>
        public bool DeasilRotate()
        {
            if (m_RunBrick == null) return true;
            for (int i = 0; i < m_RunBrick.Points.Length; i  )//循环检测各个砖点的下一个位置是否合法
            {
                //计算旋转后的坐标
                int x = m_RunBrick.X - m_RunBrick.Points[i].Y;
                int y = m_RunBrick.Y   m_RunBrick.Points[i].X;

                //左移一个位置已有砖块,不能移动
                if (x<0||x>=m_Width||y<0||y>=m_Heigh||!m_CoorArray[x,y].IsEmpty)
                    return false;
            }
            m_RunBrick.Erase(m_MainPalette);//清除当前砖块在画布上的图形
            m_RunBrick.DeasilRotate();//修正新的坐标偏移
            m_RunBrick.Paint(m_MainPalette);//从新绘制砖块图形到画布上
            return true;
        }

        //public bool ContraRotate()
        //{ }

        /// <summary>
        /// 画所有方块
        /// </summary>
        /// <param name="gp"></param>
        public void PaintPalette(Graphics gp)
        { 
            //以背景色清除画布
            lock (gp)
            {
                gp.Clear(m_BgColor);
            }
            //画网格
            if (m_ShowGrid)
                PaintGridLine(gp);
            //画已有砖块
            PaintBricks(gp);
            //画当前活动砖块
            if (m_RunBrick != null)         
                m_RunBrick.Paint(gp);
            
        }

        /// <summary>
        /// 小地图上画方块
        /// </summary>
        /// <param name="gp"></param>
        public void PaintNext(Graphics gp)
        {
            lock (gp)
            {
                gp.Clear(m_BgColor);
            }
            if (m_NextBrick != null)
                m_NextBrick.Paint(gp);
        }

        public void PaintFen(Graphics gp)
        {
            lock (gp)
            {
                gp.Clear(Color.White);
                Font drawFont = new Font("Arial", 16);
                SolidBrush drawBrush = new SolidBrush(Color.Black);
                PointF drawPoint = new PointF(0.0F, 0.0F);

                gp.DrawString(Convert.ToString(m_Score), drawFont, drawBrush, drawPoint);
            }
            

        }
        public void PaintJi(Graphics gp)
        {
            lock (gp)
            {
                gp.Clear(Color.White);
                Font drawFont = new Font("Arial", 16);
                SolidBrush drawBrush = new SolidBrush(Color.Black);
                PointF drawPoint = new PointF(0.0F, 0.0F);


                gp.DrawString(Convert.ToString(m_Level), drawFont, drawBrush, drawPoint);
            }
            
        }

        /// <summary>
        /// 开始游戏
        /// </summary>
        public void Start()
        {
            m_RunBrick = m_BrickFactory.CreateBrick();//产生一个砖块
            m_RunBrick.X = m_Width / 2;//水平位置在画布中心
            m_Ready = true;
            int y = 0;
            for (int i = 0; i < m_RunBrick.Points.Length; i  )
            {
                if (m_RunBrick.Points[i].Y < y)
                    y = m_RunBrick.Points[i].Y;
            }

            m_RunBrick.Y = -y;//垂直位置保证能完全显示


            PaintPalette(m_MainPalette);

            Thread.Sleep(20);//延时产生下一个砖块
            m_NextBrick = m_BrickFactory.CreateBrick();
            PaintNext(m_NextPalette);

            //设定并启动定时器
            m_TimerBrick = new System.Timers.Timer(TIME_SPANS[m_Level]);
            m_TimerBrick.Elapsed  = new System.Timers.ElapsedEventHandler(OnBrickTimeEvent);
            m_TimerBrick.AutoReset = true;
            //kaishidingshi
        }

        /// <summary>
        /// 暂停游戏
        /// </summary>
        public void Pause()
        { }

        /// <summary>
        /// 继续游戏
        /// </summary>
        public void Resume()
        { }

        /// <summary>
        /// 关闭游戏
        /// </summary>
        public void Close()
        {
            if (m_TimerBrick != null)
            {
                m_TimerBrick.Close();
                m_TimerBrick.Dispose();
            }
            m_NextPalette.Dispose();
            m_MainPalette.Dispose();

        }
        #endregion

        #region 私有函数
        //时时更新砖块信息
        private void OnBrickTimeEvent(object source, ElapsedEventArgs e)
        {
            if (m_Pause || m_GameOver)
            {
                if (m_GameOver) PaintGameOver();
                return;
            }
            if (m_Ready)
            {
                if (!MoveDown())
                    CheckAndOverBrick();
            }
            PaintFen(m_Fen);
            PaintJi(m_Ji);
        }

        private void PaintGridLine(Graphics gp)
        {
            try
            {
                lock (gp)
                {
                    using (Pen p = new Pen(m_GridColor, 1))
                    {
                        for (int column = 1; column < m_Width; column  )
                            gp.DrawLine(p, column * m_Size - 1, 0, column * m_Size - 1, m_Heigh * m_Size);
                        for (int row = 1; row < m_Heigh; row  )
                            gp.DrawLine(p, 0, row * m_Size, m_Width * m_Size, row * m_Size);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }

        private void PaintBricks(Graphics gp)
        {
            lock (gp)
            {
                for (int row = 0; row < m_Heigh; row  )
                {
                    for (int column = 0; column < m_Width; column  )
                    {
                        try
                        {
                            Color c = m_CoorArray[column, row];
                            if (c.IsEmpty) c = m_BgColor;
                            using (SolidBrush sb = new SolidBrush(c))
                            {
                                gp.FillRectangle(sb, column * m_Size   1, row * m_Size   1, m_Size - 2, m_Size - 2);
                            }
                            
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                    }
                }
            }
        }

        private void CheckAndOverBrick()
        {
            //设定当前砖块到画布上
            for (int i = 0; i < m_RunBrick.Points.Length; i  )
                m_CoorArray[m_RunBrick.X   m_RunBrick.Points[i].X, m_RunBrick.Y   m_RunBrick.Points[i].Y] = m_RunBrick.Color;
            //检测并消除满行
            CheckAndDelFullRow();
            //设定活动砖块
            m_RunBrick = m_NextBrick;
            m_RunBrick.X = m_Width / 2;
            int y = 0;
            for(int i=0;i<m_RunBrick.Points.Length;i  )
            {
                if(m_RunBrick.Points[i].Y<y)
                    y=m_RunBrick.Points[i].Y;
            }
            m_RunBrick.Y = -y;
            //检查游戏结束
            for (int i = 0; i < m_RunBrick.Points.Length; i  )
            {
                //如果砖块所在位置有砖块,则到达顶部,游戏结束
                if (!m_CoorArray[m_RunBrick.X   m_RunBrick.Points[i].X, m_RunBrick.Y   m_RunBrick.Points[i].Y].IsEmpty)
                {
                    m_RunBrick = null;
                    //闪烁效果
                    m_TimerBrick.Stop();
                    for (int row = m_Heigh - 1; row > 0; row--)
                    {
                        for (int column = 0; column < m_Width; column  )
                        {
                            m_CoorArray[column, row] = m_BgColor;
                        }
                        PaintBricks(m_MainPalette);
                        System.Threading.Thread.Sleep(50);
                    }
                    //游戏结束
                    m_GameOver = true;
                    m_Ready = false;
                    m_TimerBrick.Start();
                    return;
                }  
            }
            m_RunBrick.Paint(m_MainPalette);

            //获取新的下一个砖块
            m_NextBrick = m_BrickFactory.CreateBrick();
            PaintNext(m_NextPalette);
        }
        //检查并删除满行砖块
        private void CheckAndDelFullRow()
        {
            int fullRowCount = 0;//满行数
            int upRow = m_RunBrick.Y - 2;//当前砖块的上行标志
            int downRow = m_RunBrick.Y   2;//当前砖块的下行标志
            if (upRow < 0) upRow = 0;//越界处理
            if (downRow > m_Heigh) downRow = m_Heigh - 1;//越界处理

            //检查此范围的行
            for (int row = upRow; row <= downRow; row  )
            {
                bool isFull = true;
                for (int column = 0; column < m_Width; column  )
                {
                    if (m_CoorArray[column, row].IsEmpty)//如果该行颜色都不为空(都有砖块)
                    {
                        isFull = false;
                        break;
                    }
                }
                if (isFull)//清除满行
                {
                    fullRowCount  ;
                    m_TimerBrick.Stop();//暂停游戏

                    //闪烁效果
                    for (int n = 0; n < COLORS.Length; n  )
                    {
                        for (int column = 0; column < m_Width; column  )
                            m_CoorArray[column, row] = COLORS[n];
                        PaintBricks(m_MainPalette);
                        m_TimerBrick.Start();//继续游戏
                    }
                    for (int rowIndex = row; rowIndex > 0; rowIndex--)
                        for (int column = 0; column < m_Width; column  )
                            m_CoorArray[column, rowIndex] = m_CoorArray[column, rowIndex - 1];
                    PaintBricks(m_MainPalette);
                    m_TimerBrick.Start();//继续游戏
                }
                
            }
            //有满行
            if (fullRowCount > 0)
            {
                int currentScore = SCORE_SPANS[fullRowCount - 1];//当前计分
                int tempScore = m_Score;//游戏得分
                m_Score  = currentScore;//追加得分
                if (m_Score >= 1000 && m_Score.ToString()[0] != tempScore.ToString()[0])//判断升级
                {
                    m_Level = (m_Level   1) % TIME_SPANS.Length;//当前级别
                    m_TimerBrick.Interval = TIME_SPANS[m_Level];//游戏速度
                }

            }
        }
        private void PaintGameOver()
        { }
        #endregion

    }
}

标签: 俄罗斯方块

实例下载地址

C# 俄罗斯方块 游戏源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警