# data[].attributes.headline
하루만에 여소를 2명이나 받아버린 이도윤

# data[].attributes.subject
하루만에 여소를 2명이나 받아버린 이도윤

# data[].attributes.headline
유은재,신유준 그 외 1인

# data[].attributes.subject
유은재,신유준 그 외 1인

# data[].attributes.body
이현

# data[].attributes.headline
이윤서 박기준 이도윤 정지율

# data[].attributes.subject
이윤서 박기준 이도윤 정지율

# data[].attributes.body
브레스(?)를 쏠 수 있으며, 진행 중 자주 나오는 아이템을 먹으면 브레스(?)가 두꺼워진다

# data[].attributes.body
최이현(응원)

# data[].attributes.headline
더블 점프, 장애물 크기 키우기, 공룡 이미지 바꾸기, 배경 색 바꾸기, 장애물 이미지 바꾸기 시도

# data[].attributes.subject
더블 점프, 장애물 크기 키우기, 공룡 이미지 바꾸기, 배경 색 바꾸기, 장애물 이미지 바꾸기 시도

# data[].attributes.body
팀원별로

# data[].attributes.body
if (this.isBird == false) {
      const randomValue = Math.random();
      if (randomValue < 0.1) {
        this.isBird = true;
      }
    } else {
      this.isBird = false;
    }

# data[].attributes.headline
이미지 조사, 공룡 게임 기존 요소 조사

# data[].attributes.subject
이미지 조사, 공룡 게임 기존 요소 조사

# data[].attributes.body
const canvas = document.getElementById("game");
const ctx = canvas.getContext("2d");

let score = 0;
let gameSpeed = 3;
let obstacles = [];
let bullets = [];
let gravity = 1;
let keys = {};
let dino;
let spwanTimer = 200;
let initialSpawnTimer = 200;

document.addEventListener('keydown', function(evt){
    keys[evt.code] = true;
});

document.addEventListener('keyup', function(evt){
    keys[evt.code] = false;
});

class Dino {
    constructor(x, y, w, h, c) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.c = c;
        this.dy = 0;
        this.jumpForce = 15;
        this.originalHeight = h;
        this.grounded = false;
        this.jumpTimer = 0;
    }

    Draw() {
        ctx.beginPath();
        ctx.fillStyle = this.c;
        ctx.fillRect(this.x, this.y, this.w, this.h);
        ctx.closePath();
    }

    Jump() {
        if (this.grounded && this.jumpTimer == 0) {
            this.jumpTimer = 1;
            this.dy = -this.jumpForce;
        } else if (this.jumpTimer > 0 && this.jumpTimer < 15) {
            this.jumpTimer++;
            this.dy = -this.jumpForce - (this.jumpTimer / 50);
        }
    }

    Animate() {
        if (keys['Space']) {
            this.Jump();
        } else {
            this.jumpTimer = 0;
        }

        if (keys['ShiftLeft'] || keys['KeyS']) {
            this.h = this.originalHeight / 2;
        } else {
            this.h = this.originalHeight;
        }
        this.y += this.dy;

        if (this.y + this.h < canvas.height) {
            this.dy += gravity;
            this.grounded = false;
        } else {
            this.dy = 0;
            this.grounded = true;
            this.y = canvas.height - this.h;
        }

        this.Draw();
    }
}

// 총알 클래스 추가
class Bullet {
    constructor(x, y, w, h, c) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.c = c;
        this.dx = 10; // 총알 이동 속도
    }

    // 총알 그리기
    Draw() {
        ctx.beginPath();
        ctx.fillStyle = this.c;
        ctx.fillRect(this.x, this.y, this.w, this.h);
        ctx.closePath();
    }

    // 총알 이동
    Update() {
        this.x += this.dx;
        this.Draw();
    }
}

// 장애물 클래스
class Obstacle {
    constructor(x, y, w, h, c) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.c = c;
        this.dx = -gameSpeed;
    }

    // 장애물 그리기
    Draw() {
        ctx.beginPath();
        ctx.fillStyle = this.c;
        ctx.fillRect(this.x, this.y, this.w, this.h);
        ctx.closePath();
    }

    // 장애물 이동
    Update() {
        this.x += this.dx;
        this.Draw();
    }
}

// 장애물 생성
function SpawnObstacle() {
    let size = RandomIntInRange(20, 70);
    // 장애물의 y 위치를 최대 점프 높이까지 랜덤으로 설정
    let yPos = canvas.height - size - RandomIntInRange(0, 100);
    let obstacle = new Obstacle(canvas.width + size, yPos, size, size, '#2484E4');
    obstacles.push(obstacle);
}

// 랜덤 숫자 생성
function RandomIntInRange(min, max) {
    return Math.round(Math.random() * (max - min) + min);
}

// 총알 발사
function FireBullet() {
    let bullet = new Bullet(dino.x + dino.w, dino.y + dino.h / 2 - 5, 10, 5, '#ff0000');
    bullets.push(bullet);
}

// 총알과 장애물 충돌 체크
function CheckBulletCollision() {
    for (let i = 0; i < bullets.length; i++) {
        let b = bullets[i];
        for (let j = 0; j < obstacles.length; j++) {
            let o = obstacles[j];
            // 총알과 장애물 충돌 확인
            if (b.x < o.x + o.w && b.x + b.w > o.x && b.y < o.y + o.h && b.y + b.h > o.y) {
                // 충돌 시 첫 번째 장애물만 제거
                obstacles.splice(j, 1);
                bullets.splice(i, 1);
                score += 10; // 점수 증가
                break; // 충돌 후 다른 장애물과의 충돌은 확인하지 않음
            }
        }
    }
}

// 초기화 함수
function Start() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;

    ctx.font = "20px sans-serif";

    gameSpeed = 3;
    gravity = 1;
    score = 0;
    dino = new Dino(25, canvas.height - 150, 50, 50, '#ff0000');

    requestAnimationFrame(Update);
}

// 게임 업데이트 함수
function Update() {
    requestAnimationFrame(Update);
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    dino.Animate();
    spwanTimer--;
    if (spwanTimer <= 0) {
        SpawnObstacle();
        spwanTimer = initialSpawnTimer - gameSpeed * 8;

        if (spwanTimer < 60) {
            spwanTimer = 60;
        }
    }

    for (let i = 0; i < obstacles.length; i++) {
        let o = obstacles[i];
        if (o.x + o.w < 0) {
            obstacles.splice(i, 1);
        }
        o.Update();
    }

    for (let i = 0; i < bullets.length; i++) {
        let b = bullets[i];
        if (b.x > canvas.width) {
            bullets.splice(i, 1); // 총알이 화면을 벗어나면 제거
        }
        b.Update();
    }

    CheckBulletCollision();

    gameSpeed += 0.003;
    score++;
    // 점수 표시
    ctx.fillStyle = "#212121";
    ctx.fillText("Score: " + score, 25, 25);
}

// 게임 시작
Start();

// 키 이벤트 처리 (점프는 space, 총알 발사는 enter)
document.addEventListener('keydown', function(evt) {
    if (evt.code === 'Space') {
        dino.Jump();
    }
    if (evt.code === 'Enter') {
        FireBullet();
    }
});

# data[].attributes.body
function Restart () {
    restartButton.style.display = 'flex';
    document.getElementById('game').style.display = 'none'
    restartButton.addEventListener("click", () => {
        isPlaying = true; // 게임 상태 변경
        restartButton.style.display = 'none'; // 버튼 숨기기
        document.getElementById('game').style.display = 'block'
        init()
        Start(); // 게임 재시작
    });
}