Runaway Robot游戏过关通用算法设计并java语言实现

这是一个游戏,感觉不错,加上有固定的套路去寻找答案,所以就决定用程序实现。

这个小游戏的网址:点击打开链接 
      http://www.hacker.org/runaway/index.php

这个游戏是一个机器人在布满炸弹的地图(bigLayout)中寻找出路,出路是在雷区的边界(绿色区域)。但机器人(robot)记住的路途太少不可以记住从开始到安全区域的所有路径。robot会记住最小(min)的路径步数和最大(max)的路劲步数,但走完了记忆步骤,就开始循环记忆步骤。robot只会两种走法(向右和向下),开始时的图形为下图:

 

下面说一下算法:

游戏<Runaway Robot>算法:

Input:int min  //最小步数

int max  //最大步数

String info //布局

Output:int path[][] //可行路径

1 do getBigLayout

2 for min to max:

for-each Dot,Dot为固定步骤一次循环到达的位置

if dot可用:

do getLayout

do getLayoutUse

do getLayoutCut

3 return:Layout

getBigLayout1 把info代表的信息转化为地图

getLayout:

1 dot位置,建立layout布局2  依据bigLayout,丰满layout布局 ,即把到到达dot位置的步骤循环走完bigLayout,经过区域的炸弹全部映射到layout中,其中炸弹区为   标记为red,null标记为null

getLayoutUse:1 初始化layout起点为green

2 for-each layout.dot,由上至下,由左到右遍历layout

if dot为green

感染dot的右一或下一位置为null的为green

3 return layout

getLayoutCut:

1 初始化layout结束点(右下方的点)为robot2 for-each layout.dot,由下至上,由右到左遍历layout

if dot为robot

感染dot的左一或上一位置为green为robot

3 return layoutjava算法实现: 注意:0,green;1,red;2,null;3,robot;

[java] view
plain
copy

  1. package runaway;  
  2. public class Robot {  
  3.       
  4.     //主要算法实现  
  5.     public int[][] go(String info,int min,int max){  
  6.         int bigLayout[][]=getBigLayout(info);  
  7.         int layout[][]=null;  
  8.         for(int i=min;i<=max;i++){  
  9.             for(int j=0;j<=i;j++){  
  10.                 int I=i-j+1;  
  11.                 int J=j+1;  
  12.                 layout=getLayout(bigLayout,I,J);  
  13.                 layout=layoutUse(layout);  
  14.                 layout=layoutCut(layout);  
  15.                 if(layout!=null)  
  16.                     return layout;  
  17.             }  
  18.         }  
  19.         return null;  
  20.     }  
  21.   
  22.     //获取bigLayout  
  23.     private int[][] getBigLayout(String info){  
  24.         int n=(int)Math.sqrt((double)info.length());  
  25.         int bigLayout[][] =new int[n+1][n+1];  
  26.         for(int i=0;i<bigLayout.length;i++){  
  27.             for(int j=0;j<bigLayout[0].length;j++){  
  28.                 bigLayout[i][j]=2;  
  29.             }  
  30.         }  
  31.         int sum=0;  
  32.         for(int i=0;i<n;i++){  
  33.             for(int j=0;j<n;j++){  
  34.                 if(info.charAt(sum)=='X'){  
  35.                     bigLayout[i][j]=1;  
  36.                     sum++;  
  37.                 }else if(info.charAt(sum)=='.'){  
  38.                     bigLayout[i][j]=2;  
  39.                     sum++;  
  40.                 }else{  
  41.                     System.out.println("error:getBigLayout");  
  42.                     System.exit(0);  
  43.                 }  
  44.             }  
  45.         }  
  46.         return bigLayout;  
  47.     }  
  48.       
  49.     //获取layout  
  50.     private int[][] getLayout(int[][] bigLayout, int i, int j) {  
  51.         int layout[][]=new int[i][j];  
  52.         for(int x=0;x<layout.length;x++){  
  53.             for(int y=0;y<layout[0].length;y++){  
  54.                 layout[x][y]=2;  
  55.             }  
  56.         }  
  57.         for(int m=0;m<bigLayout.length;m++){  
  58.             for(int n=0;n<bigLayout[0].length;n++){  
  59.                 int M=m;  
  60.                 int N=n;  
  61.                 while(M>=(i-1) && N>=(j-1)){  
  62.                     M=M-i+1;  
  63.                     N=N-j+1;  
  64.                 }  
  65.                 if(M>=0 && M<i){  
  66.                     if(N>=0 && N<j){  
  67.                         if(bigLayout[m][n]==1){  
  68.                             layout[M][N]=1;  
  69.                         }else if(bigLayout[m][n]!=2){  
  70.                             System.out.println("error:getLayout!!");  
  71.                             System.exit(0);  
  72.                         }  
  73.                     }  
  74.                 }  
  75.             }  
  76.         }  
  77.         return layout;  
  78.     }  
  79.   
  80.     //获取layout,其中包括可行路径,可为null  
  81.     private int[][] layoutUse(int[][] layout) {  
  82.         if(layout[layout.length-1][layout[0].length-1]==1 || layout[0][0]==1)  
  83.             return null;  
  84.         if(layout[0][0]==2)  
  85.             layout[0][0]=0;  
  86.         else{  
  87.             System.out.println("error:layoutUse01");  
  88.             System.exit(0);  
  89.         }  
  90.         for(int i=0;i<layout.length;i++){  
  91.             for(int j=0;j<layout[0].length;j++){  
  92.                 if(layout[i][j]==0){  
  93.                     if((i+1)<layout.length && layout[i+1][j]==2){  
  94.                         layout[i+1][j]=0;  
  95.                     }  
  96.                     if((j+1)<layout[0].length && layout[i][j+1]==2){  
  97.                         layout[i][j+1]=0;  
  98.                     }  
  99.                 }  
  100.             }  
  101.         }  
  102.           
  103.         return layout;  
  104.     }  
  105.   
  106.     //获取layout,其中包括安全路径,可为null  
  107.     private int[][] layoutCut(int[][] layout) {  
  108.         if(layout==null)  
  109.             return null;  
  110.         if(layout[layout.length-1][layout[0].length-1]==0){  
  111.             layout[layout.length-1][layout[0].length-1]=3;  
  112.         }else{  
  113.             return null;  
  114.         }  
  115.         for(int i=layout.length-1;i>=0;i--){  
  116.             for(int j=layout[0].length-1;j>=0;j--){  
  117.                 if(layout[i][j]==3){  
  118.                     if((i-1)>=0 && layout[i-1][j]==0){  
  119.                         layout[i-1][j]=3;  
  120.                     }  
  121.                     if ((j-1)>=0 && layout[i][j-1]==0){  
  122.                         layout[i][j-1]=3;  
  123.                     }  
  124.                 }  
  125.             }  
  126.         }  
  127.         return layout;  
  128.     }  
  129. }  

