add word search assignment from WCC CS 145 Spring 2019.
This commit is contained in:
parent
7b04c359f4
commit
c988b7ce5c
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
*
|
||||
* Matt Jensen
|
||||
* CS145
|
||||
* Assignment 1
|
||||
* 4/17/19
|
||||
*
|
||||
*/
|
||||
import java.util.*;
|
||||
import java.awt.*;
|
||||
|
||||
public class Board {
|
||||
protected static enum Direction {
|
||||
DOWN, UP, LEFT, RIGHT
|
||||
};
|
||||
protected char[][] board;
|
||||
protected char[][] solution;
|
||||
protected int size;
|
||||
protected String[] unplacedWords;
|
||||
protected String[] placedWords;
|
||||
protected String[] allWords;
|
||||
public Board(String[] words) {
|
||||
setWords(words);
|
||||
this.size = getMaxWordSize();
|
||||
this.board = new char[size][size];
|
||||
this.solution = new char[size][size];
|
||||
placeWords();
|
||||
}
|
||||
|
||||
public void placeWords() {
|
||||
for( int i = 0; i < unplacedWords.length; i++) {
|
||||
placeWord(unplacedWords[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* places a single word on the board.
|
||||
* picks a random index i, j
|
||||
* picks a random direction
|
||||
*
|
||||
* @return boolean the placement successful
|
||||
*/
|
||||
private void placeWord(String inputWord) {
|
||||
|
||||
Direction direction = randomDirection();
|
||||
int rowIndex = (int) (Math.random() * (this.getSize()));
|
||||
int columnIndex = (int) (Math.random() * (this.getSize()));
|
||||
|
||||
int placementTries = 0;
|
||||
for(int tries = 0; tries < 100; tries++) {
|
||||
if(isPlaced(inputWord, rowIndex, columnIndex, direction)){
|
||||
for(int i = 0; i < this.placedWords.length; i++) {
|
||||
if(this.placedWords[i] == null) {
|
||||
placedWords[i] = inputWord;
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
direction = randomDirection();
|
||||
rowIndex = (int) (Math.random() * (this.getSize()));
|
||||
columnIndex = (int) (Math.random() * (this.getSize()));
|
||||
}
|
||||
}
|
||||
private boolean isPlaced(String word, int rowIndex, int columnIndex, Direction direction) {
|
||||
char[][] currentBoard = copyBoard(this.getBoard());
|
||||
if( direction == Direction.DOWN ) {
|
||||
for( int i = 0; i < word.length(); i++) {
|
||||
if( currentBoard[i][columnIndex] == 0) {
|
||||
currentBoard[i][columnIndex] = word.charAt(i);
|
||||
|
||||
} else if( currentBoard[i][columnIndex] == word.charAt(i)){
|
||||
|
||||
currentBoard[i][columnIndex] = word.charAt(i);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( direction == Direction.UP ) {
|
||||
for( int i = 0; i < word.length(); i++) {
|
||||
if( currentBoard[word.length() - i - 1][columnIndex] == 0) {
|
||||
currentBoard[word.length() - i - 1][columnIndex] = word.charAt(i);
|
||||
} else if( currentBoard[word.length() - i - 1][columnIndex] == word.charAt(i)){
|
||||
currentBoard[word.length() - i - 1][columnIndex] = word.charAt(i);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( direction == Direction.LEFT ) {
|
||||
for( int i = 0; i < word.length(); i++) {
|
||||
if( currentBoard[rowIndex][word.length() - i - 1] == 0) {
|
||||
currentBoard[rowIndex][word.length() - i - 1] = word.charAt(i);
|
||||
} else if( currentBoard[rowIndex][word.length() - i - 1] == word.charAt(i)){
|
||||
currentBoard[rowIndex][word.length() - i - 1] = word.charAt(i);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( direction == Direction.RIGHT ) {
|
||||
for( int i = 0; i < word.length(); i++) {
|
||||
if( currentBoard[rowIndex][i] == 0) {
|
||||
currentBoard[rowIndex][i] = word.charAt(i);
|
||||
|
||||
} else if( currentBoard[rowIndex][i] == word.charAt(i)){
|
||||
|
||||
currentBoard[rowIndex][i] = word.charAt(i);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
setBoard(currentBoard);
|
||||
return true;
|
||||
}
|
||||
public char[][] getBoard() {
|
||||
return this.board;
|
||||
}
|
||||
private void setBoard(char[][] newBoard) {
|
||||
this.board = copyBoard(newBoard);
|
||||
this.solution = copyBoard(newBoard);
|
||||
}
|
||||
private static char[][] copyBoard(char[][] old) {
|
||||
if (old == null) {
|
||||
return null;
|
||||
}
|
||||
char[][] result = new char[old.length][];
|
||||
for (int r = 0; r < old.length; r++) {
|
||||
result[r] = old[r].clone();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* get board size based on largest word input.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private int getMaxWordSize() {
|
||||
int max = 0;
|
||||
for( int i = 0; i < allWords.length; i++) {
|
||||
if( allWords[i].length() > max ) {
|
||||
max = allWords[i].length();
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
public void setWords(String[] words){
|
||||
this.allWords = words;
|
||||
this.unplacedWords = words;
|
||||
this.placedWords = new String[words.length];
|
||||
}
|
||||
public int getSize() {
|
||||
return this.size;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "Hidden Words:\n"
|
||||
+ this.placedWordsToString() + "\n"
|
||||
+ boardToString(this.getBoard(), false);
|
||||
}
|
||||
public String solutionToString() {
|
||||
return "Words:\n"
|
||||
+ this.placedWordsToString() + "\n"
|
||||
+ boardToString(this.getBoard(), true);
|
||||
}
|
||||
public String[] getPlacedWords() {
|
||||
return this.placedWords;
|
||||
}
|
||||
private String placedWordsToString() {
|
||||
String result = "";
|
||||
for(int i = 0; i < this.getPlacedWords().length; i++) {
|
||||
if( this.getPlacedWords()[i] != null ) {
|
||||
result = result + "| " + this.getPlacedWords()[i] + " ";
|
||||
}
|
||||
}
|
||||
return result + "|\n";
|
||||
}
|
||||
private static String boardToString(char[][] boardForPrint, boolean solutions) {
|
||||
char[] CHAR_ALPHA = "abcdefghijklmnopqrstuvwxyz".toCharArray();
|
||||
Random random = new Random(CHAR_ALPHA.length);
|
||||
String text = "";
|
||||
for(int i = 0; i < boardForPrint.length; i++) {
|
||||
text = text + "| ";
|
||||
for(int j = 0; j < boardForPrint[i].length; j++) {
|
||||
if(boardForPrint[i][j] == 0) {
|
||||
if(solutions) {
|
||||
text = text + "- ";
|
||||
} else {
|
||||
int randomCharIndex = random.nextInt(CHAR_ALPHA.length);
|
||||
char randomChar = CHAR_ALPHA[randomCharIndex];
|
||||
text = text + randomChar + " ";
|
||||
}
|
||||
} else {
|
||||
text = text + boardForPrint[i][j] + " ";
|
||||
}
|
||||
}
|
||||
text = text + "|\n";
|
||||
}
|
||||
return text;
|
||||
|
||||
}
|
||||
|
||||
protected static Direction randomDirection() {
|
||||
int index = (int) (Math.random() * 4);
|
||||
|
||||
if( index == 0) {
|
||||
return Direction.UP;
|
||||
}
|
||||
if( index == 1) {
|
||||
return Direction.DOWN;
|
||||
}
|
||||
if( index == 2) {
|
||||
return Direction.RIGHT;
|
||||
}
|
||||
if( index == 3) {
|
||||
return Direction.LEFT;
|
||||
}
|
||||
return Direction.UP;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
*
|
||||
* Matt Jensen
|
||||
* CS145
|
||||
* Assignment 1
|
||||
* 4/25/19
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
|
||||
public class ConsolePrompt {
|
||||
|
||||
private static String[] options = {"Generate a new word search", "Print out your word search", "Show the solutions to your word search", "Quit the program"};
|
||||
private static String[] values = {"g", "p", "s", "q"};
|
||||
private static boolean DEBUG = false;
|
||||
|
||||
// print the introduction to the program on start up.
|
||||
public static void intro() {
|
||||
System.out.println("Welcome to my word search generator");
|
||||
System.out.println("This program allows you to generate your own word search puzzle");
|
||||
}
|
||||
|
||||
// prompts for words.
|
||||
// puts them in an array.
|
||||
// pulls from a file if not null
|
||||
public static String[] forWords(int count, String fileName, Scanner console) throws FileNotFoundException {
|
||||
String[] words = new String[count];
|
||||
if(fileName != null) {
|
||||
Scanner scanner = new Scanner(new File("words.txt"));
|
||||
for(int i = 0; i < words.length; i++) {
|
||||
words[i] = scanner.nextLine();
|
||||
}
|
||||
}
|
||||
else {
|
||||
String question = "Next word:";
|
||||
String input = "";
|
||||
for(int i = 0; i < words.length; i++) {
|
||||
input = prompt(question, console);
|
||||
words[i] = input;
|
||||
}
|
||||
|
||||
}
|
||||
return words;
|
||||
}
|
||||
|
||||
// prompts for filename
|
||||
// TODO: check for file existance
|
||||
public static String forFileName( Scanner console) {
|
||||
String question = "Generate from file?";
|
||||
boolean fromFile = forBoolean(question, console);
|
||||
if(!fromFile) {
|
||||
return null;
|
||||
}
|
||||
question = "Filename?";
|
||||
String fileName = prompt(question, console);
|
||||
while( ! isFile(fileName) ) {
|
||||
System.out.println("Unrecognized input.");
|
||||
fileName = prompt(question, console);
|
||||
}
|
||||
return fileName;
|
||||
}
|
||||
|
||||
// prompts for word cound
|
||||
// prompts again if not an integer
|
||||
public static int forWordCount(Scanner console) {
|
||||
String question = "How many words would you like to include in the word search?";
|
||||
String input = prompt(question, console);
|
||||
while( ! isInteger(input) ) {
|
||||
System.out.println("Unrecognized input.");
|
||||
input = prompt(question, console);
|
||||
}
|
||||
return getInteger(input);
|
||||
}
|
||||
|
||||
// TODO: validate if an integer
|
||||
private static boolean isInteger(String input) {
|
||||
return true;
|
||||
}
|
||||
// TODO: validate if file exists
|
||||
private static boolean isFile(String input) {
|
||||
return true;
|
||||
}
|
||||
// gets integer form input
|
||||
private static int getInteger(String input) {
|
||||
return Integer.parseInt(input);
|
||||
}
|
||||
|
||||
private static String getString(String input) {
|
||||
return input;
|
||||
}
|
||||
|
||||
private static String prompt(String prompt, Scanner console) {
|
||||
System.out.println(prompt);
|
||||
String response = console.next();
|
||||
System.out.println();
|
||||
return response;
|
||||
}
|
||||
// returns all the possible options
|
||||
public static String getOptionPrompt() {
|
||||
String prompt = "Please select an option below:\n";
|
||||
for( int i = 0; i < options.length; i++ ) {
|
||||
prompt += options[i] + " (" + values[i] + ")\n";
|
||||
}
|
||||
return prompt;
|
||||
}
|
||||
|
||||
// prompts from option input
|
||||
// rejects options outside of class variable
|
||||
public static char forOption( Scanner console ) {
|
||||
String question = getOptionPrompt();
|
||||
String input = prompt(question, console);
|
||||
while( ! isOption(input) ) {
|
||||
System.out.println("Unrecognized input.");
|
||||
input = prompt(question, console);
|
||||
}
|
||||
return getOption(input);
|
||||
}
|
||||
// validates if character is an option
|
||||
private static boolean isOption(String input) {
|
||||
for(int i = 0; i < values.length; i++) {
|
||||
if( input.startsWith(values[i]) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// return first character of input for options.
|
||||
private static char getOption(String input) {
|
||||
return input.charAt(0);
|
||||
}
|
||||
|
||||
// prompts for boolean value
|
||||
public static boolean forBoolean( String prompt, Scanner console ) {
|
||||
String input = prompt(prompt, console);
|
||||
while( ! isBooleanInput(input) ) {
|
||||
System.out.println("Unrecognized input.");
|
||||
input = prompt(prompt, console);
|
||||
}
|
||||
return getBooleanInput(input);
|
||||
}
|
||||
// validates boolean value
|
||||
private static boolean isBooleanInput(String input) {
|
||||
return input.startsWith("y") || input.startsWith("Y") || input.startsWith("n") || input.startsWith("N");
|
||||
}
|
||||
// convert string input to boolean value.
|
||||
private static boolean getBooleanInput(String input) {
|
||||
if(input.startsWith("y") || input.startsWith("Y")) {
|
||||
return true;
|
||||
}
|
||||
if(input.startsWith("n") || input.startsWith("N")) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
# Word Search Generator
|
||||
|
||||
## topics
|
||||
Printing, data types, methods, operators, expressions, variables, for loop,
|
||||
parameters, returns, String objects, Scanner object, if/else statements, while loop, arrays
|
||||
|
||||
## Learning Outcomes:
|
||||
- Begin to become familiar with setup, design, execution and testing of basic Java programs
|
||||
- Design and develop a multi-method program in good style
|
||||
- Demonstrate the ability to decompose a problem and reduce redundancy using methods
|
||||
- Apply tools and techniques introduced in class to form a workin
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
*
|
||||
* Matt Jensen
|
||||
* CS145
|
||||
* Assignment 1
|
||||
* 4/25/19
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
|
||||
public class WordSearch {
|
||||
|
||||
protected static boolean DEBUG;
|
||||
protected static Board board;
|
||||
private static int wordCount = 20;
|
||||
|
||||
public static void main( String[] args ) throws FileNotFoundException {
|
||||
Scanner console = new Scanner( System.in );
|
||||
ConsolePrompt.intro();
|
||||
char option = ConsolePrompt.forOption(console);
|
||||
while(option != 'q') {
|
||||
if(option == 'g') {
|
||||
String fileName = ConsolePrompt.forFileName(console);
|
||||
generate(fileName, console);
|
||||
}
|
||||
if(option == 's') {
|
||||
showSolution(console);
|
||||
}
|
||||
if(option == 'p') {
|
||||
showBoard(console);
|
||||
}
|
||||
System.out.println();
|
||||
option = ConsolePrompt.forOption(console);
|
||||
}
|
||||
System.out.println("Goodbye!");
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* generates a new board from the set words.
|
||||
*
|
||||
* @param console console for printing prompts to.
|
||||
* @return void
|
||||
*/
|
||||
protected static void generate(String fromFile, Scanner console) throws FileNotFoundException {
|
||||
int wordCount = ConsolePrompt.forWordCount(console);
|
||||
board = new Board(
|
||||
ConsolePrompt.forWords(wordCount, fromFile, console)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* prints the solution (x's for letters between words)
|
||||
*
|
||||
* @param console console for printing prompts to.
|
||||
* @return void
|
||||
*/
|
||||
protected static void showSolution(Scanner console) {
|
||||
System.out.println(board.solutionToString());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* prints the entire board with words.
|
||||
*
|
||||
* @param console console for printing prompts to.
|
||||
* @return void
|
||||
*/
|
||||
protected static void showBoard(Scanner console) {
|
||||
System.out.println(board);
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,24 @@
|
|||
spell
|
||||
tremble
|
||||
page
|
||||
embarrass
|
||||
care
|
||||
oval
|
||||
close
|
||||
believe
|
||||
hall
|
||||
magenta
|
||||
count
|
||||
shade
|
||||
tight
|
||||
utopian
|
||||
haunt
|
||||
wary
|
||||
tent
|
||||
bomb
|
||||
complain
|
||||
preserve
|
||||
thirsty
|
||||
curve
|
||||
design
|
||||
flippant
|
Loading…
Reference in New Issue