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

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

大家好,又见面了,我是全栈君,今天给大家准备了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;
        }
    }

}

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • LaTeX参考文献类型

    LaTeX参考文献类型@article:期刊文章@book:有明确出版商的书@booklet:没有指定出版商或赞助商的印刷品@conference:会议文章,与inproceedings相同@inbook:书的一部分,可以是章节等@incollection:Apartofabookhavingitsowntitle@inproceedings:会议文章@manual:技术文档@mastersthesis:硕士论文@misc:大杂烩,当没有其他适合的时候使用这个类型@phdt

    2025年10月10日
    2
  • vs2012 webservice 实例

    vs2012 webservice 实例1.把安装好的VS打开

    2022年7月21日
    20
  • pgsql数据库恢复_oracle多字段去重

    pgsql数据库恢复_oracle多字段去重概述今天主要介绍一下Oracle、MySQL、sqlserver、pg数据库在删除重复数据时是怎么实现的。这里用实例来说明。一、Oracle数据库去重1、环境准备可以看到“ALLEN”和“SMITH”这两个人的数据重复了,现在要求表中name重复的数据只保留一行,其他的删除。CREATETABLEhwb(idint,namevarchar(10));INSERTINTOhwbVALUES(1,’TOM’);INSERTINTOhwbVALUES(2

    2022年10月1日
    3
  • idea20212.13激活_最新在线免费激活「建议收藏」

    (idea20212.13激活)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0BXA05X8YC-eyJsaWN…

    2022年3月30日
    58
  • MQTT服务器搭建–Mosquitto[通俗易懂]

    MQTT服务器搭建–Mosquitto[通俗易懂]MQTT服务器搭建–Mosquitto1.Mosquitto简介MQTT(MQTelemetryTransport),消息队列遥测传输协议,轻量级的发布/订阅协议, 适用于一些条件比较苛刻的环境,进行低带宽、不可靠或间歇性的通信。目前已经是物联网消息通信事实上的标准协议了。值得一提的是mqtt提供三种不同质量的消息服务:l “至多一次”:消息发布完全依赖底层 TCP/IP 网络。

    2022年5月6日
    42
  • 各主流浏览器内核介绍[通俗易懂]

    各主流浏览器内核介绍[通俗易懂]所谓的“浏览器内核”无非指的是一个浏览器最核心的部分——“RenderingEngine”,直译这个词汇叫做“渲染引擎”,不过我们也常称其为“排版引擎”、“解释引擎”。这个引擎的作用是帮助浏览器来渲

    2022年8月1日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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