/*
* $Id: Hangman.java 471756 2006-11-06 15:01:43Z husted $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.struts2.showcase.hangman;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Hangman implements Serializable {
private static final long serialVersionUID = 8566954355839652509L;
private Vocab vocab;
private Boolean win = false;
private int guessLeft = 5;
public List<Character> charactersAvailable;
public List<Character> charactersGuessed;
public Hangman(Vocab vocab) {
// Arrays.asList(...) returns List that doesn't support remove(), hence
// we wrap it with an ArrayList to avoid UnsupportedOperationException
// when doing a remove()
charactersAvailable = new ArrayList<Character>(Arrays.asList(
new Character[] {
Character.valueOf('A'), Character.valueOf('B'), Character.valueOf('C'),
Character.valueOf('D'), Character.valueOf('E'), Character.valueOf('F'),
Character.valueOf('G'), Character.valueOf('H'), Character.valueOf('I'),
Character.valueOf('J'), Character.valueOf('K'), Character.valueOf('L'),
Character.valueOf('M'), Character.valueOf('N'), Character.valueOf('O'),
Character.valueOf('P'), Character.valueOf('Q'), Character.valueOf('R'),
Character.valueOf('S'), Character.valueOf('T'), Character.valueOf('U'),
Character.valueOf('V'), Character.valueOf('W'), Character.valueOf('X'),
Character.valueOf('Y'), Character.valueOf('Z')
}));
charactersGuessed = new ArrayList<Character>();
this.vocab = vocab;
}
public void guess(Character character) {
assert(character != null);
synchronized(charactersAvailable) {
if (guessLeft < 0) {
throw new HangmanException(
HangmanException.Type.valueOf("GAME_ENDED"), "Game already eneded");
}
Character characterInUpperCase = Character.toUpperCase(character);
boolean ok = charactersAvailable.remove(characterInUpperCase);
if (ok) {
charactersGuessed.add(characterInUpperCase);
if (! vocab.containCharacter(characterInUpperCase)) {
guessLeft = guessLeft - 1;
}
}
if (vocab.containsAllCharacter(charactersGuessed)) {
win = true;
}
System.out.println(" *********************************** "+win);
}
}
public Boolean isWin() {
return this.win;
}
public Vocab getVocab() {
return vocab;
}
public Boolean gameEnded() {
return ((guessLeft < 0) || win);
}
public Integer guessLeft() {
return guessLeft;
}
public List<Character> getCharactersAvailable() {
synchronized(charactersAvailable) {
return new ArrayList<Character>(charactersAvailable);
//return charactersAvailable;
}
}
public boolean characterGuessedBefore(Character character) {
return charactersGuessed.contains(character);
}
}
|