본문 바로가기

All Categories/FE & javascript

개발일지 #1 - javascript 활용

반응형

공 튀기기 게임

기본 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        canvas{
            background-color: aquamarine;
            display: block;
            margin: 0 auto;
        }
    </style>
</head>
<body>
    <canvas id="can" width="480" height="320"></canvas>
</body>
<script>
    const canvas = document.getElementById("can");
    const ctx = canvas.getContext("2d");
    let x = canvas.width / 2;
    let y = canvas.height - 50;
    const ballRadius = 10;
    let dx = 3;
    let dy = -2;
    const paddleWidth = 75;
    const paddleHeight = 10;
    let paddleX = (canvas.width - paddleWidth) / 2;
    let paddleY = canvas.height - 30;
    let rightPressed = false;
    let leftPressed = false;

    // 점수
    let score = 0;
    // 생명
    let life = 3;

    // 키보드 이벤트
    document.addEventListener("keydown", keyDownHandler);
    document.addEventListener("keyup", keyUpHandler);
    function keyDownHandler(e){
        if(e.keyCode == 39){
            rightPressed = true;
        }else if(e.keyCode == 37){
            leftPressed = true;
        }
    }
    function keyUpHandler(e){
        if(e.keyCode == 39){
            rightPressed = false;
        }else if(e.keyCode == 37){
            leftPressed = false;
        }
    }
    setInterval(draw, 10);
</script>
</html>

draw()

// 그리기
function draw(){
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ball();
    paddle();
    scoreBoard();
    lifeBoard();
    if(x+dx > canvas.width-ballRadius || x+dx < 0+ballRadius){
        dx = -dx;
    }
    if(y+dy < 0+ballRadius || (x >= paddleX && x <= paddleX+paddleWidth && 
        y+ballRadius == paddleY)){
        dy = -dy;
    } else if(y+ballRadius >= canvas.height){
        life--;
        x = canvas.width / 2;
        y = canvas.height - 50;
        dx = 3;
        dy = -2;
        if(life == 0){
            alert("Game over\n현재점수는 "+score+"점");
            document.location.reload();
        }
    }

    if(rightPressed == true && paddleX < canvas.width-paddleWidth){
        paddleX = paddleX+7;
    }else if(leftPressed == true && paddleX > 0){
        paddleX = paddleX-7;
    }

    x = x + dx;
    y = y + dy;
}

ball()

// 공만들기
function ball(){
    ctx.beginPath();
    // arc(중심x좌표, 중심y좌표, 원반지름, 시작각, 끝각, 그리는 방향);
    ctx.arc(x, y, ballRadius, 0, Math.PI*2);
    ctx.fillStyle = "red";
    ctx.fill();
    ctx.strokeStyle = "black";
    ctx.stroke();
    ctx.closePath();
}

paddle()

// 패들만들기
function paddle(){
    ctx.beginPath();
    // rect(좌상단x, 좌상단y, 넓이, 높이)
    ctx.rect(paddleX, paddleY, paddleWidth, paddleHeight);
    ctx.fillStyle = "black";
    ctx.fill();
    ctx.closePath();
}

scoreBoard()

 // 점수판
function scoreBoard(){
    ctx.font = "16px Arial";
    ctx.fillStyle = "red";
    ctx.fillText("Score : "+score, 8, 20);
    score++;
}

lifeBoard()

// 생명판
function lifeBoard(){
    ctx.font = "16px Arial";
    ctx.fillStyle = "blue";
    ctx.fillText("Life : "+life, canvas.width-65, 20); 
}

 


빙고 게임

기본 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table{
            margin: auto;
        }
        td{
            width: 100px;
            height: 100px;
            border: 5px solid black;
            text-align: center;
        }
    </style>
