Overview The assignment is to build an advanced simulation of Pool (https://en.wikipedia.org/wiki/Pool_(cue_sports)) , utilising 6 design patterns in 3 stages (2 per stage). The game consists of a rectangular table with several balls on it. If the balls approach the side of the table they will bounce back. Balls also bounce off other balls. The player can hit one of the balls, the white cue ball, with the cue stick. The standard table has 6 pockets into which the balls can fall. The game is single player and is finished when all the balls, other than the cue ball, are in the pockets. The first stage you will do yourself. At stages two and three, you will extend someone else’s code from your class. Your tutor will determine whose. Make sure your code is nice to maintain. Assignment 1 Create a simple graphical display using QT. It must read configuration options from a configuration file “config.json”. You can use QJsonDocument to aid decoding. The layout of this file must be in the specified format. Config File The table which consists of: the size |
friction
An array of balls each element of which consists of
colour mass radius position
x
y velocity x
y
Words in bold are the actual keys that should be used. Colours can be specified by name eg “red’ or “blue” if they are simple, or by rgb hex value eg “\#112233”. Your program must accept either. All other values are floats.
An example config file is provided.
{
“table” : {
"colour":"green", "size":{ "x":600, "y":300
},
"friction":0.1 },
"balls" : [ {"colour":"white","position":{"x":50,"y":50},"velocity"{"x":10,"y":1},"mas
s":1,"radius":10}, {"colour":"red","position":{"x":150,"y":60},"velocity"{"x":-10,"y":0},"mas
s":1,"radius":10}, {"colour":"blue","position":{"x":150,"y":40},"velocity"{"x":-10,"y":0},"mas
s":1,"radius":10}, {"colour":"#123456","position":{"x":250,"y":70},"velocity"{"x":-10,"y":0},"m
ass":5,"radius":20} ] }
Physics
https://canvas.sydney.edu.au/courses/4799/assignments/40000
2/5
21/03/2018 Assignment 1
Friction
You are free to implement friction any way you want e.g. constant deceleration or deceleration proportional to velocity, as long the balls eventually come to rest.
Collisions with walls
When a ball collides with a wall it should simply reverse the velocity perpendicular to the wall. eg if a ball is travelling to the bottom right with a velocity of (1,1) and bounces off the right wall it will be (1,1), the x velocity is reversed. if it then proceeds to bounce off the bottom wall it becomes (1,1) as the y velocity is reversed. Note that in QT as in many gui environments the origin is at the the top left and y increases down the screen.
BallBall collisions
Since the collision mechanics between balls of arbitrary mass are non trivial the code for calculating the resulting velocity changes is provided.
You do not need to understand how the mathematical section works (it is somewhat simplified anyway) but you will have to understand the initial properties and then apply the resulting changes in velocities to the respective balls.
//properties of two colliding balls, //ball A QVector2D posA; //QVector2D is a QT class representing a vector in 2D space, QVector2D velA; //it has useful functions like dotproduct, length and normalize float massA; //You don't need to use it if you'd rather do this yourself //and ball B QVector2D posB; QVector2D velB; float massB;
//calculate their mass ratio
float mR = massB/massA;
//calculate the axis of collision
QVector2D collisionVector = posB-posA; collisionVector.normalize();
//the proportion of each balls velocity in along the axis of collision
double vA = QVector2D::dotProduct(collisionVector,velA); double vB = QVector2D::dotProduct(collisionVector,velB); //the balls are moving away from eachother so do nothing if(vA<=0&&vB>=0)
return;
//The velocity of each ball after a collision can be found by solving the quadratic equation
//given by equating momentum and energy before and after the collision and finding the veloc ities
https://canvas.sydney.edu.au/courses/4799/assignments/40000
3/5
21/03/2018 Assignment 1
//that satisfy this //-(mR+1)x^2 2*(mR*vB+vA)x -((mR-1)*vB^2+2*vA*vB)=0 //first we find the discriminent double a = -(mR+1); double b = 2*(mR*vB+vA); double c = -((mR-1)*vB*vB+2*vA*vB); double discriminant = sqrt(b*b-4*a*c); double root = (-b+discriminant)/(2*a); //only one of the roots is the solution, the other pertains to the current velocities if(root-vB<0.01) root = (-b-discriminant)/(2*a);
//The resulting changes in velocity for ball A and B
QVector2D deltaVA = mR*(vB-root)*collisionVector; QVector2D deltaVB = (root-vB)*collisionVector;
Marking
There are two segments to this assignment: The code which is worth 7 and the essay which is worth 3.
The marking (out of 7 marks) for the code section is as follows:
Compiling and running on the lab machines. (10%)
Behaviour is read from the config file (e.g. positions, colour of balls, colour size of table etc). (15%)
The balls bounce off the sides and each other and slow down due to friction. (15%)
Appropriate use of design patterns (extension of the abstract factory using factories, implementation of the builder, and possible bonus marks for other design patterns used). (30%)
Sensible / appropriate OO design (Extensible code design, clear separation of responsibility, etc). (10%) Clear code: meaningful variable and method names. (10%)
Documentation: Doxygen comments for methods/classes as well as incode comments where appropriate. (10%)
The marking (out of 3 marks) for the essay section is as follows
Explain the application of the design patterns for your concrete code base. (33%)
Explain advantage and disadvantages of the design patterns used with respect to your code. (33%) Graphical visualisation in UML of your design patterns. (33%)
https://canvas.sydney.edu.au/courses/4799/assignments/40000
4/5
21/03/2018 Assignment 1
Academic honesty
While the University is aware that the vast majority of students and staff act ethically and honestly, it is opposed to and will not tolerate academic dishonesty or plagiarism and will treat all allegations of dishonesty seriously.
Further information on academic honesty, academic dishonesty, and the resources available to all students can be found on the academic integrity pages on the current students website: https://sydney.edu.au/students/academicintegrity.html (https://sydney.edu.au/students/academic integrity.html) .
Compliance statement
In submitting this work, I acknowledge I have understood the following:
I have read and understood the University of Sydney’s Academic Honesty in Coursework Policy 2015 (https://sydney.edu.au/policies/showdoc.aspx?recnum=PDOC2012/254&RendNum=0) .
The work is substantially my own and where any parts of this work are not my own I have indicated this by acknowledging the source of those parts of the work and enclosed any quoted text in quotation marks.
The work has not previously been submitted in part or in full for assessment in another unit unless I have been given permission by my unit of study coordinator to do so.
The work will be submitted to similarity detection software (Turnitin) and a copy of the work will be retained in Turnitin’s paper repository for future similarity checking.
Engaging in plagiarism or academic dishonesty will, if detected, lead to the University commencing proceedings under the Academic Honesty in Coursework Policy 2015 (https://sydney.edu.au/policies/showdoc.aspx?recnum=PDOC2012/254&RendNum=0) and the Academic Honesty Procedures 2016 (http://sydney.edu.au/policies/default.aspx? mode=glossary&word=Academic+honesty) .
Engaging another person to complete part or all of the submitted work will, if detected, lead to the University commencing proceedings against me for potential student misconduct under the University of Sydney (Student Discipline) Rule 2016 (http://sydney.edu.au/policies/showdoc.aspx? recnum=PDOC2017/441&RendNum=0) .