<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Test Canvas Game</title>
    <style>
        body {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <canvas id="gc">
    </canvas>
    <script>
        //setup
        c = document.getElementById("gc");
        cc = c.getContext('2d');
        c.height = window.innerHeight;
        c.width = window.innerWidth;
        c.addEventListener('mousemove', function(e) {
            p1y = e.clientY - ph / 2;
        });

        lastTime = Date.now();
        deltaTime = 0;
        fps = 0;

        //gameplay variables
        p1y = p2y = 40;
        pt = 10;
        ph = 100;
        bx = by = xv = yv = 500;//just making sure bx and by exist, they'll be reset when the game first starts
        bd = 12;
        score1 = score2 = 0;
        ais = 5;



        function reset() {
            bx = c.width / 2;
            by = c.height / 2;
            xv = -xv;
            yv = 4;
        }

        function update() {
            //measure timing
            now = Date.now();
            deltaTime = (now-lastTime)/1000;
            lastTime = now;
            fps = 1/deltaTime;
            //move ball
            bx += xv * deltaTime;
            by += yv * deltaTime;
            if (by < 0 && yv < 0) {
                yv = -yv;
            }
            if (by > c.height && yv > 0) {
                yv = -yv;
            }
            //check collision with sides for scoring
            if (bx > c.width) {
                if (by > p2y && by < p2y + ph) {
                    xv = -xv;
                    dy = by - (p2y + ph / 2);
                    yv = dy * 10;
                } else {
                    score1++;
                    reset();
                }
            }
            if (bx < 0) {
                if (by > p1y && by < p1y + ph) {
                    xv = -xv;
                    dy = by - (p1y + ph / 2);
                    yv = dy * 10;//.3
                } else {
                    score2++
                    reset();
                }
            }
            //ai
            if (p2y + ph / 2 < by) {
                p2y += ais;
            } else {
                p2y -= ais;
            }
            //draw background
            var gradient=cc.createLinearGradient(0,0,c.width,c.height);
            gradient.addColorStop("0","#ff146e");
            gradient.addColorStop("1","#145aff");
            cc.fillStyle=gradient;
//            cc.fillStyle="white";
            cc.fillRect(0, 0, c.width, c.height);
            //draw paddles
            cc.fillStyle = 'cyan';
            cc.fillRect(0, p1y, pt, ph);
            cc.fillStyle = 'red';
            cc.fillRect(c.width - pt, p2y, pt, ph);
            //draw ball
            cc.fillStyle = 'lightgreen';
            cc.fillRect(bx - bd / 2, by - bd / 2, bd, bd);
            //draw scores
            cc.fillStyle = 'white';
            cc.font = '20px Times'
            cc.fillText(score1, 100, 100);
            cc.fillText(score2, c.width - 100, 100);
            //draw framerate
            cc.fillText("framerate: " + fps, c.width/2 - 100, 100);

            window.requestAnimationFrame(update); //Keep the game running
        }
        reset() //prepare the game
        update() //start the game
    </script>
</body>

</html>