% Hangman in Turing
% Coded by Johnny F
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
var input : string (1) % User's guess
var puzzle : string := "" % Phrase to guess
var unString, unDisplay : string := "" % Phrase with underlines, To display
var bodyCount : int := 0 % # of errors
var lettersUsed : string := "" % contains all letters entered
var choiceDisplay : string := "" % Centerable string or letters avail.
var playAgain : string (1) % gets 'y' or 'n'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Procedure centers text and displays it at current row as per Text.Whatrow
proc PutCenter (inputString : string)
Text.Locate (Text.WhatRow, (maxcol div 2) - (length (inputString) div 2))
put (inputString)
end PutCenter
% Displays a blinking message
proc BlinkMessage (row : int, blinkTimes : int, message : string, blinkColour : int)
colour (blinkColour)
for i : 1 .. blinkTimes * 2
if i mod 2 = 1 then
Text.Locate (row, 1)
PutCenter (message)
else
Text.Locate (row, 1)
PutCenter (repeat (" ", length (message)))
end if
View.Update
delay (300)
end for
colour (2)
end BlinkMessage
% Draws a hangman
% xLeftFoot - x position of left foot
% yLeftFoot - y position of left foot
% headRad - radius of head
% legHeight - height of legs in pixels
% torsoHeight - height of torso
% footToTorso - distance of foot to torso (center) horizontally
% armsOut - how far out the arms are horizontally (in pixels)
% armsVertOffset - 0 will set arms straight, another number will allow offset
% state - a value from 0-6. 0 = no hangman, 1 = head, 2 = torso, 3 = r arm, 4 = l arm, 5 = r leg, 6 = l leg
% example call... DrawHangman (100,120,10,50,45,15,50,-10,6,10)
proc DrawHangman (xLeftFoot : int, yLeftFoot : int, headRad : int, legHeight : int, torsoHeight : int, footToTorso : int, armsOut : int, armsVertOffset : int, state : int, colorOf : int)
% Left Leg (6)
if state > 5 then
Draw.Line (xLeftFoot, yLeftFoot, xLeftFoot + footToTorso, yLeftFoot + legHeight, colorOf)
end if
% Right Leg (5)
if state > 4 then
Draw.Line (xLeftFoot + footToTorso * 2, yLeftFoot, xLeftFoot + footToTorso, yLeftFoot + legHeight, colorOf)
end if
% Left Arm (4)
if state > 3 then
Draw.Line (xLeftFoot + footToTorso, yLeftFoot + legHeight + (torsoHeight - (torsoHeight div 6)), (xLeftFoot + footToTorso) - armsOut, (yLeftFoot + legHeight + (torsoHeight - (torsoHeight
div 6))) + armsVertOffset, colorOf)
end if
% Right Arm (3)
if state > 2 then
Draw.Line (xLeftFoot + footToTorso, yLeftFoot + legHeight + (torsoHeight - (torsoHeight div 6)), (xLeftFoot + footToTorso) + armsOut, (yLeftFoot + legHeight + (torsoHeight - (torsoHeight
div 6))) + armsVertOffset, colorOf)
end if
% Torso (2)
if state > 1 then
Draw.Line (xLeftFoot + footToTorso, yLeftFoot + legHeight, xLeftFoot + footToTorso, (yLeftFoot + legHeight) + torsoHeight, colorOf)
end if
% Head (1)
if state >= 1 then
Draw.Oval (xLeftFoot + footToTorso, yLeftFoot + legHeight + torsoHeight + headRad, headRad, headRad, colorOf)
end if
end DrawHangman
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Set colors and other graphics stuff
View.Set ("graphics:640;480")
View.Set ("title:HANGMAN")
RGB.SetColor (1, 0.11328125, 0.15234375, 0.1953125) % Dark blue
RGB.SetColor (2, 0.90234375, 0.99609375, 0.234375) % Bright lime
colourback (1)
colour (2)
cls
% Welcome Screen
%include "welcomeScreen.t"
loop
View.Set ("nooffscreenonly")
cls
lettersUsed := ""
% Prompt user for phrase to be used FIXME - hangman not showing up!
DrawHangman (335, 190, 15, 40, 50, 15, 10, -20, 6, 2)
Text.Locate (2, 3)
put "Please enter the phrase to be used:"
Text.Locate (3, 3)
View.Set ("cursor,echo")
get puzzle : *
% Convert puzzle into caps
for i : 1 .. length (puzzle)
if ord (puzzle (i)) > 96 and ord (puzzle (i)) < 123 then
puzzle := puzzle + chr (ord (puzzle (i)) - 32)
else
puzzle := puzzle + puzzle (i)
end if
end for
puzzle := puzzle ((length (puzzle) div 2) + 1 .. *)
% Create underline string, store in unString
unString := ""
for i : 1 .. length (puzzle)
if ord (puzzle (i)) > 64 and ord (puzzle (i)) < 91 then
unString := unString + "_"
else
unString := unString + puzzle (i)
end if
end for
View.Set ("offscreenonly")
loop
cls
% set up unDisplay for centering
unDisplay := ""
for i : 1 .. length (unString)
unDisplay := unDisplay + unString (i) + " "
end for
% Put underlines on third row
Text.Locate (3, 1)
PutCenter (unDisplay)
% Draw gallows
Draw.Box (View.maxx div 2 - ((View.maxx div 3) div 2), 130, View.maxx div 2 + ((View.maxx div 3) div 2), 134, 2)
Draw.Box (View.maxx div 2 - ((View.maxx div 3) div 2) + 10, 134, View.maxx div 2 - ((View.maxx div 3) div 2) + 14, 364, 2)
Draw.Box (View.maxx div 2 - ((View.maxx div 3) div 2) + 14, 360, View.maxx div 2 - ((View.maxx div 3) div 2) + 140, 364, 2)
Draw.Line (View.maxx div 2 - ((View.maxx div 3) div 2) + 14, 324, View.maxx div 2 - ((View.maxx div 3) div 2) + 50, 360, 2)
Draw.Line (View.maxx div 2 - ((View.maxx div 3) div 2) + 138, 360, View.maxx div 2 - ((View.maxx div 3) div 2) + 138, 310, 2)
% Draw Hangman
DrawHangman (335, 190, 15, 40, 50, 15, 10, -20, bodyCount, 2)
View.Update
exit when bodyCount = 6
exit when unString = puzzle
% set up choiceDisplay, Show choices for guess
choiceDisplay := ""
for i : ord ("A") .. ord ("Z")
if index (lettersUsed, chr (i)) > 0 then
choiceDisplay := choiceDisplay + " "
else
choiceDisplay := choiceDisplay + chr (i)
end if
choiceDisplay := choiceDisplay + " "
end for
locate (maxrow - 3, 1)
PutCenter (choiceDisplay)
loop
% Prompt for input (guess)
Text.Locate (5, 1)
PutCenter ("Enter your guess.")
View.Set ("nocursor,noecho")
View.Update
getch (input)
exit when ord (input) > 64 and ord (input) < 91
% Convert input to caps (if lower case)
if ord (input) > 96 and ord (input) < 123 then
input := chr (ord (input) - 32)
% See if letter has been used
if index (lettersUsed, input) > 0 then
BlinkMessage (5, 3, "You've already used that letter!", yellow)
end if
% If letter is not in lettersUsed, add it
if index (lettersUsed, input) = 0 then
lettersUsed := lettersUsed + input
exit
end if
else
BlinkMessage (5, 3, "Must be a letter!", yellow)
end if
end loop
% If letter is there then go through and change unString
if index (puzzle, input) > 0 then
for i : 1 .. length (puzzle)
if puzzle (i) = input then
unString := unString (1 .. i - 1) + input + unString (i + 1 .. *)
end if
end for
elsif index (puzzle, input) = 0 then
bodyCount += 1
end if
View.Update
end loop
% Victory Screen / Defeat Screen
colour (brightmagenta)
locate (5, 1)
case bodyCount of
label 0 :
PutCenter ("Good job, he didn't even touch the noose.")
label 1 :
PutCenter ("Ok. is neck is a little sore.")
label 2 :
PutCenter ("A torso is pretty heavy eh?")
label 3 :
PutCenter ("That was close.")
label 4 :
PutCenter ("That was close")
label 5 :
PutCenter ("He's going to feel that in the morning!")
label 6 :
PutCenter ("Umm... He's not moving. I think you lose!")
end case
colour (2)
locate (maxrow - 3, 1)
PutCenter ("Play Again? (Y/N)")
View.Update
loop
getch (playAgain)
exit when (playAgain = "Y" or playAgain = "y") or (playAgain = "N" or playAgain = "n")
BlinkMessage (maxrow - 2, 2, "Must be 'Y' or 'N'", yellow)
end loop
View.Update
exit when playAgain = "n" or playAgain = "N"
end loop
cls
locate (4, 1)
PutCenter ("Thanks for playing!")
DrawHangman (335, 190, 15, 40, 50, 15, 10, -20, 6, 2)
View.Update
|