引言
我们小时候可能都玩过这样一款小游戏,它就是开心消消乐。游戏刚开始会生成很多不同的小图标,我们需要交换两个图标的位置使三个(或以上)相同的图标紧挨在一起,这样相同的图标就会消去并随机生成其他图标。我们在有限的时间内消去的图标越多得分越高。按照这种游戏逻辑,我们今天试着复现一下。
准备工作
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#趣味消消乐小游戏
发布评论