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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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


首先,地图是一个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;
        }
    }

}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117442.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 什么是“系统空闲进程”,为什么使用那么多的CPU?「建议收藏」

    HaveyoueveropenedupTaskManagerandnoticedtheSystemIdleProcessisusing90%ormoreofyourCPU?Contrarytowhatyoumightthink,that’snotabadthing.Here’swhatthatprocessactuallyd…

  • QT学习—使用多线程的两种方法(子类化QThread+子类化QObject)

    QT学习—使用多线程的两种方法(子类化QThread+子类化QObject)第一种方法:摘要Qt多线程方法1继承QThread1写一个继承于QThread的线程2QThread的几个函数quitexitterminate函数3正确的终止一个线程4如何正确启动一个线程41正确的启动一个全局线程和UI一直存在的线程42如何启动一个局部线程用完即释放的线程继承QThread的一些总结使用QObject实现多线的方法见:http://blog.csdn.net/czyt…

  • WPS2012交叉引用技巧,word比wps这点强更新參考文献

    WPS2012交叉引用技巧,word比wps这点强更新參考文献

  • Sublime插件推荐

    Sublime插件推荐常用插件推荐Alignment:自动对齐代码SublimeLinter提示编写代码中存在的不规范和错误的写法SublimeCodeIntel代码提示和补全BracketHighlighter代码匹配SideBarEnhancements侧栏右键功能增强ConvertToUTF8,GBK编码兼容Emmet让编写代码变得简单HTML-CSS-JSPrettifyHTML…

  • idea for mac 快捷键设置_macidea使用快捷键

    idea for mac 快捷键设置_macidea使用快捷键最强IDEA关于Mac版本的常用快捷键

  • UML时序图简析[通俗易懂]

    UML时序图简析[通俗易懂]前言在嵌入式软件开发中,必然会遇到与其他控制板卡或者服务器通信的情况。比如,制作一个无线远程控制系统。系统分为,输入设备,云端服务器,执行设备。其中输入设备,用户可以通过设备上的触摸屏进行交互,控制或者监测远程设备云端服务器,收发终端,接收输入设备的命令,并将其转换为执行设备可识别的信号发送到可执行设备。执行设备,执行服务器发送过来的命令,并且反馈当前的设备的一些状态.简单如下图所示。一般,这样的系统需要多人共同协作完成,输入设备的开发人员负责输入设备开发,云端负责云端,执行端负责执行端

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号