本文实例讲述了java实现单词搜索迷宫游戏。分享给大家供大家参考。具体分析如下:

我们在杂志上,经常能够看到找单词的小游戏,在一个二维表格中,存在各种字母,我们可以从八个方向找单词。这个用计算机处理十分方便,但是,算法的好坏很重要,因为要是用蛮力算法实现,那么耗费的时间是不可想象的。

这是数据结构与问题求解Java语言描述一书中给的实现思路

完整代码如下,注释写的很明白了

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.InputStreamReader;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

/**

* 单词搜索迷宫

*

* */

public class WordSearch

{

/**

* 在构造函数中构造两个输入流,单词的输入流,和表格的输入流

* */

public WordSearch( ) throws IOException

{

puzzleStream = openFile( "输入表格文件路径:" );

wordStream = openFile( "输入单词文件路径:" );

System.out.println( "文件读取中..." );

readPuzzle( );

readWords( );

}

/**

* @return matches 共有多少个单词匹配

* 按照每个位置从八个方向搜索

* rd 表示行上得增量,eg:rd=-1,表示向上一行

* cd 表示列上得增量 eg:cd=-1。表示向左一步

* 所以rd=1,cd=0表示南

* rd=-1,cd=0表示北,

* rd=-1,cd=1,表示东北

*/

public int solvePuzzle( )

{

int matches = 0;

for( int r = 0; r < rows; r++ )

for( int c = 0; c < columns; c++ )

for( int rd = -1; rd <= 1; rd++ )

for( int cd = -1; cd <= 1; cd++ )

if( rd != 0 || cd != 0 )

matches += solveDirection( r, c, rd, cd );

return matches;

}

/**

* 在指定的坐标上,按照给定的方向搜索,返回匹配的单词数量

* @return number of matches

*/

private int solveDirection( int baseRow, int baseCol, int rowDelta, int colDelta )

{

String charSequence = "";

int numMatches = 0;

int searchResult;

charSequence += theBoard[ baseRow ][ baseCol ];

for( int i = baseRow + rowDelta, j = baseCol + colDelta;

i >= 0 && j >= 0 && i < rows && j < columns;

i += rowDelta, j += colDelta )

{

charSequence += theBoard[ i ][ j ];

searchResult = prefixSearch( theWords, charSequence );

/**

* 下面的 if( searchResult == theWords.length )

* 必须要判断,否则会出现越界的危险,及当最后一个单词之匹配前缀时,返回的是索引-1

* */

if( searchResult == theWords.length )

break;

/**

* 如果没有响应的前缀,直接跳过这个基点的搜索,即使继续搜索,做的也是无用功

* */

if( !theWords[ searchResult ].startsWith( charSequence ) )

break;

if( theWords[ searchResult ].equals( charSequence ) )

{

numMatches++;

System.out.println( "发现了 " + charSequence + " 在 " +

baseRow+1 + "行 " + baseCol + " 列 " +

i + " " + j );

}

}

return numMatches;

}

/**

* 先解释Arrays.binarySearch(Object[] ,Object)

* 使用二进制搜索算法来搜索指定数组,以获得指定对象。在进行此调用之前,

* 必须根据数组元素的自然顺序 对数组进行升序排序(通过上面的 Sort(Object[] 方法)。

* 如果没有对数组进行排序,则结果是不明确的。(如果数组包含不可相互比较的元素(例如,字符串和整数),

* 则无法 根据数组元素的自然顺序对数组进行排序,因此结果是不明确的。)

* 如果数组包含多个等于指定对象的元素,则无法保证找到的是哪一个。

*/

private static int prefixSearch( String [ ] a, String x )

{

int idx = Arrays.binarySearch( a, x );

if( idx < 0 )

return -idx - 1;

else

return idx;

}

/**

* 读取文件内容,获得输入流

*/

private BufferedReader openFile( String message )

{

String fileName = "";

FileReader theFile;

BufferedReader fileIn = null;

do

{

System.out.println( message + ": " );

try

{

fileName = in.readLine( );

if( fileName == null )

System.exit( 0 );

theFile = new FileReader( fileName );

fileIn = new BufferedReader( theFile );

}

catch( IOException e )

{ System.err.println( "Cannot open " + fileName ); }

} while( fileIn == null );

System.out.println( "Opened " + fileName );

return fileIn;

}

/**

* 读入表格

* */

private void readPuzzle( ) throws IOException

{

String oneLine;

List puzzleLines = new ArrayList( );

if( ( oneLine = puzzleStream.readLine( ) ) == null )

throw new IOException( "No lines in puzzle file" );

columns = oneLine.length( );

puzzleLines.add( oneLine );

while( ( oneLine = puzzleStream.readLine( ) ) != null )

{

if( oneLine.length( ) != columns )

System.err.println( "Puzzle is not rectangular; skipping row" );

else

puzzleLines.add( oneLine );

}

rows = puzzleLines.size( );

theBoard = new char[ rows ][ columns ];

int r = 0;

for( String theLine : puzzleLines )

theBoard[ r++ ] = theLine.toCharArray( );

}

/**

* 读取已经按照字典排序的单词列表

*/

private void readWords( ) throws IOException

{

List words = new ArrayList( );

String lastWord = null;

String thisWord;

while( ( thisWord = wordStream.readLine( ) ) != null )

{

if( lastWord != null && thisWord.compareTo( lastWord ) < 0 )

{

System.err.println( "没有按照字典顺序排序,此次跳过" );

continue;

}

words.add( thisWord.trim() );

lastWord = thisWord;

}

theWords = new String[ words.size( ) ];

theWords = words.toArray( theWords );

}

// Cheap main

public static void main( String [ ] args )

{

WordSearch p = null;

try

{

p = new WordSearch( );

}

catch( IOException e )

{

System.out.println( "IO Error: " );

e.printStackTrace( );

return;

}

System.out.println( "正在搜索..." );

p.solvePuzzle( );

}

private int rows;

private int columns;

private char [ ][ ] theBoard;

private String [ ] theWords;

private BufferedReader puzzleStream;

private BufferedReader wordStream;

private BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );

}

