咸鱼游戏涂色游戏的逻辑分析与目标块执行步骤推演

本文介绍了一个实现N维涂色游戏的项目,通过代码展示了如何寻找最短的涂色路径。作者探讨了游戏的逻辑,包括不可解目标的情况,并提供了一种基于逆向思维的解决算法。此外,还提到了将游戏与直播结合的想法,但由于技术限制未能实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

咸鱼游戏中有许多小游戏,我在玩小游戏的时候发现了一个涂色小游戏。

下方地址是我的代码地址,可以查看完整代码,并进行测试。

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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶kx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值