关于包围神经猫的想法实现

看到朋友们狂转这个游戏里面圈,然后打了一下,说下自己的想法。。

首先,地图是一个9*9矩阵,由于没有对齐,所以后来,当宽的搜索将是一些麻烦,但是,毕竟,相对于4一个方向,齐不正确6一个方向的可能性,使游戏非常大的变化。

外观猫似都是从地图中间出现。默认的障碍应该也是随机生成的,所以没什么难度。

感觉这个最麻烦的地方就是猫逃跑的路线。一開始 以为是6个方向随即一个跑,可是后来发现是能逃出去的最短路线。由于本人比較菜。所以就用广搜来实现的。起点就是猫的位置,终点就是坐标超出地图范围 。

广搜就是最主要的广搜。没有剪枝。没有双向(9*9还要这些的仅仅有一斤葱才干干出来吧。

。。)然后每扩展到一个节点都记录一下他前一个节点的位置用于作为逃跑路径,广搜里面的Visit数组我设了两个。一个是点击过的,一个是在搜索中暂时的。然后在搜索的时候假设在两个数组中都没有訪问过就訪问。探索相邻节点费了点劲。由于相对于矩阵,这个的坐标实在没法用两层for搞定,就想推数学公式,推了半天繁琐不说,代码看的叫一难受。。。后来忽然想起一斤葱的常量数组。轻松解决~这样代码长度仅仅有原来的1/3。并且比原来好看多了。

。。

至于胜负。假设老猫在地图的边界那就是输了,假设上面的广搜没有搜到出去的路径那么玩家就赢了。PS:事实上这样的情况在游戏里面老猫是在原地晃。还不算结束,只是后面怎么实现就已经非常easy了,就没写。比方没搜到就返回(-1,-1)动不了就返回(-2,-2)。

由于实在是没有设计UI的天赋。所以界面就用Label简单取代了,圆形label百度了一下。貌似能够实现这里就不赘述了。

然后。。。也没有什么然后了?

最后上代码

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;