此后,我们要在可行路径中选一条输出。具体实现代码入下:

[java] view
plain
copy

  1. package test;  
  2. public class Look {  
  3.     public void look(int matrix[][]){  
  4.         int m=matrix.length;  
  5.         int n=matrix[0].length;  
  6.         int i=0;  
  7.         int j=0;  
  8.         while(j<=n&i<m){  
  9.             if((j+1)<n && matrix[i][j+1]==3){  
  10.                 System.out.print("右 ");  
  11.                 j++;  
  12.             }else{  
  13.                 i++;  
  14.                 if(i<m){  
  15.                     System.out.print("下 ");  
  16.                 }     
  17.             }  
  18.         }  
  19.     }  
  20. }  

java实现后,就是运行了。
首先是获取info信息,获取方法和内容如下:

其中灰色的value值后的值(本例为FVterrainString=.....X..X...XX.XX.............X....XX...X.X.X.....X....X.X.......X

...X......X.....XXX.XX..X.........XXX......X....XX.....X.....X..X..X..X....X..X..XX.X.X..X.......X...XXX.XX...X...X.X.XX.XXXX.XX.X....X.X..XX..X...XX.............X.....X..XXX.XXX...XX..X..............X.X.....X.X....X.X.XXX.....X...........XX.X......X......XX..X.X..X..X....XX..X.X.XX...X...X.X...X.X.XX.XX..X..X.X..X..X......X..X..X....XX...X.X..............X...............X..X....XX..X..........X..X...X...X.X....XX...X......XX.....X...........X.XXXXX.......X..X..XXXX..X..........................X.X..X..X........X.....X..XX.X.X..X.XX..........XX.X..X.X......X.XX..XXX.XX.X.X.......X.X..........X........X.XX...XX....XX.X.XX..........XXXX....X...XXX.X.........X.X......X....X...............X.X.XXX..X..X.X..X.X...XX..XX.............X...........X......X.X.XX.....XX..X.....XXX....X.XX...XX...X.X.........X...............XX.....X......X...X.XXX.....XX.X.X.....X.....X....X............X.X....X....X......X..X.....XX..XX...................X....X......XX.........X.....X......X.X..XXXX.....XXX..........X.X.......X...........X.X.....X...........X.....X........X.........XX..XX.X...XX........X...X...XX.......X.XX....X...X....X........XX...XX............X.XX.X.....XX............XX..X......X.X..X......X.....X.X....X....X...XXXX.........X.XX.XXX.X......X.X.X...X........X.X.X........X...X.X..XX.X..X......X....X....X...X.......X..............X................X........X.......X.XX.XX...XXXX.X..X.XX.X..XX..X.X.........X...X.X...X...X.X..XX...XX........X.....XX...X..X..X.X....X...XX....XX....XX.X.X..XX...............X.....X...X....X.......X.......X..XX.X........XX...X..X..X..XX............X.X...X.XX...XX.....X..XX...X...............XX..XX.XX..X...X...X.......X........X.X.X...........X......X.....X.X......X....X.X..........X....X.......X............X.X......X.....X............XX..XX...X.X...XX......X.X...........X...X.X....X...X......XX....XX.X.XX.XXXX..X...........X...X.X......XX...XX.X...X.X....X.....X.X.XXX...XX..XXX....X...X...X.X.XX..XX.....X..XXXXXX.....X.XX...X.XX....XX.....X..X...XXX.....X.X.X.X..XX..X...X.XX.....X.............XX....X....X....X.X.......X..X.........X..XX......XXXXXX...X.........X...X....X...X.X.X..XX.XXX...XX.X.X.............X...XXX.........X.XXX.X........XX......X...XX..X.............XXX...XX.......X...........X.X..XX..X.....X...X.X...X........XX.XX...XXX..X.......X.X.X.....X....XXX.X.XX....X..XX.X.....X...X.....X.X...X.XX.X..X...XX.X....X.......X...XX...X......XX..X...X.....X......XXXX.X.....XX..X...X.........X.....X..X....XXX.....X........X..X..XX.XXX.....XX...........X........X...X.X..X..X.&FVinsMax=30&FVinsMin=18&FVboardX=51&FVboardY=51&FVlevel=96),“.”代表安全,"X"代表炸弹。其中min为FVinsMin,max为FVinsMax。这些就可以在运行软件中得知。

