RosettaCodeData/Task/24-game/TorqueScript/24-game.torque

168 lines
4.5 KiB
Plaintext

function startTwentyFourGame()
{
if($numbers !$= "")
{
echo("Ending current 24 game...");
endTwentyFourGame();
}
echo("Welcome to the 24 game!");
echo("Generating 4 numbers...");
for(%a = 0; %a < 4; %a++)
$numbers = setWord($numbers, %a, getRandom(0, 9));
echo("Numbers generated! Here are your numbers:");
echo($numbers);
echo("Use try24Equation( equation ); to try and guess the equation.");
$TwentyFourGame = 1;
}
function endTwentyFourGame()
{
if(!$TwentyFourGame)
{
echo("No 24 game is active!");
return false;
}
echo("Ending the 24 game.");
$numbers = "";
$TwentyFourGame = 0;
}
function try24Equation(%equ)
{
if(!$TwentyFourGame)
{
echo("No 24 game is active!");
return false;
}
%numbers = "0123456789";
%operators = "+-*x/()";
%tempchars = $numbers;
%other = strReplace(%tempchars, " ", "");
//Check it and make sure it has all the stuff
%equ = strReplace(%equ, " ", "");
%length = strLen(%equ);
for(%a = 0; %a < %Length; %a++)
{
%Char = getSubStr(%equ, %a, 1);
if(%a+1 != %Length)
%Next = getSubStr(%equ, %a+1, 1);
else
%Next = " ";
if(strPos(%numbers @ %operators, %char) < 0)
{
echo("The equation you entered is invalid! Try again.");
return false;
}
if(strPos(%tempchars, %char) < 0 && strPos(%operators, %char) < 0)
{
echo("The equation you entered uses a number you were not given! Try again.");
return false;
}
else if(strPos(%numbers, %next) >= 0 && strPos(%numbers, %char) >= 0)
{
echo("No numbers above 9 please! Try again.");
echo(%next SPC %char SPC %a);
return false;
}
else if(strPos(%operators, %char) > 0)
continue;
%pos = 2*strPos(%other, %char);
if(%pos < 0)
return "ERROROMG";
//Remove it from the allowed numbers
%tempchars = removeWord(%tempchars, %pos/2);
%other = getSubStr(%other, 0, %pos) @ getSubStr(%other, %pos+1, strLen(%other));
}
%result = doEquation(%equ);
if(%result != 24)
{
echo("Your equation resulted to" SPC %result @ ", not 24! Try again.");
return false;
}
for(%a = 0; %a < 4; %a++)
$numbers = setWord($numbers, %a, getRandom(0, 9));
echo("Great job!" SPC %equ SPC "Does result to 24! Here's another set for you:");
echo($numbers);
}
//Evaluates an equation without using eval.
function doEquation(%equ)
{ //Validate the input
%equ = strReplace(%equ, " ", "");%equ = strReplace(%equ, "*", "x");
%equ = strReplace(%equ, "+", " + ");%equ = strReplace(%equ, "x", " x ");
%equ = strReplace(%equ, "/", " / ");%equ = strReplace(%equ, "-", " - ");
//Parenthesis'
while(strPos(%equ, "(") > -1 && strPos(%equ, ")") > 0)
{
%start = strPos(%equ, "(");
%end = %start;
%level = 1;
while(%level != 0 && %end != strLen(%equ))
{
%end++;
if(getsubStr(%equ, %end, 1) $= "(") %level++;
if(getsubStr(%equ, %end, 1) $= ")") %level--;
}
if(%level != 0)
return "ERROR";
%inbrackets = getsubStr(%equ, %start+1, %end - strLen(getsubStr(%equ, 0, %start + 1)));
%leftofbrackets = getsubStr(%equ, 0, %start);
%rightofbrackets = getsubStr(%equ, %end + 1, strLen(%equ) - %end);
%equ = %leftofbrackets @ doEquation(%inbrackets) @ %rightofbrackets;
}
if(strPos(%equ, "ERROR") >= 0)
return "ERROR";
//Multiplication/Division loop
for(%a = 0; %a < getWordCount(%equ); %a++)
{
if(getWord(%equ, %a) $= "x" || getWord(%equ, %a) $= "/" && %a != 0)
{
%f = getWord(%equ, %a - 1);
%l = getWord(%equ, %a + 1);
%o = getWord(%equ, %a);
switch$(%o)
{
case "x": %a--;
%equ = removeWord(removeWord(setWord(%equ, %a+1, %f * %l), %a+2), %a);
case "/": %a--;
%equ = removeWord(removeWord(setWord(%equ, %a+1, %f / %l), %a+2), %a);
}
}
}
//Addition/Subraction loop
for(%a = 0; %a < getWordCount(%equ); %a++)
{
if(getWord(%equ, %a) $= "+" || getWord(%equ, %a) $= "-" && %a != 0)
{
%f = getWord(%equ, %a - 1);
%l = getWord(%equ, %a + 1);
%o = getWord(%equ, %a);
switch$(%o)
{
case "+": %a--;
%equ = removeWord(removeWord(setWord(%equ, %a+1, %f + %l), %a+2), %a);
case "-": %a--;
%equ = removeWord(removeWord(setWord(%equ, %a+1, %f - %l), %a+2), %a);
}
}
}
return %equ;
}