咸鱼游戏中有许多小游戏,我在玩小游戏的时候发现了一个涂色小游戏。
下方地址是我的代码地址,可以查看完整代码,并进行测试。
GitHub - Basicconstruction/Painter: 涂色游戏的简单实现和算法解决
类似于下面的涂色,为了完成游戏,我们需要使用右侧和下侧的刷子吧方块刷到目标色。
下图是我实现的涂色游戏的逻辑,这两个图展示的分别是初始图,和目的图。
我们需要使用若干的右侧刷子和若干的下侧刷子,吧初始图刷成目标图。
很显然,在玩的时候一些简单的多用眼睛观察,然后思考一下,就可以刷成,但是对于复杂的就比较难以完成。这个玩法比较有意思,于是在我们的网路应用编程的课大作业时,我把这个玩法推荐给了我们班的一个小组。
玩这个游戏的时候,我不禁思考,如何使用代码来计算出最短的刷子路径。我想着开发一个wcf的程序,放在抖音直播里面,让特定的直播观看者尝试或者让他和机器人来比较速度。
结果,抖音的Api不太容易获得。但是,我想这可以以其他形式来开直播,尽管我现在放弃了这个想法,这需要不少的精力,但是扑街的可能性还是比较大。
但是,在前天,我实现了n维的涂色游戏的游戏类,可以创建1*1,2*2,3*3,4*4,。。。20*20,等等的涂色游戏。当然如果你的显示屏够大也可以创建更多。
昨天我试着推演他的规律,尝试通过逆推解决,昨天思路没有打开,今天打开了思路,并解决了问题。
首先: 不是所有的目标都是可解的,对于2*2的,对角线就是不可解的,更高维度的也有不可解的。
在我的算法中,不可解的目标是,在寻找上一步的步骤时,找不到时判断是否已经解决,如果没有解决就是不可解的。
这个解决是思路的转变,是从Uncertain 到 Any的转变。
我先贴一下代码:
枚举类:
public enum Direction
{
Row,
Col,
}
public enum PaintType
{
One,
Zero,
Any,
}
数据结构和解决算法:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Reverse
{
public class Cube
{
private readonly PaintType[,] _miss;
private readonly int _axis;
public Cube(int axis)
{
_axis = axis;
_miss = new PaintType[axis, axis];
}
public Cube(int axis, PaintType[,] miss)
{
_axis = axis;
_miss = miss;
}
public void Init()
{
for (var i = 0; i < _axis; i++)
{
for (var j = 0; j < _axis; j++)
{
_miss[i, j] = PaintType.Zero;
}
}
}
public static List<Result> Sort(List<Result> results)
{
var tmp = new List<Result>();
var res = new List<Result>();
if (results.Count < 1)
{
return null;
}
var direction = results.First().Direction;
foreach (var ele in results)
{
if (ele.Direction == direction)
{
tmp.Add(ele);
}
else
{
res.AddRange(PartSort(tmp));
tmp.Clear();
direction = ele.Direction;
tmp.Add(ele);
}
}
if (tmp.Count > 0)
{
res.AddRange(PartSort(tmp));
}
return res;
}
private static List<Result> PartSort(List<Result> results)
{
results.Sort((r1, r2) => r1.Num.CompareTo(r2.Num));
return results;
}
public void RandomMix(int count)
{
var random = new Random((int)DateTimeOffset.Now.Ticks);
var i = random.Next(_axis);
var j = random.