- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我正在创建一个迷宫应用程序(我从迷宫的字符串数组中读取,然后通过触摸事件引导球穿过它)。到目前为止设法创建了所有内容,该应用程序运行良好。但我想包括一个自动解决它的选项。
我正在使用此处找到的递归算法:https://en.wikipedia.org/wiki/Maze_solving_algorithm
基本上,我在 boolean 多维数组(具有迷宫大小)中获取路径。
试图实现类似 MWC 的设计,所以我有以下类:
LabyrinthView - 处理与绘制迷宫和绘制球相关的一切LabyrinthModel - 初始化迷宫,处理球的运动,我也在此处检查迷宫的尽头,并在此处实现 recursiveSolve 以LabyrinthActivity - 这是我将所有东西放在一起的地方
就像我说的那样,手动解决迷宫非常有效。不知道如何为自动解决方案设置动画。那么让我给你一个迷宫的例子:
<string-array name="labyrinthEasy">
<item>0000000001</item>
<item>0111110110</item>
<item>0100000110</item>
<item>0101111000</item>
<item>0101000010</item>
<item>0101011010</item>
<item>0101011110</item>
<item>0101000010</item>
<item>0101111010</item>
<item>0100000010</item>
<item>0111111110</item>
<item>1000000000</item>
</string-array>
它看起来像这样(E-Entry,F-finish):
解决方案:
这是我到目前为止的进展:
private void selectControlMode() {
final CharSequence[] items = {"Human","Machine"};
final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
dialog.dismiss();
break;
case 1:
dialog.dismiss();
boolean temp;
temp = labyrinthModel.solveMaze();
if(temp){
new MazeSolver().execute();
}else{
AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
builder.setMessage("The maze is unsolvable!");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
dialog.dismiss();
Intent intent1 = new Intent(LabyrinthActivity.this, MainActivity.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent1);
break;
}
}
});
AlertDialog alert = builder.create();
alert.show();
}
break;
}
}
});
}
基本上,我会在对话中选择人工和机器解决问题。如果选择了 human,则处理对话框和无(应用程序继续并等待手动解决方案)。如果选择了机器,我会得到路径,如果可以解决,我想我应该在这里启动一个新线程,在那里我可以为自动解决方案设置动画,否则如果无法解决,我将返回到应用程序的主菜单。现在我的问题开始了,因为我真的不知道如何在我的 AsyncTask 类中实现它。
我在 doInBackgroung 方法中执行逻辑,但无法弄清楚如何遵循正确路径的逻辑。因为如果我逐行遍历数组,球会从一行跳到另一行,并且不会跟随路径的流动性。此外,我认为我应该在每次迭代后使用 onProgressUpdate 方法重新绘制我的进度。
这就是我的手动逻辑的工作方式(移动和绘图):
labyrinthView.setOnTouchListener(new View.OnTouchListener() {
float x1 = 0, x2 = 0, y1 = 0, y2 = 0;
float dx, dy;
@Override
public boolean onTouch(View v, MotionEvent event) {
float MIN_DIST = 5;
switch (event.getAction()){
case (MotionEvent.ACTION_DOWN):
x1 = event.getX();
y1 = event.getY();
break;
case (MotionEvent.ACTION_UP):
x2 = event.getX();
y2 = event.getY();
dx = x2-x1;
dy = y2-y1;
Log.v("log", dx + " " + dy);
if(Math.abs(dx) > MIN_DIST || Math.abs(dy) > MIN_DIST){
if (Math.abs(dx) > Math.abs(dy)){
if(dx > 0) {
labyrinthModel.right();
finishMessage();
}
else {
labyrinthModel.left();
finishMessage();
}
}else{
if(dy > 0) {
labyrinthModel.down();
finishMessage();
}
else {
labyrinthModel.up();
finishMessage();
}
}
}
break;
}
labyrinthView.invalidate();
return true;
}
});
这是我到目前为止在我的异步任务中所做的:
private class MazeSolver extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... params) {
for ( int row = 0; row < labyrinthModel.correctPath.length; row ++)
for ( int col = 0; col < labyrinthModel.correctPath[0].length; col++ ){
if(labyrinthModel.correctPath[row][col + 1]){
labyrinthModel.moveRight();
}
//here to do the implementaion of the path following logic???
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
// here to redraw the progress ????
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
如果您能指出正确的方向,我将不胜感激。
最佳答案
鉴于您可以覆盖信号二维数组的路径,您只需要从头到尾跟随根:
travel(correctPath, 0, 0, 11, 8);
void travel(bool a[][], int row, int col, int finalRow, int finalCol) {
// if we are already there stop
if(finalRow == row && col == finalCol) return;
// avoid comming back
a[row][col]=false;
// if the input is correct only on of this moves will be valid
// try each of them and see which move we can make
if(col - 1 >= 0 && a[row][col-1]) { left(); travel(a, row, col-1, finalRow, finalCol)};
if(col + 1 < 8 && a[row][col+1]) { right(); travel(a, row,col+1, finalRow, finalCol)};
if(row - 1 >= 0 && a[row-1][col]) { up(); travel(a, row-1, col, finalRow, finalCol)};
if(row + 1 < 11 && a[row+1][col]) { down(); travel(a, row+1,col, finalRow, finalCol)};
}
关于java - 自动迷宫解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33842852/
我只是想知道要安装哪个版本的 Visual Studio 2010(专业版或高级版)提示升级项目.. 项目包括:asp.net mvc、数据库和silverlight。 最佳答案 通常,由不同版本的相
几种通过 iproute2 来打通不同节点间容器网络的方式 几种通过 iproute2 来打通不同节点间容器网络的方式 host-gw ipip vxlan 背景 之前由于需
目录 前言 1、TypeHandler 简介 1.1转换步骤 1.2转换规则 2、JSON 转换 3、枚举转换 4、文章小结
目录 前言 1、常见 key-value 2、时效性强 3、计数器相关 4、高实时性 5、排行榜系列 6、文章小结 前言 在笔者 3 年的
目录 前言 四、技术选型 五、后端接口设计 5.1业务系统接口 5.2App 端接口 六、关键逻辑实现 6.1Red
目录 前言 一、需求分析 1.1发送通知 1.2撤回通知 1.3通知消息数 1.4通知消息列表 二、数据模型设计
目录 前言 一、多租户的概念 二、隔离模式 2.1独立数据库模式 2.2共享数据库独立数据架构 2.3共享数据库共享数据架构
导读: 虽然锁在一定程度上能够解决并发问题,但稍有不慎,就可能造成死锁。本文介绍死锁的产生及处理。 死锁的产生和预防 发生死锁的必要条件有4个,分别为互斥条件、不可剥夺条件、请求与保持条件和循环等待条
在浏览网页后,我找不到任何功能来执行此操作,我有可行的个人解决方案。也许它对某人有用。 **使用 Moment 插件转换日期。***moment(currentPersianDate).clone()
是否有一种解决方案可以很好地处理数字(1-10)手写?我试过tesseract,但我得到的只是垃圾。 理想情况下是 OSS,但商业也可以。 最佳答案 OpenCV 现在带有手写数字识别 OCR 示例。
在服务器应用程序上,我们有以下内容:一个称为 JobManager 的单例类。另一个类,Scheduler,不断检查是否需要向 JobManager 添加任何类型的作业。 当需要这样做时,调度程序会执
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 5年前关闭。 Improve this qu
当您尝试从 GitHub 存储库安装某些 R 包时 install_github('rWBclimate', 'ropensci') 如果您遇到以下错误: Installing github repo
问题在以下链接中进行了描述和演示: Paul Stovell WPF: Blurry Text Rendering www.gamedev.net forum Microsoft Connect: W
我正在寻找一种解决方案,使用标准格式 a × 10 b 在科学记数法下格式化 R 中的数字。一些同行评审的科学期刊都要求这样做,并且手动修改图表可能会变得乏味。 下面是 R 标准“E 表示法”的示例,
已编辑解决方案(如下...) 我有一个启动画面,它被打包到它自己的 jar 中。它有效。 我可以通过以下方式从另一个 java 应用程序内部调用 Splash.jar: Desktop.getDesk
什么是创建像 PageFlakes 或 iGoogle 这样的门户网站的好框架/包? ?我们希望创建一个为员工提供 HR 服务的员工/HR 门户,但我们也需要一种足够灵活的产品,以便我们可以使用它来为
我正在寻找一种解决方案,使用标准格式 a × 10 b 在科学记数法下格式化 R 中的数字。一些同行评审的科学期刊都要求这样做,并且手动修改图表可能会变得乏味。 下面是 R 标准“E 表示法”的示例,
如何将 solr 与 heritrix 集成? 我想使用 heritrix 归档一个站点,然后使用 solr 在本地索引和搜索该文件。 谢谢 最佳答案 使用 Solr 进行索引的问题在于它是一个纯文本
完整日历不包含工作时间功能选项(在任何一天的议程 View 中选择第一行和最后一行 - 例如公司不工作)。我做到了类似的事情: viewDisplay: function(view){
我是一名优秀的程序员,十分优秀!