Jump to content


Photo

[Game] Hangman


  • Please log in to reply
6 replies to this topic

#1 Banane

Banane
  • Members
  • 46 posts

Posted 19 September 2010 - 03:36 PM

Posted Image

Well, today was one of these days, were the boredom takesover... as a way to entertain myself, I thought I'd program something funny, that's what this script is all about.

The script gathers it's word list from a defineable file, the default filename is "Hangman_Words.txt".

Every line of the file will be a new word.

Script + Resources:
http://www.autohotke...ngman-1.0.1.zip

Script:
;===========================================================================================================================================================
;Directives
;===========================================================================================================================================================

#SingleInstance, Force
#NoTrayIcon
#NoEnv

;===========================================================================================================================================================
;Setup base variables
;===========================================================================================================================================================

;Application Info
App_Name    := "Hangman"
App_Version := "1.0.1"

;Gui Numbers
Gui_Hangman := 1

;File Paths
Files_Pictures := "Images"
Files_Hangman  := "Hangman_{Nr}.png" ;{Nr} will be replaced by count of wrong answers
Files_Wordlist := "Hangman_Words.txt"

;Letters
Letters_Alpha := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;Letters the player has to guess

;Word specific
Words0     := 0  ;Count of Array Entries
Word_Game  := "" ;Word as visible in game
Word_Full  := "" ;Word as loaded from file
Word_Count := 0  ;Last replacement count of a letter
Word_AllLt := 0  ;Count of all revealed letters
Word_Wrong := 0  ;Count of wrong guessings

;Gameplay
Game_MaxWrong := 6 ;Count of wrong answers for gameover

;===========================================================================================================================================================
;Setup the program
;===========================================================================================================================================================

Main:
  ;Load all words into memory
  Hangman_LoadWordList()
  ;Create all windows
  GoSub, Hangman_CreateGui
  ;Load the first random word
  GoSub, Hangman_NewWord
  Return

;===========================================================================================================================================================
;Hangman Labels
;===========================================================================================================================================================

Hangman_CreateGui:
  ;Setup the gui options
  Gui, %Gui_Hangman%:-Border +ToolWindow +LastFound +LabelHangman_ -Theme
    ;Setup the font setting
    Gui, %Gui_Hangman%:Font, Bold, Arial
    ;Create the titlebar
    Gui, %Gui_Hangman%:Add, Text, x5 y5 w350 h20 +0x1000, % "  " App_Name " [V" App_Version "] - " Words0 " Words loaded"
    Gui, %Gui_Hangman%:Add, Text, x5 y5 w330 h20 +BackgroundTrans gHangman_MoveGui
    Gui, %Gui_Hangman%:Add, Button, x335 y8 w15 h15 gHangman_Close, X
    ;Create hangman picture
    Gui, %Gui_Hangman%:Add, Picture, x5 y30 w350 h350 +0x1000 vHangman_Pic
    ;Create the word container
    Gui, %Gui_Hangman%:Add, Text, x5 y395 w350 h40 +0x1000 vHangman_Word
    Gui, %Gui_Hangman%:Add, Text, x5 y440 w350 h65 +0x1000
    ;Only use hotkeys on this window
    Hotkey, IfWinActive, Hangman
    ;Create the alphabetical buttons
    Loop, Parse, Letters_Alpha
    {
      ;If it's first button, or first button of second line, use 40
      If (A_Index = 1 || A_Index = 14)
        XPos := 40
      ;Increment the horizontal position by 22 otherwise
      Else XPos := "p+22"
      ;Use vertical position 40 on first line, on second line 65
      YPos := (A_Index < 14) ? 450 : 475
      Gui, %Gui_Hangman%:Add, Button, x%XPos% y%YPos% w20 h20 vHangman_Letter%A_Index% gHangman_NewLetter, % A_LoopField
      ;Create a hotkey as well
      Hotkey, % A_LoopField, Hangman_NewLetterByHotkey, On
    }
    ;Create gameplay specific controls
    Gui, %Gui_Hangman%:Add, Text, x5 y512 w195 h20 vHangman_Stat, Wrong: 0/0 Letters: 0
    Gui, %Gui_Hangman%:Add, Button, x200 y510 w75 h20 gHangman_SolveWord, Solve Word
    Gui, %Gui_Hangman%:Add, Button, x280 y510 w75 h20 gHangman_NewWord, New Word
  ;Create and show the gui
  Gui, %Gui_Hangman%:Show, w360 h535, Hangman
  Return

Hangman_NewWord:
  ;Ensure that everything's in the start state
  Hangman_Reset()
  ;Load the random word
  Hangman_LoadWord()
  Return

