Monster Wrestling
Book: Weird Computer Games
Author: Usborne Publishing
Translator: Marcus Medina
Story
Monster wrestling is a sport for lunatics! Which doesn’t say much for you — the brain in charge of this hulk of bone and muscle which is about to take on some of the nastiest monsters in the Universe.
As the Brain, you must do a lot of quick and accurate calculations. You must work out the muscular effort required to hold off the monster — multiply the monster’s size by the distance it is from you.
If the numbers look too difficult, you can press the Panic Button (P). Then you have to work out how much adrenaline the body needs to get through the crisis by dividing heartbeat increase by oxygen supply. Use the Panic Button sparingly: after three uses you will black out on the fourth.
To live to fight another match you must survive 12 rounds against the monster.
Pseudocode
SET round = 1SET panics_used = 0REPEAT UNTIL round > 12 GENERATE monster_size and monster_distance DISPLAY both values PROMPT player for muscular effort or panic IF player entered panic THEN INCREMENT panics_used IF panics_used == 4 THEN game over (blackout) GENERATE heartbeat_increase and oxygen_supply PROMPT for adrenaline = heartbeat / oxygen IF answer wrong THEN game over (crushed) CONTINUE to next round without incrementing round ELSE CONVERT answer to integer muscular_effort IF muscular_effort != size * distance THEN game over (crushed) INCREMENT roundEND LOOPIF loop finished without failure THEN player survives 12 roundsFlowchart
flowchart TD
A[Start] --> B[round = 1, panics = 0]
B --> C{round <= 12?}
C -->|No| Z[Print victory]
C -->|Yes| D[Show monster size & distance]
D --> E[Get player input]
E --> F{Input == P?}
F -->|Yes| G[panics++]
G --> H{panics == 4?}
H -->|Yes| Y[Blackout]
H -->|No| I[Show heartbeat & oxygen]
I --> J[Ask for adrenaline]
J --> K{Correct?}
K -->|No| X[Crushed]
K -->|Yes| C
F -->|No| L[Check muscular effort]
L --> M{Answer == size * distance?}
M -->|No| X
M -->|Yes| N[round++]
N --> C
X --> End[Game over]
Y --> End
Z --> End
Code
Pages


