引言

我们小时候可能都玩过这样一款小游戏,它就是开心消消乐。游戏刚开始会生成很多不同的小图标,我们需要交换两个图标的位置使三个(或以上)相同的图标紧挨在一起,这样相同的图标就会消去并随机生成其他图标。我们在有限的时间内消去的图标越多得分越高。按照这种游戏逻辑,我们今天试着复现一下。

准备工作

1.Microsoft Visual Studio 2008
2.相关的图标(我使用的是百度贴吧的表情包,下载自网络,通过photoshop将图标调整成合适的大小)

相关代码

我首先使用一张浅色图片作为背景,然后绘制合适数量的方格(白线绘制),每一个方格都可以加载不同的图标。

//自定义类方法:绘制背景
        public void DrawBoard(Graphics g)
        {
            //创建粗画笔与细画笔
            Pen thickPen = new Pen(Color.Blue, 3);
            Pen thinPen = new Pen(Color.White, 1);

            //绘制背景
            g.DrawImage(_deskTop, new Point(0, 0));
            //绘制分割线
            g.DrawLine(thickPen, new Point(0, 70), new Point(620, 70));
            //绘制细框
            g.DrawRectangle(thinPen, _leftTop.X, _leftTop.Y, _width * 10, _width * 10);

            //绘制细线
            for (int i = 1; i <= 9; i++)
                g.DrawLine(thinPen, new Point(_leftTop.X + _width * i, _leftTop.Y), new Point(_leftTop.X + _width * i, _leftTop.Y + _width * 10));
            for (int i = 1; i <= 9; i++)
                g.DrawLine(thinPen, new Point(_leftTop.X, _leftTop.Y + _width * i), new Point(_leftTop.X + _width * 10, _leftTop.Y + _width * i));

            //绘制标记
            DrawMark(g, _fRow, _fCol);
            DrawMark(g, _sRow, _sCol);

        }

总共8个图标,每个图标设置为1~8中的一个整数数值,空白图标对应数值0(打开程序后不加载图标)。
点击菜单中的开始按钮后,通过赋随机数的方法给每一个方格赋值(只能是1~8的整数),不同的数值对应不同的图标,这样就能加载出来随机的图标了。

//图标枚举类型
    public enum Block
    {
        无图 = 0,
        爱心 = 1, 愤怒 = 2, 大笑 = 3, 滑稽 = 4,
        可爱 = 5, 难过 = 6, 调皮 = 7, 吓哭 = 8
    }
//自定义类方法:绘制图标
        public void DrawBmp(Graphics g)
        {
            //检测
            Check();
            //循环控制每行每列
            for (int a = 1; a <= 10; a++)
            {
                for (int b = 1; b <= 10; b++)
                {
                    //逐行逐列绘制每一个图标                   
                    g.DrawImage(_blockBmp[(int)_block[a, b]], new Point(_leftTop.X - 3 + _width * (a - 1), _leftTop.Y - 3 + _width * (b - 1)));
                }
            }
            _changeFlag = true;
        }


图标加载完成之后,我们开始游戏,可是如何将两个小方格的图标进行交换呢?其实很简单,每一个小方格上的图标对应一个数值,我们只需将两个小方格所保存的数值进行交换,再重新加载一次图标即可。

交换不是任意交换,需要满足一定的条件。只能是相邻的两个小方格才有机会进行交换,如果交换后不满足三个(或以上)相同图标相邻则不会发生交换。

//自定义类方法:检测
        public void Check()
        {
            Random ran = new Random();          
            //逐行检测
            for (int i = 1; i <= 8; i++)
            {//列
                for (int j = 1; j <= 10; j++)
                {//行
                    if (_block[i, j] == _block[i + 1, j] && _block[i, j] == _block[i + 2, j] && _block[i, j] != Block.无图)
                    {
                        //将原先方格的图标依次往下移
                        for (int x = i; x <= i + 2; x++)
                        {//列
                            for (int y = j; y >= 1; y--)
                            {//行
                                if (y >= 2)                               
                                    _block[x, y] = _block[x, y - 1];                              
                                else                              
                                    _block[x, y] = (Block)ran.Next(8) + 1;                               
                            }
                        }
                        _changeFlag = false;
                        _score += 100;//分数增加100
                    }
                }
            }
            //逐列检测
            for (int i = 1; i <= 10; i++)
            {//列
                for (int j = 1; j <= 8; j++)
                {//行
                    if (_block[i, j] == _block[i, j + 1] && _block[i, j] == _block[i, j + 2] && _block[i, j] != Block.无图)
                    {
                        //将原先方格的图标依次往下移
                        for (int x = i; x <= i; x++)
                        {//列
                            for (int y = j; y >= -1; y--)
                            {//行
                                if (y + 2 >= 4)
                                    _block[x, y + 2] = _block[x, y - 1];
                                else
                                    _block[x, y + 2] = (Block)ran.Next(8) + 1;
                            }
                        }                        
                        _changeFlag = false;
                        _score += 100;//分数增加100
                    }
                }
            }           
        }

每个小方格有相应的行号列号,鼠标点击该方格时,会保存该方格的行号列号,方便进行图标交换。

//自定义类方法:把鼠标点击位置转换成行号和列号
        public bool ConvertFromPointToRowCol(Point p, out int row, out int col)
        {
            //获取行号
            row = ((int)(p.Y - _leftTop.Y) / _width) + 1;
            //获取列号
            col = ((int)(p.X - _leftTop.X) / _width) + 1;
            if ((row >= 1) && (row <= 10) && (col >= 1) && (col <= 10) && (p.Y > _leftTop.Y) && (p.X > _leftTop.X))
            {
                return true;
            }
            else
            {
                row = -1;
                col = -1;
                return false;
            }
        }

如果是有效交换,则将三个(或以上)相同图标消去,这三个位置由其他未消去图标补上,空白部分会生成新图标。

//自定义类方法:交换图标值
        public void ChangeBmp(int row,int col)
        {
            
            if (_fBlock == Block.无图)
            {
                _fBlock = _block[col, row];//保存第一次点击位置的图标值
                _fRow = row; _fCol = col;//第一次点击位置行列
                _sRow = 0; _sCol = 0;
            }
            else
            {
                if ((row == _fRow && Math.Abs(col - _fCol) == 1) ||
                    (col == _fCol && Math.Abs(row - _fRow) == 1))
                {
                    _sBlock = _block[col, row];//保存第二次点击位置的图标值
                    _sRow = row; _sCol = col;//第二次点击位置行列
                    //交换两个位置的图标值
                    _block[_fCol, _fRow] = _sBlock;
                    _block[col, row] = _fBlock;
                    Check();//检测
                    if (_changeFlag)
                    {
                        //还原两个位置的图标值
                        _block[_fCol, _fRow] = _fBlock;
                        _block[_sCol, _sRow] = _sBlock;                       
                    }
                    _changeFlag = true;
                    _fBlock = Block.无图;
                    _fRow = 0; _fCol = 0;
                    
                }
            }
        }

视频展示

C#趣味消消乐小游戏

更多推荐

C#趣味消消乐小游戏