Вопрос

I was wondering if anyone can help me?

I am creating a simple game using JSF. I have managed to complete the main functionality but I would like to tell the user how many games they have played.

For some reason, the code I have written for it does not work.

Bean:

import java.util.Random;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class GameBeans {
    private int randomNumber;
    private int userGuess;
    private int gamesPlayed;

    public String getWin() {
         if(this.userGuess == this.randomNumber)
        {

            return "Congratulations! You've Won!";
        }
        else
        {
            return "You Lose!";
        }        
    } 
    /**
     * 
     * @return randomNumber
     */
    public int getRandomNumber() {
        return randomNumber;
    }

    /**
     * sets the generated random number
     * @param randomNumber 
     */
    private void setRandomNumber(int randomNumber) {
        this.randomNumber = randomNumber;
    }

    /**
     * 
     * @return the guess of the user
     */
    public int getUserGuess() {
        return userGuess;
    }

    /**
     * Sets the guess of the user into userGuess
     * @param userGuess 
     */
    public void setUserGuess(int userGuess) {
        this.userGuess = userGuess;

    }
    /**
     * 
     * @return number of games played by the user
     */


    public int getGamesPlayed() 
    {
        return gamesPlayed;
    }

    private void setGamesPlayed(int played)
    {
        this.gamesPlayed=played;
    }

    /**
     * Creates a new instance of GameBeans
     * Generates a new random number
     * 
     * Compares random number to user's
     * choice
     * 
     * Keeps total of games played
     */
   public GameBeans() {
        Random number = new Random();
        int rNumber = number.nextInt(1000);
        setRandomNumber(rNumber);
        int played = this.gamesPlayed++;
        setGamesPlayed(played);
    }

}

First page (play_game.xhtml):

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Guess Numbers Page</title>
    </h:head>
    <h:body>
        <h:form>
            <h1>Welcome to Your Game Session</h1>
            <p>Number of games played this session: #{gameBeans.gamesPlayed}</p>
            <p>Enter your lucky number guess and then click play</p>
            <p>Your guess: <h:inputText id="iptxt1" value="#{gameBeans.userGuess}" /></p>
            <h:commandButton id="cmdBtn1" value="Play" action="game_result" />            
        </h:form>
    </h:body>
</html>

game_result.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Game Results</title>
    </h:head>
    <h:body>
        <h:form>
            <p>Your Guess: <h:outputText id="outText1" value="#{gameBeans.userGuess}"></h:outputText></p>
            <p>Random Number: <h:outputText id="outText2" value="#{gameBeans.randomNumber}"></h:outputText></p>
            <p><h:outputText id="outText4" value="#{gameBeans.win}"></h:outputText></p>
            <p>Number of Games Played: #{gameBeans.gamesPlayed}</p>
            <h:commandButton id="cmdBtn1" value="Play Again" action="play_game" />     
        </h:form>
    </h:body>
</html>

I would like to allow the user to play again even if they win or lose, the count (game played) should be kept track of. This is not working currently!

Can anyone help please??

Thanks

Это было полезно?

Решение

@SessionScoped bean is only created once when the client visit your page for the 1st time. It will then live until the end of the session. In other words, the constructor of your @SessionScoped bean is only called once. It's not the place to increment your gamesPlayed.

@ManagedBean
@SessionScoped
public class GameBeans {
    private int randomNumber;
    private int userGuess;
    private int gamesPlayed;

    public GameBeans() {
        Random number     = new Random();
        this.randomNumber = number.nextInt(1000);
        this.gamesPlayed  = 0;
    }

    public void getWin() {
        if (this.userGuess.equals(this.randomNumber)) 
             return "Congratulations! You've Won!";
        else return "You Lose!";
    }

    public void incrementGamesPlayed() {
        this.gamePlayed++;
    }

    // Getters and Setters
}

And this is the play_game.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Guess Numbers Page</title>
    </h:head>
    <h:body>
        <h:form>
            <h1>Welcome to Your Game Session</h1>
            <p>Number of games played this session: #{gameBeans.gamesPlayed}</p>
            <p>Enter your lucky number guess and then click play</p>
            <p>Your guess: <h:inputText id="iptxt1" value="#{gameBeans.userGuess}" /></p>
            <h:commandButton id="cmdBtn1" value="Play" action="game_result" 
                             actionListener="#{gameBeans.incrementGamesPlayed}" />            
        </h:form>
    </h:body>
</html>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top