namespace TrapTheCat
{
    public partial class Form1 : Form
    {
        private int MapHeight = 9;
        private int MapWidth = 9;
        private bool[,] BoolMap;//不能走的节点
        private int StartNum = 30;
        private GameLabel[,] GameMap;
        private int CatPosX;//猫德位置
        private int CatPosY;
        private int[,] GuideY = { { 0, 1, -1, 1, 0, 1 }, { -1, 0, -1, 1, -1, 0 } };//这两个数组用于在深搜中探索相邻节点
        private int[] GuideX = { -1, -1, 0, 0, 1, 1 };
        struct Pos//用于存储路径用的
        {
            public Pos(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }
            public int X;
            public int Y;
        }
        public Form1()
        {
            InitializeComponent();
            GameStart();
            GameShow();
        }
        private void GameStart()//生成地图
        {
            int i, j;
            CatPosX = MapHeight / 2;
            CatPosY = MapWidth / 2;
            BoolMap = new bool[MapHeight, MapWidth];
            GameMap = new GameLabel[MapHeight, MapWidth];
            Random rand = new Random();
            for (i = 0; i < MapHeight; i++)
                for (j = 0; j < MapWidth; j++)
                    BoolMap[i, j] = false;
            for (i = 0; i < StartNum; i++)
            {
                int x, y;
                x = rand.Next(MapHeight);
                y = rand.Next(MapWidth);
                while (BoolMap[x, y] || (x == MapHeight / 2 && y == MapWidth / 2))
                {
                    x = rand.Next(MapHeight);
                    y = rand.Next(MapWidth);
                }
                BoolMap[x, y] = true;
            }
            for (i = 0; i < MapHeight; i++)
                for (j = 0; j < MapWidth; j++)
                {
                    GameMap[i, j] = new GameLabel(i, j);
                    if (BoolMap[i, j])
                        GameMap[i, j].BackColor = Color.Orange;
                    else GameMap[i, j].BackColor = Color.White;
                    GameMap[i, j].Width = 20;
                    GameMap[i, j].Height = 20;
                    if (i % 2 == 0)
                    {
                        GameMap[i, j].Left = 30 + j * 25;
                    }
                    else
                    {
                        GameMap[i, j].Left = 20 + j * 25;
                    }
                    GameMap[i, j].Top = 30 + i * 25;
                }
            GameMap[CatPosX, CatPosY].Text = "Cat";
            BoolMap[CatPosX, CatPosY] = false;
        }
        private void GameShow()//显示界面
        {
            int i, j;
            for (i = 0; i < MapHeight; i++)
                for (j = 0; j < MapWidth; j++)
                {
                    GameMap[i, j].Click += Label_Click;
                    this.Controls.Add(GameMap[i, j]);
                }
        }
        private Pos? CatMove()//猫逃跑的路径,返回下一步应该向哪个方向跑
        {
            int X = CatPosX;
            int Y = CatPosY;
            int[,] list = new int[400, 2];
            bool[,] Visited = new bool[MapHeight, MapWidth];
            int Top = 0;
            int Tail = 0;
            int i, j;
            for (i = 0; i < MapHeight; i++)
                for (j = 0; j < MapWidth; j++)
                    Visited[i, j] = false;
            Pos[,] Prev = new Pos[MapHeight, MapWidth];
            Prev[X, Y].X = X;
            Prev[X, Y].Y = Y;
            list[Top, 0] = X;
            list[Top, 1] = Y;
            Top++;
            while (Top != Tail || Top == 0)
            {
                X = list[Tail, 0];
                Y = list[Tail, 1];
                Tail++;
                for (i = 0; i < 6; i++)
                {
                    int TempX, TempY;
                    TempY = Y + GuideY[X % 2, i];
                    TempX = X + GuideX[i];
                    if (TempX < 0 || TempX >= MapHeight || TempY < 0 || TempY >= MapWidth)
                    {
                        Pos p;
                        while (Prev[X, Y].X != CatPosX || Prev[X, Y].Y != CatPosY)
                        {
                            p = Prev[X, Y];
                            X = p.X;
                            Y = p.Y;
                        }
                        return new Pos(X, Y);
                    }
                    if (!Visited[TempX, TempY] && !BoolMap[TempX, TempY])
                    {
                        list[Top, 0] = TempX;
                        list[Top, 1] = TempY;
                        Prev[TempX, TempY].X = X;
                        Prev[TempX, TempY].Y = Y;
                        Top++;
                        Visited[TempX, TempY] = true;
                    }
                }

            }
            MessageBox.Show("No!\n" + Tail.ToString());
            return null;
        }
        private void Label_Click(object sender, EventArgs e)//label单击事件
        {
            GameLabel label = (GameLabel)sender;
            BoolMap[label.X, label.Y] = true;
            label.BackColor = Color.Orange;
            if (CatPosX == 0 || CatPosX == MapHeight - 1 || CatPosY == 0 || CatPosY == MapWidth - 1)
            {
                MessageBox.Show("You Lose!");
                return;
            }
            Pos? p = CatMove();
            if (p.HasValue)
            {
                GameMap[CatPosX, CatPosY].Text = "";
                GameMap[p.Value.X, p.Value.Y].Text = "Cat";
                CatPosX = p.Value.X;
                CatPosY = p.Value.Y;
            }
            else
            {
                MessageBox.Show("You Win!");
            }
        }

    }
    class GameLabel : Label//显示用标签
    {
        private int PosX;

        public int X
        {
            get { return PosX; }
        }
        private int PosY;

        public int Y
        {
            get { return PosY; }
        }
        public GameLabel(int PosX, int PosY)
        {
            this.PosX = PosX;
            this.PosY = PosY;
        }
    }

}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-08-11 07:40:49

关于包围神经猫的想法实现的相关文章

可能是最难围住的神经猫——寻找必胜路径的算法实现

标题借鉴了一下老罗的风格,哈哈(*^__^*) 原来围住神经猫游戏刚火的时候,恰巧当时正在学QML,顺手就给弄了一个,不知道大家还记不记得这个游戏,简单说就是设置障碍把中间的猫围住就获胜了(橙色圆即为障碍),而猫可以向周围六个方向中的非障碍区域逃跑,如果猫逃跑到四周边界的圆上则玩家失败,界面是酱紫的: 然后在 Qt 贴吧里面也共享了一下:http://tieba.baidu.com/p/3241650033 因为当时做这个的时候主要是想练下 QML,所以草草弄了个随机方向选择算法(应该没资格叫算

一个配置表优化的想法

今天下班在班车上想了一个关于配置表存储的小优化,起因是早上的时候发现了一个bug,这个bug是由于在运行时动态更改了一个列表配置导致的. 其实关于这种运行时"偷偷"改配置的问题我之前也有考虑过,这种应该是一不小心就会写出的,这不终于都出了一个. 至于如何预防这种问题,我认为在python里面似乎也没有什么好的解决方法,因为它不像c++有const语义,但有一个稍尽人事的预防措施就是把列表型的配置读成元组(tuple).而由此衍生出的一个想法便是:把配置表中所有的列表型配置都读成共享的元

看死亡笔记后的想法(一)

