Code
11 January 2025 15:30
#Skeleton Program code for the AQA A Level Paper 1 Summer 2025 examination
#this code should be used in conjunction with the Preliminary Material
#written by the AQA Programmer Team
#developed in the Python 3.9 programming environment
import re
import random
import math
def Main():
NumbersAllowed = []
Targets = []
MaxNumberOfTargets = 20
MaxTarget = 0
MaxNumber = 0
TrainingGame = False
Choice = input("Enter y to play the training game, anything else to play a random game: ").lower()
print()
if Choice == "y":#if in training MaxNumber, Max Target and Targets pre-determind with below stats
MaxNumber = 1000
MaxTarget = 1000
TrainingGame = True
Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82, 121, 34, 45, 68, 75, 34, 23, 119, 43, 23, 119]
else:# targets are randomly generated from a range of upto 50
MaxNumber = 10
MaxTarget = 50
Targets = CreateTargets(MaxNumberOfTargets, MaxTarget) #sub routine run
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)#passes empty array, Boolean value and max number
PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber)#startes game using generated values
input()
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber):
Score = 0
GameOver = False
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)#runs sub routine DisplayState
UserInput = input("Enter an expression: ")
print()
if CheckIfUserInputValid(UserInput):#send userinput to be checked
UserInputInRPN = ConvertToRPN(UserInput)
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed, UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score)
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput, MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
print("Game over!")
DisplayScore(Score)
def CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score):
UserInputEvaluation = EvaluateRPN(UserInputInRPN)
UserInputEvaluationIsATarget = False
if UserInputEvaluation != -1:
for Count in range(0, len(Targets)):
if Targets[Count] == UserInputEvaluation:
Score += 2
Targets[Count] = -1
UserInputEvaluationIsATarget = True
return UserInputEvaluationIsATarget, Score
def RemoveNumbersUsed(UserInput, MaxNumber, NumbersAllowed):
UserInputInRPN = ConvertToRPN(UserInput)
for Item in UserInputInRPN:
if CheckValidNumber(Item, MaxNumber):
if int(Item) in NumbersAllowed:
NumbersAllowed.remove(int(Item))
return NumbersAllowed
def UpdateTargets(Targets, TrainingGame, MaxTarget):
for Count in range (0, len(Targets) - 1):
Targets[Count] = Targets[Count + 1]
Targets.pop()
if TrainingGame:
Targets.append(Targets[-1])
else:
Targets.append(GetTarget(MaxTarget))
return Targets
def CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed, UserInputInRPN, MaxNumber):
Temp = []
for Item in NumbersAllowed:
Temp.append(Item)
for Item in UserInputInRPN:
if CheckValidNumber(Item, MaxNumber):
if int(Item) in Temp:
Temp.remove(int(Item))
else:
Skeleton Code Analysus Page 1
, else:
return False
return True
def CheckValidNumber(Item, MaxNumber):
if re.search("^[0-9]+$", Item) is not None:#regular expression search of a non-empty line that is composed of nothing but digits
ItemAsInteger = int(Item)
if ItemAsInteger > 0 and ItemAsInteger <= MaxNumber:
return True
return False
def DisplayState(Targets, NumbersAllowed, Score):#target generated from main, the array of targets and score
DisplayTargets(Targets)
DisplayNumbersAllowed(NumbersAllowed)
DisplayScore(Score)
def DisplayScore(Score):
print("Current score: " + str(Score))
print()
print()
def DisplayNumbersAllowed(NumbersAllowed):
print("Numbers available: ", end = '') #ends the output with a space
for N in NumbersAllowed:
print(str(N) + " ", end = '')
print()
print()
def DisplayTargets(Targets):
print("|", end = '') #ends the output with a space
for T in Targets: #repeats for all targets in the array
if T == -1:
print(" ", end = '')#if -1 display a blank space
else:
print(T, end = '') #print value of T
print("|", end = '')#seperate values with |
print()
print()
def ConvertToRPN(UserInput): #Reverse Polish Notation (RPN), used to evaluate the expression
Position = 0
Precedence = {"+": 2, "-": 2, "*": 4, "/": 4} #creates dictionary for sumbols and value, higher value = higher presedence
Operators = []#stores operators temporarily
Operand, Position = GetNumberFromUserInput(UserInput, Position)#runs sub routine and passes UserInput and Postion
#sub routine returns the number as the operand and the updates postion e.g 123+456 would return Operand 123 postion would be 3
UserInputInRPN = []
UserInputInRPN.append(str(Operand))#appends number from the Operand to the array
Operators.append(UserInput[Position - 1])
while Position < len(UserInput):
Operand, Position = GetNumberFromUserInput(UserInput, Position)
UserInputInRPN.append(str(Operand))
if Position < len(UserInput):
CurrentOperator = UserInput[Position - 1]
while len(Operators) > 0 and Precedence[Operators[-1]] > Precedence[CurrentOperator]:
UserInputInRPN.append(Operators[-1])
Operators.pop()
if len(Operators) > 0 and Precedence[Operators[-1]] == Precedence[CurrentOperator]:
UserInputInRPN.append(Operators[-1])
Operators.pop()
Operators.append(CurrentOperator)
else:
while len(Operators) > 0:
UserInputInRPN.append(Operators[-1])
Operators.pop()
return UserInputInRPN
def EvaluateRPN(UserInputInRPN):
S = []
while len(UserInputInRPN) > 0:
while UserInputInRPN[0] not in ["+", "-", "*", "/"]:
S.append(UserInputInRPN[0])
UserInputInRPN.pop(0)
Num2 = float(S[-1])
S.pop()
Num1 = float(S[-1])
S.pop()
Result = 0.0
if UserInputInRPN[0] == "+":
Result = Num1 + Num2
elif UserInputInRPN[0] == "-":
Result = Num1 - Num2
elif UserInputInRPN[0] == "*":
Result = Num1 * Num2
elif UserInputInRPN[0] == "/":
Result = Num1 / Num2
UserInputInRPN.pop(0)
S.append(str(Result))
if float(S[0]) - math.floor(float(S[0])) == 0.0:
return math.floor(float(S[0]))
else:
return -1
def GetNumberFromUserInput(UserInput, Position):
Number = ""
MoreDigits = True
while MoreDigits:
if not(re.search("[0-9]", str(UserInput[Position])) is None):#checks for any digit between 0-9 and returns None if not
Number += UserInput[Position] #adds the number to the Number variable and stores as a string
Skeleton Code Analysus Page 2
, Number += UserInput[Position] #adds the number to the Number variable and stores as a string
else:
MoreDigits = False #stops looking for more digits if one isn't found
Position += 1 #moves to the next character in the user input
if Position == len(UserInput):#if it gets to the end of the UserInput there are no more characters to check
MoreDigits = False
if Number == "":
return -1, Position#return-1 if no number found
else:
return int(Number), Position #return the number and the Position of the number back to the call position
def CheckIfUserInputValid(UserInput):
if re.search("^([0-9]+[\\+\\-\\*\\/])+[0-9]+$", UserInput) is not None:#searches userinput contains numbers and symbols
return True
else:
return False
def GetTarget(MaxTarget):
return random.randint(1, MaxTarget)#Generates a random int and returns
def GetNumber(MaxNumber):
return random.randint(1, MaxNumber)#chooses a random number between 1 and the maxnumber and returns value
def CreateTargets(SizeOfTargets, MaxTarget):
Targets = []
for Count in range(1, 6):
Targets.append(-1)#appends first 5 targets to -1
for Count in range(1, SizeOfTargets - 4):
Targets.append(GetTarget(MaxTarget))#passes maxtarget variable, to GetTarget and appends result
return Targets
def FillNumbers(NumbersAllowed, TrainingGame, MaxNumber):
if TrainingGame: #if boolean value passed from Main is True return below array
return [2, 3, 2, 8, 512]
else:
while len(NumbersAllowed) < 5:#repeats until 5 entries appended to the NumbersAllowed array
NumbersAllowed.append(GetNumber(MaxNumber)) #runs the GetNumber sub routine and passes the MaxNumber
return NumbersAllowed
if __name__ == "__main__":
Main()
Skeleton Code Analysus Page 3
,Main()
03 February 2025 20:36
1 def Main():
2 NumbersAllowed = []
3 Targets = []
4 MaxNumberOfTargets = 20
5 #MaxNumberOfTargets represents the size of the list of targets, but the actual value is 15, due to
6 the first 5 being Empty
7 MaxTarget = 0
8 MaxNumber = 0
9 TrainingGame = False
10 Choice = input("Enter y to play the training game, anything else to play a random game: ").lower()
11 print()
12 if Choice == "y":#if in training MaxNumber, Max Target and Targets pre-determind with below stats
13 MaxNumber = 1000 # Determines the maximum value of numbers that players can use in their
14 expressions
15 MaxTarget = 1000 # Determines the maximum value of targets players must achieve through their
16 expressions
17 TrainingGame = True
18 Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82, 121, 34, 45, 68, 75, 34, 23, 119, 43, 23, 119] #
19 first five slots are filled with -1 indicating empty s;ot
20 else:# targets are randomly generated from a range of upto 50
21 MaxNumber = 10
22 MaxTarget = 50
23 Targets = CreateTargets(MaxNumberOfTargets, MaxTarget) #sub routine run
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)#passes empty array, Boolean
value and max number
PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber)#startes game using generated
values
input()
Initialised Variables Game mode selection
NumbersAllowed : Empty list to store allowed numbers for gameplay - Asks User if they want to play training game (y) or random game
Targets : Empty list to store target values
MaxNumberOfTargets = 20 : Sets the maximum number of targets the player can hit
MaxTarget / MaxNumber : These are upper bounds for targets/ numbers TRAINING GAME
- Training game has predetermined stats
- MaxNumber = 1000
○ MaxNumber determines the maximum value of numbers the player can use
- MaxTarget = 1000
○ Determines the maximum value of targets players must achieve through
expressions
▪ Targets will be able to be randomly chosen from this range of 1000
- Predefined list of targets -- Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82,
121, 34, 45, 68, 75, 34, 23, 119, 43, 23, 119]
○ -1 Defines the value for the empty slot
RANDOM GAME
- MaxNumber = 10
- MaxNumber = 50
○ Predefined max number and max target are much lower
- Generates Targets randomly (via Createtargets())
○ Paramaters being {MaxNumberOfTargets : 20,MaxTarget:50}
Populating Numbers
- Calls FillNumbers() to fill the empty list of NumbersAllowed
ONCE ALL COMPLETE
PlayGame(Targets,Numbersallowed,TrainingGame,MaxTarget,MaxNumber)
Skeleton Code Analysus Page 4
, PlayGame()
20 February 2025 20:01
1 def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
Parameters passed through: 2 MaxNumber):
3 Score = 0
4 GameOver = False
- Targets : A list of target values, (e.g."[-1, -1, -1, 23, 9, 140, ...]") 5 while not GameOver:
- NumbersAllowed: A list of numbers players can use in their 6 DisplayState(Targets, NumbersAllowed, Score)#runs sub routine
expressions 7 DisplayState
- TrainingGame : Boolean flag indicating whether the game is in a 8 UserInput = input("Enter an expression: ") # Grabs user
9 expression
Training mode or random mode 10 print()
- MaxTarget: The maximum value for randomly generated targets 11 if CheckIfUserInputValid(UserInput):#send userinput to be
- MaxNumber: The maximum value for randomly generated numbers 12 checked
13 # If valid
14 UserInputInRPN = ConvertToRPN(UserInput)
15 if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
Initialised Variables: 16 UserInputInRPN, MaxNumber):
- Score = 0 17 IsTarget, Score =
○ Tracks the players score 18 CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score)
19 if IsTarget:
- GameOver = False
20 NumbersAllowed = RemoveNumbersUsed(UserInput,
○ Tracks state of the game loop, indicating when to quit 21 MaxNumber, NumbersAllowed)
22 NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
GAME ENTERS WHILE LOOP if Targets[0] != -1:
DisplayState(Targets,NumbersAllowed,Score): Shows: GameOver = True
○ Current targets else:
○ Available numbers Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
print("Game over!")
○ Current Score
DisplayScore(Score)
- User is now able to put their expression into the console
- The next block of code can only be ran if CheckIfUserInputValid(userinput)
is TRUE
○ If CheckIfUserInputValid() is TRUE, it will convert the infix notation
in RPN (postfix notation) through the function
ConvertToRPN(UserInput)
○ Once converted, it is then sent to the
CheckNumbersUsedAreAllNumberAllowed()
▪ Ensures all numbers in the expression are in NumbersAllowed
▪ Prevents players from reusing numbers
○ Once this condition was met, CheckIfUserInputEvaluationIsATarget() is ran
▪ The function evaluates the RPN expression
▪ Then checks if the result matches any targets
□ If HIT target is marked as -1
Score increases by 2
○ If The target has been hit, the list of numbers allowed is updated
using the
RemoveNumbersUsed(UserInput,MaxNumber,NumbersAllowed)
○ Once the list NumbersAllowed has been updated
Numbers allowed is now updated using
FillNumbers(NumbersAllowed,TrainingGame,MaxNumber)
○ Score Decreases by 1 for every turn, even if no target is hit
- Check Game Over Condition
○ If the Targets list with the index 0 (first item) is not empty (!= -1)
▪ The Game ends
○ If the first item in the targets list is -1
▪ The game updates the Targets list using
UpdateTargets(Targets,TrainingGame,MaxTarget)
Skeleton Code Analysus Page 5
11 January 2025 15:30
#Skeleton Program code for the AQA A Level Paper 1 Summer 2025 examination
#this code should be used in conjunction with the Preliminary Material
#written by the AQA Programmer Team
#developed in the Python 3.9 programming environment
import re
import random
import math
def Main():
NumbersAllowed = []
Targets = []
MaxNumberOfTargets = 20
MaxTarget = 0
MaxNumber = 0
TrainingGame = False
Choice = input("Enter y to play the training game, anything else to play a random game: ").lower()
print()
if Choice == "y":#if in training MaxNumber, Max Target and Targets pre-determind with below stats
MaxNumber = 1000
MaxTarget = 1000
TrainingGame = True
Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82, 121, 34, 45, 68, 75, 34, 23, 119, 43, 23, 119]
else:# targets are randomly generated from a range of upto 50
MaxNumber = 10
MaxTarget = 50
Targets = CreateTargets(MaxNumberOfTargets, MaxTarget) #sub routine run
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)#passes empty array, Boolean value and max number
PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber)#startes game using generated values
input()
def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber):
Score = 0
GameOver = False
while not GameOver:
DisplayState(Targets, NumbersAllowed, Score)#runs sub routine DisplayState
UserInput = input("Enter an expression: ")
print()
if CheckIfUserInputValid(UserInput):#send userinput to be checked
UserInputInRPN = ConvertToRPN(UserInput)
if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed, UserInputInRPN, MaxNumber):
IsTarget, Score = CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score)
if IsTarget:
NumbersAllowed = RemoveNumbersUsed(UserInput, MaxNumber, NumbersAllowed)
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)
Score -= 1
if Targets[0] != -1:
GameOver = True
else:
Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
print("Game over!")
DisplayScore(Score)
def CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score):
UserInputEvaluation = EvaluateRPN(UserInputInRPN)
UserInputEvaluationIsATarget = False
if UserInputEvaluation != -1:
for Count in range(0, len(Targets)):
if Targets[Count] == UserInputEvaluation:
Score += 2
Targets[Count] = -1
UserInputEvaluationIsATarget = True
return UserInputEvaluationIsATarget, Score
def RemoveNumbersUsed(UserInput, MaxNumber, NumbersAllowed):
UserInputInRPN = ConvertToRPN(UserInput)
for Item in UserInputInRPN:
if CheckValidNumber(Item, MaxNumber):
if int(Item) in NumbersAllowed:
NumbersAllowed.remove(int(Item))
return NumbersAllowed
def UpdateTargets(Targets, TrainingGame, MaxTarget):
for Count in range (0, len(Targets) - 1):
Targets[Count] = Targets[Count + 1]
Targets.pop()
if TrainingGame:
Targets.append(Targets[-1])
else:
Targets.append(GetTarget(MaxTarget))
return Targets
def CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed, UserInputInRPN, MaxNumber):
Temp = []
for Item in NumbersAllowed:
Temp.append(Item)
for Item in UserInputInRPN:
if CheckValidNumber(Item, MaxNumber):
if int(Item) in Temp:
Temp.remove(int(Item))
else:
Skeleton Code Analysus Page 1
, else:
return False
return True
def CheckValidNumber(Item, MaxNumber):
if re.search("^[0-9]+$", Item) is not None:#regular expression search of a non-empty line that is composed of nothing but digits
ItemAsInteger = int(Item)
if ItemAsInteger > 0 and ItemAsInteger <= MaxNumber:
return True
return False
def DisplayState(Targets, NumbersAllowed, Score):#target generated from main, the array of targets and score
DisplayTargets(Targets)
DisplayNumbersAllowed(NumbersAllowed)
DisplayScore(Score)
def DisplayScore(Score):
print("Current score: " + str(Score))
print()
print()
def DisplayNumbersAllowed(NumbersAllowed):
print("Numbers available: ", end = '') #ends the output with a space
for N in NumbersAllowed:
print(str(N) + " ", end = '')
print()
print()
def DisplayTargets(Targets):
print("|", end = '') #ends the output with a space
for T in Targets: #repeats for all targets in the array
if T == -1:
print(" ", end = '')#if -1 display a blank space
else:
print(T, end = '') #print value of T
print("|", end = '')#seperate values with |
print()
print()
def ConvertToRPN(UserInput): #Reverse Polish Notation (RPN), used to evaluate the expression
Position = 0
Precedence = {"+": 2, "-": 2, "*": 4, "/": 4} #creates dictionary for sumbols and value, higher value = higher presedence
Operators = []#stores operators temporarily
Operand, Position = GetNumberFromUserInput(UserInput, Position)#runs sub routine and passes UserInput and Postion
#sub routine returns the number as the operand and the updates postion e.g 123+456 would return Operand 123 postion would be 3
UserInputInRPN = []
UserInputInRPN.append(str(Operand))#appends number from the Operand to the array
Operators.append(UserInput[Position - 1])
while Position < len(UserInput):
Operand, Position = GetNumberFromUserInput(UserInput, Position)
UserInputInRPN.append(str(Operand))
if Position < len(UserInput):
CurrentOperator = UserInput[Position - 1]
while len(Operators) > 0 and Precedence[Operators[-1]] > Precedence[CurrentOperator]:
UserInputInRPN.append(Operators[-1])
Operators.pop()
if len(Operators) > 0 and Precedence[Operators[-1]] == Precedence[CurrentOperator]:
UserInputInRPN.append(Operators[-1])
Operators.pop()
Operators.append(CurrentOperator)
else:
while len(Operators) > 0:
UserInputInRPN.append(Operators[-1])
Operators.pop()
return UserInputInRPN
def EvaluateRPN(UserInputInRPN):
S = []
while len(UserInputInRPN) > 0:
while UserInputInRPN[0] not in ["+", "-", "*", "/"]:
S.append(UserInputInRPN[0])
UserInputInRPN.pop(0)
Num2 = float(S[-1])
S.pop()
Num1 = float(S[-1])
S.pop()
Result = 0.0
if UserInputInRPN[0] == "+":
Result = Num1 + Num2
elif UserInputInRPN[0] == "-":
Result = Num1 - Num2
elif UserInputInRPN[0] == "*":
Result = Num1 * Num2
elif UserInputInRPN[0] == "/":
Result = Num1 / Num2
UserInputInRPN.pop(0)
S.append(str(Result))
if float(S[0]) - math.floor(float(S[0])) == 0.0:
return math.floor(float(S[0]))
else:
return -1
def GetNumberFromUserInput(UserInput, Position):
Number = ""
MoreDigits = True
while MoreDigits:
if not(re.search("[0-9]", str(UserInput[Position])) is None):#checks for any digit between 0-9 and returns None if not
Number += UserInput[Position] #adds the number to the Number variable and stores as a string
Skeleton Code Analysus Page 2
, Number += UserInput[Position] #adds the number to the Number variable and stores as a string
else:
MoreDigits = False #stops looking for more digits if one isn't found
Position += 1 #moves to the next character in the user input
if Position == len(UserInput):#if it gets to the end of the UserInput there are no more characters to check
MoreDigits = False
if Number == "":
return -1, Position#return-1 if no number found
else:
return int(Number), Position #return the number and the Position of the number back to the call position
def CheckIfUserInputValid(UserInput):
if re.search("^([0-9]+[\\+\\-\\*\\/])+[0-9]+$", UserInput) is not None:#searches userinput contains numbers and symbols
return True
else:
return False
def GetTarget(MaxTarget):
return random.randint(1, MaxTarget)#Generates a random int and returns
def GetNumber(MaxNumber):
return random.randint(1, MaxNumber)#chooses a random number between 1 and the maxnumber and returns value
def CreateTargets(SizeOfTargets, MaxTarget):
Targets = []
for Count in range(1, 6):
Targets.append(-1)#appends first 5 targets to -1
for Count in range(1, SizeOfTargets - 4):
Targets.append(GetTarget(MaxTarget))#passes maxtarget variable, to GetTarget and appends result
return Targets
def FillNumbers(NumbersAllowed, TrainingGame, MaxNumber):
if TrainingGame: #if boolean value passed from Main is True return below array
return [2, 3, 2, 8, 512]
else:
while len(NumbersAllowed) < 5:#repeats until 5 entries appended to the NumbersAllowed array
NumbersAllowed.append(GetNumber(MaxNumber)) #runs the GetNumber sub routine and passes the MaxNumber
return NumbersAllowed
if __name__ == "__main__":
Main()
Skeleton Code Analysus Page 3
,Main()
03 February 2025 20:36
1 def Main():
2 NumbersAllowed = []
3 Targets = []
4 MaxNumberOfTargets = 20
5 #MaxNumberOfTargets represents the size of the list of targets, but the actual value is 15, due to
6 the first 5 being Empty
7 MaxTarget = 0
8 MaxNumber = 0
9 TrainingGame = False
10 Choice = input("Enter y to play the training game, anything else to play a random game: ").lower()
11 print()
12 if Choice == "y":#if in training MaxNumber, Max Target and Targets pre-determind with below stats
13 MaxNumber = 1000 # Determines the maximum value of numbers that players can use in their
14 expressions
15 MaxTarget = 1000 # Determines the maximum value of targets players must achieve through their
16 expressions
17 TrainingGame = True
18 Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82, 121, 34, 45, 68, 75, 34, 23, 119, 43, 23, 119] #
19 first five slots are filled with -1 indicating empty s;ot
20 else:# targets are randomly generated from a range of upto 50
21 MaxNumber = 10
22 MaxTarget = 50
23 Targets = CreateTargets(MaxNumberOfTargets, MaxTarget) #sub routine run
NumbersAllowed = FillNumbers(NumbersAllowed, TrainingGame, MaxNumber)#passes empty array, Boolean
value and max number
PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget, MaxNumber)#startes game using generated
values
input()
Initialised Variables Game mode selection
NumbersAllowed : Empty list to store allowed numbers for gameplay - Asks User if they want to play training game (y) or random game
Targets : Empty list to store target values
MaxNumberOfTargets = 20 : Sets the maximum number of targets the player can hit
MaxTarget / MaxNumber : These are upper bounds for targets/ numbers TRAINING GAME
- Training game has predetermined stats
- MaxNumber = 1000
○ MaxNumber determines the maximum value of numbers the player can use
- MaxTarget = 1000
○ Determines the maximum value of targets players must achieve through
expressions
▪ Targets will be able to be randomly chosen from this range of 1000
- Predefined list of targets -- Targets = [-1, -1, -1, -1, -1, 23, 9, 140, 82,
121, 34, 45, 68, 75, 34, 23, 119, 43, 23, 119]
○ -1 Defines the value for the empty slot
RANDOM GAME
- MaxNumber = 10
- MaxNumber = 50
○ Predefined max number and max target are much lower
- Generates Targets randomly (via Createtargets())
○ Paramaters being {MaxNumberOfTargets : 20,MaxTarget:50}
Populating Numbers
- Calls FillNumbers() to fill the empty list of NumbersAllowed
ONCE ALL COMPLETE
PlayGame(Targets,Numbersallowed,TrainingGame,MaxTarget,MaxNumber)
Skeleton Code Analysus Page 4
, PlayGame()
20 February 2025 20:01
1 def PlayGame(Targets, NumbersAllowed, TrainingGame, MaxTarget,
Parameters passed through: 2 MaxNumber):
3 Score = 0
4 GameOver = False
- Targets : A list of target values, (e.g."[-1, -1, -1, 23, 9, 140, ...]") 5 while not GameOver:
- NumbersAllowed: A list of numbers players can use in their 6 DisplayState(Targets, NumbersAllowed, Score)#runs sub routine
expressions 7 DisplayState
- TrainingGame : Boolean flag indicating whether the game is in a 8 UserInput = input("Enter an expression: ") # Grabs user
9 expression
Training mode or random mode 10 print()
- MaxTarget: The maximum value for randomly generated targets 11 if CheckIfUserInputValid(UserInput):#send userinput to be
- MaxNumber: The maximum value for randomly generated numbers 12 checked
13 # If valid
14 UserInputInRPN = ConvertToRPN(UserInput)
15 if CheckNumbersUsedAreAllInNumbersAllowed(NumbersAllowed,
Initialised Variables: 16 UserInputInRPN, MaxNumber):
- Score = 0 17 IsTarget, Score =
○ Tracks the players score 18 CheckIfUserInputEvaluationIsATarget(Targets, UserInputInRPN, Score)
19 if IsTarget:
- GameOver = False
20 NumbersAllowed = RemoveNumbersUsed(UserInput,
○ Tracks state of the game loop, indicating when to quit 21 MaxNumber, NumbersAllowed)
22 NumbersAllowed = FillNumbers(NumbersAllowed,
TrainingGame, MaxNumber)
Score -= 1
GAME ENTERS WHILE LOOP if Targets[0] != -1:
DisplayState(Targets,NumbersAllowed,Score): Shows: GameOver = True
○ Current targets else:
○ Available numbers Targets = UpdateTargets(Targets, TrainingGame, MaxTarget)
print("Game over!")
○ Current Score
DisplayScore(Score)
- User is now able to put their expression into the console
- The next block of code can only be ran if CheckIfUserInputValid(userinput)
is TRUE
○ If CheckIfUserInputValid() is TRUE, it will convert the infix notation
in RPN (postfix notation) through the function
ConvertToRPN(UserInput)
○ Once converted, it is then sent to the
CheckNumbersUsedAreAllNumberAllowed()
▪ Ensures all numbers in the expression are in NumbersAllowed
▪ Prevents players from reusing numbers
○ Once this condition was met, CheckIfUserInputEvaluationIsATarget() is ran
▪ The function evaluates the RPN expression
▪ Then checks if the result matches any targets
□ If HIT target is marked as -1
Score increases by 2
○ If The target has been hit, the list of numbers allowed is updated
using the
RemoveNumbersUsed(UserInput,MaxNumber,NumbersAllowed)
○ Once the list NumbersAllowed has been updated
Numbers allowed is now updated using
FillNumbers(NumbersAllowed,TrainingGame,MaxNumber)
○ Score Decreases by 1 for every turn, even if no target is hit
- Check Game Over Condition
○ If the Targets list with the index 0 (first item) is not empty (!= -1)
▪ The Game ends
○ If the first item in the targets list is -1
▪ The game updates the Targets list using
UpdateTargets(Targets,TrainingGame,MaxTarget)
Skeleton Code Analysus Page 5