现在编写运行代码如下:

import java.util.Scanner;
import runaway.Robot;
import test.Look;

public class Test {

	public static void main(String[] args) {
		String info;
		int min;
		int max;
		while(true){
			System.out.println("input::");
			Scanner sc=new Scanner(System.in);
			String value=sc.nextLine();
			info=value.substring(value.indexOf("FVterrainString=")+16, value.indexOf("&FVinsMax="));
			String Max=value.substring(value.indexOf("&FVinsMax=")+10, value.indexOf("&FVinsMin="));
			String Min=value.substring(value.indexOf("&FVinsMin=")+10, value.indexOf("&FVboardX="));
			min=Integer.valueOf(Min);
			max=Integer.valueOf(Max);
			Robot bo=new Robot();
			int path[][]=bo.go(info,min,max);
			if(path==null){
				System.out.println("game over:null");
			}
			for(int [] x:path){
				for(int y:x){
					System.out.print(y+"  ");
				}
				System.out.println("");
			}
			new Look().look(path);
			System.out.println();
		}

	}

}

运行上述代码,在input::后面输入在网页源码中获取的信息,并回车确认。这样既可以得到运行结果。如下图:

根据运行结果,输入步骤的选择,最后就可以运行成功。输入并闯关成功的图片所示如下:

game over!!!

——fxleyu
20130115写于QQ空间

20130124在原有基础上增加Look类,实现结果的人性化显示。

时间: 2024-07-31 08:33:25

Runaway Robot游戏过关通用算法设计并java语言实现的相关文章

VC实现五子棋游戏的一个算法示例_C 语言

本文讲述了VC实现五子棋游戏的一个算法示例,该算法采用极大极小剪枝博弈算法,感兴趣的读者可以对程序中不完善的部分进行修改与完善. 该设计主要包括:数据结构.估值函数.胜负判断.搜索算法 程序运行界面如下: 具体实现步骤如下: 1.数据结构 //记录每步棋,可以建立链表用来进行悔棋.后退(本程序没有实现) struct Step { int x,y; //棋子坐标 int ball; //表示下子方{BLACK,WHITE} }; //记录棋盘情况,用于搜索过程 class CBoardSitua