Hangman_SolveWord:
  InputBox, Word, Hangman - Solve Word, Enter the word:,, 300, 120
  If (Word = Word_Full) {
    ;Show the full word
    GuiControl, %Gui_Hangman%:, Hangman_Word, % Word_Full
    ;Disable all buttons
    Hangman_LetterState(0)
    ;Show "Game Won" Message
    MsgBox,, Hangman, Congratulations! You've won the game!
  } Else MsgBox,, Hangman, Sorry`, that wasn't correct!
  Return

Hangman_NewLetter:
  ;Retrieve the letter of the pressed control
  GuiControlGet, Letter,, % A_GuiControl
  ;Check if this letter is within the word
  Hangman_CheckLetter(Letter)
  ;Disable control
  GuiControl, %Gui_Hangman%:Disable, % A_GuiControl
  Return

Hangman_NewLetterByHotkey:
  ;Use the hotkey button name
  Letter := A_ThisHotkey
  ;Check if this letter is within the word
  Hangman_CheckLetter(Letter)
  ;Loop through all allowed characters
  Loop, Parse, Letters_Alpha
    ;If the current character was the pressed key
    If (A_LoopField = Letter) {
      ;Disable the control
      GuiControl, %Gui_Hangman%:Disable, % "Hangman_Letter" A_Index
      ;Break from the loop
      Break
    }
  Return

Hangman_MoveGui:
  PostMessage, 0xA1, 2,,, A
  Return

Hangman_Escape:
Hangman_Close:
  MsgBox, 64, Hangman, % App_Name " [V" App_Version "]`n`nCreated by: Banane"
  ExitApp

;===========================================================================================================================================================
;Functions
;===========================================================================================================================================================

Hangman_Reset() {
 global

  ;Reset all variables
  Word_Game  := ""
  Word_Full  := ""
  Word_Count := 0
  Word_Wrong := 0
  ;Enable letter buttons
  Hangman_LetterState(1)
  ;Restore standard values
  GuiControl, %Gui_Hangman%:, Hangman_Word, 
  GuiControl, %Gui_Hangman%:, Hangman_Stat, % "Wrong: 0/" Game_MaxWrong " Letters: 0"
  Hangman_HangmanImage()
}

Hangman_HangmanImage() {
 global
 local Image

  StringReplace, Image, Files_Hangman, {Nr}, % Word_Wrong
  GuiControl, %Gui_Hangman%:, Hangman_Pic, % Files_Pictures "\" Image
}

Hangman_LoadWordList() {
 global
 local Currword

  ;Read the file line by line
  Loop, Read, % Files_Wordlist
    ;Only create array entry for this line, if not empty
    If (A_LoopReadLine <> "")
      ;Increase array count and save current word in pseudo array
      Words0 ++,Words%Words0% := A_LoopReadLine,Currword := ""
}

Hangman_LoadWord() {
 global
 local Currword

  ;Select a random word from array
  Random, Currword, 1, % Words0
  ;Set currword to the word in Words%Currword%
  Currword := Words%Currword%
  ;Change all alphabetical letters to _
  Loop, Parse, Currword
    Word_Game .= (InStr(Letters_Alpha,A_LoopField)) ? "_" : A_LoopField
  ;Make every letter uppercase
  StringUpper, Word_Full, Currword
  ;Change the content of the word control
  GuiControl, %Gui_Hangman%:, Hangman_Word, % Word_Game
}

Hangman_CheckLetter(Input) {
 global

  ;Reset the found letter count
  Word_Count := 0
  ;Parse through every letter of the full word
  Loop, Parse, Word_Full
    ;If the current letter is equal to the specified one
    If (A_LoopField = Input)
      ;Change the _ of this position with the letter and increase count
      Word_Game := SubStr(Word_Game,1,A_Index - 1) Input SubStr(Word_Game,A_Index + 1,StrLen(Word_Game)),Word_Count ++
  ;Increase the count of wrong guessings if no letter was replaced, change control text otherwise
  If (Word_Count = 0)
    Word_Wrong ++,Hangman_HangmanImage()
  Else GuiControl, %Gui_Hangman%:, Hangman_Word, % Word_Game
  Word_AllLt := Word_AllLt + Word_Count
  ;Update the statistics
  GuiControl, %Gui_Hangman%:, Hangman_Stat, % "Wrong: " Word_Wrong "/" Game_MaxWrong " Letters: " Word_AllLt
  ;If the count is equal to the maximum count of wrong guessings (6 by default)
  If (Word_Wrong = Game_MaxWrong || Word_Game = Word_Full) {
    ;Show the full word
    GuiControl, %Gui_Hangman%:, Hangman_Word, % Word_Full
    ;Disable all buttons
    Hangman_LetterState(0)
    ;Show "Game Over" / "Game Won" Message
    MsgBox,, Hangman, % (Word_Wrong = Game_MaxWrong) ? "Game Over!" : "Congratulations! You've won the game!"
  }
}

Hangman_LetterState(Mode) {
 global

  ;Check whether the buttons should be enabled or disabled
  Mode := (Mode = 1) ? "Enable" : "Disable"
  ;Apply the state to every button
  Loop, % StrLen(Letters_Alpha) {
    ;Change the control state
    GuiControl, %Gui_Hangman%:%Mode%, Hangman_Letter%A_Index%
    ;Change the hotkey state
    Hotkey, % SubStr(Letters_Alpha,A_Index,1), % (Mode = "Enable") ? "On" : "Off"
  }
}


#2 x79animal

x79animal
  • Members
  • 1021 posts

Posted 19 September 2010 - 03:56 PM

You've won the game!


damnit i just lost the game

#3 health901

health901
  • Members
  • 8 posts

Posted 20 September 2010 - 02:46 PM

i see nothing but "Congratulations! You've won the game!"

#4 Eedis

Eedis
  • Members
  • 1591 posts

Posted 20 September 2010 - 07:40 PM

damnit i just lost the game

Damn you Animal.

This is pretty cool. You should have it grab a large list from the internet or something.

#5 Tuncay

Tuncay
  • Members
  • 1943 posts

Posted 20 September 2010 - 07:48 PM

Hello World! I won the game.

Simple and nice. Good work

Suggestion: Add keyboard support. Then no need for mouse clicks. That would make me more happy. :D

#6 Frankie

Frankie
  • Members
  • 2930 posts

Posted 20 September 2010 - 11:05 PM

I keep a page in my favorites that has lists of words.
<!-- m -->http://www.artwinaut... ... l#wordlist<!-- m -->

Specificaly the 500 most common and the 100,000 word lists. It also has other language lists.

#7 Banane

Banane
  • Members
  • 46 posts

Posted 09 April 2011 - 12:56 PM

Totally forgot about this... :O

Add keyboard support.

Keyboard support is now in.