</head>
<body>
    <table>
        <tr>
            <td id="1" onclick="colorChange(this)">수박</td>
            <td id="2" onclick="colorChange(this)">딸기</td>
            <td id="3" onclick="colorChange(this)">바나나</td>
            <td id="4" onclick="colorChange(this)">블루베리</td>
            <td id="5" onclick="colorChange(this)">복숭아</td>
        </tr>
        <tr>
            <td id="6" onclick="colorChange(this)">코코넛</td>
            <td id="7" onclick="colorChange(this)">용과</td>
            <td id="8" onclick="colorChange(this)">오렌지</td>
            <td id="9" onclick="colorChange(this)">사과</td>
            <td id="10" onclick="colorChange(this)">포도</td>
        </tr>
        <tr>
            <td id="11" onclick="colorChange(this)">귤</td>
            <td id="12" onclick="colorChange(this)">체리</td>
            <td id="13" onclick="colorChange(this)">석류</td>
            <td id="14" onclick="colorChange(this)">토마토</td>
            <td id="15" onclick="colorChange(this)">레드향</td>
        </tr>
        <tr>
            <td id="16" onclick="colorChange(this)">키위</td>
            <td id="17" onclick="colorChange(this)">한라봉</td>
            <td id="18" onclick="colorChange(this)">파프리카</td>
            <td id="19" onclick="colorChange(this)">레몬</td>
            <td id="20" onclick="colorChange(this)">망고</td>
        </tr>
        <tr>
            <td id="21" onclick="colorChange(this)">파인애플</td>
            <td id="22" onclick="colorChange(this)">배</td>
            <td id="23" onclick="colorChange(this)">감</td>
            <td id="24" onclick="colorChange(this)">자몽</td>
            <td id="25" onclick="colorChange(this)">오이</td>
        </tr>
    </table>
</body>
<script>
    function colorChange(element){
       ...
    }
</script>
</html>

colorChange(element)

function colorChange(element){
        if (element.style.backgroundColor == "orange") {
            element.style.backgroundColor = "white";
        } else {
            element.style.backgroundColor = "orange";
        }
    }

배운 점

본 과정에 들어가기에 앞서 자바스크립트를 통한 기초 교육 기간으로, 간단하지만 쉽게 즐길 수 있는 게임을 만들어보는 시간을 가졌습니다.

공 튀기기 게임을 만들 때, 공의 중심 위치와 패들의 x, y 좌표를 비교하여 공이 튕기는 기능을 구현했습니다. 공이 패들의 시작 x 좌표부터 시작 x 좌표의 너비를 더한 값 사이에 위치하고, 패들의 y 좌표와 일치할 때 패들에 맞닿았다고 판단하도록 조건문(x >= paddleX && x <= paddleX + paddleWidth && y + ballRadius == paddleY)을 작성했습니다.

다음으로는 생명판 기능을 구현했습니다. 패들에 닿지 못하고 땅으로 떨어질 때 생명을 감소시켜, 생명이 0이 되었을 때 게임이 종료될 수 있도록 하였습니다. 초기에 조건문을 작성할 때, 생명이 1보다 클 때(if (life < 1)) 생명을 1 감소시킨 후 좌표를 초기화하도록 하고, 그렇지 않을 때(else) 게임 종료 alert를 띄우도록 작성하였습니다. 그러나, 이렇게 코드를 작성하게 되면 게임 종료 후에 좌표가 초기화되지 않기 때문에, alert의 확인 버튼을 눌러도 게임을 재시작할 수 없었습니다. 따라서, 생명 감소 및 좌표 초기화를 먼저 수행한 후, 생명이 0이라면(if (life == 0)) 게임 종료 alert를 띄우도록 하여 게임이 정상적으로 종료 및 재시작이 되도록 구현하였습니다.

이러한 기능을 구현하면서, 개발자에게 알고리즘 및 컴퓨팅 사고력이 왜 중요한지 다시 한번 깨달았습니다. 평소에 백준 알고리즘 문제를 열심히 풀면서 문제해결능력을 키운 덕분에, 쉽게 기능을 구현할 수 있었습니다.

또한, 코딩 기초 지식에 대한 사전 평가를 진행했습니다. 논리 구조 파악 능력 및 코딩 기초 지식에 대한 평가로, html 및 javascript 기본 문법, 조건문, 반복문 등에 대한 문제를 풀어 좋은 평가를 받았습니다. 이 평가 결과를 바탕으로 팀장으로 선정이 되었습니다. 팀장으로서 팀원들을 돕고 서로 나누면서 성장할 수 있도록 노력하고자 합니다. 팀으로 구성되고 나서, 함께 문제를 해결하기 위해 집중도가 더 높아질 수 있었습니다. 앞으로도 팀원들과 함께 열심히 학습하여 역량을 키우고자 합니다.

반응형