WINDOWS 10通用应用设计趋势分析

  编者按:腾讯精品长文流!今天月兔同学将通过Win 10的系统新特性和已公布的通用应用,来简单分析一下Windows 10 的设计趋势,来看看微软有哪些颠覆自身的亮点 >>> 众所周知,当初微软在Windows 8上做了非常大胆的变革,除了开创性的Metro设计语言,传统桌面和平板两种模式的融合也是一大特色,可这两种操作模式在使用体验上的不一致也成为Windows 8饱受用户诟病的原因之一,但微软自始至终都朝着平台大融合的目标坚定前行着.经过一路探索,微软终于通过在Windows 10

下一代信息推荐系统的算法设计与性能评估

信息总量的爆炸性增长导致"信息过载"--用户难以在海量信息中找到自己需要的对象.信息推荐系统被认为是解决信息过载最有效的工具[1],其最早的研究可以追溯到30年前[2],而90年代早期关于信息推荐的概念就已基本成型[3]. 传统推荐系统往往基于用户或对象的相似性,本质上是集中化的静态系统[4].海量数据的出现,Web2.0技术的成熟,用户实时反馈需求的增加和在线社会网络的涌现提出了对下一代信息推荐系统的需求[5].这方面的研究不仅可以推动数据挖掘和信息过滤理论和技术的发展,而且对在线零

算法设计

1.算法简介 算法是问题求解过程的精确描述,一个算法由有穷个可完全机械地执行的.有确定结果的指令组成.指令正确地描述了要完成的任务和它们被执行的顺序.计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解. 通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性.其次是算法所需要的存储空间少和执行更快等. 算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法.穷举搜索法.递推法.

编码-四元式划分基本块算法设计求救!

问题描述 四元式划分基本块算法设计求救! 哪位大神能搞定请联系我!qq363166167 课设内容和要求: 内容:1.设计一个演示窗口,包括基本的操作按钮和显示窗口: 2.设计构造基本块划分算法: 3.输入语句序列(四元式): 4.输出程序流程图: 要求:1.建立合理的数据结构模型,存储输入四元式和程序流程图: 2.设计实现方案和算法: 3.编码工具自行选择: 4.软件操作界面友好,具有简单的错误处理功能: 5.必须独立完成课设的设计.编码.调试: 6.写出规范的课程设计报告.

《企业迁云实战》——第3章 3.0云上通用架构设计与改造

第3章 3.0云上通用架构设计与改造 本章将介绍如何基于常用的阿里云产品和技术,快速构建出满足客户业务需求的架构.在进行实际架构设计和实施过程中,将就如何恰当地使用阿里云产品与技术给出建议和指导,同时会对阿里云产品背后的技术细节进行探讨.

Linux下文件分发的算法设计及C代码实现

需求描述 在Linux系统的某个源目录中有一批后缀相同的文件,编写程序将这些文件按照前缀分发到不同的目录中. 例如,源目录SourceDir中存放有三个后缀相同的文件File1_1.txt.File2_1.txt和File3_1.txt,按照前缀File1_.File2_和File3_将它们分别移动(分发)到目录FileDir1.FileDir2和FileDir3中. 算法设计 基于需求,可以采用如图1所示的程序流程: 图1 程序总体流程 特殊流程考虑 在编写程序的过程中,对于某些特殊流程的考虑

面试之如何回答关于算法设计的问题?

转自:http://blog.csdn.net/xdhehao/article/details/12522449                                                                                          程序员面试之道(<程序员面试笔试宝典>)之如何回答算法设计?                                程序员面试中,很多算法设计问题,都是历年来各家企业的"炒现饭"

《算法设计与分析》一一2.1 数学运算背后的算法操作

2.1 数学运算背后的算法操作 虽然我们已经熟知很多数学概念与性质,但是从算法设计与分析的角度来看,还需要进一步将这些数学的概念与算法的运作联系起来.下面就从这一角度来讨论几组算法设计与分析中常用的数学概念与性质.2.1.1 取整x和x 我们熟知取整函数的定义:下取整函数x表示不超过x的最大整数:上取整函数x表示不小于x的最小整数.需要取整函数的本质原因在于算法分析中涉及的一些量往往是某种离散对象的个数,它必然是正整数.例如,算法的代价是关键操作的个数,问题的规模经常表示为输入元素的个数.输入数