希望本文所述对大家的java程序设计有所帮助。

益智java单词游戏_java实现单词搜索迷宫游戏相关推荐

  1. java 迷宫游戏_Java小项目之迷宫游戏的实现方法

    项目要求: 一个网格迷宫由n行n列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示),你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格.任何时候都不能在有 ...

  2. java课设小迷宫含代码_Java小项目之迷宫游戏的实现方法

    项目要求: 一个网格迷宫由n行n列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示),你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格.任何时候都不能在有 ...

  3. java生命小游戏_Java修炼——飞机生存小游戏

    在学习了java入门的课程之后,自己动手跟着老师写的一个小游戏,用的是Frame.总共有七个类. 1.飞机游戏的主窗口(MyGameFrame)继承Frame. package com.bjsxt.p ...

  4. java swing 代码_java swing编写gui生命游戏代码,新手上路

    项目描述 生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着 ...

  5. java 五子棋项目_Java项目实现五子棋小游戏

    本文实例为大家分享了Java实现五子棋小游戏的具体代码,供大家参考,具体内容如下 项目名称 五子棋小游戏 项目描述 可以改变获胜棋子数,率先连成棋数的人获胜 代码实现 测试类 public class ...

  6. 手动搜索迷宫游戏 c语言,C语言实现一个走迷宫小游戏(深度优先算法)

    接上一篇万年历博文,还是那位朋友的练习题.这次是使用C语言做一个小游戏程序,三选一(2048.8皇后和迷宫游戏),我选择的是迷宫(文章末尾有程序截图).个人认为这个程序的难点在于迷宫地图的绘制,也就是 ...

  7. c语言课程设计走迷宫游戏,C语言课程设计-迷宫游戏.doc

    计算机技术基础课程设计 C语言 设计报告 题目:完整的二维迷宫游戏 学院:工商管理学院 专业:信息系统与信息管理 班级:050507 姓名:孙月 指导教师:张首伟 设计日期:2004年12月10日 题 ...

  8. 迷宫游戏c语言代码讲解,迷宫游戏C语言代码讲解.doc

    /*迷宫游戏 by CDQ*//*vc++ 6.0 编译成功本程序参照网上一个特殊算法随机生成迷宫该算法优点:效率高,从入口到出口只有唯一路径,入口出口自己设定该算法缺点:宽度高度都必须为奇数,只能生 ...

  9. java英语单词测试_Java 英语单词自测

    Java英语单词自测小游戏 编写初衷 记英语单词的时候,不知道记没记住,所以写了个检测的程序,在检测的同时,也能够复习之前学习的. 任务目标 创建数据库 Java编写代码(没写成GUI,觉着写成GUI ...

最新文章

  1. 厌倦了“复制粘贴”,我辞去了年薪45万美元的开发工作
  2. 基于Spark的机器学习实践 (九) - 聚类算法
  3. BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
  4. @Scheduled(cron=““) spring定时任务时间设置
  5. swagger2 注解说明 ( @ApiImplicitParams )
  6. 【深度学习】Transformer长大了,它的兄弟姐妹们呢?(含Transformers超细节知识点)...
  7. scale html 浏览器,javascript中scale怎么使用?
  8. 解决CentOS7本机时间与实际时间相差8小时的问题
  9. ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件
  10. 霍夫直线检测python_python+opencv实现霍夫变换检测直线的方法
  11. 洛谷P1776 宝物筛选
  12. 泰山OFFICE笑而不语
  13. 2019 互联网月饼哪家强?阿里走情怀;百度最土豪;浪潮最高冷;抖音最.........
  14. 聚合影视大全android版,聚合影视App下载-聚合影视大全2021最新版 1.5.0 安卓版-我游网...
  15. vue yaml代码编辑器组件
  16. 2022 SpeechHome 语音技术研讨会-回顾
  17. 台式机的无线网卡连接wifi,能连上但丢包严重,无法上网
  18. java毕设项目广东省梅州市宇恒节能科技有限公司(附源码)
  19. 【Java】java9的of方法
  20. C语言娱乐项目————4、一箭双心

热门文章

  1. 解决Android SDK Manager无法更新下载 - 猪悟能 - 博客园 (cnblogs.com)
  2. Linux 安装nginx
  3. STM32通过串口控制LED闪烁或者呼吸效果
  4. 一个网工的十年奋斗史 - 工作篇
  5. 域名注册、域名实名认证、域名解析流程详解
  6. 网易Airtest跨平台的UI自动化测试框架
  7. [Android 9][markw] 红米4高配版 刷入Lineage OS 16与OpenGApps
  8. 流程图软件lauto_Iauto流程软件
  9. matlab中opc没有注册类,电脑中出现没有注册类别的错误提示的多种解决方法
  10. [MP3]MP3固件持续分享(2019.1.25)