ZX-81 BASIC
20 LET P=030 LET K=340 CLS50 LET Y=160 LET Y=670 LET N=180 G=INT(RND(1)*Y)+X90 LET I=INT(RND(1)*K)+K100 LET Y=Y+0.5110 LET K=K+0.5130 PRINT140 PRINT "SIZE OF MONSTER: ";G150 PRINT "DISTANCE AWAY: ";I160 PRINT "MUSCULAR EFFORT? ";170 GOSUB 570180 IF I*G>Z THEN GOTO 320240 CLS250 PRINT "MONSTER KEPT AT BAY"260 IF N<11 THEN GOTO 75270 PRINT "PHEW! ---- THE MONSTER"280 PRINT "IS TIRED AND HAS GONE TO"290 PRINT "LOOK FOR ANOTHER VICTIM."300 PRINT "YOU SURVIVE TO TELL THE TALE!"310 STOP320 CLS330 PRINT "YOU HAVE BEEN CRUSHED"340 PRINT "TO A PULP IN THE"350 PRINT "MONSTER'S HUGE ARMS"360 PRINT "YOU SURVIVED ";N;" ROUNDS"370 STOP390 CLS400 LET W=INT(RND(1)*9)+1410 LET WX=INT(RND(1)*9)+1420 LET P=P+1430 IF P=4 THEN GOTO 700440 IF P=3 THEN PRINT "YOU ARE SEEING STARS"450 PRINT "PANIC ON!!"470 PRINT "HEARTBEAT INCREASE: ";W480 PRINT "OXYGEN SUPPLY: ";WX500 PRINT "AMOUNT OF ADRENALIN? ";520 LET Q=100530 GOSUB 580540 IF Z<>W/WX THEN GOTO 320550 CLS:IF N<11 THEN GOTO 75560 GOTO 270570 LET Z$=""580 LET A$=INKEY$590 IF A$=CHR$(13) THEN GOTO 680600 IF A$="P" THEN GOTO 390610 IF A$="" THEN GOTO 580620 PRINT A$;630 LET Z$=Z$+A$640 IF LEN Z$>4 THEN GOTO 580650 GOTO 580680 LET Z=VAL(Z$)690 RETURN700 CLS710 PRINT "YOU BLACKED OUT"720 STOPModern Implementations
C#
using System;
namespace WeirdComputerGames;
public static class MonsterWrestling{ private const int RoundsToWin = 12; private const int MaxPanics = 3;
public static void Main() { var random = new Random(); int panics = 0;
for (int round = 1; round <= RoundsToWin; round++) { int size = random.Next(8, 16); // monster size grows gradually int distance = random.Next(3, 9); // distance in arbitrary units Console.WriteLine($"\nRound {round}"); Console.WriteLine($"Size of monster: {size}"); Console.WriteLine($"Distance away: {distance}"); Console.Write("Muscular effort? (or P to panic): ");
string? input = Console.ReadLine()?.Trim().ToUpperInvariant(); if (input == "P") { if (++panics > MaxPanics) { Console.WriteLine("You blacked out! The monster wins."); return; }
int heartbeat = random.Next(10, 50); int oxygen = random.Next(5, 15); Console.WriteLine("PANIC ON!!"); Console.WriteLine($"Heartbeat increase: {heartbeat}"); Console.WriteLine($"Oxygen supply: {oxygen}"); Console.Write("Amount of adrenalin? ");
if (!double.TryParse(Console.ReadLine(), out double answer) || Math.Abs(answer - (double)heartbeat / oxygen) > 0.01) { Console.WriteLine("Wrong dose! You are crushed in a massive hug."); return; }
round--; // panic doesn't advance the round continue; }
if (!int.TryParse(input, out int effort) || effort != size * distance) { Console.WriteLine("Wrong calculation! The monster squeezes you flat."); return; }
Console.WriteLine("Muscles straining... the monster is kept at bay!"); }
Console.WriteLine("Phew! The monster wearily lumbers off. You survive to tell the tale!"); }}Python
import random
ROUNDS_TO_WIN = 12MAX_PANICS = 3
def monster_wrestling() -> None: panics = 0 round_no = 1
while round_no <= ROUNDS_TO_WIN: size = random.randint(8, 15) distance = random.randint(3, 8) print(f"\nRound {round_no}") print(f"Size of monster: {size}") print(f"Distance away: {distance}") choice = input("Muscular effort? (or P to panic): ").strip().upper()
if choice == "P": panics += 1 if panics > MAX_PANICS: print("You black out! The monster crushes you.") return
heartbeat = random.randint(10, 40) oxygen = random.randint(5, 12) print("PANIC ON!!") print(f"Heartbeat increase: {heartbeat}") print(f"Oxygen supply: {oxygen}") try: adrenaline = float(input("Amount of adrenalin? ")) except ValueError: print("That wasn't a number. You are crushed.") return
if abs(adrenaline - heartbeat / oxygen) > 0.01: print("Wrong dose! The monster wins.") return
continue # retry the same round
try: effort = int(choice) except ValueError: print("You freeze up and the monster flattens you!") return
if effort != size * distance: print("Incorrect calculation! The monster crushes you.") return
print("Muscles hold! The monster retreats a step.") round_no += 1
print("Phew! Twelve rounds later the monster slinks away.")
if __name__ == "__main__": monster_wrestling()Java
import java.util.Random;import java.util.Scanner;
public class MonsterWrestling { private static final int ROUNDS_TO_WIN = 12; private static final int MAX_PANICS = 3;
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Random random = new Random(); int panics = 0;
for (int round = 1; round <= ROUNDS_TO_WIN; round++) { int size = random.nextInt(8) + 8; // 8-15 int distance = random.nextInt(6) + 3; // 3-8
System.out.printf("%nRound %d%n", round); System.out.printf("Size of monster: %d%n", size); System.out.printf("Distance away: %d%n", distance); System.out.print("Muscular effort? (or P to panic): "); String input = scanner.nextLine().trim().toUpperCase();
if ("P".equals(input)) { panics++; if (panics > MAX_PANICS) { System.out.println("You black out! The monster wins."); return; }
int heartbeat = random.nextInt(31) + 10; int oxygen = random.nextInt(8) + 5; System.out.println("PANIC ON!!"); System.out.printf("Heartbeat increase: %d%n", heartbeat); System.out.printf("Oxygen supply: %d%n", oxygen); System.out.print("Amount of adrenalin? ");
double answer; try { answer = Double.parseDouble(scanner.nextLine()); } catch (NumberFormatException ex) { System.out.println("That wasn't a number. You are crushed."); return; }
if (Math.abs(answer - (double) heartbeat / oxygen) > 0.01) { System.out.println("Wrong dose! The monster crushes you."); return; }
round--; // redo the round continue; }
int effort; try { effort = Integer.parseInt(input); } catch (NumberFormatException ex) { System.out.println("Incorrect response! The monster crushes you."); return; }
if (effort != size * distance) { System.out.println("Wrong calculation! You are crushed."); return; }
System.out.println("You hold the monster back!"); }
System.out.println("Phew! Twelve rounds later the monster slinks away."); }}Go
package main
import ( "bufio" "fmt" "math" "math/rand" "os" "strconv" "strings" "time")
const ( roundsToWin = 12 maxPanics = 3)
func main() { rand.Seed(time.Now().UnixNano()) reader := bufio.NewReader(os.Stdin) panics := 0
for round := 1; round <= roundsToWin; round++ { size := rand.Intn(8) + 8 // 8-15 distance := rand.Intn(6) + 3 // 3-8
fmt.Printf("\nRound %d\n", round) fmt.Printf("Size of monster: %d\n", size) fmt.Printf("Distance away: %d\n", distance) fmt.Print("Muscular effort? (or P to panic): ") line, _ := reader.ReadString('\n') input := strings.ToUpper(strings.TrimSpace(line))
if input == "P" { panics++ if panics > maxPanics { fmt.Println("You black out! The monster crushes you.") return }
heartbeat := rand.Intn(31) + 10 oxygen := rand.Intn(8) + 5 fmt.Println("PANIC ON!!") fmt.Printf("Heartbeat increase: %d\n", heartbeat) fmt.Printf("Oxygen supply: %d\n", oxygen) fmt.Print("Amount of adrenalin? ")
ansLine, _ := reader.ReadString('\n') ans, err := strconv.ParseFloat(strings.TrimSpace(ansLine), 64) if err != nil || math.Abs(ans-float64(heartbeat)/float64(oxygen)) > 0.01 { fmt.Println("Wrong dose! The monster wins.") return }
round-- continue }
effort, err := strconv.Atoi(input) if err != nil || effort != size*distance { fmt.Println("Wrong calculation! The monster crushes you.") return }
fmt.Println("You hold the monster back!") }
fmt.Println("Phew! Twelve rounds later the monster lumbers away.")}C++
#include <cmath>#include <iostream>#include <random>#include <string>
int main() { std::mt19937 rng(std::random_device{}()); std::uniform_int_distribution<int> sizeDist(8, 15); std::uniform_int_distribution<int> distDist(3, 8); std::uniform_int_distribution<int> heartbeatDist(10, 40); std::uniform_int_distribution<int> oxygenDist(5, 12);
int panics = 0;
for (int round = 1; round <= 12; ++round) { int size = sizeDist(rng); int distance = distDist(rng);
std::cout << "\nRound " << round << '\n' << "Size of monster: " << size << '\n' << "Distance away: " << distance << '\n' << "Muscular effort? (or P to panic): ";
std::string input; std::getline(std::cin, input); for (char& ch : input) ch = static_cast<char>(std::toupper(static_cast<unsigned char>(ch)));
if (input == "P") { if (++panics > 3) { std::cout << "You black out! The monster crushes you.\n"; return 0; }
int heartbeat = heartbeatDist(rng); int oxygen = oxygenDist(rng); std::cout << "PANIC ON!!\n" << "Heartbeat increase: " << heartbeat << '\n' << "Oxygen supply: " << oxygen << '\n' << "Amount of adrenalin? ";
std::string ansLine; std::getline(std::cin, ansLine); double ans = std::stod(ansLine); if (std::fabs(ans - static_cast<double>(heartbeat) / oxygen) > 0.01) { std::cout << "Wrong dose! The monster wins.\n"; return 0; }
--round; continue; }
int effort = std::stoi(input); if (effort != size * distance) { std::cout << "Wrong calculation! The monster crushes you.\n"; return 0; }
std::cout << "You hold the monster back!\n"; }
std::cout << "Phew! Twelve rounds later the monster slinks away.\n"; return 0;}The program is a tense arithmetic drill. Each round generates a monster size and distance; multiplying them gives the muscular effort needed to keep the monster away. Panicking swaps one calculation for another: a ratio of heartbeat to oxygen. Panics are limited — overusing them leads to a blackout. Survive 12 correct answers and you win.
Challenges
- Endurance Mode – Remove the 12-round limit and see how long you can last as numbers creep upward.
- Combo Bonus – Track streaks of correct answers and award extra points for consecutive wins without panicking.
- Multiplayer Brain – Alternate rounds between two players and see who keeps their nerves the longest.
Copyright
These programs are adaptations of the original Usborne Computer Guides published in the 1980s. The books are free to download for personal or educational use from Usborne’s Computer and Coding Books. Programs and adaptations may not be used for commercial purposes.
Return to Weird Computer Games.