#!/usr/bin/perl ######################################### # "Damage" # -------- # # Damage the number by typing # expressions. The result of the # expressions will be subtracted from # the current number. When the current # number gets to 0 you win. If it goes # below 0 you lose. # # Expression rules: # # 1. The two numbers in an expression # cannot be the same numbers. # 2. The only valid operators are # + - * /. # 3. There must be 3 parts in the # expression all seperated by a # single space. These are a # number, an operator, then the # other number. # 4. You can't use the current # number in the expression. # 5. The numbers in the expression # can only use digits that are # in the start number. # 6. You can't divide by 0. # 7. When dividing, the result must # be an integer. # 8. You can't multiply by 1. # # By Jeremy Ruten ("Jeremysr") # E-mail: jeremy.ruten@gmail.com # Website: http://bio-gaming.com/jeremy ######################################## do { print "\nHow many digits? [1-5] "; $digits = ; } until ($digits >= 1 && $digits <= 5); if ($digits == 1) { $range = 8; $minimum = 1; } elsif ($digits == 2) { $range = 89; $minimum = 10; } elsif ($digits == 3) { $range = 899; $minimum = 100; } elsif ($digits == 4) { $range = 8999; $minimum = 1000; } elsif ($digits == 5) { $range = 89999; $minimum = 10000; } else { die("That's not an integer!"); } $the_number = int(rand($range)) + $minimum; $current_number = $the_number; $turns = 0; while ($current_number > 0) { print "\nThe current number is: $current_number\n[Start number is $the_number]\n\nYour expression:"; $expression = ; @expression = split(/ /, $expression); # Validate it $valid = ""; if ($expression[0] == $expression[2]) { $valid = "Can't use same number on both sides of expression"; } if ($expression[1] ne "+" && $expression[1] ne "-" && $expression[1] ne "*" && $expression[1] ne "/") { $valid = "Invalid operator"; } if ($#expression != 2) { $valid = "Wrong number of parts to expression (must be 3 parts)"; } if ($expression[0] == $current_number || $expression[2] == $current_number) { $valid = "Expression can't use current number"; } if ($expression[2] == 0 && $expression[1] eq "/") { $valid = "Division by 0"; } if ($expression[0] !~ /[0-9]/ || $expression[2] !~ /[0-9]/) { $valid = "Numbers must be integers"; } if ($expression[1] eq "/" && $valid eq "") { if ($expression[0] / $expression[2] !~ /[0-9]/) { $valid = "Expression results in a non-integer"; } } # Make sure it has the right digits if ($valid eq "") { @valid_digits = split("", $the_number); @test_digits = split("", $expression[0]); @test_digits2 = split("", $expression[2]); push(@test_digits, @test_digits2); pop(@test_digits); foreach $current_digit (@test_digits) { $digit_valid = 0; foreach $current_valid_digit (@valid_digits) { if ($current_digit eq $current_valid_digit) { $digit_valid = 1; } } if ($digit_valid == 0) { $valid = "Numbers use digits not in start number"; } } } if ($valid eq "") { if ($expression[1] eq "+") { $current_number -= $expression[0] + $expression[2]; } elsif ($expression[1] eq "-") { $current_number -= $expression[0] - $expression[2]; } elsif ($expression[1] eq "*") { $current_number -= $expression[0] * $expression[2]; } elsif ($epxression[1] eq "/") { $current_number -= $expression[0] / $expression[2]; } $turns++; } else { print "\nINVALID EXPRESSION [$valid]\n\n"; } } if ($current_number == 0) { print "CONGRATULATIONS!\n\nYou have won in $turns turns!\n\n"; } else { print "You have lost after $turns turns! (Ended up with the number $current_number)\n\n"; }