java实现单词小游戏

本文实例为大家分享了java实现单词小游戏的具体代码,供大家参考,具体内容如下

介绍

公司最近有一个竞技场项目,里面有一个单词小游戏。

游戏大概就是随机生成一个5*5的棋盘,上面有单词的字母,通过滑动连出正确的单词。

棋盘生成算法

思路

首先随机选个一个起点,从这个点开始铺单词。

分别选取上下左右四个方向作为下一个字母的摆放位置,不能触边也不能走重复路,直到平铺完所有的单词。

如果在棋盘能平铺下单词的情况下,找不到路径,就从四个角作为起点,必能找到路径。

代码

import java.util.*;

/**
 * @author Wang Guolong
 * @version 1.0
 * @date 2020/7/31 5:50 下午
 */
public class GenerateWordBoard {

 private static char[][] board;

 public static void main(String[] args) {
 GenerateWordBoard g = new GenerateWordBoard();
 g.generateCharBoard("vocabulary", 5, 5);
 }

 private void generateCharBoard(String word, int m, int n) {
 // 单词为空 直接返回
 if (word.isEmpty()) {
  return;
 }
 // 单词长度大于棋盘 铺不下 直接返回
 if (word.length() > m * n) {
  return;
 }
 // 初始化棋盘 全为*
 initBoard(m, n);

 char[] wordChar = word.toCharArray();
 // 随机选取一个位置开始
 Random random = new Random();
 int randomX = random.nextInt(m);
 int randomY = random.nextInt(n);
 // 开始从随机位置dfs铺单词 从index 0 开始
 boolean result = generateDfs(board, wordChar, randomX, randomY, 0);
 // 如果没有找到路线 那么从四个角开始 必能找到一条路
 if (!result) {
  List<int[]> starts = Arrays.asList(new int[]{0, 0}, new int[]{0, n - 1}, new int[]{m - 1, 0},
   new int[]{m - 1, n - 1});
  // 随机四个角的一个
  Collections.shuffle(starts);
  // 初始化棋盘
  initBoard(m, n);
  // dfs铺单词
  generateDfs(board, wordChar, starts.get(0)[0], starts.get(0)[1], 0);
 }
 // 查看结果
 for (int i = 0; i < board.length; i++) {
  for (int j = 0; j < board[0].length; j++) {
  System.out.print(board[i][j] + " ");
  }
  System.out.println();
 }
 }

 private void initBoard(int m, int n) {
 // 初始化
 board = new char[m][n];
 for (int i = 0; i < board.length; i++) {
  for (int j = 0; j < board[0].length; j++) {
  board[i][j] = '*';
  }
 }
 }

 /**
 * 返回true则为找到一条路 返回false为死路
 */
 private boolean generateDfs(char[][] board, char[] wordChar, int i, int j, int index) {
 // 碰到边 或者碰到已经走过的位置 不能走了 死路
 if (i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] == '/') {
  return false;
 }

 // 摆放一个字母
 board[i][j] = wordChar[index];

 //如果已经达到单词长度则直接返回 找到一条路
 if (index == wordChar.length - 1) {
  return true;
 }

 // 记录当前矩阵元素
 char tmp = board[i][j];
 // 修改为/ 表示已经访问过
 board[i][j] = '/';

 // 向上下左右四个方向开启递归
 // 查看能走几个方向 随机选择一个
 List<int[]> directions = Arrays.asList(new int[]{-1, 0}, new int[]{1, 0}, new int[]{0, -1}, new int[]{0, 1});
 Collections.shuffle(directions);

 boolean res = false;
 for (int k = 0; k < directions.size(); k++) {
  int di = i + directions.get(k)[0], dj = j + directions.get(k)[1];
  boolean partialRes = generateDfs(board, wordChar, di, dj, index + 1);
  if (k == 0) {
  res = partialRes;
  } else {
  res = res || partialRes;
  }
  // 如果res为true 说明找到一条路 就不再遍历了 还原后返回true
  if (res) {
  // 还原矩阵元素
  board[i][j] = tmp;
  return true;
  }
 }
 // 还原矩阵元素
 board[i][j] = '*';
 return false;
 }
}

运行结果




