Training Report
Training Report
MOHALI-140307
DEPARTMENT OF COMPUTER APPLICATIONS
TRAINING
REPORT
OF
SUMMER TRAINING
UNDERTAKEN
AT
NOVEM CONTROLS PVT. LTD. ( MOHALI )
ON SNAKE GAME
SUBMITTED IN PARTIAL FULFILLMENT
OF THE DEGREE
OF
BACHELOR OF COMPUTER
APPLICATIONS
Submitted By:
NAME:- ARYAAN PEGU
Roll No. :-2133040
DEPARTMENT OF COMPUTER APPLICATIONS
CGC JHANJHERI
MOHALI-140307
CANDIDATE’S DECLARATION
I ARYAAN PEGU hereby declare that I have undertaken Summer training at
NOVEM CONTROLS PVT. LTD. (MOHALI) during period from 15 June 2023 to
30 July 2023 in partial fulfillment of requirements for the award of the degree
The work which is being presented in the training report submitted to Department of
Computer Applications) at Chandigarh groups of collage, Jhanjheri is an authentic
record of training work.
Candidate’s Signature
The summer training Viva- Voce Examination of _____________________________________
has been held on _______________________________and accepted.
Signature of Examiner
COMPANY PROFILE
NOVEM is a leading system engineering and integration company in India, offering
segments through turnkey projects for mission critical systems. NOVEM has also been
advantages and delivering value through service level-based and project scope-based
deliveries. Since its inception on March 2004, 2004, NOVEM has been a frontrunner in
customers globally and enhance the quality of its products and services by combining
its wide range of service offerings with its deep vertical experience in multiple
executes large and complex turnkey projects, and has built, managed and
and highly qualified software & hardware professional in the fields of Software,
One of the areas of our specializations is Project study, analysis, development and its live
implementation. Our Engineers has hands-on experience in software development and has
This project explore a new dimension in the tradition snake game to make it more
interesting and challenging. The simplicity of this game makes it an idea candidate for a
minor project as we can focus on simple topics like simple functionality and
implementation of computer controlled intelligent opponent.
ACKNOWLEDGEMENT
Acknowledgement is an endless ocean and one requires the satisfying, supporting,
guiding, inspiring and constructively criticizing several specialists in order to drive out
a handful pearls from its depth. As this comes wordlessly it can’t be acknowledged in
words. I am greatly obliged to NOVEM CONTROLS PVT. LTD. institute for providing me
this opportunity to take up this project as long as platform to learn and enhance my
professional skill. I would like to express my deep sense of gratitude to MR. CHURAMANI
SHARMA, my corporate guide, for his kind help and support and valuable guidance
throughout the project. I am thankful to him for providing me with necessary insights
MUKESH KUMAR
TABLE OF CONTENTS
Contents
Chapter 1: Introduction
Java Intro
Java Features
Java Syntax
Java Output
Java Comments
Java Variables
Java Operators
Java Strings
Java Loops
Java Break/Continue
Java Arrays
Java Methods
Java Scope
Java OOP
Java Classes/Objects
Java Encapsulation
Java Inheritance
Java Polymorphism
Java Abstraction
Conclusion
References
CHAPTER 1
INTRODUCTION
1. Java Intro -Java is a programming language created by James Gosling from Sun
Microsystems (Sun) in 1991. The target of Java is to write a program once and
then run this program on multiple operating systems. The first publically
available
version of Java (Java 1.0) was released in 1995. Sun Microsystems was acquired
by the Oracle Corporation in 2010. Oracle has now the stearmanship of Java.
More than billion devices run Java. Java is defined by a specification and
program code in other languages than the Java programming language which
still runs on the Java virtual machine. The Java platform is usually associated
with the Java virtual machine and the Java core libraries.
Java works on different platforms (Windows, Mac, Linux, Raspberry Pi, etc.)
Java is an object oriented language which gives a clear structure to programs and
As Java is close to C and C#, it makes it easy for programmers to switch to Java.
Main.java
public class Main{
public static void main(String[] args) {
System.out.println("Hello World")
}
}
In the above example, we created a lava file called Main.java, and we used the
above code to print "Hello World" to the screen.
Example explained
Every line of code that runs in Javu must be inside a class. In our example, we
named theclass Main. A class should always start with an uppercase first letter.
Note: Java is case-sensitive: "MyClass" and "myclass" has different meaning
The name of the java file must match the class name. When saving the file, save it
using the class name and add "java" to the end of the filename. The output
should be: Hello World
System.out.println()
Inside the main() method, we can use the println() method to print a line of text to the screen
Note: The curly braces {} marks the beginning and the end of a block of code.
System is a built-in Java class that contains useful members, such as out, which is short
for "output". The println() method, short for "print line", is used to print a value to the
System.out.println(“Hello World”);
We can add as many println() methods as you want. It will add new line for each method.
Double Quotes
When you are working with text, it must be wrapped inside double quotations marks "".If
Print Numbers
You can also use the println() method to print numbers. However, unlike text, we
You can also perform mathematical calculations inside the println() method:
System.out.println(3+3);
1.4 JAVA USER INPUT: The Scanner class is used to get user input, and it is
found in the java.util package. To use the Scanner class, create an object of the
class and use any of the available methods found in the Scanner class
class Main{
1.6 JAVA COMMENTS: Comments can be used to explain Java code, and to make it
more readable. It can also be used to prevent execution when testing alternative code.
executed).
Java Multi-line Comments: Multi-line comments start with /* and ends with */.
1.7 JAVA VARIABLES: Variables are containers for storing data values. In Java,
there are different types of variables, for example:
String - stores text, such as "Hello". String values are surrounded by double quotes
int - stores integers (whole numbers), without decimals, such as 123 or -123
float - stores floating point numbers, with decimals, such as 19.99 or -19.99
char - stores single characters, such as 'a' or 'B'. Char values are surrounded by
single quotes
Declaring (Creating) Variables: To create a variable, you must specify the type and assign
it a value:
Where type is one of Java's types (such as int or String), and variableName is the name of the
variable (such as x or name). The equal sign(=) is used to assign values to the variable.
Example:
Int myNum;
myNum=15;
System.out.println(myNum);
Final Variables
If you don't want others (or yourself) to overwrite existing values, use the final keyword
(this will declare the variable as "final" or "constant", which means
unchangeable and readonly).
myNum=15; //will generate error as we declare variable name with final keyword
Int myNum=5;
Float myFloatNum=5.99f;
Char myLetter=’D’;
Boolean myBool=true;
String myText=”Hello”;
Display Variables: The println() method is often used to display variables. To combine
both text and a variable, use the + character:
System.out.println(name+” Sharma”);
One Value to Multiple Variables: You can also assign the same value to
multiple variables in one line:
Example: int x, y, z;
x=y=z=50;
System.out.println(x+y+z);
Identifiers: All Java variables must be identified with unique names. These
unique names are called identifiers. Identifiers can be short names (like x and y)
int m=60; //it is Ok, but it is not easy to understand what “m” actually means
The general rules for naming variables are:
1.8 JAVA DATA TYPES: Data types are divided into two groups:
• Primitive data types - includes byte, short, int, long, float, double, boolean and
char
• Non-primitive data types - such as String, Arrays and Classes.
Numbers: Primitive number types are divided into two groups: Integer types stores whole
numbers, positive or negative (such as 123 or -456), without decimals. Valid types are byte,
short, int and long. Which type you should use, depends on the numeric value.
Floating point types represents numbers with a fractional part, containing one or
Integer Types
Byte: The byte data type can store whole numbers from -128 to 127. This can be used
instead of int or other integer types to save memory when you are certain that the value
Short: The short data type can store whole numbers from -32768 to 32767.
Int: The int data type can store whole numbers from -2147483648 to 2147483647.
In general, and in our tutorial, the int data type is the preferred data type when we
Long: The long data type can store whole numbers from -9223372036854775808 to
9223372036854775807. This is used when int is not large enough to store the value.
as 9.99 or 3.14515. The float and double data types can store fractional numbers. Note
that you should end the value with an "f" for floats and "d" for doubles.
Scientific Numbers:
Boolean Types: Very often in programming, you will need a data type that can only
• YES / NO
• ON / OFF
• TRUE / FALSE
For this, Java has a boolean data type, which can only take the values true or false.
Characters: The char data type is used to store a single character. The character
must be surrounded by single quotes, like 'A' or 'c'
Strings: The String data type is used to store a sequence of characters (text). String
values must be surrounded by double quotes.
• Primitive types are predefined (already defined) in Java. Non-primitive types are
created by the programmer and is not defined by Java .
• Non-primitive types can be used to call methods to perform certain operations,
while primitive types cannot.
• A primitive type has always a value, while non-primitive types can be null.
• A primitive type starts with a lowercase letter, while non-primitive types starts
with an uppercase letter.
1.9 JAVA TYPE CASTING: Type casting is when you assign a value of one primitive
data type to another type. In Java, there are two types of casting:
1.10 JAVA OPERATORS: Operators are used to perform operations on variables and
values. In the example below, we use the + operator to add together two values:
• Arithmetic operators
• Assignment operators
• Comparison operators
• Logical operators
• Bitwise operators
1. Arithmetic Operators: Arithmetic operators are used to perform common
mathematical operations. Example: +, -, *, /, %, ++, --
2. Assignment Operators: Assignment operators are used to assign values to variables.
Example: =, +=, - =, *=, /=, %=, &=, |=, >>=, <<=
3. Comparison Operators: Comparison operators are used to compare two values (or
variables). This is important in programming, because it helps us to find answers and
make decisions. The return value of a comparison is either true or false. These values
are known as Boolean values. Example: ==, !=, >, <, >=, <=
4. Logical Operators: You can also test for true or false values with logical operators.
Logical operators are used to determine the logic between variables or values.
Example: &&, ||, !
1.11 JAVA STRINGS: Strings are used for storing text. A String variable contains a
collection of characters surrounded by double quotes.
String Length: A String in Java is actually an object, which contain methods that can
perform certain operations on strings. For example, the length of a string can be found
More String Methods: There are many string methods available, for example
Finding a Character in a String: The indexof() method returns the index (the
position) of the first occurrence of a specified text in a string (including whitespace).
String Concatenation: The + operator can be used between strings to combine them.
This is called concatenation. You can also use the concat() method to concatenate two
strings
1.12 JAVA MATH & BOOLEANS: The Java Math class has many methods that
allows you to perform mathematical tasks on numbers.
value of x and y:
Example: Math.max(5,10);
Math.min(x,y): The Math.min(x,y) method can be used to find the lowest value of x and y:
Example: Math.min(5,10);
Example: Math.sqrt(25);
Java Booleans: Very often, in programming, you will need a data type that can only
have one of two values, like:
• YES / NO
• ON / OFF
• TRUE / FALSE
For this, Java has a boolean data type, which can store true or false values.
Boolean Values: A boolean type is declared with the boolean keyword and can only
take the
This is useful to build logic, and find answers. For example, you can use a
comparison operator, such as the greater than (>) operator, to find out if an
System.out.println(x>y);
}}
The else Statement: Use the else statement to specify a block of code to be executed if
} else{
} System.out.println(“Good Evening”); }
The else if Statement: Use the else if statement to specify a new condition if the first
condition is false.
} System.out.println(“Good evening”); }
Short Hand If...Else: There is also a short-hand if else, which is known as the ternary
operator because it consists of three operands. It can be used to replace multiple lines of code
with a single line, and is most often used to replace simple if else statements:
System.out.println(result);
blocks to be executed:
case x:
//code block
break;
case y:
//code block
break;
default:
//code block
int day = 4;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
case 4:
System.out.println("Thursday");
break;
case 5:
System.out.println("Friday");
break;
case 6:
System.out.println("Saturday");
break;
case 7:
System.out.println("Sunday");
break;
The default Keyword: The default keyword specifies some code to run if there is no
case match
1.15 JAVA LOOPS: Loops can execute a block of code as long as a specified condition
is reached. Loops are handy because they save time, reduce errors, and they make code
more readable.
Java While Loop: The while loop loops through a block of code as long as a
// code block
while (i<5) {
System.out.println(i);
i++; }
Java For Loop: When you know exactly how many times you want to loop through a
// code block
Statement 1 is executed (one time) before the execution of the code block.
Statement 3 is executed (every time) after the code block has been executed.
System.out.println(i);
Nested Loops: It is also possible to place a loop inside another loop. This is called a nested
loop. The "inner loop" will be executed one time for each iteration of the "outer loop".
For-Each Loop: There is also a "for-each" loop, which is used exclusively to loop
// code block
System.out.println(i);
if (i==4) {
break;
System.out.println(i);
Java Continue: The continue statement breaks one iteration (in the loop), if a
specified condition occurs, and continues with the next iteration in the loop.
if (i==4) {
continue;
System.out.println(i);
1.17 JAVA ARRAYS: Arrays are used to store multiple values in a single variable,
instead of declaring separate variables for each value. To declare an array, define the
the index number. This statement accesses the value of the first element in cars.
System.out.println(cars[0]);
Change an Array Element: To change the value of a specific element, refer to the
index number.
cars[0]=”Swift”;
System.out.println(cars[0]);
Array Length: To find out how many elements an array has, use the length property.
System.out.println(cars.length);
Loop Through an Array: You can loop through the array elements with the for loop,
and use the length property to specify how many times the loop should run.
System.out.println(cars.length);
Loop Through an Array with For-Each: There is also a "for-each" loop, which is
for(String i: cars) {
System.out.println(i);
Multidimensional arrays are useful when you want to store data as a tabular form,
like a table with rows and columns. To create a two-dimensional array, add each array
Access Elements: To access the elements of the myNumbers array, specify two indexes: one
for the array, and one for the element inside that array.
Example: int[][] myNumbers={{1,2,3,4},{5,6,7,8}};
System.out.println(myNumbers[1][2]);
Change Element Values: You can also change the value of an element.
myNumbers[1][2]=9;
System.out.println(myNumbers[1][2]);
Loop Through a Multi-Dimensional Array: We can also use a for loop inside another for
loop to get the elements of a two-dimensional array (we still have to point to the
two indexes)
System.out.println(myNumbers[i][j]);
1.18 JAVA METHODS: A method is a block of code which only runs when it is called.
You can pass data, known as parameters, into a method.
Methods are used to perform certain actions, and they are also known as functions.
Why use methods? To reuse code: define the code once, and use it many times.
Create a Method: A method must be declared within a class. It is defined with the name of the
method, followed by parentheses (). Java provides some pre-defined methods, such as
System.out.println(), but you can also create your own methods to perform certain actions
// code to be executed
}
Call a Method: To call a method in Java, write the method's name followed by two
Parameters act as variables inside the method. Parameters are specified after the
method name, inside the parentheses. You can add as many parameters as you want,
The following example has a method that takes a String called fname as parameter.
When the method is called, we pass along a first name, which is used inside the method
myMethod("Liam");
myMethod("Jenny");
myMethod("Anja");
NOTE: When a parameter is passed to the method, it is called an argument. So, from the
example above: fname is a parameter, while Liam, Jenny and Anja are arguments.
Note: when you are working with multiple parameters, the method call must have the
same number of arguments as there are parameters, and the arguments must be passed
Return Values: The void keyword, used in the examples above, indicates that the
method should not return a value. If you want the method to return a value, you can
use a primitive data type (such as int, char, etc.) instead of void, and use the return
return x + y;
System.out.println(myMethod(5, 3));
} // Outputs 8 (5 + 3)
return x + y;
return x + y;
1.21 JAVA SCOPE: In Java, variables are only accessible inside the region they are
created. This is called scope.
Method Scope: Variables declared directly inside a method are available anywhere in the
method
Block Scope: A block of code refers to all of the code between curly braces {}. Variables
declared inside blocks of code are only accessible by the code between the curly braces,
procedural programming:
Everything in Java is associated with classes and objects, along with its attributes
and methods. For example: in real life, a car is an object. The car has attributes, such
int x = 5;
Create an Object
In Java, an object is created from a class. We have already created the class named
Main, so now we can use this to create objects. To create an object of Main, specify the
class name, followed by the object name, and use the keyword new:
int x = 5;
System.out.println(myObj.x);
Java Class Attributes: In the previous example, we used the term "variable" for x in
the example (as shown below). It is actually an attribute of the class. Or you could say
int x = 5;
int y = 3;
Accessing Attributes: You can access attributes by creating an object of the class,
Modify Attributes: You can also modify attribute values or override the existing values:
int x=10;
myObj.x = 40;
System.out.println(myObj.x);
1.24 JAVA CLASS METHODS: Methods are declared within a class, and that they
System.out.println("Hello World!");
Static vs.
Public :You will often see Java programs that have either static or public attributes and
methods. In the example above, we created a static method, which means that it can be
accessed without creating an object of the class, unlike public, which can only be
accessed by objects.
1.25 JAVA CONSTRUCTORS: A constructor in Java is a special method that is used to
initialize objects. The constructor is called when an object of a class is created. It can be
public Main() {
} // Outputs 5
Note: Constructor name must match the class name, and it cannot have a return type
(like void). Also note that the constructor is called when the object is created. All classes
have constructors by default: if you do not create a class constructor yourself, Java
creates one for you. However, then you are not able to set initial values for object
attributes.
constructor. Inside the constructor we set x to y (x=y). When we call the constructor,
we pass a parameter to the constructor (5), which will set the value of x to 5:
int x;
public Main(int y) {
x = y;
} // Outputs 5
that "sensitive" data is hidden from users. To achieve this, you must:
Get and Set: private variables can only be accessed within the same class (an outside class
public get and set methods. The get method returns the variable value, and the set method
sets the value. Syntax for both is that they start with either get or set, followed by the
Why Encapsulation ?
class (subclass) inherits the attributes and methods from the Vehicle class
It is useful for code reusability: reuse attributes and methods of an existing class
when you
// Call the honk() method (from the Vehicle class) on the myCar
object myCar.honk();
/* Display the value of the brand attribute (from the Vehicleclass) and the value of the
The final Keyword: If you don't want other classes to inherit from a class,
specified in the previous topic; Inheritance lets us inherit attributes and methods from
another class. Polymorphism uses those methods to perform different tasks. This allows
For example, think of a superclass called Animal that has a method called animalSound().
Subclasses of Animals could be Pigs, Cats, Dogs, Birds - And they also have their own
implementation of an animal sound (the pig oinks, and the cat meows, etc.)
}}
class Main {
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
It is useful for code reusability: reuse attributes and methods of an existing class
when you
The abstract keyword is a non-access modifier, used for classes and methods:
• Abstract class: is a restricted class that cannot be used to create objects (to access it,
• it must be inherited from another class).
• Abstract method: can only be used in an abstract class, and it does not have a body.
The body is provided by the subclass (inherited from).
// Regular method
System.out.println("Zzz");
class Main {
myPig.animalSound();
myPig.sleep();
CHAPTER 2
TRAINING WORK UNDERTAKEN
INTRODUCTION TO PROJECT:SNAKE GAME
The history of the snake game goes back to the 1970s when the game took that we will be
using. It was sold under numerous names and many platforms but probably gained widespread
recognition when it was shipped as standard on Nokia mobile phones in the 1990s.
GAME
CONCEPT :The game involve controlling a single block or snakehead by turning only left
,right, up and down you manage to eat enemy .When you get the enemy ,the snake grows
an extra block or body segment.
If ,or rather when , the snake bumps into the edge of the screen or accidentally eats
himself the game is over .the more enemys the snake eats the higher the score.
KEY FEATURES:
• Use the left, right , up and down keys to give direction to the
snake.
• The current score and lengths are displayed .
• If the snake hits its own body, it dies.
• Food is placed at random positions every time.
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;
privateint[]xPos={25,50,75,100,125,150,175,200,225,250,275,300,325,350,375,400,425,450,4
75,50 0,525,550,575,600,625,650,675,700,725,750,775,800,825,850};
privateint[]yPos={75,100,125,150,175,200,225,250,275,300,325,350,375,400,425,450,475,50
0,525, 550,575,600,625};
private Random random=new Random();
ImageIcon
private enemy=new
Timer timer; ImageIcon(getClass().getResource("enemy.png"));
GamePanel(){
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(true);
timer=new Timer(delay,this);
timer.start();
newEnemy();
@Override
g.setColor(Color.WHITE);
snaketitle.paintIcon(this,g,25,11);
g.setColor(Color.BLACK);
if (moves==0){
snakexlength[0]=100;
snakexlength[1]=75;
snakexlength[2]=50;
snakeylength[0]=100;
snakeylength[1]=100;
snakeylength[2]=100;
if(left){
leftmouth.paintIcon(this,g,snakexlength[0],snakeylength[0]);
if(right){
rightmouth.paintIcon(this,g,snakexlength[0],snakeylength[0]);
if(up){
upmouth.paintIcon(this,g,snakexlength[0],snakeylength[0]);
if(down){
downmouth.paintIcon(this,g,snakexlength[0],snakeylength[0]);
for(int i=1;i<lengthOFSnake;i++){
snakeimage.paintIcon(this, g,snakexlength[i],snakeylength[i] );
if(gameOver){
g.setColor(Color.WHITE);
g.setFont(new Font("Arial",Font.BOLD,50));
g.setFont(new Font("Arial",Font.PLAIN,20));
g.setColor(Color.WHITE);
g.setFont(new Font("Arial",Font.PLAIN,14));
g.drawString("Score:"+score,750, 30);
g.dispose();
@Override
for(int i=lengthOFSnake-1;i>0;i--){
snakexlength[i]=snakexlength[i-1];
snakeylength[i]=snakeylength[i-1];
}
if(left){
snakexlength[0]=snakexlength[0]-25;
if(right){
snakexlength[0]=snakexlength[0]+25;
if(up){
snakeylength[0]=snakeylength[0]-25;
if(down){
snakeylength[0]=snakeylength[0]+25;
if(snakexlength[0]>850)snakexlength[0]=25;
if(snakexlength[0]<25)snakexlength[0]=850;
if(snakeylength[0]>625)snakeylength[0]=75;
if(snakeylength[0]<75)snakeylength[0]=625;
collidesWithEnemy();
collidesWithBody();
repaint();
@Override
if(e.getKeyCode()==KeyEvent.VK_SPACE){
restart();
left=true;
right=false;
up=false;
down=false;
moves++;
left=false;
right=true;
up=false;
down=false;
moves++;
left=false;
right=false;
up=true;
down=false;
moves++;
left=false;
right=false;
up=false;
down=true;
moves++;
}
if(e.getKeyCode()==KeyEvent.VK_LEFT){
left=true;
right=false;
up=false;
down=false;
moves++;
@Override
@Override
enemyX=xPos[random.nextInt(34)];
enemyY=yPos[random.nextInt(23)];
for(int i=lengthOFSnake-1;i>=0;i--){
newEnemy();
newEnemy();
lengthOFSnake++;
score++;
for(int i=lengthOFSnake-1;i>0;i--){
timer.stop();
gameOver=true;
gameOver=false;
moves=0;
score=0;
lengthOFSnake=3;
left=false;
right=true;
up=false;
down=false;
timer.start();
repaint();
Output
CHAPTER 3
RESULTS AND DISCCUSSIONS
RESULTS:
Snapshots of result of Game application:
Fig1
Fig2
DISCUSSIONS: The snake game is a timeless classic that holds a special place in the
hearts of gamers. Its straightforward gameplay and simple controls make it easy to
pick up and play, appealing to players of all ages and skill levels. The objective of
enemy to eats the snake grows the extra length and score one by one and if hit snake
body the game over.
One of the game's strengths lies in its strategic elements. Players must carefully
position the enemy and eats enemy to maximize the number of lengths and
score. The use of Java as the development platform allows the game to be highly
gaming experience.
CONCLUSION
The snake game in Java showcases the versatility of Java's core features in creating an engaging
and entertaining gaming experience. Its simple yet addictive gameplay, combined with dynamic
graphics, provides an immersive experience for players. The game's potential for strategic
decision-making and increasing difficulty keeps players challenged and motivated. With some
additional enhancements and features, the snake game has the potential to become an even
more captivating and popular gaming choice among players. It offers an enjoyable blend of
simplicity, nostalgia, and strategic gameplay. Its timeless appeal, combined with Java's
capabilities, makes it a fun and accessible option for players seeking a classic arcade adventure.
With its potential for enhancements, the snake game can continue to captivate players and
REFERENCES:
https://www.w3schools.com/
https://www.javatpoint.com/
https://youtube.videos.com/