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

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

大家好,又见面了,我是全栈君,今天给大家准备了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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js数组排序的几种方法

    js数组排序的几种方法1、冒泡排序以从小到大排序为例,冒泡排序的原理就是通过两层循环把数组中两两相邻的元素进行比较,是的大的元素放到后边,元素交换位置,从而一步步的交换元素的位置,使得最大的元素放到数组的末尾,这样内部的循环就进行了一轮,再根据外部的循环依次再把次大一点的元素放到数组的末尾,从而实现数组的逐步排序。代码如下://冒泡排序vararr=[52,3,8,57,75,2,1];for(…

    2022年4月29日
    87
  • java:闰年判断程序[通俗易懂]

    java:闰年判断程序[通俗易懂]公历闰年的简单计算方法(符合以下条件之一的年份即为闰年)1、能被4整除而不能被100整除。2、能被400整除。方案:使用数学运算符取余运算(%),关系运算符等于(==)和不等于(!=),辑运算符逻辑与(&&)和逻辑或(||),来判断某年是否为闰年,判断的结果为boolean类型的值,如果为闰年boolean类型的值为true,否则为falsebooleanflag=(year%4==0&&year%100!=0)||year%400==0

    2022年7月17日
    10
  • 信号带宽和信道带宽_信号带宽大于信道带宽

    信号带宽和信道带宽_信号带宽大于信道带宽信号带宽:一个信号可以分解为一系列不同频率正余弦函数的加权和。带宽,就是那些对应的加权非零部分对应的三角函数的频率宽度。信号频谱的宽度,也就是信号的最高频率分量与最低频率分量之差。例如,比如我们学过的sin(x)函数,就是一个信号,sin(x)是一个三角函数,所以其若用傅里叶级数表示,加权非零部分就是该信号本身。其对应的信号的带宽就是1HZ.(因其只有一个频率)。再例如:一个由数个正弦波叠加成的方…

    2022年10月11日
    0
  • Jenkins安装_jenkins安装与配置

    Jenkins安装_jenkins安装与配置前言jenkins的环境搭建方法有很多,本篇使用docker快速搭建一个jenkins环境。环境准备:mac/Linuxdockerdocker拉去jenkins镜像先下载jenkins镜

    2022年7月30日
    4
  • Idea激活码最新教程2021.2.2版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2021.2.2版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2021 2 2 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2021 2 2 成功激活

    2025年5月22日
    4
  • 【json】Jackson的使用

    【json】Jackson的使用

    2022年4月2日
    38

发表回复

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

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