最近在看Death Note,特别是逮捕火口的前后几集,很精彩,也有了自己的一些看法. 逮捕火口之前,八人会议中的三位高管聚到一起商议,他们八人中到底谁是基拉,他们都认为是火口,看来公司高管没有一个是简单的呢 他们认为是火口的原因之一是他看起来对名利毫不在意,我的想法是 一个人表现出对什么东西越是装作不在意,就可能越是在意. 对一些东西,比如钱,或者地位,大家都想要的东西,某个人对它并不在意,这是否如他所说,就值得怀疑 并且,如果这个人的身份跟他的话矛盾,比如是公司高管,但天天说自己不在意地位和

只想把技术做好,维持一份可观的收入,就精专一门;有创业想法,就全栈

做全栈开发(前端和后端)好还是全端开发(前端和Android应用开发)好?哪个前景和钱景发现比较好,对以后的发展! 1. 有创业想法,就全栈.只想把技术做好,维持一份可观的收入,就精专一门 2. 全栈对自己的优势不大吗?好多公司都不认同,特别是HR,普遍的观点是,会的多,就很难专精. 3. 大公司是一个靠分工增加工作效率的机构,无论你全栈,还是全端,对公司来说都只用你的一部分技能.但是薪资可是要比一般的人高一些,所以很多HR都忽悠你说全会的就没法专精.先全栈,后全端.别信那些HR忽悠. 4. 有

企业怎样玩转10亿网民?田溯宁有不一样的想法!

京东商城创始人刘强东在中美互联网论坛上表示,中国是世界上最大的互联网市场,未来十年中国网民将超10亿.阿里巴巴创始人马云谈到当前中国传统企业经营压力增大,但更应该看到新经济增长的势头不亚于美国,中国市场潜力巨大.联想CEO杨元庆则提到,现在是一个资源全球配置的时代. 面对一个拥有全球最大网民规模.员工数量动辄上万的企业规模.全球化资源配置以及新经济增长模式层出不穷的转型时代,传统企业究竟要如何实现互联网+.如何玩转即将出现的10亿网民所带来的数据红利和网民人口红利?被誉为中国"互联网建筑师&qu

有个想法,想吧LNMP和NGINX和HAPROXY都放到docker里做集群,大家觉得怎么样?

有个想法,想把LNMP和NGINX和HAPROXY都放到docker里做集群 顶层HAPROXY+KERPALIVE 第二层NGINX+KERPALIVE 第三层APACHE集群+MYSQL集群 第四层docker 第五层LINUX内核 有想法的可以一起讨论下哈

NOSDK--关于android一键打包及统一接入国内多个平台SDK的想法与实现(前言)

前言 一,一键打包的实现 1.1 shell文件介绍 1.2 自动刷新mk文件 1.3 自动拷贝资源 1.4 使用ant实现打包 1.5 拷贝icon 二,统一接入多个平台 1.1 nosdk框架介绍 1.2 nosdk_library基本库介绍 1.3 游戏逻辑与sdk平台的分离 1.4 xx平台接入示例 三,后记 做SDK平台接入工作已经有一年多了,自认对于大多平台的sdk都基本熟悉了,因此计划写一个系列的文章,介绍自己对于一键打包及统一接入多个平台sdk的一些想法与实现,算是对于这一年多的

[待完善]关于辛普森公式的一点想法

[吐槽] 嗯一开始接触到这个东西其实是因为某道凸包的题目好像可以用这个奇妙的方法来算 但其实了解也不是很深,只是觉得这个东西十分有意思, 所以先稍微写一下自己的想法,了解更多之后慢慢完善 [正题] 首先这个公式是长这样的: 取一个二次函数上(嗯..貌似是这样的)的一段区间,左端点为$(l, hl)$,右端点为$(r, hr)$,中间的那个点为$(\frac{r-l}{2}, hmid)$ 那么,这段的积分可以表示为: $\frac{(r-l)*(hl+4*hmid+hr)}{6}$ 但是这样往往

记录下我曾经那些认为的小想法

每隔一段时间,脑袋瓜子就会冒出一些自认为是小想法. 这篇文章就记录下我以前的一些小想法以及以后的小想法,一种想记录下来,一直也没有机会和时间.直到现在一琢磨,赶紧记录下来吧,也许很多时候的灵光一闪真是一个不错的idea.记录下来前面想起的和现在以及以后的idea,因此这篇文章会不断地实时更新,越来越完善. IDea1 2012年,刚步入高中的时候的第二学期,依稀记得那时候的智能手机还没有想象的普遍,在校门口当时接触了第一台智能机,一个高仿iphone 4s的手机,当时和同学一狠心每人买了一台.当