关于围住神经猫实现的想法
首先地图是一个9*9的矩阵,因为不是对齐的,所以在后面广搜的时候会有些麻烦,但是毕竟相对于4个方向,不对齐的6个方向会让游戏的可能性有很大变化。
猫貌似都是从地图中间出现,默认的障碍应该也是随机生成的,所以没什么难度。
感觉这个最麻烦的地方就是猫逃跑的路线。一开始 以为是6个方向随即一个跑,但是后来发现是能逃出去的最短路线,因为本人比较菜,所以就用广搜来实现的。起点就是猫的位置,终点就是坐标超出地图范围 。广搜就是最基本的广搜,没有剪枝,没有双向(9*9还要这些的只有一斤葱才能干出来吧。。。)然后每扩展到一个节点都记录一下他前一个节点的位置用于作为逃跑路径,广搜里面的Visit数组我设了两个,一个是点击过的,一个是在搜索中临时的,然后在搜索的时候如果在两个数组中都没有访问过就访问。探索相邻节点费了点劲,因为相对于矩阵,这个的坐标实在没法用两层for搞定,就想推数学公式,推了半天繁琐不说,代码看的叫一难受。。。后来忽然想起一斤葱的常量数组,轻松解决~这样代码长度只有原来的1/3,而且比原来好看多了。。。
然后。。。也没有什么然后了?
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;}}}
关于围住神经猫实现的想法相关推荐
- Spring 集成dubbo 找不到dubbo.xsd 文件的问题的想法概述
想法概述: 网上的很多关于找不到dubbo.xsd 都是指向的原因是: 阿里的这个域名(http://code.alibabatech.com/schema/dubbo/dubbo.xsd)已经停用了 ...
- web标准,我们去向何方?一些想法...
web标准,我们去向何方?一些想法... 作者:阿捷 2004-7-5 0:52:42 原文作者:Veerle 原文出处:veerle.duoh.com 原文发表时间:2004年6月14日 译者注:本 ...
- 【杂】突然有个想法,为了防止公司或其他,监视你的qq或微信,可以做个程序,将信息打乱,分别用qq和微信传输,然后,再还原
突然有个想法,为了防止公司或其他,监视你的qq或微信,可以做个程序,将信息打乱,分别用qq和微信传输,然后,再还原.
- 编码中统一更该变量的快捷键_更多项目想法,以提高您的编码技能
编码中统一更该变量的快捷键 Two weeks ago I published an article containing 15 project ideas that you can build to ...
- 如何使用React.js和Heroku快速实现从想法到URL的转变
by Tom Schweers 由汤姆·史威士(Tom Schweers) 如何使用React.js和Heroku快速实现从想法到URL的转变 (How to go from idea to URL ...
- 多个敏捷团队同时做一个项目_您说您的团队很敏捷……但是这个词可能并不代表您的想法。...
多个敏捷团队同时做一个项目 by Mark Shead 由马克·希德(Mark Shead) Many things get called Agile - especially by people w ...
- 调试代码遗留_陷入遗留代码地狱吗? 这里有一些想法可以帮助您处理情况
调试代码遗留 by Felipe Lopes 通过Felipe Lopes 陷入遗留代码地狱吗? 这里有一些想法可以帮助您处理情况 (Stuck in legacy code hell? Here a ...
- 想法2: 充电性冰袋
想法缘由: 小奶狗特别喜欢打篮球,然而总受伤啊------------呜呜, 每次总是被撞到青一块的,故而总是用到 冰块. 京东: (1)注水冰袋---------- 原理: 冰袋 ...
- 想法1 : 突然萌发的 “天时地利人和”-----优化
背景: 大数据的时代,人类的行为总是通过数据记录来展现,me每一个数据有了自己的行业背景就赋予了不一样的意义 萌生的想法点: (1) 为何不把数据分成外部的环境模型-------- ...
最新文章
- selenium - webdriver常用方法
- 【Leetcode】Palindrome Number
- 吴恩达 coursera ML 第十一课总结+作业答案
- 单机环境RocketMQ的安装
- ofo引入信用分评系统 ,0分将被禁止使用
- [BZOJ2655] calc
- 【java】Windows7 下环境变量设置
- SQL Server更新联接概述
- Linux故障解决(4)——新安装的CentOS 系统无法上网解决方法 (未知的名称或服务)
- 无线充电手机 协议 c语言,这款无线充电器仅69元?支持Qi协议
- jsp+mysql校园卡管理系统设计与实现
- 深度学习中的注意力机制
- 深度学习常用python库学习笔记
- 2020-09-25
- Bentley OpenFlows FLOOD 集成的洪水模拟软件
- 图片验证码有时会出现无法显示的问题
- c# 从一组数中随机抽取一定个数_C#随机一组不重复的数字
- 【Python刷题*计算客】A+B+C问题
- linux 64位 objdump,linux objdump
- ubuntu16.04 uhd+gnuradio+gr-radar安装总结
热门文章
- VMware虚拟机网络详细设置(转载https://www.2cto.com/net/201103/85655.html)
- shell脚本实现查找文件夹下重复的文件,并提供删除功能
- 系统性能评价---性能评估
- 应用性能监控对DMS系统综合分析案例
- 用计算机怎么算期中成绩呢,绩点计算器有什么用?绩点计算器导出成绩的方法介绍...
- 计算机软件和软件系统的区别,系统软件和软件系统是一回事吗?如果不是,那 – 手机爱问...
- M 平台按键强制升级流程分析
- html自动布局框架,html布局 百分比自适应框架网页模板
- 显示计算机101代码,steam错误代码-101怎么解决
- kafka Java客户端之consumer 流量控制 以及 Rebalance解析