AUTODEFINE "Off" Window w1,w2 DIALOG d1 file OptionsFile,MyFile string ActualWord,LetterGuess,DisplayWord int sL,sT,sW,sH,cL,cT,cW,cH,PanelHgt,PanelTop,LastChar,run int MinWordLen,MaxWordLen,SoundOn,PressOne,LetterWrong,GallowsImageCount,GameOn int a = 0 int x = 0 int GameWon = 0 int ShowUsedLetters = 0 string Dashes = "" istring dIn[256] = "" istring WrongLetters[30] = "" string WordToGuess[21120] = "" const STATIC_1 = 100 enum Letters LA = 65 LB LC LD LE LF LG LH LI LJ LK LL LM LN LO LP LQ LR LS LT LU LV LW LX LY LZ endenum IF(OPENFILE(MyFile,GETSTARTPATH+"dictionary.txt","R") = 0) DO READ MyFile,dIn x++ WordToGuess[x] = dIn until EOF(MyFile) endif closefile MyFile 'Load Gallows and Logo images into memory UINT BitmapL = LOADIMAGE(GETSTARTPATH + "Hangman Logo.jpg",@IMGSCALABLE) UINT BITMAP = LOADIMAGE(GETSTARTPATH + "Gallows.jpg",@IMGSCALABLE) UINT BITMAP0 = LOADIMAGE(GETSTARTPATH + "Gallows0.jpg",@IMGSCALABLE) UINT BITMAP1 = LOADIMAGE(GETSTARTPATH + "Gallows1.jpg",@IMGSCALABLE) UINT BITMAP2 = LOADIMAGE(GETSTARTPATH + "Gallows2.jpg",@IMGSCALABLE) UINT BITMAP3 = LOADIMAGE(GETSTARTPATH + "Gallows3.jpg",@IMGSCALABLE) UINT BITMAP4 = LOADIMAGE(GETSTARTPATH + "Gallows4.jpg",@IMGSCALABLE) UINT BITMAP5 = LOADIMAGE(GETSTARTPATH + "Gallows5.jpg",@IMGSCALABLE) UINT BITMAP6 = LOADIMAGE(GETSTARTPATH + "Gallows6.jpg",@IMGSCALABLE) UINT BITMAP7 = LOADIMAGE(GETSTARTPATH + "Gallows7.jpg",@IMGSCALABLE) UINT BITMAP8 = LOADIMAGE(GETSTARTPATH + "Gallows8.jpg",@IMGSCALABLE) UINT BITMAP9 = LOADIMAGE(GETSTARTPATH + "Gallows9.jpg",@IMGSCALABLE) UINT BITMAP10 = LOADIMAGE(GETSTARTPATH + "Gallows10.jpg",@IMGSCALABLE) UINT BITMAP11 = LOADIMAGE(GETSTARTPATH + "Gallows11.jpg",@IMGSCALABLE) UINT BITMAPFREE = LOADIMAGE(GETSTARTPATH + "GallowsFree.jpg",@IMGSCALABLE) int Across = -14 int WindowBackColour = RGB(253,255,214) 'Read Options file or write it if it doesn't exist IF(OPENFILE(OptionsFile,GETSTARTPATH+"Options.txt","R") = 0) IF(READ(OptionsFile,dIn) = 0) THEN MinWordLen = VAL(dIn) IF(READ(OptionsFile,dIn) = 0) THEN MaxWordLen = VAL(dIn) IF(READ(OptionsFile,dIn) = 0) THEN SoundOn = VAL(dIn) IF(READ(OptionsFile,dIn) = 0) THEN ShowUsedLetters = VAL(dIn) CLOSEFILE Optionsfile ELSE 'default values MinWordLen = 7 MaxWordLen = 15 SoundOn = 0 ShowUsedLetters = 1 IF(OPENFILE(OptionsFile,GETSTARTPATH+"Options.txt","W") = 0) WRITE OptionsFile,MinWordLen WRITE OptionsFile,MaxWordLen WRITE OptionsFile,SoundOn WRITE OptionsFile,ShowUsedLetters CLOSEFILE Optionsfile ENDIF ENDIF 'main window OPENWINDOW w1,0,0,480,600,@MINBOX,0,"Hangman",&Main SETWINDOWCOLOR w1,WindowBackColour 'window menus BEGINMENU w1 MENUTITLE "Game" MENUITEM "New Game", 0,1 SEPARATOR MENUITEM "Options", 0,2 SEPARATOR MENUITEM "Load saved game", 0,3 MENUITEM "Save game && exit", 0,4 SEPARATOR MENUITEM "Exit", 0,5 MENUTITLE "Help" MENUITEM "About", 0,6 ENDMENU 'Status bar CONTROL w1,@STATUS," Select 'New Game' from the Menu to play, or press ESC",0,0,0,0,0,10 'Draw a 3D panel at bottom of window. Adjust for diffent Status bar Heights GETCLIENTSIZE w1,cL,cT,cW,cH GETSIZE w1,sL,sT,sW,sH,10 'status bar PanelHgt=94 PanelTop=cH-sH-PanelHgt ThreeDPanel(w1,0,cH-sH-PanelHgt,cW,PanelHgt,225,226,159) CONTROL w1,@STATIC,"",10,PanelTop + 8,452,77,@CTEDITCENTER|0x200,STATIC_1 SETFONT w1,"Arial",36,400,0,STATIC_1 SETCONTROLCOLOR w1,STATIC_1,RGB(255,0,0),RGB(225,226,159) showwindow w1,@SWHIDE,STATIC_1 FOR a = 65 TO 90 Across += 18 CONTROL w1,@STATIC,chr$(a),Across,(PanelTop + 8) - 40,18,25,@CTEDITCENTER|0x200,a SETFONT w1,"Arial",12,400,0,a SETCONTROLCOLOR w1,a,rgb(0,0,0),RGB(253,255,214) showwindow w1,@SWHIDE,a next a 'Show gallows and logo on opening screen SHOWIMAGE w1,BITMAP,@IMGSCALABLE,30,4,400,400 SHOWIMAGE w1,BitmapL,@IMGSCALABLE,10,PanelTop+14,458,70 'End program run = 1 WAITUNTIL run = 0 if iswindowclosed(w2) = 0 then closewindow w2 End 'Window handler SUB Main(),INT SELECT @MESSAGE CASE @IDCREATE CENTERWINDOW w1 CASE @IDCLOSEWINDOW if iswindowclosed(w2) = 0 then closewindow w2 run = 0 CASE @IDMENUPICK SELECT @MENUNUM CASE 1 NewGame() CASE 2 Options() if ShowUsedLetters and GameOn FOR a = 65 TO 90 showwindow w1,@SWSHOW,a next a else FOR a = 65 TO 90 showwindow w1,@SWHIDE,a next a endif case 3 'Load game IF(OPENFILE(OptionsFile,GETSTARTPATH+"Game.txt","R") = 0) do read OptionsFile,dIn GallowsImageCount = val(dIn) read OptionsFile,dIn ActualWord = dIn read OptionsFile,dIn ThreeDPanel(w1,0,cH-sH-PanelHgt,cW,PanelHgt,225,226,159) setcontroltext(w1,STATIC_1,dIn) showwindow w1,@SWSHOW,STATIC_1 read OptionsFile,dIn WrongLetters = dIn until eof(OptionsFile) if ShowUsedLetters = 1 FOR a = 65 TO 90 showwindow w1,@SWSHOW,a next a endif GameOn = 1 for a = 1 to len(WrongLetters) if mid$(WrongLetters,a,1) <> " " SETCONTROLCOLOR w1,asc(ucase$(mid$(WrongLetters,a,1))),RGB(255,0,0),RGB(253,255,214) endif next a SELECT GallowsImageCount CASE 1 SHOWIMAGE w1,BITMAP1,@IMGSCALABLE,30,4,400,400 CASE 2 SHOWIMAGE w1,BITMAP2,@IMGSCALABLE,30,4,400,400 CASE 3 SHOWIMAGE w1,BITMAP3,@IMGSCALABLE,30,4,400,400 CASE 4 SHOWIMAGE w1,BITMAP4,@IMGSCALABLE,30,4,400,400 CASE 5 SHOWIMAGE w1,BITMAP5,@IMGSCALABLE,30,4,400,400 CASE 6 SHOWIMAGE w1,BITMAP6,@IMGSCALABLE,30,4,400,400 CASE 7 SHOWIMAGE w1,BITMAP7,@IMGSCALABLE,30,4,400,400 CASE 8 SHOWIMAGE w1,BITMAP8,@IMGSCALABLE,30,4,400,400 CASE 9 SHOWIMAGE w1,BITMAP9,@IMGSCALABLE,30,4,400,400 CASE 10 SHOWIMAGE w1,BITMAP10,@IMGSCALABLE,30,4,400,400 CASE 11 SHOWIMAGE w1,BITMAP11,@IMGSCALABLE,30,4,400,400 SETCONTROLTEXT w1,10," Sorry, you've lost - press 'Enter' to reveal the word" IF SoundOn = 1 THEN PLAYWAVE GETSTARTPATH+"loser.wav",@SNDASYNC GameOn = 0 endselect SETCONTROLTEXT w1,10," Guess a Letter" else NewGame() ENDIF case 4 'Save game IF(OPENFILE(OptionsFile,GETSTARTPATH+"Game.txt","W") = 0) WRITE OptionsFile,ltrim$(str$(GallowsImageCount)) WRITE OptionsFile,ActualWord WRITE OptionsFile,getcontroltext(w1,STATIC_1) WRITE OptionsFile,WrongLetters CLOSEFILE Optionsfile ENDIF if iswindowclosed(w2) = 0 then closewindow w2 run = 0 CASE 5 'Exit if iswindowclosed(w2) = 0 then closewindow w2 run = 0 CASE 6 MESSAGEBOX (w1,"HANGMAN Version 2021\n\nBased on David Aldersley's program\n\nConverted to IWB by Brian\n\nGot working by me, Andy","Hangman",64) ENDSELECT CASE @IDCHAR LastChar = @CODE 'Reveal the word (If game lost) IF (@CODE = 13)&(GameOn = 0) & GallowsImageCount = 11 Reveal() SETCONTROLTEXT w1,10," Play again? select 'New Game' from the Menu, or press ESC" ENDIF IF Isletter(@CODE) & GameOn = 1 IF PressOne = 0 'prevent multi key presses PressOne = 1 LetterGuess=CHR$(@CODE) 'Call Sub to sort word LetterWrong = 0 WordToFind() '*********Guesser got the letter right select LetterWrong '*********Guesser chose a letter that had already been chosen case 1 SETCONTROLTEXT w1,10," Try again, you've already selected that letter" IF SoundOn = 1 THEN PLAYWAVE GETSTARTPATH+"Error.wav",@SNDASYNC goto AfterMessage '*********Guesser chose a wrong letter case 2 GallowsImageCount += 1 SELECT GallowsImageCount CASE 1 SHOWIMAGE w1,BITMAP1,@IMGSCALABLE,30,4,400,400 CASE 2 SHOWIMAGE w1,BITMAP2,@IMGSCALABLE,30,4,400,400 CASE 3 SHOWIMAGE w1,BITMAP3,@IMGSCALABLE,30,4,400,400 CASE 4 SHOWIMAGE w1,BITMAP4,@IMGSCALABLE,30,4,400,400 CASE 5 SHOWIMAGE w1,BITMAP5,@IMGSCALABLE,30,4,400,400 CASE 6 SHOWIMAGE w1,BITMAP6,@IMGSCALABLE,30,4,400,400 CASE 7 SHOWIMAGE w1,BITMAP7,@IMGSCALABLE,30,4,400,400 CASE 8 SHOWIMAGE w1,BITMAP8,@IMGSCALABLE,30,4,400,400 CASE 9 SHOWIMAGE w1,BITMAP9,@IMGSCALABLE,30,4,400,400 CASE 10 SHOWIMAGE w1,BITMAP10,@IMGSCALABLE,30,4,400,400 CASE 11 SHOWIMAGE w1,BITMAP11,@IMGSCALABLE,30,4,400,400 SETCONTROLTEXT w1,10," Sorry, you've lost - press 'Enter' to reveal the word" IF SoundOn = 1 THEN PLAYWAVE GETSTARTPATH+"loser.wav",@SNDASYNC GameOn = 0 endselect case 10 SETCONTROLTEXT w1,10," Correct - make another guess" IF SoundOn=1 THEN PLAYWAVE GETSTARTPATH+"blip.wav",@SNDASYNC IF DisplayWord = ActualWord SETCONTROLTEXT w1,10," Brilliant - you've won - to start a new game press ESC" GameWon = 1 SHOWIMAGE w1,BITMAPFREE,@IMGSCALABLE,30,4,400,400 IF SoundOn = 1 THEN PLAYWAVE GETSTARTPATH+"cheer.wav",@SNDASYNC GameOn = 0 ENDIF endselect label WrongMessage IF GameOn = 1 and LetterWrong <> 10 SETCONTROLTEXT w1,10," Wrong - have another guess" IF SoundOn = 1 THEN PLAYWAVE GETSTARTPATH+"Wrong.wav",@SNDASYNC ENDIF if GameWon = 1 and @CODE = 27 NewGame() endif label AfterMessage ENDIF ENDIF CASE @IDKEYUP PressOne = 0 IF DisplayWord = ActualWord and LastChar = 27 SETCONTROLTEXT w1,10," Play again? Select 'New Game' from the Menu, or press ESC" GameOn = 0 PressOne = 0 NewGame() endif if GallowsImageCount = 11 and LastChar = 27 GameOn = 0 PressOne = 0 NewGame() endif ENDSELECT RETURN 0 ENDSUB 'New game SUB NewGame() int RandNo GameWon = 0 ActualWord = "" DisplayWord = "" WrongLetters = "" if ShowUsedLetters = 1 FOR a = 65 TO 90 showwindow w1,@SWSHOW,a next a endif FOR a = 65 TO 90 SETCONTROLCOLOR w1,a,rgb(0,0,0),RGB(253,255,214) next a label SearchAgain RandNo = RND(21110)+1 IF len(WordToGuess[RandNo]) >= MinWordLen and LEN(WordToGuess[RandNo]) <= MaxWordLen ActualWord = WordToGuess[RandNo] ENDIF if ActualWord = "" then goto SearchAgain 'Greyed out gallows SHOWIMAGE w1,BITMAP0,@IMGSCALABLE,30,4,400,400 'Blank out the previous games characters (on screen) ThreeDPanel(w1,0,cH-sH-PanelHgt,cW,PanelHgt,225,226,159) 'Re-initialize variables for new game DisplayWord = "" LetterGuess = "" GallowsImageCount = 0 showwindow w1,@SWSHOW,STATIC_1 'Call Sub to print initial dashes WordToFind() GameOn = 1 Dashes = "" for a = 1 to len(ActualWord) Dashes = Dashes + "- " next a Dashes = rtrim$(Dashes) setcontroltext(w1,STATIC_1,Dashes) SETCONTROLTEXT w1,10," Guess a Letter" ENDSUB 'Word sort - sorts letters into dashes, spaces, characters SUB WordToFind() DEF WordLen,Count:INT LetterWrong = 0 'Error if letter previously selected IF INSTR(LCASE$(getcontroltext(w1,STATIC_1)),LCASE$(LetterGuess)) LetterWrong = 1 ELSE IF !INSTR(LCASE$(WrongLetters),LCASE$(LetterGuess)) LetterWrong = 2 '2 if Letter not found if !instr(WrongLetters,LCASE$(LetterGuess)) WrongLetters = WrongLetters + LCASE$(LetterGuess) + " " SETCONTROLCOLOR w1,asc(LetterGuess)-32,RGB(255,0,0),RGB(253,255,214) endif endif ENDIF WordLen = LEN(ActualWord) FOR COUNT = 1 TO wordLen 'Found a match IF LCASE$(MID$(ActualWord,COUNT,1)) = LCASE$(LETTERGUESS) LetterWrong = 10 string Temp = getcontroltext(w1,STATIC_1) string Temp2 = "" for a = 1 to len(Temp) if mid$(Temp,a,1) <> " " Temp2 = Temp2 + mid$(Temp,a,1) endif next a replace$(Temp2,Count,1,LetterGuess) DisplayWord = Temp2 Dashes = "" for a = 1 to len(Temp2) string Chr = mid$(Temp2,a,1) if Chr = "-" Dashes = Dashes + "- " else Dashes = Dashes + Chr + " " endif next a Dashes = rtrim$(Dashes) setcontroltext(w1,STATIC_1,Dashes) goto NextCount ENDIF LABEL NextCount NEXT COUNT ENDSUB 'Reveal the word SUB Reveal() setcontroltext(w1,STATIC_1,ActualWord) ENDSUB 'Function to draw a 3D Panel on a window SUB ThreeDPanel(w:WINDOW,pL:INT,pT:INT,pW:INT,PH:INT,red:INT,green:INT,blue:INT) RECT w,pL,pT,pW,pH,RGB(red,green,blue),RGB(red,green,blue) RECT w,pL+4,pT+4,pW-8,pH-8,RGB(0,0,0) LINE w,pL+4,pT+pH-5,pW-5,pT+pH-5,rgb(250,250,250) 'LINE w,pW-5,pT+3,pW-5,pT+pH-5,rgb(255,255,255) EndSub 'Function to check if Ascii character is a letter Sub IsLetter(AscChar:int),int DEF IsLetter:Int IF ((AscChar>=65)&(AscChar<=90))|((AscChar>=97)&(AscChar<=122)) IsLetter=1 ENDIF RETURN IsLetter EndSub sub Options() OPENWINDOW w2,0,0,350,320,@MINBOX,0,"Hangman Options",&OptionsHandler SETWINDOWCOLOR w2,WindowBackColour CONTROL w2,@GROUPBOX," Word Length ",25,24,300,100,0x50000007,1 SETFONT w2,"Arial",12,400,0,1 SETCONTROLCOLOR w2,1,rgb(0,0,0),WindowBackColour CONTROL w2,@EDIT,ltrim$(str$(MinWordLen)),77,65,34,25,@CTEDITNUMBER,2 SETFONT w2,"Arial",12,400,0,2 CONTROL w2,@EDIT,ltrim$(str$(MaxWordLen)),165,65,34,25,@CTEDITNUMBER,3 SETFONT w2,"Arial",12,400,0,3 CONTROL w2,@STATIC,"Min",40,65,35,25,0x200,4 SETFONT w2,"Arial",12,400,0,4 SETCONTROLCOLOR w2,4,rgb(0,0,0),WindowBackColour CONTROL w2,@STATIC,"Max",127,65,35,25,0x200,5 SETFONT w2,"Arial",12,400,0,5 SETCONTROLCOLOR w2,5,rgb(0,0,0),WindowBackColour CONTROL w2,@CHECKBOX,"Play Sounds",25,140,120,25,0,6 SETFONT w2,"Arial",12,400,0,6 SETCONTROLCOLOR w2,6,rgb(0,0,0),WindowBackColour setstate w2,6,SoundOn CONTROL w2,@CHECKBOX,"Show Used Letters",25,170,160,25,0,7 SETFONT w2,"Arial",12,400,0,7 SETCONTROLCOLOR w2,7,rgb(0,0,0),WindowBackColour setstate w2,7,ShowUsedLetters CONTROL w2,@BUTTON,"Cancel",25,255,71,24,0x50010000,8 SETFONT w2,"Arial",12,400,0,8 CONTROL w2,@BUTTON,"Save",250,255,70,25,0x50010001,9 SETFONT w2,"Arial",12,400,0,9 waituntil w2 = 0 return endsub sub Optionshandler(),int SELECT @MESSAGE CASE @IDCREATE CENTERWINDOW w2 CASE @IDCLOSEWINDOW CLOSEWINDOW w2 CASE @IDCONTROL SELECT @CONTROLID CASE 9 'Save Button int MinWordLenX = VAL(GETCONTROLTEXT (w2,2)) int MaxWordLenX = VAL(GETCONTROLTEXT (w2,3)) int SoundOnX = GETSTATE (w2,6) int ShowUsedX = GETSTATE (w2,7) 'Test input value's are ok before saving changes If MinWordLenX < 1 MESSAGEBOX d1,"Minimum word length is 1","Error",64 setfocus w2,2 ENDIF If MaxWordLenX > 19 MESSAGEBOX d1,"Maximum word length is 19","Error",64 setfocus w2,3 return 0 ENDIF IF MinWordLenX > MaxWordLenX MESSAGEBOX d1,"Minimum word length > Maximum","Error",64 setfocus w2,2 ENDIF MinWordLen = MinWordLenX MaxWordLen = MaxWordLenX SoundOn = SoundOnX ShowUsedLetters = ShowUsedX 'write new values to file IF(OPENFILE(OptionsFile,GETSTARTPATH+"Options.txt","W") = 0) WRITE OptionsFile,ltrim$(str$(MinWordLen)) WRITE OptionsFile,ltrim$(str$(MaxWordLen)) WRITE OptionsFile,ltrim$(str$(SoundOn)) WRITE OptionsFile,ltrim$(str$(ShowUsedX)) CLOSEFILE Optionsfile ENDIF if GameOn = 0 closewindow w2 closewindow w1 system getstartpath + "hangman2021.exe" run = 0 endif closewindow w2 return 0 CASE 8 'Cancel Button closewindow w2 return 0 ENDSELECT ENDSELECT return 0 endsub