Complete hangman game: Good example for seeing how everything goes together
I learned a lot of programming through courses and on my own, but it took me a long time to really figure out how to use all that functionality together. When and where to put functions, classes and just what worked with what. I created this hangman game for my Java I class, although, back then it was implemented a bit differently. Here's a more complex example of using different Java elements with each other for those of you who find most examples to be too simple for what they need.
This is probably not the nicest code in the world, but hey, I'm still a beginner.
There are two folders that I used to keep the words files and player statistics files in. These were Words and Save. Both file types are .txt for easy manipulation outside of the program.
The Words folder contains three text files called Easy, Medium and Hard. For easy words I choose three to five letter words entered one per line, medium was six to eight letter words and hard was anything over eight. You can add and remove words at your convenience to these files. Note, these three files must be there when the program starts and populated with at least one word or it will return an error.
The Save folder contains files generated by the program and updated by the program. Both folders were located in the program's top level directory structure since the program uses relative paths to find them. The folder structure looks like:
Hangman
|_Main.java
|_GameLogic.java
|_GUI
| |_MainFrame.java
|_IO
| |_IO.java
|_Words
| |_Easy.txt
| |_Medium.txt
| |_Hard.txt
|_Save
This is the main.java file. The entire program starts here which creates a new instance of the GUI class MainFrame and sets its properties:
Code :
/**
* @author ShadeDarkan
*/
package Hangman;//The package this class belongs to
import Hangman.GUI.MainFrame;//Needed to create the GUI for the program
import javax.swing.JFrame;//Needed so we can set the properties of MainFrame as MainFrame uses JFrame
public class Main
{
public static void main(String[] args)
{
MainFrame mainFrame = new MainFrame();//Create a new instance of the GUI class
mainFrame.pack();//Size the JFrame to how big is needs to be to show all the elements inside it
mainFrame.setResizable(false);//Don't let the user resize the frame
mainFrame.setVisible(true);//Let the user see the JFrame
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//When the JFrame is closed, exit the program
mainFrame.setLocation(0, 0);//Set the default on-screen location of the JFrame
}
}
The MainFrame class controls the GUI elements and monitors when the user has interacted with the GUI by clicking a button or changing a menu setting. It's the biggest class, but 94% of it is simply creating the GUI elements and setting their properties:
Code :
/**
* @author ShadeDarkan
*/
package Hangman.GUI;//The package this class belongs to
import Hangman.GameLogic;//Needed so we can evaluate the game, get new words, set and get player stats, etc
import java.awt.*;//Needed for many of the GUI elements we are using
import java.awt.event.ActionEvent;//Needed so we can make and use ActionEvent for our ActionListener
import java.awt.event.ActionListener;//Needed so we can tell when a button or menu item is clicked or changed
import javax.swing.*;//Needed for many of the GUI elements we are using
public class MainFrame extends JFrame
{
//Create global variables and objects
GameLogic gameLogic = new GameLogic();//Create a new GameLogic object so we can use its methods
private String sPlayerName = "";//We need this because the GUI is going to be getting the player's name and passing it to GameLogic
private String sGameStatus = "";//We need this to keep track of the game's win, lose or progressing status
//Create menu bars and items
private JMenuItem jmiNewGame = new JMenuItem("New Game");
private JMenuItem jmiChoosePlayer = new JMenuItem("Choose Player");
private JMenu jmDifficulty = new JMenu("Difficulty");
private JMenuItem jmiExit = new JMenuItem("Exit");
private JRadioButtonMenuItem jrbmiEasy = new JRadioButtonMenuItem("Easy", true);
private JRadioButtonMenuItem jrbmiMedium = new JRadioButtonMenuItem("Medium");
private JRadioButtonMenuItem jrbmiHard = new JRadioButtonMenuItem("Hard");
//Create stats and message text boxes
private JLabel jlDisplayWord = new JLabel();
private JTextArea jtaStats = new JTextArea();
private JTextArea jtaMessage = new JTextArea();
//Create the alphabet buttons
private JButton jbtA = new JButton("A");
private JButton jbtB = new JButton("B");
private JButton jbtC = new JButton("C");
private JButton jbtD = new JButton("D");
private JButton jbtE = new JButton("E");
private JButton jbtF = new JButton("F");
private JButton jbtG = new JButton("G");
private JButton jbtH = new JButton("H");
private JButton jbtI = new JButton("I");
private JButton jbtJ = new JButton("J");
private JButton jbtK = new JButton("K");
private JButton jbtL = new JButton("L");
private JButton jbtM = new JButton("M");
private JButton jbtN = new JButton("N");
private JButton jbtO = new JButton("O");
private JButton jbtP = new JButton("P");
private JButton jbtQ = new JButton("Q");
private JButton jbtR = new JButton("R");
private JButton jbtS = new JButton("S");
private JButton jbtT = new JButton("T");
private JButton jbtU = new JButton("U");
private JButton jbtV = new JButton("V");
private JButton jbtW = new JButton("W");
private JButton jbtX = new JButton("X");
private JButton jbtY = new JButton("Y");
private JButton jbtZ = new JButton("Z");
//Class constructor
public MainFrame()
{
//Create menu bar and items
JMenuBar jmbMenu = new JMenuBar();
JMenu jmGameOptions = new JMenu("Game Options");
//Create panel for GUI elements
JPanel jpMenu = new JPanel();
JPanel jpLabel = new JPanel();
JPanel jpImagesText = new JPanel();
JPanel jpImages = new JPanel();
JPanel jpText = new JPanel();
JPanel jpButtons = new JPanel();
//Create the button group for difficulties
ButtonGroup bgDifficulty = new ButtonGroup();
//Create dimension objects for use with JLabel to set a preferred size for the GUI element
Dimension dLabel = new Dimension();
Dimension dImagesText = new Dimension();
//Set the layout for panels
setLayout(new GridBagLayout());
jpMenu.setLayout(new FlowLayout(FlowLayout.LEFT));
jpLabel.setLayout(new FlowLayout(FlowLayout.CENTER));
jpImagesText.setLayout(new GridLayout(1,2,5,0));
jpText.setLayout(new GridLayout(2, 1, 0, 5));
jpButtons.setLayout(new GridLayout(2, 13, 0, 0));
//Set component properties
jtaStats.setEditable(false);
jtaStats.setLineWrap(true);
jtaMessage.setEditable(false);
jtaMessage.setLineWrap(true);
jlDisplayWord.setFont(jlDisplayWord.getFont().deriveFont(46.0f));
dLabel.height = 80;
dImagesText.height = 300;
jpLabel.setPreferredSize(dLabel);
jpImagesText.setPreferredSize(dImagesText);
//Add menu items to the menu
jmbMenu.add(jmGameOptions);
jmGameOptions.add(jmiNewGame);
jmGameOptions.add(jmiChoosePlayer);
jmGameOptions.add(jmDifficulty);
jmGameOptions.add(jmiExit);
jmDifficulty.add(jrbmiEasy);
jmDifficulty.add(jrbmiMedium);
jmDifficulty.add(jrbmiHard);
bgDifficulty.add(jrbmiEasy);
bgDifficulty.add(jrbmiMedium);
bgDifficulty.add(jrbmiHard);
//Create GUI constraints
GridBagConstraints cMenu = new GridBagConstraints();
cMenu.anchor = GridBagConstraints.LINE_START;
cMenu.gridwidth = GridBagConstraints.REMAINDER;
cMenu.gridx = 0;
cMenu.gridy = 0;
GridBagConstraints cLabel = new GridBagConstraints();
cLabel.fill = GridBagConstraints.BOTH;
cLabel.gridwidth = GridBagConstraints.REMAINDER;
cLabel.gridy = GridBagConstraints.RELATIVE;
GridBagConstraints cImagesText = new GridBagConstraints();
cImagesText.fill = GridBagConstraints.BOTH;
cImagesText.gridwidth = GridBagConstraints.REMAINDER;
cImagesText.gridy = GridBagConstraints.RELATIVE;
GridBagConstraints cButtons = new GridBagConstraints();
cButtons.fill = GridBagConstraints.BOTH;
cButtons.gridwidth = GridBagConstraints.REMAINDER;
cButtons.gridy = GridBagConstraints.RELATIVE;
//Add the panels to the MainFrame
this.add(jpMenu, cMenu);
jpMenu.add(jmbMenu);
this.add(jpLabel, cLabel);
jpLabel.add(jlDisplayWord);
this.add(jpImagesText, cImagesText);
jpImagesText.add(jpImages);
jpImagesText.add(jpText);
this.add(jpButtons, cButtons);
//Add the text areas to the panels
jpText.add(jtaStats);
jpText.add(jtaMessage);
//Add buttons to jpButtons panel
jpButtons.add(jbtA);
jpButtons.add(jbtB);
jpButtons.add(jbtC);
jpButtons.add(jbtD);
jpButtons.add(jbtE);
jpButtons.add(jbtF);
jpButtons.add(jbtG);
jpButtons.add(jbtH);
jpButtons.add(jbtI);
jpButtons.add(jbtJ);
jpButtons.add(jbtK);
jpButtons.add(jbtL);
jpButtons.add(jbtM);
jpButtons.add(jbtN);
jpButtons.add(jbtO);
jpButtons.add(jbtP);
jpButtons.add(jbtQ);
jpButtons.add(jbtR);
jpButtons.add(jbtS);
jpButtons.add(jbtT);
jpButtons.add(jbtU);
jpButtons.add(jbtV);
jpButtons.add(jbtW);
jpButtons.add(jbtX);
jpButtons.add(jbtY);
jpButtons.add(jbtZ);
//Create button action listeners
MenuListener menuListener = new MenuListener();
ButtonListener buttonListener = new ButtonListener();
//Register the action listener with the buttons
jmiNewGame.addActionListener(menuListener);
jmiChoosePlayer.addActionListener(menuListener);
jmDifficulty.addActionListener(menuListener);
jmiExit.addActionListener(menuListener);
jrbmiEasy.addActionListener(menuListener);
jrbmiMedium.addActionListener(menuListener);
jrbmiHard.addActionListener(menuListener);
jbtA.addActionListener(buttonListener);
jbtB.addActionListener(buttonListener);
jbtC.addActionListener(buttonListener);
jbtD.addActionListener(buttonListener);
jbtE.addActionListener(buttonListener);
jbtF.addActionListener(buttonListener);
jbtG.addActionListener(buttonListener);
jbtH.addActionListener(buttonListener);
jbtI.addActionListener(buttonListener);
jbtJ.addActionListener(buttonListener);
jbtK.addActionListener(buttonListener);
jbtL.addActionListener(buttonListener);
jbtM.addActionListener(buttonListener);
jbtN.addActionListener(buttonListener);
jbtO.addActionListener(buttonListener);
jbtP.addActionListener(buttonListener);
jbtQ.addActionListener(buttonListener);
jbtR.addActionListener(buttonListener);
jbtS.addActionListener(buttonListener);
jbtT.addActionListener(buttonListener);
jbtU.addActionListener(buttonListener);
jbtV.addActionListener(buttonListener);
jbtW.addActionListener(buttonListener);
jbtX.addActionListener(buttonListener);
jbtY.addActionListener(buttonListener);
jbtZ.addActionListener(buttonListener);
}
//Action listener for menu items
private class MenuListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String sMenuPressed = e.getActionCommand();//Get the item that was pressed or selected
//Evaluate the menu selection and take action if needed
if(sMenuPressed.contentEquals("New Game"))
{
if(sPlayerName.contentEquals(""))
{
setPlayerName();
}
startNewGame();
}
if(sMenuPressed.contentEquals("Choose Player"))
{
setPlayerName();
startNewGame();
}
if(sMenuPressed.contentEquals("Easy"))
{
if(sPlayerName.contentEquals(""))
{
setPlayerName();
}
startNewGame();
}
if(sMenuPressed.contentEquals("Medium"))
{
if(sPlayerName.contentEquals(""))
{
setPlayerName();
}
startNewGame();
}
if(sMenuPressed.contentEquals("Hard"))
{
if(sPlayerName.contentEquals(""))
{
setPlayerName();
}
startNewGame();
}
if(sMenuPressed.contentEquals("Exit"))
{
System.exit(0);
}
}
}
//Action listener for button items
private class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(sGameStatus.contentEquals("progressing"))
{
//Change action into a character
String sBtnPressed = e.getActionCommand();
char[] chaBtn = sBtnPressed.toCharArray();
char chBtn = chaBtn[0];
//Send action for button greyout
setIsEnabledFalse(chBtn);
//Send action to game logic for evaluation
gameLogic.EvaluateGuess(chBtn, e.getActionCommand());
jlDisplayWord.setText(gameLogic.getDisplayWord());
sGameStatus = gameLogic.EvaluateGame();
jtaMessage.setText((6 - gameLogic.getGuessesMade()) + " guesses left!");
evalGameStatus();
}
}
}
//Starts a new game
private void startNewGame()
{
if(jrbmiEasy.isSelected())
{
gameLogic.getNewGameWord(jrbmiEasy.getActionCommand());
jlDisplayWord.setText(gameLogic.getDisplayWord());
setStatsText();
jtaMessage.setText("6 guesses left!");
setIsEnabledTrue();
}
if(jrbmiMedium.isSelected())
{
gameLogic.getNewGameWord(jrbmiMedium.getActionCommand());
jlDisplayWord.setText(gameLogic.getDisplayWord());
setStatsText();
jtaMessage.setText("6 guesses left!");
setIsEnabledTrue();
}
if(jrbmiHard.isSelected())
{
gameLogic.getNewGameWord(jrbmiHard.getActionCommand());
jlDisplayWord.setText(gameLogic.getDisplayWord());
setStatsText();
jtaMessage.setText("6 guesses left!");
setIsEnabledTrue();
}
sGameStatus = "progressing";
}
//Evaluate game status
private void evalGameStatus()
{
if(sGameStatus.contentEquals("win") || sGameStatus.contentEquals("lose"))
{
if(jrbmiEasy.isSelected())
{
gameLogic.setPlayerStats(sPlayerName, sGameStatus,
jrbmiEasy.getActionCommand());
}
if(jrbmiMedium.isSelected())
{
gameLogic.setPlayerStats(sPlayerName, sGameStatus,
jrbmiMedium.getActionCommand());
}
if(jrbmiHard.isSelected())
{
gameLogic.setPlayerStats(sPlayerName, sGameStatus,
jrbmiHard.getActionCommand());
}
if(sGameStatus.contentEquals("win"))
{
jtaMessage.append("\nYOU WON!");
setStatsText();
}
if(sGameStatus.contentEquals("lose"))
{
jtaMessage.append("\nYOU LOST!");
setStatsText();
jlDisplayWord.setText(gameLogic.getRealWord());
}
}
}
//Sets the alphabet button pressed to not enabled
private void setIsEnabledFalse(char chBtn)
{
switch (chBtn)
{
case 'A': jbtA.setEnabled(false); break;
case 'B': jbtB.setEnabled(false); break;
case 'C': jbtC.setEnabled(false); break;
case 'D': jbtD.setEnabled(false); break;
case 'E': jbtE.setEnabled(false); break;
case 'F': jbtF.setEnabled(false); break;
case 'G': jbtG.setEnabled(false); break;
case 'H': jbtH.setEnabled(false); break;
case 'I': jbtI.setEnabled(false); break;
case 'J': jbtJ.setEnabled(false); break;
case 'K': jbtK.setEnabled(false); break;
case 'L': jbtL.setEnabled(false); break;
case 'M': jbtM.setEnabled(false); break;
case 'N': jbtN.setEnabled(false); break;
case 'O': jbtO.setEnabled(false); break;
case 'P': jbtP.setEnabled(false); break;
case 'Q': jbtQ.setEnabled(false); break;
case 'R': jbtR.setEnabled(false); break;
case 'S': jbtS.setEnabled(false); break;
case 'T': jbtT.setEnabled(false); break;
case 'U': jbtU.setEnabled(false); break;
case 'V': jbtV.setEnabled(false); break;
case 'W': jbtW.setEnabled(false); break;
case 'X': jbtX.setEnabled(false); break;
case 'Y': jbtY.setEnabled(false); break;
case 'Z': jbtZ.setEnabled(false); break;
}
}
//Sets the alphabet buttons back to enabled
private void setIsEnabledTrue()
{
jbtA.setEnabled(true); jbtN.setEnabled(true);
jbtB.setEnabled(true); jbtO.setEnabled(true);
jbtC.setEnabled(true); jbtP.setEnabled(true);
jbtD.setEnabled(true); jbtQ.setEnabled(true);
jbtE.setEnabled(true); jbtR.setEnabled(true);
jbtF.setEnabled(true); jbtS.setEnabled(true);
jbtG.setEnabled(true); jbtT.setEnabled(true);
jbtH.setEnabled(true); jbtU.setEnabled(true);
jbtI.setEnabled(true); jbtV.setEnabled(true);
jbtJ.setEnabled(true); jbtW.setEnabled(true);
jbtK.setEnabled(true); jbtX.setEnabled(true);
jbtL.setEnabled(true); jbtY.setEnabled(true);
jbtM.setEnabled(true); jbtZ.setEnabled(true);
}
//Set the player's name
private void setPlayerName()
{
sPlayerName = JOptionPane.showInputDialog(null, "Enter your name:",
"Player Name", JOptionPane.QUESTION_MESSAGE);
}
//Update stats text area
private void setStatsText()
{
int[] iaPStats = gameLogic.getPlayerStats(sPlayerName);
jtaStats.setText("");
jtaStats.append("Games played: " + iaPStats[0] + "\n");
jtaStats.append("Games won: " + iaPStats[1] + "\n");
if(iaPStats[0] == 0)
{
jtaStats.append("Win percentage: 0%" + "\n");
}
else
{
jtaStats.append("Win percentage: " + ((int)((double)iaPStats[1] / (double)iaPStats[0] * 100)) + "%" + "\n");
}
jtaStats.append("Games played on Easy: " + iaPStats[2] + "\n");
jtaStats.append("Games played on Medium: " + iaPStats[3] + "\n");
jtaStats.append("Games played on Hard: " + iaPStats[4]);
}
}
The GameLogic class holds the functions needed to evaluate the game progress, get and set player statistics, retrieve new words to guess, etc. Some functions I would have liked to put here, but accessing GUI elements from other classes didn't work well for me, lol:
Code :
/**
* @ShadeDarkan
*/
package Hangman;
import Hangman.IO.IO;
import javax.swing.JOptionPane;
public class GameLogic
{
//Create member variables
private final String sWordFolder = "Words";
private final String sSaveFolder = "Save";
private IO ioGame = new IO();
private String sRealWord = "";
private String sDisplayWord = "";
private int[] iaPStats = new int[5];
private int iGuessesMade;
//Class consructor
public GameLogic()
{
iGuessesMade = 0;//Set the guesses made to zero
}
//Get the player's saved stats, if available
public int[] getPlayerStats(String sPlayerName)
{
try//Send the player's name to IO so IO can check for a player save file to pull stats from
{
iaPStats = ioGame.getPlayerStats((sPlayerName + ".txt"), sSaveFolder, iaPStats);
}
catch(Exception e)//Display any error messages if IO can't get player stats
{
JOptionPane.showMessageDialog(null,e.toString(),"IO Error", JOptionPane.ERROR_MESSAGE);
}
return iaPStats;
}
//Return the string to be displayed to the player
public String getDisplayWord()
{
return sDisplayWord;
}
//Return the real word
public String getRealWord()
{
return sRealWord;
}
//Return the number of guesses made
public int getGuessesMade()
{
return iGuessesMade;
}
//Retrieve a new word
public void getNewGameWord(String difficulty)
{
try
{
//Get a new word and update real word string
sRealWord = ioGame.getRandomWord((difficulty + ".txt"), sWordFolder);
//Set the display word string to all '+'
char[] chaDisplayWord = new char[sRealWord.length()];
for(int i = 0; i < sRealWord.length(); i++)
{
chaDisplayWord[i] = '+';
}
String sTempWord = new String(chaDisplayWord);
sDisplayWord = sTempWord;
//Reset guesses made to 0
iGuessesMade = 0;
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,e.toString(),"IO Error", JOptionPane.ERROR_MESSAGE);
}
}
//Evaluate a character guess and update the display word if needed
public void EvaluateGuess(char chGuess, String sGuess)
{
boolean bGuessMatch = false;
//Convert display and real word strings to char arrays
char[] chaRealWord = sRealWord.toCharArray();
char[] chaDisplayWord = sDisplayWord.toCharArray();
//Compare each character for matches and update display word
for(int i = 0; i < chaRealWord.length; i++)
{
if(chGuess == chaRealWord[i])
{
chaDisplayWord[i] = chaRealWord[i];
bGuessMatch = true;
}
}
//Penalize for wrong guesses
if(bGuessMatch == false)
{
iGuessesMade = (iGuessesMade + 1);
}
//Change display word char array to a string
String sTempWord = new String(chaDisplayWord);
sDisplayWord = sTempWord;
}
//Evaluate a game for win, loss, progressing condition
public String EvaluateGame()
{
if(sDisplayWord.equals(sRealWord))
{
return "win";
}
else if((iGuessesMade != 6) && (!sDisplayWord.contentEquals(sRealWord)))
{
return "progressing";
}
else if((iGuessesMade == 6) && (!sDisplayWord.contentEquals(sRealWord)))
{
return "lose";
}
return "error";
}
//Sets the player stats after a game
public void setPlayerStats(String sPlayerName, String sGameStatus, String sDifficulty)
{
if(sGameStatus.contentEquals("win"))
{
++iaPStats[0];
++iaPStats[1];
if(sDifficulty.contentEquals("Easy"))
{
++iaPStats[2];
}
else if(sDifficulty.contentEquals("Medium"))
{
++iaPStats[3];
}
else
{
++iaPStats[4];
}
try
{
ioGame.setPlayerStats((sPlayerName + ".txt"), iaPStats, sSaveFolder);
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null,e.toString(),"IO Error", JOptionPane.ERROR_MESSAGE);
}
}
else
{
++iaPStats[0];
if(sDifficulty.contentEquals("Easy"))
{
++iaPStats[2];
}
else if(sDifficulty.contentEquals("Medium"))
{
++iaPStats[3];
}
else
{
++iaPStats[4];
}
try
{
ioGame.setPlayerStats((sPlayerName + ".txt"), iaPStats, sSaveFolder);
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null,e.toString(),"IO Error", JOptionPane.ERROR_MESSAGE);
}
}
}
}
Then, for single responsibility sake I put all the input/output into its own class called IO. IO really just takes the information provided from GameLogic and either writes it to a file or reads it from a file:
Code :
/**
* @author ShadeDarkan
*/
package Hangman.IO;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class IO
{
public IO ()
{
}
//Look for a file <difficulty> in the directory <folder> to get a word from
public String getRandomWord(String difficulty, String folder) throws IOException
{
ArrayList alRandomWord = new ArrayList();//We are going to read the words from the file into the ArrayList
File fDirWords = new File(folder);//Create file object from the directory argument <folder>
//Check that the directory containing the files for the random words exists.
if(!fDirWords.exists() && !fDirWords.canRead())
{
throw new IOException("The " + folder + " folder is missing or corrupt. "
+ "Please repair the program");
}
else
{
//Create a file object from the directory <folder> and file <difficulty> arguments
File fRandomWord = new File(folder + "/" + difficulty);
if(fRandomWord.exists() && fRandomWord.canRead())
{
Scanner input = new Scanner(fRandomWord);//Create a scanner object from our directory/file file object so we can read the file
while(input.hasNext())//While the scanner has another word enter the loop
{
alRandomWord.add(input.next().toString());//Add each word read by the scanner object into the arraylist
}
input.close();//Make sure to close your scanner object when you don't need it
}
else
{
throw new IOException ("The " + difficulty + " file is corrupt or missing. "
+ "Please repair the program.");
}
}
Random rNumber = new Random();//Create a random object for generating random numbers
//Generate a random number in the range our arraylist length, access the word at that index, turn it into a string and put it in rWord
String rWord = alRandomWord.get(rNumber.nextInt(alRandomWord.size())).toString();
return rWord;
}
//Use the player name <sName>, directory <folder> and array to get the player's stats from a file
public int[] getPlayerStats(String sName, String folder, int[] iaPStats) throws IOException
{
File fDirSave = new File(folder);
if(!fDirSave.exists())
{
throw new IOException("The " + folder + " folder is missing or corrupt. "
+ "Please repair the program.");
}
else
{
File fPStats = new File(folder + "/" + sName);
if(fPStats.exists() && fPStats.canRead())
{
Scanner sPStats = new Scanner(fPStats);
for(int i = 0; i < (iaPStats.length - 1); i++)
{
if(sPStats.hasNextInt())
{
iaPStats[i] = sPStats.nextInt();
}
else
{
iaPStats[i] = 0;
}
}
}
else if(!fPStats.exists())
{
fPStats.createNewFile();
for(int i = 0; i < (iaPStats.length - 1); i++)
{
iaPStats[i] = 0;
}
throw new IOException("The " + sName + " file could not be found. "
+ "A new file has been created.");
}
}
return iaPStats;
}
//Use the player's name <sName>, directory <sFolder> and stats array <iaStats> to write the player's stats to their save file
public void setPlayerStats(String sName, int[] iaStats, String sfolder) throws IOException
{
File fDirSave = new File(sfolder);
if(!fDirSave.exists())
{
throw new IOException("The " + sfolder + " folder is missing or corrupt. "
+ "Please repair the program.");
}
else
{
File fPStats = new File(sfolder + "/" + sName);
if(fPStats.exists() && fPStats.canRead())
{
PrintWriter pwPStats = new PrintWriter(fPStats);//Create a printwriter object (streamout) to write the stats to file
for(int i = 0; i < iaStats.length; i++)
{
pwPStats.println(iaStats[i]);
}
pwPStats.close();//Make sure to close the printwriter object when you are done with it
}
else
{
throw new IOException("The " + sName + " file is missing or corrupt. "
+ "No data was saved.");
}
}
}
}
Re: Complete hangman game: Good example for seeing how everything goes together
These is great! thanks :cool:
Re: Complete hangman game: Good example for seeing how everything goes together
Thanks. It only took four or five hours to code that. If anyone would like an example that uses some other Java functionality then just let me know.