以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现2048小游戏(可直接运行)

    运行效果: 1.项目结构 2.代码 BaseData接口 package com.hsy.game; import java.awt.*; public interface BaseData { Font topicFont = new Font("微软雅黑", Font.BOLD, 50); Font scoreFont = new Font("微软雅黑", Font.BOLD, 28); Font normalFont = new Font("宋体&q

  • java实现简单的猜数字小游戏

    本文实例为大家分享了java实现简单的猜数字的具体代码,供大家参考,具体内容如下 题目描述: 猜数字(又称 Bulls and Cows )是一种古老的的密码破译类益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩.通常由两个人玩,一方出数字,一方猜.出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道.猜的人就可以开始猜.每猜一个数字,出数者就要根据这个数字给出nAmB,其中A前面的数字n表示数字正确且位置也正确的数的个数,而B前的数字m表示数字正确但位置不正

  • java简易小游戏制作代码

    java简易小游戏制作 游戏思路:设置人物移动,游戏规则,积分系统,随机移动的怪物,游戏胜负判定,定时器. 游戏内容部分 package 代码部分; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyList

  • 利用Java编写24点小游戏的实例代码

    话不多说直接给大家上代码 package com.company; import java.util.*; /** * 24点小游戏 * 游戏规则:系统自动生成4个1-10的随机整数,玩家通过加减乘除操作,得到结果为24,每个数字只能使用一次 */ public class Game24Player { final String[] patterns = {"nnonnoo", "nnonono", "nnnoono", "nnnono

  • java实现2048小游戏(含注释)

    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 实现文件 APP.java import javax.swing.*; public class APP { public static void main(String[] args) { new MyFrame(); } } 类文件 import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionList

  • 使用Java实现天天酷跑(附源码)

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的障碍物越多跑酷距离越远,玩家吃的金币越多,得分越高. 三.功能模块: 1.登录界面 用户名(输入框,明文) 密码(输入框,密文) 登录.取消按钮 2.菜单选择界面 开始游戏按钮(图片按钮) 帮助按钮 退出按钮 3.缓冲加载界面 自动加载进度条,加载完毕之后,跳转到下一界面 4.游戏主界面 移动的背景图片.动态

  • Java实现简单的五子棋小游戏

    五子棋游戏(Java),供大家参考,具体内容如下 思路: 1.首先创建一个棋盘,建立一个二维数组,此文中为一个15*15的二维数组, 2.初始化棋盘,给棋盘上个点赋初始值为"+": 3.打印棋盘: 4.开始游戏 创建一个下棋的函数(playChess),黑方棋子为"●",白方棋子为"○",用奇偶数分别代表黑方和白方:判断输赢,有5个连续一样的棋子即为赢,游戏结束 五个棋子连续条件 本来需要判断8个方向的棋子,但由于棋子没有方向,头尾可调换,所以只

  • java面向对象之人机猜拳小游戏

    人机猜拳小游戏,只要用到的java面向对象的思维模式.本游戏中有游戏玩家和计算机两个参与者.玩家和计算机都有的属性是姓名和得分.共分为4个类.下图是游侠小程序控制台截图:     以下是源代码: Computer.java类 package com.whf.guess.game; /** * @author :辰 * @version * 创建时间:2017年2月24日 上午8:38:29 * */ public class Computer { String name = "电脑";

  • java实现单机版五子棋小游戏

    简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的功能.在右上角能够显示目前轮到哪个棋种下棋.右下角还有一个记录信息框,记录行为,当信息量过多时,可以清除信息内容. 成果: 初始界面: 游戏(获胜)界面: 附上代码: Chessframe.java package firstgobang; import javax.swing.JFrame; impor

  • 利用java开发简易版扫雷游戏

    1.简介 学了几周的Java,闲来无事,写个乞丐版的扫雷,加强一下Java基础知识. 2.编写过程 编写这个游戏,一共经历了三个阶段,编写了三个版本的游戏代码. 第一版:完成了扫雷游戏的基本雏形,实现了游戏的基本功能,游戏运行在cmd黑窗口中,以字符绘制游戏界面,无图形化窗口,通过控制台输入字符完成游戏控制.代码放置在一个java文件中,代码的可读性以及可扩展性都比较差. 第二版:在第一版实现基本功能的基础之上,对游戏代码进行重构,根据各部分的功能创建多个类,增加代码注释,提高代码的可读性以及可

  • java实现象棋小游戏

    本文实例为大家分享了java实现象棋小游戏的具体代码,供大家参考,具体内容如下 用Eclipse编写 java环境1.8jdk 代码如下 package xiangqi象棋; /** *中国象棋Java版V3.0 *源文件:Chess.java *添加功能:实现了当前棋局的保存 **/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.io.*; //

随机推荐