100% satisfaction guarantee Immediately available after payment Both online and in PDF No strings attached 4.2 TrustPilot
logo-home
Summary

Summary AQA A-Level Skeleton Code 2025 Computer Science Analysis

Rating
-
Sold
-
Pages
18
Uploaded on
23-02-2025
Written in
2024/2025

This PDF file contains a detailed description of the different functions that make up the Target Clear game Skeleton code. IT provides a series of quick links within the text to show you how the game operates and flows, allowing for a deeper understand to improve grades

Show more Read less
Institution
AQA












Whoops! We can’t load your doc right now. Try again or contact support.

Document information

Uploaded on
February 23, 2025
Number of pages
18
Written in
2024/2025
Type
Summary

Content preview

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
£15.16
Get access to the full document:

100% satisfaction guarantee
Immediately available after payment
Both online and in PDF
No strings attached

Get to know the seller
Seller avatar
aaronmathew1

Get to know the seller

Seller avatar
aaronmathew1 Blessed Thomas Holford Catholic College
View profile
Follow You need to be logged in order to follow users or courses
Sold
0
Member since
9 months
Number of followers
0
Documents
1
Last sold
-

0.0

0 reviews

5
0
4
0
3
0
2
0
1
0

Recently viewed by you

Why students choose Stuvia

Created by fellow students, verified by reviews

Quality you can trust: written by students who passed their exams and reviewed by others who've used these revision notes.

Didn't get what you expected? Choose another document

No problem! You can straightaway pick a different document that better suits what you're after.

Pay as you like, start learning straight away

No subscription, no commitments. Pay the way you're used to via credit card and download your PDF document instantly.

Student with book image

“Bought, downloaded, and smashed it. It really can be that simple.”

Alisha Student

Frequently asked questions